以太坊圖靈完備的智能合約豐富了區塊鏈從比特幣單一數字資產去中心化轉移到去中心化的全球分佈式計算機變爲可能,雖然在以太坊網絡運行代碼成本比較高。相對於比特幣的腳本,以太坊智能合約的出現是一種比較大的進步。這篇文章咱們來討論以太坊網絡智能合約的工做原理。node
區塊鏈簡而言之就是非中心化的分佈式帳本,一種多方參與者共享的特定類型數據庫。數據庫
帳本中保存在區塊鏈網絡中發生全部的交易,每一個加入網絡的節點都有數據的全量拷貝。經濟激勵模型削弱甚至消除了獨立節點之間的信任基礎,在不須要信任的開放網絡中轉移數字資產。網絡
區塊鏈世界奉行 Don't trust, verify it 原則。分佈式
圖靈完備的智能合約讓以太坊成爲繼比特幣以後區塊鏈技術最大的亮點。比特幣是數字資產做爲價值的載體,而以太坊超越了數字資產屬性,賦能去中心化應用。智能合約是可以在區塊鏈網絡運行的代碼邏輯。函數
比特幣使用 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)區塊鏈
nonceui
balance編碼
storageRootcode
codeHash
下圖爲 state trie 與區塊的關係
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 的關係
eth_storage_tree.png
值得強調的是:區塊數據只保存 transaction trie (相似比特幣中的區塊頭中存儲全部區塊中的交易默克爾樹根結點), state trie root 和 receipts trie root。
contract Counter { uint counter; function Counter( ) public { counter = 0; } function count() public { counter = counter + 1; } }
簡單的智能合約,類型爲 uint 的 counter 爲合約的狀態,count 函數被調用以後, counter 值加 1
smart_contract_account.png
交易信息中有個比較特殊的字段 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天的食物、飲料,併爲每一位參會者準備一件文化衫
如下是咱們的社區介紹,歡迎各類合做、交流、學習:)