交易和消息是以太坊系統(tǒng)中很關(guān)鍵的兩個概念蟆豫,同時也是兩個非常類似的概念篙耗,它們在形式上近乎相同,但是本質(zhì)上卻又完全不同引润。這篇博客會將交易(Transaction)巩趁、消息(Message)和調(diào)用(Message Call)進(jìn)行介紹和區(qū)分。
交易(Transaction)是什么淳附?
交易存儲了發(fā)送者要發(fā)送至以太坊網(wǎng)絡(luò)的經(jīng)過簽名的信息议慰,它其中包含了從一個賬戶要傳遞給另一個賬戶(或者合約)的信息。在以太坊中奴曙,有兩種類型的交易:一種是能夠產(chǎn)生消息調(diào)用的交易别凹,另一種是能夠生成新賬戶的交易(比如說生成合約)。
籠統(tǒng)的來說洽糟,一個完整有效的以太坊交易包含以下幾個部分:
- 交易接收者
- 簽名(用以核實交易發(fā)送者身份)
- value值(發(fā)送的以太幣數(shù)量炉菲,以wei為單位)
- 可選數(shù)據(jù)域
- STARTGAS值
- GASPRICE值
交易中的字段
根據(jù)以太坊黃皮書,我們知道一個交易中有以下字段:
- nonce:該字段表示的是交易發(fā)送者的交易序列號坤溃,它是賬號的一個交易計數(shù)器拍霜,這個字段能夠防止重放攻擊(replay attack)。
- gasPrice:gas的價格薪介,用于計算交易費用
- gasLimit:執(zhí)行這筆交易所花費的gas的上限
- to:交易接收者的地址或者合約的地址
- value:要發(fā)送的以太幣數(shù)量祠饺,以wei為單位
- v, s, r:簽名相關(guān)的參數(shù),通過這三個參數(shù)可以得到發(fā)送者的公鑰和地址(更詳細(xì)的內(nèi)容參見以太坊黃皮書附錄F)
如果該交易是一個創(chuàng)建合約的交易汁政,還可能包括以下字段:
- init:用于初始化交易的EVM(以太坊虛擬機(jī))操作碼
- data:數(shù)據(jù)域(理論上數(shù)據(jù)域的大小是不受限制的)
消息(Message)是什么道偷?
消息在以太坊中是一個“虛擬”的事物,它永遠(yuǎn)不會被記錄到區(qū)塊鏈中记劈,它是由合約發(fā)出的勺鸦。從形式上看,消息很“像”交易抠蚣,但是它與交易有著本質(zhì)上的區(qū)別祝旷,一筆成功的交易會被永久的記錄到區(qū)塊鏈中履澳。在以太坊中嘶窄,我們可以把消息看做在EVM中的函數(shù)調(diào)用。
一般來說距贷,一條消息會包含以下幾個部分:
- 消息的發(fā)送者
- 消息的接收者
- 以太幣的數(shù)量(以wei為單位)
- 可選數(shù)據(jù)域
- STARTGAS
- GASPRICE
交易柄冲、消息與調(diào)用(Message Call)的區(qū)別
以太坊黃皮書中對交易(transations)的描述為:
A piece of data, signed by an External Actor. It represents either a Message or a new Autonomous Object. Transactions are recorded into each block of the blockchain.
由外部參與者簽名后的一段數(shù)據(jù)。它代表了一條信息或者一個新創(chuàng)建的自治對象(合約)忠蝗。交易會被記錄至區(qū)塊鏈的區(qū)塊中现横。
對消息(message)的描述為:
Data (as a set of bytes) and Value (specified as Ether) that is passed between two Accounts, either through the deterministic operation of an Autonomous Object or the cryptographically secure signature of the Transaction.
在兩個賬戶之間傳輸?shù)臄?shù)據(jù)(一組字節(jié))和值(以太幣的數(shù)量),形式是合約的確定性操作或者經(jīng)過加密安全簽名的交易。
對調(diào)用(call)的描述為:
The act of passing a message from one Account to another. If the destination account is associated with non-empty EVM Code, then the VM will be started with the state of said Object and the Message acted upon. If the message sender is an Autonomous Object, then the Call passes any data returned from the VM operation.
從一個賬戶發(fā)送至另一個賬戶的消息的行為戒祠。如果目標(biāo)賬戶關(guān)聯(lián)著非空的EVM操作碼骇两,VM就會按照該操作碼的狀態(tài)進(jìn)行啟動。如果消息的發(fā)送者是一個自治對象姜盈,那么該調(diào)用將會傳遞所有返回自VM操作的數(shù)據(jù)低千。
具體來說,調(diào)用是對合約的本地調(diào)用馏颂,它是只讀的操作并且不會消耗以太幣示血。它能夠模擬交易的行為,但是在調(diào)用結(jié)束以后救拉,它會返回至之前的狀態(tài)难审。交易是會被廣播至整個網(wǎng)絡(luò)的,被礦工處理驗證之后會被記錄至區(qū)塊鏈的區(qū)塊中亿絮。
合約中函數(shù)的調(diào)用創(chuàng)建的是調(diào)用還是交易告喊?
考慮一下這四種情況:
- 使用調(diào)用(call)直接對合約函數(shù)進(jìn)行調(diào)用
- 使用sendTransaction直接對合約函數(shù)進(jìn)行調(diào)用
- 使用調(diào)用(call)通過合約對合約函數(shù)進(jìn)行調(diào)用
- 使用sendTransaction通過合約對合約函數(shù)進(jìn)行調(diào)用
第一種情況與第三種情況是很明顯的調(diào)用,第二種情況由于使用的是sendTransaction方法派昧,因此它創(chuàng)建了一筆交易葱绒。比較特殊的是第四種情況,它看似是生成了一筆交易斗锭,但是由于以太坊黃皮書中對交易的定義中提到地淀,交易是需要外部參與者(External Actor)進(jìn)行簽名的消息,所以第四種情況沒有生成交易岖是。
本文的版權(quán)歸作者 羅遠(yuǎn)航 所有帮毁,采用 Attribution-NonCommercial 3.0 License。任何人可以進(jìn)行轉(zhuǎn)載豺撑、分享烈疚,但不可在未經(jīng)允許的情況下用于商業(yè)用途;轉(zhuǎn)載請注明出處聪轿。感謝配合爷肝!