第九章|第九章 交易

想利用一点休息时间,把《精通以太坊》翻译一下,是否有同行人?
第九章|第九章 交易
文章图片
交易是由外部账户发起的签名消息,通过以太网络进行传播,并由以太区块链记录。在最基本的定义背后,有很多令人惊艳的细节。从另一种方式来看,交易是唯一能够引起状态变化或者触发合约在以太虚拟机里面执行的东西。以太坊是全球唯一的状态机,而交易是唯一能够使这个状态机的状态发生变化的东西。合约不能自己执行。以太坊不会“在背后”执行,任何事情都会开始于一笔交易。
在这一章,我们将对交易进行剖析,说明交易是如何工作的,并理解其中的细节。值得注意的是,本章很多内容是面向那些想在更基础的层次上管理自己交易的用户,比如,想编写一个钱包软件;当然,虽然你会觉得这些细节很有趣,但如果你乐意去使用现有的钱包应用,也不是一定要去担心这些事情。
交易的结构
首先,让我们看一下,一笔交易在以太网络上被序列化并进行传输时的基本结构。接收到一条序列化交易的每一个客户端或应用,都会采用自己的内部数据结构,将交易数据存储在内存中,当然也许会用一些网络序列化交易自身没有的元数据进行修饰。一笔交易的网络序列化应该是交易结构的唯一公共标准。
一笔交易是一个序列化的二进制消息,包含如下数据:
随机数(nonce)
一个顺序数,由一个发送外部账户发布,用于阻止消息重放。
gas price
发送者愿意支付执行交易所需的每个gas的Wei数量,即gas的价格。
gas limit
发送者愿意为执行交易支付gas数量的最大值。这个数量被设置之后在任何
计算完成之前就会被提前扣掉。
to
接收者的地址。在合约创建交易中,合约账户的地址还没有存在,所以值先空着
value
从发送者转移到接收者的Wei数量。在合约创建交易中,value作为新建合约账
户的开始余额。
v,r,s:用于产生标识交易发生着的签名。
init(只有在合约创建交易中存在)
用来初始化新合约账户的EVM代码片段。init值会执行一次,然后就会被丢弃。当init第一次执行的时候,它返回一个账户代码体,也就是永久与合约账户关联的一段代码。
data(可选域,只有在消息通信中存在)
消息通话中的输入数据(也就是参数)。例如,如果智能合约就是一个域名注册服务,那么调用合约可能就会期待输入域例如域名和IP地址。
交易消息的结构采用递归前缀长度编码方案进行序列化,which was created specifically for accurate and byte-perfect data
serialization in Ethereum. 以太坊中的所有数字都被编码为大端整数,长度是8位的倍数。
请注意字段标签 ("to", "gas limit", etc.) 列出来只是为了清楚起见,并不是包含字段值得序列化交易数据的一部分。一般而言,RLP不包含任何字段分界符或标签。RLP的长度前缀是用来确定每个字段的长度,因此,任何超过定义长度的数据属于结构的下一个字段。
虽然这是实际传输的交易结构,但很多内部表征或用户界面可视化程序用一些附加的信息对来自交易或区块链的数据结构进行了美化。
【第九章|第九章 交易】比如,你会注意到这里没有表示发起账户地址的“来源”数据。这是因为外部账户的公钥可以由v,r,s ECDSA签名组件获得。反过来,地址又可以由公钥获得。当你看到一笔交易中含有“来自”字段,这是软件为了可视化交易,自己增加的。其他一些经常被客服端软件添加的元数据包括:区块高度(一旦区块被挖出并写入区块链就会确定的数)、交易ID(由交易头得到的哈希值)等。同样,这些数据来源于交易,但并不是交易消息本身的一部分。

    推荐阅读