以太坊智能合約的生命週期

"A smart contract is a computer program executed in a secure environment that directly controls digital assets."git

-- Vitalik Buteringithub

做爲以太坊的標誌性技術, 網絡上已經有很是多的文章對智能合約進行了介紹。今天Cindy將主要帶領你們經歷一場以太坊上智能合約的生命週期之旅, 一塊兒經歷合約存儲、建立、部署、執行、升級與銷燬的過程。數據庫

一塊兒出發吧!網絡

第一站:合約存儲

1

-以太坊上兩種帳戶類型:a) 我的帳戶 b)合約帳戶-區塊鏈

首先,以太坊智能合約有兩種類型的帳戶:外部我的帳戶和合約帳戶。這兩種類型帳戶的功能和特色都不同。測試

其次,合約在部署時, 就會建立一個合約帳戶, 合約代碼的可執行字節碼(Bytecode)保存在合約帳戶(CA)中。具體來講就是存在帳戶 codehash 指向的存儲區域;codeHash 是代碼的 hash 值,建立後不可更改。3d

再次, 數據主要存儲在帳戶 storageRoot 指向的存儲區域;storageRoot 對應合約存儲結構的MPT樹根節點hash值,經過它可以在數據庫中檢索到合約的變量信息。code

最後, 全部的基礎存儲目前都基於 leveldb, 一種 kv 數據庫。blog

第二站:合約建立

這裏咱們用用戶 A 的例子作說明。生命週期

2

  1. 用戶 A 使用 solidity 等語言建立一份合約代碼
  2. A 在 IDE/錢包/其餘客戶端,按必定的格式(from,data,value,Gas,GasPrice....)填寫 data,而後確認(即發起一次transaction)
  3. 客戶端會填補 account nonce(tx計數器)、compile solidity、簽名 等操做,並將 to 字段置零(表明合約建立)。
  4. 該 tx 廣播到網絡上,B 節點收到該 tx。
  5. B 節點檢查 tx 是否有效、格式是否正確,驗證交易簽名是否合法。若是符合要求,計算可能的最大交易費用,肯定發送者的地址,並在本地的區塊鏈上查看發送者的餘額,若是帳戶餘額不足以支付最大的交易費用,則返回錯誤。
  6. 對於符合要求的交易請求,B 將其放在交易存儲池中,並向其餘節點轉發(好比轉發給了C)。C 收到交易請求的節點重複用戶 B 的處理過程。

第三站:合約部署

咱們加入礦工B和C。

3

 

-部署與挖礦過程-

  1. B 和 C 各自從本地的交易存儲池中拿到一批 TX,而後打包進行 hash 計算(挖礦)。

  2. 假設 B 挖礦成功(得到了記帳權),B 會根據 A 提供的交易費用和合約代碼,建立合約帳戶,並在帳戶空間中部署合約。合約帳戶地址在建立合約的 tx 確認後返回給 A

  3. B 打包好的區塊(包含 A 建立的智能合約)發送至對等節點,並在全網傳播。

  4. C 接收到該區塊,驗證區塊,若是區塊經過驗證:
    a. C 從內存池中刪除 A 建立的智能合約交易請求
    b. C 將區塊連接到本地最長鏈上(同步區塊)
    c. C 將 A 的智能合約部署在本地區塊鏈中。

4

 

-區塊驗證過程-

第四站:合約執行

5

 

-合約執行過程-

  1. 用戶 A 按照必定格式在網絡中發起一個 tx 請求;該請求被網絡中節點 B 收到: i. 若是符合要求,計算可能的最大交易費用(最大交易費用=Gas Limit×GasPrice),肯定發送方的地址,並在本地的區塊鏈上從發送方帳戶中減去相應費用 ii. 若是帳戶餘額不足,則返回錯誤,這條交易被直接丟棄。
  2. B 同步到此交易,檢查交易是否有效、格式是否正確。
  3. 符合要求的交易請求,用戶 B 將其放在交易存儲池中,並向其餘節點轉發. 其餘節點執行和B一樣的操做過程.
  4. B 挖礦成功。 a. 對於轉帳交易,B 將該交易和其餘交易一塊兒打包到區塊。 b. 對於合約調用交易,B 將該交易和其餘交易一塊兒打包到區塊中,並在本地的 EVM 上運行合約代碼: i. 若是代碼並未結束而 Gas 已經用完,那麼因代碼運行而改變的狀態回滾到代碼運行以前,可是已經支付的交易費用不可收回,交易費用由B得到。 ii. 若是代碼運行結束 Gas 還有剩餘,那麼B只會得到消耗 的Gas×GasPrice 做爲手續費,不會收取剩餘 Gas 對應的手續費。 c. B 將包含 A 交易請求的區塊傳播到對等節點,在網絡中廣播。
  5. C 節點收到該區塊後: a. 驗證區塊(用戶A的交易的合法性也被再次驗證) i. 驗證經過,C 將內存池中 A 的交易請求刪掉,同時將B的區塊添加到本地的區塊鏈中 ii. 驗證不經過,C 丟棄該區塊。 b. 執行區塊中的智能合約交易 i. C 在本地的 EVM 上運行該智能合約,並與 B 的執行結果互相驗證。
  6. 網絡上其餘礦工節點重複 C 的執行過程:經過 EVM 在本地計算機上運行智能合約,做爲他們參與挖礦進程的一部分,而後得出一個結果並進行驗證。 a. 理論上,若是沒有人惡意操做,每一個計算機代碼運行的結果都是相同的,由於它們運行着提供了相同信息的相同合約代碼。

6

第五站:合約升級

  1. 部署在以太坊區塊鏈上的代碼是不可改變的,即沒法從新部署一個新的合約到相同的地址上。(編者注:其實是能夠改變的。但須要)
  2. 智能合約升級較爲困難,務必須要一次性將合約寫"完美"(測試/驗證要求極高)。
  3. hacking 辦法: a. 部署一個擁有調用轉發功能的智能合約 b. 將收到的調用轉發到另一個包含邏輯功能的合約地址 c. 當進行合約升級時,只須要部署一個新的合約並修改轉發的目標地址,以指向新的合約。

第六站:合約銷燬

合約發起者能夠調用 selfdestruct() 方法便可銷燬合約。舉例:

7


參考材料:

相關文章
相關標籤/搜索