交易和消息(Transaction and Messages)

By | 2018年12月1日

交易是EOA(外部所有账户,External Owned Account,文末有解读)发送的,用于转账、部署合约、触发合约;

消息是合约发送给合约的,用于进行合约间的调用。

注意,消息调用不等于消息!

 

交易(Transaction):

以太坊是一个由交易驱动的状态机——也就是说,以太坊世界状态的改变是由交易驱动的。

交易在本质上是由EOA生成并签名的“指令”——它指出了将要如何修改以太坊的状态——这个指令在被序列化之后提交上链,永久储存。

交易分为两种——消息调用交易和合约创建交易(即用来创建新的智能合约的交易)

(这里把普通的EOA之间的转账也称为“消息调用”,只不过这种消息调用只包含 value 字段)

所有的交易都包含以下几个部分:

nonce:发送者所发送过历史交易的数量(也就是“交易计数器”,包括这个交易本身);

gasPrice:发送者为执行这笔交易所使用的每单位gas所给出的价格;

gasLimit:发送者愿意支付的用于执行这笔交易的gas最大。这个数量的gas将被在交易完成前提前支付;

to:收款人的地址。若交易为合约创建交易——没有收款人——则此段留空;

value:从转账人到收款人的转账数额。若交易是合约创建交易,则这笔钱就会成为新建的合约的初始余额;

v, r, s:用于生成验证交易发送者身份的签名;

data(可选字段):进行消息调用时的输入数据(即参数),比如要调用一个域名注册合约,那么就应该输入一个域名和一个ip地址作为参数。在合约创建交易中起着初始化工具的作用;

消息调用交易、合约创建交易都是需要由EOA发送并提交上链的,因此可以认为,交易是一种连接EOA和以太坊内部状态(internal state)的桥梁。

 

消息(Message):

EOA之外,一个合约本身也可以调用另一个合约——这种行为被称为“消息”或“内部交易”。消息与交易类似,但区别在于:1. 交易由EOA发送而消息由合约发送,用于触发接受者账户中的代码;2. 消息不会被序列化后上链,它只存在于以太坊的运行环境中。

需要注意的是,消息不包含gasLimit字段——gasLimit不由直接发起调用的合约决定,而由发起这一连串连锁调用的EOA决定。EOA在发送最初交易时设置的gasLimit必须足够支付这一连串的执行开销。如果在连锁调用的途中gas被完全消耗没有剩余,则该合约的运行将被回滚,将要调用的子合约将取消调用,而已经执行完毕的父合约执行则不会被回滚。

 

 

关于以太坊“内部”、“外部”概念的思考

以太坊是一个世界、一个体系,它自有一套全局状态,它内部本身就是一个世界——这个世界包含存储历史的区块链结构、运行环境EVM、全局状态state。在这之中发生的事情——比如上面提到的“消息”就叫做内部事件;而影响内部变化的终究是来自外部的交易(重复一遍,交易的本质是:推动以太坊世界状态——世界状态是所有账户个人状态的总和——改变的指令),“来自外部的交易”中所述的外部即以太坊世界的外部,也就是在现实世界中的我们。因此,由人类创建的,人类来操作的账户就被称作“EOA”了。

 


写博不易,如果读的开心,可以考虑请我吃包辣条 ~

人间自有真情在,五毛一块也是爱

点击量:499

发表评论

邮箱地址不会被公开。 必填项已用*标注