以太坊币机器(基于交易的状态机——以太坊的交易详解)
一般来说,以太坊更像是一个基于交易的状态机,在不同账户之间发生的交易正是以太坊从一个状态转移到另一个状态的原因。
因此,交易可以看做是一个由外部拥有的帐户生成的序列化加密签名指令,比特币购买然后提交给区块链。
以太坊的交易分为两类:一是“消息调用”,二是“合约创建”(创建新的以太坊合约的交易)。
不管是哪一类交易,都应该包含以下组件:
- Nonce:发送方发送的交易数量的计数;
- gasPrice:发送方愿意支付每单位Gas所需执行交易的Wei数量;
- gasLimit:发送方愿意支付的执行这一交易的Gas最大数量。这个数额是预先设定和支付的;
- to:接收方的地址,在创建合约的交易中,合约帐户地址还不存在,因此使用了空值;
- Value:从发送方转移到收件方的金额,在创建合约的交易中,这个Value作为新创建合约账户内的起始余额;
- v, r, s:用于生成识别交易发送方的签名;
- Init(只存在于创建合同的交易中):用于初始化新合约帐户的EVM代码片段,它只运行一次,然后被丢弃,当init第一次运行时,它会返回帐户代码的主体,这个代码是与合约帐户永久关联的一段代码;
- data(只存在于消息调用中的可选字段):消息调用的输入数据(即参数)。例如,如果一个智能合约充当域名注册服务,那么对该合约的调用可能会有诸如域名以及IP地址等输入字段。
在说「账户」的时候,我们看到,交易(包括消息调用和合约创建的交易),总是由外部账户启动并提交给区块链的。另一种思考方式是,交易是连接外部世界与以太坊内部状态的桥梁。
但这并不意味着一个合约不能与其他合约对话。在全局范围内存在的合约,可以与同一范围内的其他合约进行交流。它们是以通过「消息」或「内部交易」的方式来实现的。我们可以认为消息或内部交易类似于交易,其主要区别在于它们不是由外部账户所产生的,相反,是由合约产生的,是虚拟对象。与交易不同,合约不是序列化的,而是只存在于以太坊的执行环境中。
当一个合约将一个内部交易发送到另一个合约时,存在于接收方合约账户上的关联代码就会被执行。
需要注意的一点是,内部交易或消息不包含Gas Limit。这是因为Gas Limit是由原始交易的外部创建者(即部分外部帐户)来决定的。外部账户集合的Gas Limit必须足够高,以便进行交易,这包括由这一交易而导致发生的任何次级处理运行,例如合约对合约的消息。如果在交易和消息链中,特定的消息执行耗尽了Gas,那么该消息的执行将与执行引发的所有后续消息一起恢复。不过,上一级的执行不需要恢复。
","content_hash"!"7e6ea7cb
评论