區塊鏈核心代碼調用和虛擬幣開發庫教程詳細介紹
來源:互聯網
上載者:User
指令集(Instruction Set)
EVM的指令集被刻意保持在最小規模,以儘可能避免可能導致共識問題的錯誤實現。所有的指令都是針對256位元這個基本的資料類型的操作。具備常用的算術,位,邏輯和比較操作。也可以做到條件和無條件跳轉。此外,合約可以訪問當前區塊的相關屬性,比如它的編號和時間戳記。
訊息調用(Message Calls)
合約可以通過訊息調用的方式來調用其它合約或者發送以太幣到非合約賬戶。訊息調用和交易非常類似,它們都有一個源,一個目標,資料負載,以太幣,gas和返回資料。事實上每個交易都可以被認為是一個頂層訊息調用,這個訊息調用會依次產生更多的訊息調用。
一個合約可以決定剩餘gas的分配。比如內部訊息調用時使用多少gas,或者期望保留多少gas。如果在內部訊息調用時發生了out-of-gas異常(或者其他異常),合約將會得到通知,一個錯誤碼被壓在棧上。這種情況只是內部訊息調用的gas耗盡。在solidity中,這種情況下發起調用的合約預設會觸發一個人工異常。這個異常會列印出調用棧。
就像之前說過的,被調用的合約(發起調用的合約也一樣)會擁有嶄新的主存並能夠訪問調用的負載。調用負載被儲存在一個單獨的被稱為calldata的地區。調用執行結束後,返回資料將被存放在調用方預先分配好的一塊記憶體中。
調用層數被限制為1024,因此對於更加複雜的操作,我們應該使用迴圈而不是遞迴。
代碼調用和庫(Delegatecall / Callcode and Libraries)
存在一種特殊類型的訊息調用,被稱為callcode。它跟訊息調用幾乎完全一樣,只是載入自目標地址的代碼將在發起調用的合約上下文中運行。
這意味著一個合約可以在運行時從另外一個地址動態載入代碼。儲存,當前地址和餘額都指向發起調用的合約,只有代碼是從被調用地址擷取的。
這使得Solidity可以實現”庫“。可複用的庫代碼可以應用在一個合約的儲存上,可以用來實現複雜的資料結構。
日誌(Logs)
在區塊層面,可以用一種特殊的可索引的資料結構來儲存資料。這個特性被稱為日誌,Solidity用它來實現事件。合約建立之後就無法訪問日誌資料,但是這些資料可以從區塊鏈外高效的訪問。因為部分日誌資料被儲存在布隆過濾器(Bloom filter) 中,我們可以高效並且安全的搜尋日誌,所以那些沒有下載整個區塊鏈的網路節點(輕用戶端)也可以找到這些日誌。
建立(Create)
合約甚至可以通過一個特殊的指令來建立其他合約(不是簡單的向零地址發起調用)。建立合約的調用跟普通的訊息調用的區別在於,負載資料執行的結果被當作代碼,調用者/建立者在棧上得到新合約的地址。
自毀(Selfdestruct)
只有在某個地址上的合約執行自毀操作時,合約代碼才會從區塊鏈上移除。合約地址上剩餘的以太幣會發送給指定的目標,然後其儲存和代碼被移除。 注意,即使一個合約的代碼不包含自毀指令,依然可以通過代碼調用(callcode)來執行這個操作。