主页 > imtoken官网网址 > 以太坊上执行交易过程的原理分析

以太坊上执行交易过程的原理分析

imtoken官网网址 2023-03-26 05:23:37

简介

在本系列文章中,我们讨论了以太坊如何作为分布式计算机工作,以及用户如何通过向系统发送交易与以太坊进行交互(还讨论了交易费用的概念)。

在第一篇博文中,我们了解了以太坊的状态转换功能,以及以太坊如何通过连续的状态转换来充当计算机。

简单来说,状态转移函数使用当前状态和交易作为输入,计算下一个状态。

以太坊上执行交易过程的原理解析

-以太坊状态转换函数-

在深入探讨以太坊中的节点如何执行交易之前,让我们先谈谈如何验证交易。

交易验证

在执行交易之前,节点将首先验证交易是否满足一些基本(固有)规则。如果连这些基本规则都没有通过,节点就不会执行交易。

这些交易的内在规则如下:

满足RLP编码格式

有一个有效的签名

有一个有效的nonce(与交易发送方交易的当前nonce值相同)

执行交易的内在成本(intrinsic cost)小于交易设定的gas limit交易

发送方账户余额大于等于交易所需的预付款

还有一个规则,不是交易的固有规则——如果一系列准备打包进区块的交易,加上这个交易,会让所有交易的总 Gas Limit 超过 Gas区块的限制,则交易无法与这些交易打包成一个区块。

让我们展开每条规则来解释这些规则是如何工作的以及它们存在的原因。

交易必须符合兼容的 RLP 编码

这条规则可能最好直观地理解。 RLP(Recursive Length Prefix,也称为Recursive Length Prefix Encoding)是以太坊中序列化对象的一种编码方式;和其他方法一样,如果不按照RLP对对象进行编码,就无法对对象进行编码解码,也无法通过数据编码得到原始对象的信息。

这个规则的目的是保证以太坊客户端收到交易后能够成功解码并执行。

交易必须有有效的签名

假设你的以太坊账户中有很多以太币,现在有人试图发起一笔从你的账户转账的交易,作为我的证据,你怎么看?您绝对不希望看到有人冒充您并窃取您的钱,这就是我们需要交易签名的原因。

以太坊使用非对称加密来确保只有实际控制人才能从账户发起交易。同时,这个加密工具可以让其他人验证交易确实是由账户的实际控制人发起的。

我不会详细介绍 ECDSA(以太坊选择的非对称加密算法),因为我们只需要了解最基本的概念。

在非对称加密中,公钥和私钥成对存在。私钥应完全保密,公钥可以与任何人共享;私钥可以用来签名,签名可以用对应的公钥验证。在以太坊上签署你发起的交易,就相当于签署你写的一封信,只不过加密签名比手写签名更难伪造!

在以太坊上,账户地址是从个人的公钥生成的。发送交易时,使用私钥对交易进行签名(还记得交易中包含的值v、r、s吗?),然后所有节点就可以判断该交易是否真的与帐户的私钥所有者。

没有合法签名的交易没有执行的意义,所以必须有合法的签名是交易的内在规则之一。

交易nonce和账户nonce必须匹配

在以太坊中,账户nonce值表示该账户发送的交易数量(如果是合约账户,nonce值是指该账户发送的交易数量。创建的合约数量)。如果没有随机数,同一笔交易可能会被错误地执行多次(所谓的“重放攻击”)。考虑到以太坊的分布式特性,不同的节点可能会尝试将相同的交易打包到不同的区块中,并将重复的交易放在链上。假设你转账给某人的交易被错误地打包了两次,导致你两次转账,你一定很不爽。

用户每次创建新交易时,都必须设置一个与当前账户 nonce 值匹配的交易 nonce 值。执行交易时,节点会检查交易nonce是否与账户nonce匹配。

如果由于某种原因,同一笔交易被重复提交给节点,此时,由于账户的nonce值已经增加,重复提交的交易将被认为是非法的。

以太坊强制交易 nonce 值与账户 nonce 值匹配。这不仅可以防止重放攻击,还可以确保事务只会执行和更改一次状态。

交易的内在成本必须小于交易设定的gas cap

在上一篇博文中,我们解释了为什么你需要付费才能使用以太坊,以及 gas 的概念。一般来说,每笔交易都有与之相关的gas——发送交易的成本由两部分组成:固有成本和执行成本。

执行成本取决于交易需要运行多少以太坊虚拟机 (EVM) 资源。执行交易所需的操作越多,执行成本就越高。

内在成本由交易的负载决定。交易的payload分为以下三种payload:

如果交易是创建智能合约,payload就是创建智能合约EVM代码

如果交易是调用智能合约的函数,payload就是执行消息的输入数据

如果交易只是两个账户之间的转账,则payload为空

假设 Nzeros 表示交易载荷中的总字节数为 0 字节; Nnonzeros 表示事务有效负载中具有非零字节的总字节数。该交易的内在成本可以通过以下公式计算(黄皮书6.第2章,公式54、55和56):

固有成本 = GtransacTIon + Gtxdatazero * Nzeros + Gtxdatanonzero * Nnonzeros + Gtxcreate

与创建和执行交易相关的费用表可以在黄皮书的附录 G 中找到。相关费用如下:

