如何在以太坊上执行交易。在本文中,我们将讨论交易验证规则,以及它们存在的原因;然后我们将深入探讨交易是如何执行的,以及节点在验证交易时所采取的每一步。
欢迎关注和讨论
0x01 简介
简单来说,状态转换函数使用当前状态和交易作为输入来计算下一个状态。
0x02 交易验证
在执行交易之前,节点会验证交易是否满足一些基本规则。如果连这些基本规则都没有通过,节点就不会执行交易。
还有一个规则,不是交易的固有规则——如果一系列准备打包成区块的交易,加上这个交易,会让所有交易的总 Gas Limit 超过区块的 Gas Limit ,则该交易无法与这些交易打包到一个区块中。
- 满足 RLP 编码格式
RLP(Recursive Length Prefix)是以太坊中序列化对象的一种编码方式;与其他方法一样,如果不按照 RLP 对对象进行编码,则无法对对象进行解码,也无法通过数据编码信息得到原始对象。这条规则的目的是保证以太坊客户端在收到交易后能够成功解码并执行。
- 交易必须有合法签名
假设你的以太坊账户中有很多以太币,现在有人试图发起一笔交易,将你账户中的钱转给他自己,你怎么看?你绝对不希望看到有人冒充你并窃取你的钱,这就是我们需要交易签名的原因。以太坊使用非对称加密货币来确保只有实际控制人才能从账户发起交易。在以太坊上,账户地址是从个人的公钥生成的。发送交易时,使用私钥对交易进行签名,所有节点然后可以确定交易是否由关联账户的私钥所有者实际签署。没有合法签名的交易没有执行意义,因此必须存在合法签名是交易的固有规则之一。
- 交易 nonce 和 account nonce 必须匹配
在以太坊中,账户 nonce 值表示该账户发送的交易数量(在合约账户的情况下,nonce 值是指该账户创建的合约数量)。如果没有随机数,同一笔交易可能会被错误地执行多次(所谓的“重放攻击”)。以太坊强制交易 nonce 值与账户 nonce 值匹配。这不仅可以防止重放攻击,还可以确保事务只会执行和更改一次状态。
- 交易的内在成本必须小于交易设定的gas cap
每笔交易都有与之相关的gas——发送交易的成本由两部分组成:固有成本和执行成本。执行成本取决于交易需要运行多少以太坊虚拟机(EVM)资源,执行交易所需的操作越多,执行成本就越高。内在成本由交易的有效载荷决定,分为以下三种有效载荷:
- 如果交易是创建智能合约,payload就是创建智能合约的EVM代码
- 如果交易是调用智能合约的函数,payload就是执行消息的输入数据
- 如果交易只是两个账户之间的转账,则payload为空
- Gtransaction = 21,000 Wei
- Gtxcreate = 32,000 Wei
- Gtxdatazero = 4 Wei
- Gtxdatanonzero = 68 Wei
交易前
Pre-Transaction=gasLimit * gasPrice + value(一笔交易的 Gas Limit)
0x03 执行交易
验证交易后,是时候执行它了。在以太坊中,执行一个交易会改变状态——几个交易被打包成一个区块,每个区块相当于一个交易列表;当交易按顺序执行时,一个新的合法状态是一个输出。交易执行如下:
- 将发件人帐户 nonce 值增加 1
- 从发送方账户中扣除交易预付款(gasLimit * gasPrice)
- 确定交易可用于执行的 gas 值(gasLimit — 内在成本)
- 执行交易中包含的操作(转账、调用或创建智能合约)
- 通过SELFDESTRUCT和SSTORE功能为发件人退款
- 将任何未使用的gas退还给交易的发送者
- 将挖矿收益转入受益人账户(通常属于挖出包含交易的区块的矿工)
参考:https://ethereum.github.io/yellowpaper/paper.pdf
内容搜集自网络,整理者:BTCover,如若侵权请联系站长,会尽快删除。