理解以太坊的交易(transaction),消息(message)和调用(call)
交易和消息是以太坊系统中很关键的两个概念,同时也是两个非常类似的概念,它们在形式上近乎相同,但是本质上却又完全不同。这篇博客会将交易(Transaction)、消息(Message)和调用(Message Call)进行介绍和区分。
交易存储了发送者要发送至以太坊网络的经过签名的信息,它其中包含了从一个账户要传递给另一个账户(或者合约)的信息。在以太坊中,有两种类型的交易: 一种是能够产生消息调用的交易,另一种是能够生成新账户的交易(比如说生成合约) 。
笼统的来说,一个完整有效的以太坊交易包含以下几个部分:
根据以 太坊黄皮书 ,我们知道一个交易中有以下字段:
如果该交易是一个创建合约的交易,还可能包括以下字段:
消息在以太坊中是一个“虚拟”的事物,它永远不会被记录到区块链中,它是由合约发出的。从形式上看,消息很“像”交易,但是它与交易有着本质上的区别,一笔成功的交易会被永久的记录到区块链中。在以太坊中,我们可以把消息看做在EVM中的函数调用。
一般来说,一条消息会包含以下几个部分:
以太坊黄皮书中对交易(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操作的数据。
具体来说,调用是对合约的本地调用,它是只读的操作并且不会消耗以太币。它能够模拟交易的行为,但是在调用结束以后,它会返回至之前的状态。交易是会被广播至整个网络的,被矿工处理验证之后会被记录至区块链的区块中。
考虑一下这四种情况:
第一种情况与第三种情况是很明显的调用,第二种情况由于使用的是sendTransaction方法,因此它创建了一笔交易。比较特殊的是第四种情况,它看似是生成了一笔交易,但是由于以太坊黄皮书中对交易的定义中提到,交易是需要外部参与者(External Actor)进行签名的消息,所以第四种情况没有生成交易。
本文的版权归作者 罗远航 所有,采用 Attribution-NonCommercial 3.0 License 。任何人可以进行转载、分享,但不可在未经允许的情况下用于商业用途;转载请注明出处。感谢配合!
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!