GtransacTIon = 21,000 韦

Gtxcreate = 32,000 韦

Gtxdatazero = 4 Wei

Gtxdatanonzero = 68 wei(在伊斯坦布尔升级时改为 16 wei)

当我们了解什么是固有成本时,我们就可以理解为什么一旦交易的固有成本高于 Gas Limit,该交易就被认为是非法的。 Gas Limit 指定交易执行时,可以消耗的 Gas 上限;如果我们在执行交易之前就知道它的内在成本高于gas上限,那么我们就没有理由执行交易。

交易发送方的账户余额必须大于或等于交易所需的预付款。

交易预付款是指交易执行前从发送方账户中扣除的Gas金额。

我们可以通过以下公式计算交易预付款:

预付款 = gasLimit * gasPrice + 价值

一笔交易的 Gas Limit 是指交易发送方愿意花费在执行交易上的 Gas 最大值; Gas Price是指每单位Gas的单价;交易价值是指发送给消息接收者的 Wei 金额(如转账金额),或投资于要创建的合约的准备金。要详细了解什么是 gas 以及执行交易为什么要花费 gas,请参阅我们之前的博客文章。

因为交易预付款是在交易执行前扣除的,一旦交易发送方的账户余额小于代扣金额,则无需执行交易。

交易的 Gas Limit 必须小于或等于区块的 Gas Limit

此规则不是固有规则,但这是节点在选择要打包的交易时需要遵守的基本要求。区块gas limit是可以在区块中“打包”的交易使用的总gas上限。

当节点选择要打包的交易时,节点必须保证在添加该交易后,该交易在区块中使用的总gas不会超过区块gas限制。对于要打包的交易,其 Gas Limit 加上其他交易的 Gas Limit 之和必须小于或等于区块 Gas Limit。当然,如果有交易不能打包到当前区块,它仍然有机会被后续区块打包。

执行交易

在验证交易之后,就该执行它了。在以太坊中,执行一个交易会改变状态——几个交易被打包成一个区块,每个区块相当于一个交易列表;当交易顺序执行时,会输出一个新的合法状态。

交易执行如下:

将发件人帐户的 nonce 值增加 1

从发送方账户中扣除交易预付款(gasLimit * gasPrice)

p>

确定交易可用于执行的gas值(gasLimit - 内在成本)

执行交易中包含的操作(转账、调用或创建智能合约)

通过 SELFDESTRUCT 和 SSTORE 函数向发件人退款

向交易发送者退还任何未使用的gas

到受益人账户(通常由开采包含交易的区块的矿工所有)转移采矿收入

增加发送者账户的nonce值

每发送一笔交易,发送者的账户随机数就会增加。此操作在事务执行开始时完成。如果事务执行失败,则回滚账户nonce值。

从发送方账户中扣除交易预付款

我们将从发件人的账户余额中扣除交易预付款。机制非常简单——发送者执行交易以自愿支付费用(gasLimit * gasPrice)。

计算可用于执行交易的气体

从交易的gas限制中扣除固有成本后,剩下的是可用于执行交易的gas。

执行交易中包含的操作

执行事务还涉及涉及 EVM 的操作列表。唯一完全不需要 EVM 操作的交易就是普通转账。

每个 EVM 操作都有相应的 gas 成本;在交易执行过程中,每执行一次 EVM 操作,都会从可用 gas 中扣除相应的 gas 成本。直到出现以下两种情况之一才会停止:

可用gas耗尽,执行失败

执行结束后剩余的可用gas,或者只是零

通过 SELFDESTRUCT 和 SSTORE 功能向发件人退款

在以太坊中,SELFDESTRUCT 操作码用于销毁不再需要的智能合约。每销毁一份合约,执行者可获得 24,000 Wei。

类似地,当使用 SSTORE 操作码写入 0(有效的删除值)时,每写入 0 将向操作员收取 1500 Wei。

关于退款的一个有趣的事情是退款也有上限。这个上限确保矿工能够计算出执行交易所需计算时间的上限。 (关于gas费用和退款的更多细节可以在以太坊的合理设计文章中找到)。

还需要注意的是,在兑换所包含的所有操作都已执行之前以太坊挖矿原理,我们不会进行退款。所以任何应该返回的gas都不会被交易执行过程消耗掉,避免了交易永远不会耗尽gas的可能性。

向交易发送者退还任何未使用的gas

如果用于交易的预付款超过交易所使用的gas,发送方有权在执行交易后收回剩余的gas。

向受益人账户支付矿工费

用于执行交易的所有气体都被视为交易费用,由矿工赚取。这种机制激励矿工继续生产区块并在网络安全方面以可持续的方式合作。

结论

在本文中,我们详细讨论了交易的验证和执行(黄皮书第 6 章)。更多类型的交易(合约创建和调用)将在第 7 章和第 8 章中介绍,未来我将继续更新有关这些章节的博文。

我认为以太坊挖矿原理,彻底了解交易验证和执行细节的最佳方式是阅读任何实现该协议的以太坊客户端的源代码。作为一个 Besu 贡献者,我对它的实现很熟悉,所以我建议即使你对 Java 不是很精通,你仍然可以看看它的源代码。