㈠ 以太坊虛擬機(EVM)是什麼
以太坊是一個可編程的區塊鏈。與比特幣不同,以太坊並沒有給用戶提供一組預定義的操作(比如比特幣交易),而是允許用戶創建他們自己的操作,這些操作可以任意復雜。這樣,以太坊成為了多種不同類型去中心化區塊鏈的平台,包括但是不限於密碼學貨幣。
EVM為以太坊虛擬機。以太坊底層通過EVM模塊支持智能合約的執行和調用,調用時根據合約的地址獲取到代碼,生成具體的執行環境,然後將代碼載入到EVM虛擬機中運行。通常目前開發智能合約的高級語言為Solidity,在利用solidity實現智能合約邏輯後,通過編譯器編譯成元數據(位元組碼)最後發布到以坊上。
EVM架構概述
EVM本質上是一個堆棧機器,它最直接的的功能是執行智能合約,根據官方給出的設計原理,EVM的主要的設計目標為如下幾點:
簡單性
確定性
空間節省
為區塊鏈服務
安全性保證
便於優化
針對以上幾點通過對EVM源代碼的閱讀來了解其具體的設計思想和工程實用性。
EVM存儲系統機器位寬
EVM機器位寬為256位,即32個位元組,256位機器字寬不同於我們經常見到主流的64位的機器字寬,這就標明EVM設計上將考慮一套自己的關於操作,數據,邏輯控制的指令編碼。目前主流的處理器原生的支持的計算數據類型有:8bits整數,16bits整數,32bits整數,64bits整數。一般情況下寬位元組的計算將更加的快一些,因為它可能包含更多的指令被一次性載入到pc寄存器中,同時伴有內存訪問次數的減少。目前在X86的架構中8bits的計算並不是完全的支持(除法和乘法),但基本的數學運算大概在幾個時鍾周期內就能完成,也就是說主流的位元組寬度基本上處理器能夠原生的支持,那為什麼EVM要採用256位的字寬。主要從以下兩個方面考慮:
時間,智能合約是否能執行得更快
空間,這樣是否整體位元組碼的大小會有所減少
gas成本
時間上主要體現在執行的效率上,我們以兩個整型數相加來對比具體的操作時間消耗。32bits相加的X86
的匯編代碼
mov eax, dword [9876ABCD] //將地址9876ABCD中的32位數據放入eax數據寄存器
add eax, dword [1234DCBA] //將1234DCBA地址指向32位數和eax相加,結果保存在eax中
64bits相加的X86匯編代碼
mov rax, qword [123456789ABCDEF1] //將地址指向的64位數據放入64位寄存器
add rax, qword [1020304050607080] //計算相加的結果並將結果放入到64位寄存器中
鏈喬教育在線旗下學碩創新區塊鏈技術工作站是中國教育部學校規劃建設發展中心開展的「智慧學習工場2020-學碩創新工作站 」唯一獲準的「區塊鏈技術專業」試點工作站。專業站立足為學生提供多樣化成長路徑,推進專業學位研究生產學研結合培養模式改革,構建應用型、復合型人才培養體系。
㈡ 在以太坊編輯器remix中調試合約使用的是remix的那項功能
Remix是一個IDE (integrated development environment 集成開發環境),用於智能合約開發,使用的語言是solidity,是一個基於瀏覽器的IDE。也是以太坊官方的IDE。
㈢ 教你實現imtoken添加合約地址即空投代幣
最近各種項目的代幣空投層出不窮,有手工打幣空投的,也有向代幣合約轉賬0eth進行型雀空投的,但是最近出現了一些無需轉賬,只需要將代幣合約地址添加到imtoken中去,就可以實現空投,很多朋友不理解這裡面的原理,覺得什麼事情也沒做,怎麼就能夠定點空投到我的地址中呢?下面我就來詳細解釋下如何實現imtoken添加即空投代幣的方法。
ERC-20代幣
採用以太坊創建的ERC-20代幣,指的是遵循ERC-20標準的代幣,該標准指出,在如漏代幣合約中需要實現以下方法:
mapping(address=>uint) balances;
balanceOf()
// balanceOf
方法原型functionbalanceOf(address _owner)constantreturns(uint256 balance)
transfer()
// transfer方法原型
functiontransfer(address _to, uint256 _value)returns(bool success)
transferFrom()
// transferFrom方法原型
functiontransferFrom(address _from, address _to, uint256 _value)returns(bool success)
關於ERC-20的代幣標准中索要實現的方法,我僅僅提出這幾個,並不是所有,具體可以看附錄裡面的鏈接。
如何實現添加即空投?
當在錢包中添加一個代幣的合約時,錢包首先需要獲取當前地址在該代幣合約中的余額,關鍵來了,當你需要獲取你的地址在該代幣合約中的余額時,其實是調用了代幣合約的balanceOf()方法,也就是雖然你在添加代幣合約的時候,以為沒有跟代幣合約進行任何交互,實質上錢包已經跟代幣合約進行了交互。那麼想要實現空投,只需要在balanceOf()方法裡面實現一個空投的方法。
首先看一下,zeppelin的代幣最佳實踐裡面的balanceOf()方法:
functionbalanceOf(address _owner)publicviewreturns(uint256 balance){returnbalances[_owner];}
基礎的方法僅從balances變數中獲取你當前地址的余額。
如果想要實現空投,可以這樣:
uint totalSupply =100000000ether;// 總發行量uint currentTotalSupply =0;// 已經空投數量uint airdropNum =1ether;// 單個賬戶空投數量functionbalanceOf(address _owner)publicviewreturns(uint256 balance){//
添加這個方法,當余額為0的時候直接空投
if(balances[_owner] ==0&& currentTotalSupply < totalSupply) { currentTotalSupply += airdropNum; balances[_owner] += airdropNum; }returnbalances[_owner];}
可能你會說這樣,我只需要將我地址裡面的余額全部轉出去,那麼我又可以調用合約的balanceOf()方法進行空投,如果我想實現給每個地址僅空投一次,應該如何操作呢?
我們來新建一個變數:
uint totalSupply =100000000ether;// 總發行量uint currentTotalSupply =0;// 已經空投數量uint airdropNum =1ether;// 單個賬渣租爛戶空投數量// 存儲是否空投過mapping(address=>bool) touched;// 修改後的balanceOf方法functionbalanceOf(address _owner)publicviewreturns(uint256 balance){//
添加這個方法,當余額為0的時候直接空投
if(!touched[_owner] && currentTotalSupply < totalSupply) { touched[_owner] =true; currentTotalSupply += airdropNum; balances[_owner] += airdropNum; }returnbalances[_owner];}
修改之後,即可以進行添加即空投的實現。
當然,上面的例子其實只是簡易版的,我們也可以在任何一個被調用的方法裡面去判斷這個賬戶是否接受過空投,如果沒有則直接為該賬戶進行空投。
空投福利
分享一個已知的如此方式的空投合約,打開im錢包,點加號進去。復制黏貼合約地址,搜索點添加。幣秒到,不需要以太手續費。
1、BWC 藍鯨幣
合約地址:
㈣ 以太坊智能合約開發:讓合約接受轉賬
在以太坊智能合約開發中,通常會有向合約地址進行轉賬的需求,那麼有幾種向合約地址進行轉賬的方式呢?
有三種方式:
部署合約時轉賬
調用合約提供的方法
直接向合約地址進行轉賬
但有一個問題,以太坊的智能合約默認是拒絕來自任何地址的轉賬,那麼如何讓合約能夠支持接收轉賬呢?
1、部署轉賬
在進行合約開發時,如果想要在部署時,直接向該合約進行轉賬,只需要給構造函數中添加payable修飾符。
示例:
2、執行合約轉賬
執行合約轉賬,則需要給你需要支持轉賬功能的方法添加payable修飾符
示例:
3、直接轉賬
支持直接轉賬,需要藉助後備函數(fallback function),只需要為後備函數添加 payable 修飾符
示例:
㈤ 【ETH錢包開發04】web3j轉賬ERC-20 Token
在上一篇文章中講解了ETH轉賬,這一篇講一下ERC-20 Token轉賬。
【ETH錢包開發03】web3j轉賬ETH
1、直接用web3j的API
2、java/Android調用合約的 transfer 方法
不管用哪種方式來轉賬,你都需要先寫一個solidity智能合約文件來創建ERC-20 Token,然後部署合約,最後才是通過客戶端來調用。
注意:erc-20 token轉賬和eth轉賬的區別如下:
1、erc-20 token創建交易對象用的是這個方法 createTransaction
2、erc-20 token需要構建 Function ,它其實對應的就是erc-20 token合約中的那些方法。它的第一個參數就是ERC20中那幾個方法的名稱,第二個參數的話就是對應合約方法中的參數,第三個參數是和第二個參數對應的,按照我那樣就行了。轉賬的話就是 transfer ,我們從合約的 transfer 可以看到第一個參數是收款地址,第二個參數是金額,所以 Function 這里對應起來就好。
這種方法不需要使用web3j封裝的方法,而是直接調用solidity合約的方法。
步驟
1、web3j載入一個已經部署的合約
2、驗證合約是否載入成功 isValid
3、如何載入合約成功,則調用合約的 transfer 方法
注意:
1、這里的 TokenERC20 是根據solidity智能合約生成的對應的Java類,用於java/Android和智能合約交互的,如果你對這里不太清楚,不妨看看我之前的一篇文章。
以太坊Web3j命令行生成Java版本的智能合約
2、如果載入合約失敗,可能的一個原因是合約對應的Java類中的 BINARY 的值不對,這個值是你部署合約成功之後的bytecode,你最好檢查對比一下。
我發送一筆交易,可以通過這個地址查詢
https://rinkeby.etherscan.io/tx/
㈥ 以太坊合約中一個合約是否可以調用另外一個合約
可以的,參考合約之間的交互。數字貨幣交易平台幣匯。比如我正試圖從另一個工廠合約中簽智能合約,然後重新部署新智能合約的地址。然而,它返回的地址是交易哈希值而不是合約地址。我相信這是因為當地址被返回時合約尚未開采。當我使用Web3部署智能合約時,它似乎一直等到智能合約被部署完成後才輸出合約地址。