區塊鏈100講:淺析以太坊網路智慧合約原理

區塊鏈社群HiBlock發表於2018-08-30

image

以太坊圖靈完備的智慧合約豐富了區塊鏈從比特幣單一數字資產去中心化轉移到去中心化的全球分散式計算機變為可能,雖然在以太坊網路執行程式碼成本比較高。相對於比特幣的指令碼,以太坊智慧合約的出現是一種比較大的進步。這篇文章我們來討論以太坊網路智慧合約的工作原理。

1

區塊鏈101

區塊鏈簡而言之就是非中心化的分散式賬本,一種多方參與者共享的特定型別資料庫。

賬本中儲存在區塊鏈網路中發生所有的交易,每個加入網路的節點都有資料的全量拷貝。經濟激勵模型削弱甚至消除了獨立節點之間的信任基礎,在不需要信任的開放網路中轉移數字資產。

區塊鏈世界奉行 Don't trust, verify it 原則。

2

智慧合約

圖靈完備的智慧合約讓以太坊成為繼比特幣之後區塊鏈技術最大的亮點。比特幣是數字資產作為價值的載體,而以太坊超越了數字資產屬性,賦能去中心化應用。智慧合約是能夠在區塊鏈網路執行的程式碼邏輯。

3

以太坊賬戶模型和狀態模型

比特幣使用 UTXO 模型,而以太坊使用賬戶模型。智慧合約在以太坊中也屬於賬戶。以太坊網路有且僅有一個經常被更新的 State trie 全域性狀態。state trie 通過健值對維護所有在以太坊網路發生過交易的賬戶。

key 為長度為 160 bit 的以太坊地址,value 為下面四個要素使用 RLP (Recursive-Length Prefix 編碼方法) 編碼而來。每個賬戶都是 state trie 的一個節點,所有賬戶的 state trie 做類默克爾樹得到根節點 (State Trie — Keccak-256-bit hash of the state trie’s root node stored as the “stateRoot” value)

  • nonce

  • balance

  • storageRoot

  • codeHash

下圖為 state trie 與區塊的關係

image

Relationship between the State Trie (leveldb implementation of a Merkle Patricia Trie) and an Ethereum block

兩種賬戶 nonce (賬戶中成功轉賬次數) 和 balance (eth 餘額) 欄位都有資料,智慧合約賬戶 storageRoot (儲存合約的所有資料)和 codeHash (儲存合約程式碼編譯後位元組碼) 有資料,而普通賬戶這兩個欄位為空。

合約的資料儲存在 storage trie 中,正如 state trie 一樣,storage trie 同樣儲存格式同樣為健值對 (keys are storage locations and values are storage values) 對應合約中變數名和值,這些健值對通過默克爾雜湊之後得到 storageRoot 儲存在賬戶中。

下圖為 storage trie 和 state trie 的關係

image

eth_storage_tree.png

值得強調的是:區塊資料只儲存 transaction trie (類似比特幣中的區塊頭中儲存所有區塊中的交易默克爾樹根結點), state trie root  和 receipts trie root。

4

智慧合約賬戶

contract Counter {

    uint counter;
   function Counter(

) public {

        counter = 0; 

    }    function

count() public {

        counter 
   = counter + 1; 

    }

 }
複製程式碼

簡單的智慧合約,型別為 uint 的 counter 為合約的狀態,count 函式被呼叫之後, counter 值加 1

image

smart_contract_account.png

5

以太坊交易

交易資訊中有個比較特殊的欄位 data , 這個欄位值結合 to 欄位可把以太坊交易分為三大類:

轉賬

  • TO 收款地址

  • DATA 為空或任意交易備註資訊

  • AMOUNT 交易 ether 數量

新建合約

  • TO 欄位為空,新建合約被觸發

  • DATA 欄位為智慧合約位元組碼

  • AMOUNT 欄位可為空或任意數,非負數則轉賬給新建的合約賬戶

呼叫合約

  • TO 欄位為合約賬戶地址

  • DATA 欄位為合約函式及其引數

  • AMOUNT 空或任意數

// Transfer of value

{

    to: '0x687422eEA2cB73B5d3e24
2bA5456b782919AFc85',

    value: 0.0005

    data: ‘0x’ // 
Could also send a message here 
if we want to

}

// Create smart contract

{

    to: '',
    value: 0.0

    data: ‘0x60606040523415610
00c57fe5b60405160c0806……………’
 }

// Call contract

{

    to: '0x687422eEA2cB73B5d3e2
42bA5456b782919AFc85',  

// Contract

    value: 0.0

    data: '0x606060405234156100
0c57fe5b60405160c0806……………'

}
複製程式碼

值得強調的是,在以太坊交易中有 gas 的概念,在以太坊網路跑運用需要一定的成本,同時必須設定 gas 上限,交易執行完成之後,剩餘的 gash 將會返還。

推薦閱讀

  • Diving into Ethereum’s world state

  • Basic Questions About the Ethereum EVM and State Storage

  • State Tree Pruning

內容來源:簡書

作者:老碼農不上班

Blockathon|48小時極客競賽,區塊鏈馬拉松等你挑戰(成都)

時間:2018年9月14-16日

地點:成都高新區天府五街200號菁蓉國際廣場2號樓A座12樓中韓網際網路+新技術孵化器

  • 招募50名開發者(識別下圖二維碼或點選“閱讀原文”即可報名)

  • 報名費100元為參賽押金,參賽者個人原因不能到場參加活動概不退款;參賽者全程參與活動,待活動結束後現場退還。9月14日18:00開始第一次簽到,9月15日和16日每天早上都要記得簽到哦。

  • 主辦方免費提供2天的食物、飲料,併為每一位參會者準備一件文化衫

image

相關文章