以太坊智慧型合約的生命週期

2021-09-22 13:55:36 字數 3146 閱讀 8889

"a smart contract is acomputerprogramexecuted in asecureenvironmentthat directly controlsdigitalassets."

-- vitalik buterin

作為以太坊的標誌性技術, 網路上已經有非常多的文章對智慧型合約進行了介紹。今天cindy將主要帶領大家經歷一場以太坊上智慧型合約的生命週期之旅, 一起經歷合約儲存、建立、部署、執行、公升級與銷毀的過程。

一起出發吧!

-以太坊上兩種賬戶型別:a) 個人賬戶 b)合約賬戶-

首先,以太坊智慧型合約有兩種型別的賬戶:外部個人賬戶和合約賬戶。這兩種型別賬戶的功能和特點都不一樣。

其次,合約在部署時, 就會建立乙個合約賬戶, 合約**的可執行位元組碼(bytecode)儲存在合約賬戶(ca)中。具體來說就是存在賬戶 codehash 指向的儲存區域;codehash 是**的 hash 值,建立後不可更改。

再次, 資料主要儲存在賬戶 storageroot 指向的儲存區域;storageroot 對應合約儲存結構的mpt樹根節點hash值,通過它能夠在資料庫中檢索到合約的變數資訊。

最後, 所有的基礎儲存目前都基於 leveldb, 一種 kv 資料庫。

這裡我們用使用者 a 的例子做說明。

使用者 a 使用 solidity 等語言建立乙份合約**

a 在 ide/錢包/其他客戶端,按一定的格式(from,data,value,gas,gasprice....)填寫 data,然後確認(即發起一次transaction)

客戶端會填補 account nonce(tx計數器)、compile solidity、簽名 等操作,並將 to 欄位置零(代表合約建立)。

該 tx 廣播到網路上,b 節點收到該 tx。

b 節點檢查 tx 是否有效、格式是否正確,驗證交易簽名是否合法。如果符合要求,計算可能的最大交易費用,確定傳送者的位址,並在本地的區塊鏈上檢視傳送者的餘額,如果賬戶餘額不足以支付最大的交易費用,則返回錯誤。

對於符合要求的交易請求,b 將其放在交易儲存池中,並向其他節點**(比如**給了c)。c 收到交易請求的節點重複使用者 b 的處理過程。

我們加入礦工b和c。

-部署與挖礦過程-

b 和 c 各自從本地的交易儲存池中拿到一批 tx,然後打包進行 hash 計算(挖礦)。

假設 b 挖礦成功(獲得了記賬權),b 會根據 a 提供的交易費用和合約**,建立合約賬戶,並在賬戶空間中部署合約。合約賬戶位址在建立合約的 tx 確認後返回給 a

b 打包好的區塊(包含 a 建立的智慧型合約)傳送至對等節點,並在全網傳播。

c 接收到該區塊,驗證區塊,如果區塊通過驗證:

a. c 從記憶體池中刪除 a 建立的智慧型合約交易請求

b. c 將區塊鏈結到本地最長鏈上(同步區塊)

c. c 將 a 的智慧型合約部署在本地區塊鏈中。

-區塊驗證過程-

-合約執行過程-

使用者 a 按照一定格式在網路中發起乙個 tx 請求;該請求被網路中節點 b 收到: i. 如果符合要求,計算可能的最大交易費用(最大交易費用=gas limit×gasprice),確定傳送方的位址,並在本地的區塊鏈上從傳送方賬戶中減去相應費用 ii. 如果賬戶餘額不足,則返回錯誤,這條交易被直接丟棄。

b 同步到此交易,檢查交易是否有效、格式是否正確。

符合要求的交易請求,使用者 b 將其放在交易儲存池中,並向其他節點**. 其他節點執行和b同樣的操作過程.

b 挖礦成功。 a. 對於轉賬交易,b 將該交易和其他交易一起打包到區塊。 b. 對於合約呼叫交易,b 將該交易和其他交易一起打包到區塊中,並在本地的 evm 上執行合約**: i. 如果**並未結束而 gas 已經用完,那麼因**執行而改變的狀態回滾到**執行之前,但是已經支付的交易費用不可收回,交易費用由b獲得。 ii. 如果**執行結束 gas 還有剩餘,那麼b只會獲得消耗 的gas×gasprice 作為手續費,不會收取剩餘 gas 對應的手續費。 c. b 將包含 a 交易請求的區塊傳播到對等節點,在網路中廣播。

c 節點收到該區塊後: a. 驗證區塊(使用者a的交易的合法性也被再次驗證) i. 驗證通過,c 將記憶體池中 a 的交易請求刪掉,同時將b的區塊新增到本地的區塊鏈中 ii. 驗證不通過,c 丟棄該區塊。 b. 執行區塊中的智慧型合約交易 i. c 在本地的 evm 上執行該智慧型合約,並與 b 的執行結果互相驗證。

網路上其他礦工節點重複 c 的執行過程:通過 evm 在本地計算機上執行智慧型合約,作為他們參與挖礦程序的一部分,然後得出乙個結果並進行驗證。 a. 理論上,如果沒有人惡意操作,每個計算機**執行的結果都是相同的,因為它們執行著提供了相同資訊的相同合約**。

智慧型合約公升級較為困難,務必需要一次性將合約寫"完美"(測試/驗證要求極高)。

hacking 辦法: a. 部署乙個擁有呼叫**功能的智慧型合約 b. 將收到的呼叫**到另外乙個包含邏輯功能的合約位址 c. 當進行合約公升級時,只需要部署乙個新的合約並修改**的目標位址,以指向新的合約。

合約發起者可以呼叫selfdestruct()方法即可銷毀合約。舉例:

參考材料:

智慧型合約 以太坊

智慧型合約是執行在可複製 共享的賬本上的電腦程式,可以處理資訊,接收 儲存和傳送價值。2.1 什麼是以太坊 以太坊 ethereum 是乙個分布式計算機,有許多的節點,其中的每乙個節點都會執行智慧型合約,然後把結果存在區塊鏈上。由於整個網路是分布式的,且應用就是乙個個的狀態組成,儲存了狀態就有了服務...

以太坊和智慧型合約

1 什麼是以太坊?以太坊的官方 告訴我們 以太坊是乙個執行著智慧型合約的分布式平台 應用程式完全按照程式執行,不存在故障 審查 欺詐或第三方干預的可能性 2 智慧型合約就是可以處理資金的指令碼。開發語言 solidity 整合開發工具ide remix,乙個基於瀏覽器的整合開發環境 開發框架 tru...

以太坊智慧型合約安全

智慧型合約就是自主執行的合約,其條款是用 規定的。雖然這個概念已經存在一段時間了,但至少從1996年nick szabo提出了這一概念以來,直到圖靈完備的以太坊區塊鏈來臨,智慧型合約的使用才變得普遍。對智慧型合約理念的字面解釋造成了 即法律 code is law 的正規化理解,意思是那些智慧型合約...