區塊鏈簡而言之就是非中心化的分布式賬本,一種多方參與者共享的特定類型數據庫。
賬本中保存在區塊鏈網絡中發生所有的交易,每個加入網絡的節點都有數據的全量拷貝。經濟激勵模型削弱甚至消除了獨立節點之間的信任基礎,在不需要信任的開放網絡中轉移數字資產。
區塊鏈世界奉行 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)
nonce
balance
storageRoot
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 的關系

值得強調的是:區塊數據只保存 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

交易信息中有個比較特殊的字段 data , 這個字段值結合 to 字段可把以太坊交易分為三大類:
轉賬
TO 收款地址
DATA 為空或任意交易備注信息
AMOUNT 交易 ether 數量
新建合約
調用合約
TO 字段為合約賬戶地址
DATA 字段為合約函數及其參數
AMOUNT 空或任意數
{
to: '0x687422eEA2cB73B5d3e24
2bA5456b782919AFc85',
value: 0.0005
data: ‘0x’ }{
to: '',
value: 0.0
data: ‘0x60606040523415610
00c57fe5b60405160c0806……………’
}{
to: '0x687422eEA2cB73B5d3e2
42bA5456b782919AFc85',
value: 0.0
data: '0x606060405234156100
0c57fe5b60405160c0806……………'}
值得強調的是,在以太坊交易中有 gas 的概念,在以太坊網絡跑運用需要一定的成本,同時必須設置 gas 上限,交易執行完成之后,剩余的 gash 將會返還。
作者:老碼農不上班