以太坊的交易(transaction),消息(message)和调用(call)

  • 辉哥
  • 更新于 2018-08-20 11:39
  • 阅读 4213

理解以太坊的交易(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 。任何人可以进行转载、分享,但不可在未经允许的情况下用于商业用途;转载请注明出处。感谢配合!

点赞 1
收藏 1
分享

0 条评论

请先 登录 后评论
辉哥
辉哥
0x5bAe...0BE7
HiBlock技术社区上海合伙人,区块链落地产业应用布道者