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