《區(qū)塊鏈原理與技術(shù)》學(xué)習(xí)筆記 第五部分
-
5. 以太坊交易
- 5.1 交易內(nèi)容
- 5.2 交易費用
- 5.3 交易的周期
- 5.4 交易的執(zhí)行類型
-
6. 以太坊的共識機制
- 6.1 解決以太坊分叉:Ghost協(xié)議
- 6.2 新的共識機制:PoS
-
7. 以太坊挖礦難度調(diào)整
- 7.1 自適應(yīng)難度調(diào)整
- 7.2 難度炸彈
-
8. 數(shù)據(jù)結(jié)構(gòu)與存儲
- 8.1 區(qū)塊和叔塊
- 8.2 默克爾前綴樹(Merkle Patricia Trie)
- 8.3 布隆過濾器(Bloom Filter)
5. 以太坊交易
以太坊中,交易承載了賬戶轉(zhuǎn)賬和合約創(chuàng)建、調(diào)用合約等功能。
5.1 交易內(nèi)容
交易中的數(shù)據(jù)大體分為基本的交易、交易的執(zhí)行參數(shù)、交易的簽名三個部分。
基本交易內(nèi)容
- From:交易發(fā)送者的地址,實際上由簽名中的<r,s,v>計算得到。
- To:交易接收者的地址。創(chuàng)建合約時設(shè)置為0x0000,調(diào)用合約時是合約的地址。
- Value:交易的金額。1Ether = 10^18 Wei。
交易的執(zhí)行參數(shù)
- Input Data:交易附帶數(shù)據(jù),傳遞創(chuàng)建合約的代碼/構(gòu)造函數(shù)、調(diào)用合約的函數(shù)和參數(shù)。
- Nonce:交易發(fā)送者的Nonce。
- MaxFeePerGas:發(fā)送者為交易愿意付出的最大price
- MaxPriorityFeePerGas:給礦工付出的最大小費
- gasLimit: 交易允許消費的最大gas,解決智能合約不能停機的問題。
交易的簽名
- hash:由以上字段生成的哈希值
- r,s,v:由發(fā)送者的私鑰對交易的哈希做數(shù)字簽名而成,用于確認轉(zhuǎn)賬的合法性。
5.2 交易費用
以太坊中交易的的手續(xù)費由Gas機制計算,主要包括以下概念:
- Gas:計算資源消耗的基礎(chǔ)單位
- GasLimit:允許消耗的最大Gas值
- GasUsed:執(zhí)行后消耗的Gas值
- GasPrice:每個Gas的以太幣價格
其中交易的Gas由基礎(chǔ)的交易Gas加上EVM運行時消耗的Gas值累加得到。當(dāng)GasUsed超過GasLimit,交易執(zhí)行失敗。
交易的GasUsed*GasPrice就是用戶為交易支付的手續(xù)費。
5.3 交易的周期
1.發(fā)起
- 用戶輸入from,to,value,data,gasPrice等
- 用戶確認發(fā)送至以太坊節(jié)點
- 以太坊錢包軟件為用戶補充gasLimit,nonce,使用私鑰得到r,s,v,最后將交易序列化后發(fā)送到網(wǎng)絡(luò)。
2.廣播
- 節(jié)點收到/發(fā)起交易后,對交易進行驗證
- 節(jié)點驗證為合法交易,將交易加入節(jié)點的交易池中
- 節(jié)點根據(jù)P2P網(wǎng)絡(luò)廣播的策略向相鄰節(jié)點繼續(xù)廣播交易
3.打包與執(zhí)行
- 全節(jié)點將交易打包,并將交易按順序執(zhí)行
- 所有需要打包的交易執(zhí)行后,將交易、狀態(tài)、收據(jù)的信息打包到區(qū)塊中。
- 記賬節(jié)點獲得合法區(qū)塊后,廣播到相鄰節(jié)點
4.驗證與執(zhí)行
- 沒有獲得記賬權(quán)的節(jié)點在收到廣播的區(qū)塊后,對區(qū)塊進行合法性驗證,并進行交易的執(zhí)行。
5.4 交易的執(zhí)行類型
根據(jù)to值的不同,交易的執(zhí)行分為以下3種:
1.創(chuàng)建合約交易
to為空的交易,交易根據(jù)from和nonce值生成合約地址,并執(zhí)行data中的智能合約代碼。EVM會將代碼存儲到合約地址中。
2.調(diào)用合約交易
to為合約賬戶的交易。EVM獲取to地址中的代碼,并執(zhí)行data中的代碼。
本質(zhì)上來說。對合約的調(diào)用就是對合約狀態(tài)的修改。
3.普通轉(zhuǎn)賬交易
to為人控制的賬戶(外部賬戶),交易直接將以太幣從from轉(zhuǎn)到to
6. 以太坊的共識機制
6.1 解決以太坊分叉:Ghost協(xié)議
叔塊
指不在主鏈但被主鏈記錄的滿足難度的區(qū)塊。礦工在打包區(qū)塊時,可以自主選擇合法的0-2個叔塊。
以太坊中規(guī)定,7代以內(nèi)的有共同祖先的都可以認為是叔父塊。
叔父塊的接納和獎勵規(guī)則
- 對于主鏈上的區(qū)塊,每個區(qū)塊最多接納2個叔父塊,每接納一個叔父塊,主鏈區(qū)塊獎勵增加1/32。
- 接納的叔父塊應(yīng)該是主鏈上祖先的直接子塊,且不能重復(fù)接納叔父塊。
- 被接納的叔父塊,獲得出塊獎勵為1-(接納塊高度-叔父塊高度)/8
- 叔父塊中的交易不需要執(zhí)行。
叔父塊可以盡量收縮和統(tǒng)一整個區(qū)塊鏈的主鏈,同時維護礦工的積極性。
6.2 新的共識機制:PoS
權(quán)益證明(Proof-of-Stake):持有幣的數(shù)量和占有幣數(shù)的時間來決定你獲得本次記賬權(quán)利的概率。持有越多,獲得記賬概率越大。
相比PoW縮短了達成共識時間,節(jié)省能源,但是容易分叉和中心化。
7. 以太坊挖礦難度調(diào)整
挖礦難度的公式為:
H
=
0
,
D
(
H
)
=
0
D
(
H
)
=
m
a
x
(
D
0
,
P
(
H
)
H
d
+
x
×
ζ
2
)
+
?
H=0,D(H)=0 \\ D(H)=max(D_0,P(H)_{H_d}+x × \zeta_2)+\epsilon
H=0,D(H)=0D(H)=max(D0?,P(H)Hd??+x×ζ2?)+?
其中
P
(
H
)
H
d
P(H)_{H_d}
P(H)Hd??是父區(qū)塊的難度,
x
×
ζ
2
x×\zeta_2
x×ζ2? 用于自適應(yīng)調(diào)節(jié)出塊難度,
?
\epsilon
?表示設(shè)定的難度炸彈
基礎(chǔ)部分有下界,最小值為 D 0 = 131072 D_0=131072 D0?=131072
7.1 自適應(yīng)難度調(diào)整
x
=
?
P
(
H
)
H
d
2048
?
,
?
ζ
2
=
m
a
x
(
y
?
?
H
s
?
P
(
H
)
H
s
9
?
,
?
99
)
x= \left\lfloor \frac{P(H)_{H_d}}{2048} \right\rfloor, \ \zeta_2=max \left( y-\left\lfloor \frac{H_s-P(H)_{H_s}}{9} \right\rfloor, -99 \right)
x=?2048P(H)Hd????,?ζ2?=max(y??9Hs??P(H)Hs????,?99)
x為調(diào)整的單位,
ζ
2
\zeta_2
ζ2? 為調(diào)整的系數(shù)
如果父區(qū)塊中包含uncle,y為2,否則為1
H
s
H_s
Hs?是本區(qū)塊的時間戳,
P
(
H
)
H
s
P(H)_{H_s}
P(H)Hs??是父區(qū)塊的時間戳,并規(guī)定
H
s
>
P
(
H
)
H
s
H_s > P(H)_{H_s}
Hs?>P(H)Hs??
7.2 難度炸彈
?
=
?
2
?
H
i
′
/
100
,
000
?
?
2
?
,
?
H
i
′
=
m
a
x
(
H
i
?
30
,
000
,
000
)
\epsilon = \left\lfloor 2^{\lfloor H'_i / 100,000 \rfloor -2} \right\rfloor, \ H'_i=max(H_i-30,000,000)
?=?2?Hi′?/100,000??2?,?Hi′?=max(Hi??30,000,000)
?
\epsilon
? 是2的指數(shù)函數(shù)。每100000塊擴大一倍
設(shè)置難度炸彈是為了降低遷移到PoS協(xié)議時發(fā)生fork的風(fēng)險,引導(dǎo)礦工有意愿遷移到PoS。
8. 數(shù)據(jù)結(jié)構(gòu)與存儲
8.1 區(qū)塊和叔塊
以太坊區(qū)塊的區(qū)塊頭包括:
- 記錄以太坊狀態(tài)的狀態(tài)根
- 交易列表、收據(jù)列表、父塊和叔塊的哈希值
- 區(qū)塊號、難度、礦工地址、時間戳、Nonce值
- gas上限、交易gas之和、工作量證明摘要
- 可變長度字段
以太坊區(qū)塊體的內(nèi)容:
- 由交易組成的TX列表
- 有交易執(zhí)行信息組成的收據(jù)列表
- 用于改進以太坊共識過程的叔塊列表
世界狀態(tài)
以太坊中所有賬戶的狀態(tài)的匯總,也就是區(qū)塊頭的狀態(tài)根,通過一個特殊的樹狀哈希數(shù)據(jù)結(jié)構(gòu)實現(xiàn)。
收據(jù)
對應(yīng)交易的數(shù)據(jù)結(jié)構(gòu),代表交易執(zhí)行的一些中間狀態(tài)寫入和交易的執(zhí)行結(jié)果等信息。
收據(jù)的內(nèi)容包括:
- 以太坊的智能合約向EVM輸出的執(zhí)行日志
- 智能合約執(zhí)行的Gas
- 單個交易執(zhí)行完畢后以太坊的狀態(tài)根
- 如果交易創(chuàng)建合約,收據(jù)中寫入新建合約的地址
8.2 默克爾前綴樹(Merkle Patricia Trie)
由于以太坊潛在的賬戶數(shù)量巨大,單使用Merkle Tree無法存儲數(shù)據(jù),且修改成本高,因此以太坊使用了十六叉壓縮前綴樹,作為地址到賬戶的索引,然后利用Merkle Tree將每一層節(jié)點合并計算節(jié)點的哈希值,最后得到根哈希值。
壓縮前綴樹
普通的字典樹(Trie)為每一個字母作為樹的節(jié)點,這樣導(dǎo)致樹的高度太高,浪費存儲空間;壓縮前綴樹(Patricia Trie)將共同的前綴部分組成一個子樹,逐級向下劃分,提高了查找效率。
MPT
在MPT中,“單詞”對應(yīng)賬戶的哈希值,“指針”對應(yīng)哈希指針。葉子節(jié)點記錄(前綴+賬戶哈希值)的哈希值,父節(jié)點的哈希值為(前綴+子分支)的哈希值。
以下圖為例:
H1=H(“”+賬戶1的哈希值),H3=H(d+賬戶3的哈希值)
H5=H(bc+H1+H2+“”+“”+…+“”)
H6=H(b+H4+…+“”+H3+“+”“)
H_root=H(”“+…+”“+H5+…+”“+H6+”")
狀態(tài)樹
以太坊的狀態(tài)樹記錄各個賬號的狀態(tài),當(dāng)狀態(tài)改變后只會影響對應(yīng)分支的狀態(tài),區(qū)塊存儲對應(yīng)狀態(tài)樹的狀態(tài)根。
合約存儲樹
合約賬戶存儲樹也使用了MPT來記錄存儲地址到存儲值的映射,映射表的哈希值叫做存儲根(storage root)。
由于合約存儲空間中的一個單位剛好為256位,所以可以直接當(dāng)葉子節(jié)點
交易樹和收據(jù)樹
這兩棵樹通過交易/收據(jù)在區(qū)塊中的序號來構(gòu)建MPT,收據(jù)和交易的信息一一對應(yīng)。
8.3 布隆過濾器(Bloom Filter)
布隆過濾器可以檢索一個值是否在一個集合中,以太坊用來對收據(jù)的日志進行索引、查找。
在容忍一定錯誤率的情況下,它的效率很高。
原理:用多個哈希函數(shù)將鍵值映射到一個位圖中。對于一個鍵值,若在同樣的哈希函數(shù)映射下,沒有在位圖中出現(xiàn)標記位,則鍵值一定不在集合中。文章來源:http://www.zghlxwxcb.cn/news/detail-517202.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-517202.html
到了這里,關(guān)于《區(qū)塊鏈原理與技術(shù)》學(xué)習(xí)筆記(五) ——以太坊的交易、共識機制和數(shù)據(jù)結(jié)構(gòu)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!