以太坊交易内存池是如何工作的?

2022-11-07 10:35:12 浏览数 (1)

本文作者:张小风[1]

以太坊区块链是一个分布式账本,就像比特币[2]区块链一样,它以智能合约的形式提供计算能力。在最基本形式上,它是一个个相互连接的区块,每个区块包含改变区块链状态的交易。

组成以太坊网络的节点保存着区块链的副本,并负责向其添加新的交易,保证其一致性和有效性。

那节点是如何将交易添加到区块链中的?

这个过程可以很容易解释:节点从钱包/用户那里收到签名的交易,如果交易是有效的,节点就把它们添加到区块链上。

问题是,节点可能会收到数以千计的交易,并且区块以准恒定的速度(每几秒钟)被添加到区块链上,节点也可能从不同的用户和他们连接的其他节点处收到不同的交易....。我们需要有某种缓冲区来存储所有这些传入的、尚未验证的交易......这就是内存池 "MemPool"发挥作用的地方,我将尝试从通用的角度来描述它是什么、如何工作以及它们可能有什么"副作用"。

MemPool 是什么,它是如何工作的?

我们如何向区块链添加新的交易?比方说,有人希望向另一个账户发送一些 Token?那么,这个人应该做的第一件事就是生成交易:

除其他内容外,交易至少包含:

  • 交易的接收人
  • 要支付的金额
  • 愿意为该交易支付的费用金额
  • 交易签名(例如,用钱包的私钥签名)。

一旦交易准备就绪,它就需要被包含在未来的区块中,以便被网络所接受。

做到这一点的方法是将已签署的交易广播给构成区块链网络的一个(或许多)节点。

节点会收到你的交易,并在转发到网络中的其他节点之前检查其有效性和真实性(他们会检查发送者是否有足够的资金,更重要的是检查签名是否正确)。

检查完交易后,节点将把它添加到他们的内存池中。在区块被添加到网络后,节点将重新检查他们内存池里所有的交易,因为区块里可能包含使内存池中一些交易无效的交易。

mempool基本上是节点的RAM 内存,它们在其中保存所有 "迄今为止 "已验证的交易,这是已经收到但还不能添加到区块链中的交易。

事实上,根据区块链的情况,每隔几秒或几十秒生成一个区块,而且一个区块最大的尺寸限制,这意味着区块只能承载有限的交易数量。

如果用户向区块链发送交易的速度高于区块链添加区块的速度,许多交易将不得不在节点内存池中等待。

值得注意的是,由于其去中心化的性质,节点的内存池在任何时候都可能是不同的,它们可能持有不同的交易。同样重要的(也需要注意),你的交易也可能在任何时间点存在于多个节点的内存池。

有时我们把内存池称为单一实体/位置,但实际上它是在 T 时间存在的所有内存池的集合。

节点会从他们的内存池中挑选交易,以打包区块添加到区块链中,但节点不会遵循先进先出的策略,他们将挑选他们认为最方便的交易,基本上是那些支付最高费用的交易,因为这样他们收益将最大化。

一旦一个交易最终被矿工从其内存池中挑选出来并添加到一个区块中,所有其他在其内存池中包含相同交易的节点将着手删除它,因为同一交易不能被两次添加到区块链中。

每个节点的内存池就像火车站的候车区,乘客在那里等待下一趟列车的到来,只有那些愿意支付最多的人才能上车。有一个特殊性,就是一个乘客可以同时在多个火车站,当他或她进入一列火车的那一刻,他或她就从其他所有的火车站消失了!

交易额外作用

取消交易

节点是不被信任的代理人,从这个意义上说,他们将永远从自己的最佳利益出发,就像之前已经描述的那样,他们会首先挑选那些支付最多费用的交易,这实际上是一种我们可以利用的行为,基于此,它将给我们提供在需要时取消交易的可能性(当然,尚未被添加到区块链的交易!)。

为了取消以前的交易,我们需要从同一个账户向网络提交一个新的交易,使用相同的 nonce,但费用(gas price)更高。

节点会收到你的新交易,由于它支付的费用比之前的交易高,他们会先把它添加到区块链上。一个特定的账户其交易 nonce 只能使用一次,这意味着当他们把新的交易添加到区块链上时,旧的交易就会变得无效,并从内存池中删除。

交易抢跑

由于节点在将交易添加到区块链之前将交易保存在他们的 mempools 中,他们可以访问交易内容,并可以提前检查他们将对区块链造成的影响(状态变化)。

这对你的 dapp 来说可能是一个问题,假设你为第一个提交某个值(该值被哈希成一个存储在智能合约上的值)的账户提供某种奖励。如果有人向一个节点提交了正确的答案,那么节点将有机会获得该值,并可以非常容易地生成自己的交易,复制交易内容,并先将其添加到区块链上,从而从诚实的用户那里 "窃取"奖励。

这只是交易抢跑的一个例子,但还有很多情况,交易被添加到区块链的 "速度"或"顺序"会对你的 dapp 逻辑产生影响,你应该始终牢记,这是有可能会被破坏。

原文:https://medium.com/coinmonks/ethereum-memory-pool-how-does-it-work-6b6d8edfa0eb

参考资料

[1]

张小风: https://learnblockchain.cn/people/74

[2]

比特币: https://learnblockchain.cn/article/1001

0 人点赞