上一篇文章介紹了以太坊5個核心概念:以太坊虛擬機(EVM)、賬戶(Accounts)、交易(Transactions)、Gas、存儲,主存和棧(Storage, Memory and the Stack)。這篇文章將談?wù)勂渌麕讉€核心概念。
EVM的指令集被刻意保持在最小規(guī)模,以盡可能避免可能導(dǎo)致共識問題的錯誤實現(xiàn)。所有的指令都是針對256比特這個基本的數(shù)據(jù)類型的操作。具備常用的算術(shù),位,邏輯和比較操作。也可以做到條件和無條件跳轉(zhuǎn)。此外,合約可以訪問當(dāng)前區(qū)塊的相關(guān)屬性,比如它的編號和時間戳。
合約可以通過消息調(diào)用的方式來調(diào)用其它合約或者發(fā)送以太幣到非合約賬戶。消息調(diào)用和交易非常類似,它們都有一個源,一個目標(biāo),數(shù)據(jù)負載,以太幣,gas和返回數(shù)據(jù)。事實上每個交易都可以被認為是一個頂層消息調(diào)用,這個消息調(diào)用會依次產(chǎn)生更多的消息調(diào)用。
一個合約可以決定剩余gas的分配。比如內(nèi)部消息調(diào)用時使用多少gas,或者期望保留多少gas。如果在內(nèi)部消息調(diào)用時發(fā)生了out-of-gas異常(或者其他異常),合約將會得到通知,一個錯誤碼被壓在棧上。這種情況只是內(nèi)部消息調(diào)用的gas耗盡。在solidity中,這種情況下發(fā)起調(diào)用的合約默認會觸發(fā)一個人工異常。這個異常會打印出調(diào)用棧。
就像之前說過的,被調(diào)用的合約(發(fā)起調(diào)用的合約也一樣)會擁有嶄新的主存并能夠訪問調(diào)用的負載。調(diào)用負載被存儲在一個單獨的被稱為calldata的區(qū)域。調(diào)用執(zhí)行結(jié)束后,返回數(shù)據(jù)將被存放在調(diào)用方預(yù)先分配好的一塊內(nèi)存中。
調(diào)用層數(shù)被限制為1024,因此對于更加復(fù)雜的操作,我們應(yīng)該使用循環(huán)而不是遞歸。
存在一種特殊類型的消息調(diào)用,被稱為callcode。它跟消息調(diào)用幾乎完全一樣,只是加載自目標(biāo)地址的代碼將在發(fā)起調(diào)用的合約上下文中運行。
這意味著一個合約可以在運行時從另外一個地址動態(tài)加載代碼。存儲,當(dāng)前地址和余額都指向發(fā)起調(diào)用的合約,只有代碼是從被調(diào)用地址獲取的。
這使得Solidity可以實現(xiàn)"庫"??蓮?fù)用的庫代碼可以應(yīng)用在一個合約的存儲上,可以用來實現(xiàn)復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
在區(qū)塊層面,可以用一種特殊的可索引的數(shù)據(jù)結(jié)構(gòu)來存儲數(shù)據(jù)。這個特性被稱為日志,Solidity用它來實現(xiàn)事件。合約創(chuàng)建之后就無法訪問日志數(shù)據(jù),但是這些數(shù)據(jù)可以從區(qū)塊鏈外高效的訪問。因為部分日志數(shù)據(jù)被存儲在布隆過濾器(Bloom filter) 中,我們可以高效并且安全的搜索日志,所以那些沒有下載整個區(qū)塊鏈的網(wǎng)絡(luò)節(jié)點(輕客戶端)也可以找到這些日志。
合約甚至可以通過一個特殊的指令來創(chuàng)建其他合約(不是簡單的向零地址發(fā)起調(diào)用)。創(chuàng)建合約的調(diào)用跟普通的消息調(diào)用的區(qū)別在于,負載數(shù)據(jù)執(zhí)行的結(jié)果被當(dāng)作代碼,調(diào)用者/創(chuàng)建者在棧上得到新合約的地址。
只有在某個地址上的合約執(zhí)行自毀操作時,合約代碼才會從區(qū)塊鏈上移除。合約地址上剩余的以太幣會發(fā)送給指定的目標(biāo),然后其存儲和代碼被移除。 注意,即使一個合約的代碼不包含自毀指令,依然可以通過代碼調(diào)用(callcode)來執(zhí)行這個操作。
好了,通過前面的2篇文章,我們了解了以太坊的核心概念,接下來就可以通過編程來深入理解這些概念了。
本文并非原創(chuàng),文章來自于@rink1969, @jan, @shaoping的翻譯和校對,系統(tǒng)的介紹以太坊繞不開這些概念,因此轉(zhuǎn)載過來,特此感謝。
原文:http://wangxiaoming.com/blog/2016/05/09/blockchain-tech-ethereum-concept-2/