以太坊智能合約---工作原理

一、什么叫智能合約

智能合約其實(shí)不是合約也不智能,只是它能跑著區(qū)塊鏈上的代碼。

二、智能合約語言

  • Solidity
    Solidity是和JavaScript相似的語言,你可以用它來開發(fā)合約并編譯成以太坊虛擬機(jī)字節(jié)代碼。它目前是以太坊最受歡迎的語言。
  • Serpent
    Serpent是和Python類似的語言,可以用于開發(fā)合約編譯成以太坊虛擬機(jī)字節(jié)代碼。它力求簡潔, 將低級語言在效率方面的優(yōu)點(diǎn)和編程風(fēng)格的操作簡易相結(jié)合,同時合約編程增加了獨(dú)特的領(lǐng)域特定功能。Serpent用LLL編譯。
  • Lisp Like Language (LLL)
    Lisp Like Language (LLL)是和Assembly類似的低級語言。它追求極簡;本質(zhì)上只是直接對以太坊虛擬機(jī)的一點(diǎn)包裝。
  • Mutan (棄用)
    Mutan是個靜態(tài)類型,由Jeffrey Wilcke 開發(fā)設(shè)計的C類語言。它已經(jīng)不再受到維護(hù)。

我們這里用solidity作為合約開發(fā)語言進(jìn)行講解

三、智能合約的編譯

solidity編譯過程

如上圖合約文件Helloworld.sol經(jīng)過編譯器編譯生成Helloworld.abi和Helloworld.bin文件。

solc helloworld.sol --abi --bin -o ./
  • ABI文件可以簡單看作是合約的接口描述文件,具體見以太坊智能合約---ABI
  • bin文件可以看作是一個二進(jìn)制文件,這二進(jìn)制文件就是EVM指令的集合。

四、合約的部署

合約部署流程圖

如上圖,合約的部署跟發(fā)送一筆交易是一樣的操作,調(diào)用transaction函數(shù),from為發(fā)布者的地址,to為0,data為合約的evm操作碼。在礦工打包的時候會生成智能合約地址。智能合約地址的生成是由創(chuàng)建者的賬號和發(fā)送的交易數(shù)作為隨機(jī)數(shù)輸入,通過Kecca-256加密算法重新創(chuàng)建一個地址作為賬號。也就是說最后合約地址對應(yīng)合約的代碼會保存在區(qū)塊鏈數(shù)據(jù)庫。調(diào)用者只需要有合約地址和abi文件就可以調(diào)用合約的代碼。

五、合約的調(diào)用

合約調(diào)用流程圖
  • 要調(diào)用合約需要合約的地址和合約的方法
  • 智能合約是部署在區(qū)塊鏈的代碼,區(qū)塊鏈本身不能執(zhí)行代碼,代碼的執(zhí)行是在本地的EVM中,實(shí)際上,部署在區(qū)塊鏈上代碼是能夠在本地產(chǎn)生原智能合約代碼的代碼,可以理解區(qū)塊鏈為一個數(shù)據(jù)庫,而客戶端從數(shù)據(jù)庫中讀取了存儲的運(yùn)行代碼,并在本地運(yùn)行后,將結(jié)果寫入到了區(qū)塊鏈這個數(shù)據(jù)庫中。

github地址

參考:
一次搞懂「以太坊智能合約」如何運(yùn)作
圖解以太坊智能合約中的概念
【譯】完全理解以太坊智能合約
[以太坊源代碼分析] I.區(qū)塊和交易,合約和虛擬機(jī)
EVM 以太坊虛擬機(jī)
區(qū)塊鏈開發(fā)(二)部署和運(yùn)行第一個以太坊智能合約
以太坊虛擬機(jī)(EVM)底層原理及性能缺陷

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容