在区块链的世界里,每一笔交易都渴望被确认、被记录在永恒的账本上,以太坊作为全球领先的智能合约平台,其交易处理机制复杂而精妙,在这个过程中,偶尔会出现一些“孤独”的交易——它们被广播到网络,却暂时无法被包含在任何一个有效的区块中,这些交易被称为“孤儿交易”(Orphan Transactions),理解孤儿交易,有助于我们更深入地洞察以太坊网络的工作原理及其潜在挑战。

什么是以太坊孤儿交易?

孤儿交易是指那些已经被节点接收并验证,但其输入(即引用的前一笔交易)尚未被确认(即尚未被打包进区块)的交易,换句话说,一笔交易A花费了交易B的输出,但交易B本身因为某种原因还没有被区块链确认,那么交易A对于接收它的节点而言,就成了一笔“孤儿交易”。

这里的“孤儿”并非指交易本身有问题(例如签名无效或 nonce 错误),而是指它依赖的“父交易”暂时“下落不明”,这些交易就像等待父母认领的孩子,暂时游离在主链之外。

孤儿交易是如何产生的?

以太坊(以及其他许多区块链,如比特币)采用基于GHOST(Greedy Heaviest-Observed Sub-Tree)共识算法的变体来处理区块和交易,孤儿交易的产生主要源于以下几个原因:

  1. 网络延迟与分叉: 以太坊网络是一个分布式系统,节点之间的信息传递存在延迟,当两个矿工(或验证者)几乎同时挖出(或提议)一个新的区块时,网络可能会出现暂时的分叉,一部分节点看到的是A区块,另一部分看到的是B区块,假设一笔交易C的输入依赖于A区块中的一笔交易,而另一部分节点先看到了B区块,那么这些节点就会认为交易C的输入(来自A区块的交易)尚未确认,从而将交易C标记为孤儿交易。

  2. 交易广播顺序: 交易广播到网络的顺序并非完全一致,一笔交易可能先被发送到某个节点,而它依赖的前一笔交易却稍后才被该节点接收到,这也会导致该节点暂时将前者视为孤儿交易。

  3. 区块打包时间与交易处理速度: 以太坊的区块出块时间(对于PoW是约15秒,对于PoS是约12秒)和交易打包的效率,也会影响交易确认的速度,如果一笔交易在广播后不久,其依赖的交易就因为网络拥堵或区块已满而未能及时被打包,那么它就有可能成为孤儿交易。

孤儿交易池(Orphan Pool)

为了处理这些孤儿交易,以太坊客户端(如Geth、Nethermind等)会维护一个“孤儿交易池”,当一笔交易被接收时,客户端会检查其输入交易是否已经被确认,如果没有,且该交易本身有效,它就会被放入孤儿交易池中。

孤儿交易池的大小是有限的,这是为了避免恶意攻击者通过发送大量孤儿交易来耗尽节点的内存资源(即“内存耗尽攻击”),当孤儿交易池满时,新的孤儿交易可能会被拒绝,或者最旧的孤儿交易会被移除以腾出空间。

孤儿交易的命运与处理随机配图