内存池或内存池是等待节点验证的待处理事务的集合,然后再将它们提交到区块链上的新块。简而言之,内存池是节点中未确认交易的暂存区。网络中的每个区块链节点都有一个内存池,它们都相互通信以共享有关最新待处理交易的信息。
内存池的存在是因为每个区块只能确认约 200 笔交易,这些交易大约每 15 秒开采一次。
因此,待处理的交易会在整个内存池网络中广播,并带有相关的 gas 价格(即发送者愿意为完成交易而支付的 gas 费用)。当一个区块被开采时,开采最新区块的节点将确认到区块链上具有最高 gas 价格的约 200 个待处理交易。
如果交易未能通过一系列验证检查,或者提交的gas太少,这些交易最终将从内存池中删除。
随机数是一个 0 索引的数字,对应于特定地址发送的已确认交易的数量。也就是说,如果一个地址有 0 个已确认交易,它会将其第一笔交易标记为随机数 0,并将其想要发送的后续交易标记为随机数 1。
由特定发件人地址确认的每笔交易都必须具有唯一的 nonce 值。例如,如果一个发送者提交了两个 nonce 值为 1 的交易,那么只有一个可以成功。
随机数的存在是为了防止重放攻击。
例如,从 A 到 B 发送 20 个硬币的交易可以由 B 一遍又一遍地重放,以不断消耗 A 的余额,如果它没有随机数。因为交易是作为散列值提交的,B 可以简单地复制发布到区块链的散列交易并一遍又一遍地重新运行它。
但是,如果您在创建散列交易之前设置一个唯一的 nonce,它将防止重放攻击,因为每个确认的交易都必须具有唯一的 nonce 值,并且后续相同的交易将失败。
对于发送者来说,正确设置他们的 nonce 值以确保交易有机会被确认很重要,因为提交的带有乱序或重复 nonce 值的交易将从内存池中删除。
随机数也可用于保证交易的顺序。例如,如果发送者可以提交 5 个随机数从 0 到 4 的交易,他们可以期望这些交易将严格按照随机数的顺序执行。
传统上,内存池交易属于以下三个桶之一:
已提交到内存池并等待包含在矿工开采的下一个区块中的交易。
已被矿工选择并包含在最新区块中的交易。然后将这些交易的结果广播到整个网络。挖掘的交易可以有两种状态:
这些交易成功执行并修改链上状态。成功交易的status
字段是0x1
这些交易没有成功执行,但仍然包含在区块中。如果执行过程遇到错误、gas 耗尽或遇到其他问题,就会发生这种情况。失败交易的status
字段是0x0
未能确认且未包含在最新区块中的交易。发生这种情况的原因可能是交易未通过某些验证测试、nonce 不正确、提交的 gas 价格太低且超时,或其他一些错误。被丢弃的交易将其资产和汽油费返还给发送者,就好像交易从未发生过一样。
一个新的类别已成为开发人员的常见功能要求。当一个事务被丢弃时,发送者通常会发送一个具有相同随机数值的替换事务来“替换”失败的事务。
如果第二笔交易被确认到区块链上(例如,通过发送具有相同随机数和更高gas价格的新交易),“丢弃”的交易将被移至称为“丢弃和替换”的新交易状态类别。
类似地,如果同时发送多个具有相同 nonce 值的交易,通常会选择交易费用较高的交易来确认到一个块上。其他交易将属于“丢弃和替换”类别。
此交易状态对智能合约开发人员很有用,因为它允许他们跟踪哪些交易已成功重新广播到区块链网络(“丢弃和替换”)以及哪些丢弃的交易仍需要重新广播(“丢弃”)