待字閨中開發(fā)了一門區(qū)塊鏈方面的課程:《深入淺出ETH原理與智能合約開發(fā)》挽鞠,馬良老師講授闹究。此簡書文集記錄我的學(xué)習(xí)筆記。
課程共8節(jié)課珠插。其中惧磺,前四課講ETH原理,后四課講智能合約捻撑。
第二課分為三部分:
- 以太坊交易
- MPT與RLP
- MPT與RLP實驗
這篇文章是第二課第一部分的學(xué)習(xí)筆記:以太坊交易豺妓。
關(guān)于以太坊的交易,課程中講了三部分的內(nèi)容布讹,分別是以太坊交易模型、交易的結(jié)構(gòu)和交易的生命周期训堆。
1. 以太坊交易模型
交易模型部分分別講解了比特幣的UTXO交易模型描验,以太坊的Account交易模型,并通過對比來說明兩者的優(yōu)劣坑鱼。
1.1 比特幣的 UTXO 交易模型
比特幣的交易采用了UTXO模型膘流,其中UTXO 代表 Unspent Transaction Output,即未花費(fèi)的交易輸出鲁沥。通過下圖來說明呼股。
圖中使用的比特幣單位是聰(satoshi),交易費(fèi)都按10k計算画恰。
交易0表示彭谁,某個地址有100k的未花費(fèi)交易輸出(UTXO),向另外兩個地址分別轉(zhuǎn)賬40k和50k允扇,這樣那兩個地址就分別有了40k和50k的UTXO缠局。
交易1表示,一個含有40k的UTXO的某地址向外轉(zhuǎn)賬考润,除去10k的交易費(fèi)狭园,接收地址就得到了30k的UTXO。
其它的交易依次類推糊治。
這樣唱矛,整個系統(tǒng)的收支狀態(tài)信息都保存在UTXO中。每一個UTXO都由私鑰控制,解鎖后才能使用绎谦。
這種設(shè)計的好處是管闷,有一定的保密性,如果一個用戶經(jīng)常更換地址燥滑,外界就不容易判斷他的身份渐北。但這對智能合約系統(tǒng)來說,就是不利的地方铭拧,因為智能合約需要一個確定的身份來操作赃蛛。
它的缺點是會影響區(qū)塊的尺寸,如果在某個交易中搀菩,有1000個交易輸入呕臂,那就需要1000個解鎖,這會造成區(qū)塊的尺寸增大肪跋,尺寸大的區(qū)塊就需要多的交易費(fèi)歧蒋。交易費(fèi)在這里就是控制因素,使得交易盡量采用少的輸入州既。
它還有一個缺點很難精細(xì)地控制使用哪些輸入谜洽,假如要花費(fèi)5個比特幣,有50種排列組合吴叶,到底選哪個呢阐虚,不易控制。以太坊則沒有這個缺點蚌卤,因為它是采用的賬戶模型实束。一個賬戶對應(yīng)一個余額。
下面是以太坊賬戶交易模型的介紹逊彭。
1.2 以太坊的 Account 交易模型
在以太坊中采用賬戶模型咸灿,這種設(shè)計不易于隱藏身份,通過合約來混淆侮叮。
這種模型節(jié)省空間避矢;實現(xiàn)比較簡單。
DAPP(分布式應(yīng)用)也需要這種模型囊榜,在應(yīng)用中谷异,合約的發(fā)起、調(diào)用都需要特定的人來執(zhí)行锦聊。而在比特幣中歹嘹,如果輸入比較多,則不易控制孔庭。
歷史信息獲取也比較簡單尺上,可以只檢查更新的部分材蛛。
同時簽名驗證次數(shù)少,不像比特幣要依賴輸入的多少怎抛。
2. 以太坊交易的結(jié)構(gòu)
2.1 賬戶類型
以太坊中有兩種類型的賬戶:
外部賬戶(Externally Owned Accounts 或EOA):被私鑰控制卑吭,沒有與合約代碼相關(guān)聯(lián),有余額马绝《股停可以發(fā)起和簽名交易,可以創(chuàng)建合約富稻。
其地址長度為公鑰的Keccak256散列值的最后20個字節(jié)掷邦。
合約賬戶:被合約代碼控制,同樣有余額椭赋。能被外部賬戶調(diào)用來激活抚岗,也可以通過另外一個合約賬戶來激活。
合約賬號一經(jīng)創(chuàng)建哪怔,存在于區(qū)塊鏈中宣蔚。一旦接收到消息,其包含的代碼被激活開始運(yùn)行认境,它修改全局狀態(tài)或向其它合約繼續(xù)發(fā)送消息胚委。
2.2 交易的內(nèi)部結(jié)構(gòu)
交易中的幾個參數(shù)介紹:
- To: 交易接收方地址(20Bytes)
- Value: 交易發(fā)送的ether數(shù)量(wei)
- Startgas:交易者愿意花費(fèi)的最大Gas數(shù)量
- Gasprice: 交易者愿意支付的Gas價格
- startgas*gasprice = 最終ether數(shù)值
- nonce: 交易發(fā)起者填寫的序列號,防止重放攻擊
- Data:可變長度的二進(jìn)制數(shù)據(jù)載荷
- V,R,S: ECDSA數(shù)字簽名信息
2.3 注意事項
- 不要發(fā)送到無效地址叉信!這樣會丟失以太幣亩冬。
- 發(fā)往合約賬號的交易一般需要符合調(diào)用規(guī)范,否則會調(diào)用合約fallback函數(shù)茉盏,如果正常則調(diào)用并轉(zhuǎn)賬到該函數(shù)。
- 地址0用來創(chuàng)建合約枢冤,合約編譯結(jié)果是data鸠姨。創(chuàng)建合約需要消耗Gas。
- 專有的銷毀以太幣地址0xdead淹真,一般用不到讶迁。
3. 以太坊交易的生命周期
這里有一個交易執(zhí)行過程的例子。如圖核蘸,有三個節(jié)點巍糯,Alice節(jié)點,Charlie節(jié)點客扎,礦工節(jié)點祟峦。
- Alice發(fā)布一筆交易,給Bob轉(zhuǎn)賬 1 ether徙鱼。
- 交易廣播到所有的節(jié)點宅楞。
- 礦工節(jié)點開始挖礦针姿,贏得競爭后,記錄新區(qū)塊厌衙,Alice 的余額變?yōu)?18.98** ether距淫,比 19 少的那部分是交易費(fèi),Bob 的余額變?yōu)?6 ether婶希。
- 礦工將新區(qū)塊廣播出去榕暇,其它節(jié)點更新區(qū)塊。
經(jīng)過若干個區(qū)塊喻杈,Alice 的交易被認(rèn)為是安全的彤枢。