【易錯概念】以太坊的交易(transaction),消息(message)和調用(call)

交易和消息是以太坊系統中很關鍵的兩個概念,同時也是兩個非常類似的概念,它們在形式上近乎相同,但是本質上卻又完全不同。這篇博客會將交易(Transaction)、消息(Message)和調用(Message Call)進行介紹和區分。

交易(Transaction)是什么?

交易存儲了發送者要發送至以太坊網絡的經過簽名的信息,它其中包含了從一個賬戶要傳遞給另一個賬戶(或者合約)的信息。在以太坊中,有兩種類型的交易:一種是能夠產生消息調用的交易,另一種是能夠生成新賬戶的交易(比如說生成合約)

籠統的來說,一個完整有效的以太坊交易包含以下幾個部分:

  • 交易接收者
  • 簽名(用以核實交易發送者身份)
  • value值(發送的以太幣數量,以wei為單位)
  • 可選數據域
  • STARTGAS值
  • GASPRICE值

交易中的字段

根據以太坊黃皮書,我們知道一個交易中有以下字段:

  • nonce:該字段表示的是交易發送者的交易序列號,它是賬號的一個交易計數器,這個字段能夠防止重放攻擊(replay attack)。
  • gasPrice:gas的價格,用于計算交易費用
  • gasLimit:執行這筆交易所花費的gas的上限
  • to:交易接收者的地址或者合約的地址
  • value:要發送的以太幣數量,以wei為單位
  • v, s, r:簽名相關的參數,通過這三個參數可以得到發送者的公鑰和地址(更詳細的內容參見以太坊黃皮書附錄F)

如果該交易是一個創建合約的交易,還可能包括以下字段:

  • init:用于初始化交易的EVM(以太坊虛擬機)操作碼
  • data:數據域(理論上數據域的大小是不受限制的)

消息(Message)是什么?

消息在以太坊中是一個“虛擬”的事物,它永遠不會被記錄到區塊鏈中,它是由合約發出的。從形式上看,消息很“像”交易,但是它與交易有著本質上的區別,一筆成功的交易會被永久的記錄到區塊鏈中。在以太坊中,我們可以把消息看做在EVM中的函數調用。

一般來說,一條消息會包含以下幾個部分:

  • 消息的發送者
  • 消息的接收者
  • 以太幣的數量(以wei為單位)
  • 可選數據域
  • STARTGAS
  • GASPRICE

交易、消息與調用(Message Call)的區別

以太坊黃皮書中對交易(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.
由外部參與者簽名后的一段數據。它代表了一條信息或者一個新創建的自治對象(合約)。交易會被記錄至區塊鏈的區塊中。

對消息(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.
在兩個賬戶之間傳輸的數據(一組字節)和值(以太幣的數量),形式是合約的確定性操作或者經過加密安全簽名的交易。

對調用(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.
從一個賬戶發送至另一個賬戶的消息的行為。如果目標賬戶關聯著非空的EVM操作碼,VM就會按照該操作碼的狀態進行啟動。如果消息的發送者是一個自治對象,那么該調用將會傳遞所有返回自VM操作的數據。

具體來說,調用是對合約的本地調用,它是只讀的操作并且不會消耗以太幣。它能夠模擬交易的行為,但是在調用結束以后,它會返回至之前的狀態。交易是會被廣播至整個網絡的,被礦工處理驗證之后會被記錄至區塊鏈的區塊中。

合約中函數的調用創建的是調用還是交易?

考慮一下這四種情況:

  • 使用調用(call)直接對合約函數進行調用
  • 使用sendTransaction直接對合約函數進行調用
  • 使用調用(call)通過合約對合約函數進行調用
  • 使用sendTransaction通過合約對合約函數進行調用

第一種情況與第三種情況是很明顯的調用,第二種情況由于使用的是sendTransaction方法,因此它創建了一筆交易。比較特殊的是第四種情況,它看似是生成了一筆交易,但是由于以太坊黃皮書中對交易的定義中提到,交易是需要外部參與者(External Actor)進行簽名的消息,所以第四種情況沒有生成交易。


本文的版權歸作者 羅遠航 所有,采用 Attribution-NonCommercial 3.0 License。任何人可以進行轉載、分享,但不可在未經允許的情況下用于商業用途;轉載請注明出處。感謝配合!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容