知识库详情
知识库

以“词条释义”的形式对比特币区块链技术中经常涉及的术语及基本概念进行专业化的阐释和解读。

交易池
返回上级
BSV区块链编辑 2022-04-14 18:00 452

交易池是一种数据结构,它包含尚未被纳入矿工挖出的区块、但已被交易处理商(或矿工)验证的交易集。每个节点都有不同类型的交易池,交易可以根据分类方式存储在某个交易池之中。在比特币的网络上,如果交易被提交给交易处理商,或已经在P2P网络上广播出去,那么该交易就能被节点知晓,并被每个知晓它的节点保存在自己的交易池中。

 

交易池类型

每种类型的交易池只会有一个,并且这些交易池的用途各有不同。

一、交易内存池(the Mempool)

这个交易池里放的是已被该矿工知晓的、已通过其验证的交易的完整数据,且这些交易满足了矿工要求的最低中继费(relay fee)。内存池里包含了两类交易,一类是符合矿工最低交易手续费的交易,这些交易可以被该矿工打包进自己生产的新区块里;另一类交易是未符合矿工最低交易手续费的交易,它们会被存放在二级内存池(secondary mempool)中。

(一)向内存池添加交易

(1)交易如何被接受

任何要被添加到内存池里的新交易均不能与内存池现存的交易发生冲突。此外,鉴于Bitcoin SV(BSV)脚本工程师可以编写能灵活扩展的脚本,用脚本实现各种功能,矿工需要对验证这些复杂脚本所花费的时间施加一些限制:比如果验证交易脚本时间超过一秒钟,他们就会将这笔交易删除。内存池当然也有大小限制,一旦它变得很满,矿工就会向其施加限制,让内存池空间释放出来一些。矿工会提前规定他们所接受的最低交易费率,只有那些超过此费率的交易才能被添加到他们的内存池中。

(2)二级内存池

如果一个交易不满足某矿工的要求,它就不会被该矿工打包进自己的区块;但此交易可能满足其他矿工的标准,因此该矿工会保留此交易,将其储存到自己的二级内存池中。这类交易通常是因为手续费通常低于该矿工的最低交易手续费要求,不过仍然高于网络普遍的中继费(relay fee)限制。在以前,这类交易会被矿工直接丢弃,但现在考虑到其它节点可能有不同的配置,矿工会将这种自己过滤掉的、不符合自身标准的交易,存在不同的交易池中。矿工维护二级内存池的主要好处是:池中交易最终其他矿工打包在区块中,保留这些可以让确保自己能快速进行区块验证,优化自己的网络性能。倘若没有二级内存池,恶意用户可以利用节点配置的差异,向不同的矿工提交花费相同比特币的不同交易,进行双花攻击。

(二)从内存池中删除交易

(1)创建区块

当矿工挖矿时,他们会使用rpc命令getminingcandidate(过去使用 getblocktemplate命令)从自己的内存池中收集交易来构建候选区块。类似地,当矿工从网络中接收到一个新区块时,对于这个区块中包含的交易,只要它的交易ID与矿工内存池中的某个交易的交易ID匹配,则验证者可以省去验证这笔交易的过程,从而加快区块验证的过程。

(2)交易超时

每当向内存池中添加新交易时,矿工都会检查内存池中是否有已到期的交易。到期的交易将首先被移除。若内存池容量不足,会按照手续费从低到高的顺序,来移除额外的交易,使交易池使用量低于最大限额。以这种方式删除交易会提高矿工节点接受的最低费率。

当前交易的有效期被默认设置为 14 天(336 小时)。

(三)CPFP使用子交易为父交易买单

如果用户创建交易支付了足够的手续费,使这笔交易能够进入到矿工的候选区块,但手续费又没有高到这笔交易可以立即被下一个区块纳入,此时用户可以选择使用“子交易为父交易买单”的策略,英文简称CPFP(Child Pays for Parent)。这个策略中,使用来自低手续费交易(父交易)的找零,来创新一笔子交易,并在子交易中支付一笔足够高的手续费,来使父交易和子交易共同成为内存池里费率较高的交易。此外,对于二级内存池中的交易,也可以使用此策略来升级交易被打包的优先等级。

二、非最终交易池(Non-Final Pool)

比特币协议允许应用程序创建并广播可进一步修改的交易,这类交易由非最终交易池来跟踪。当这些交易被最终确定时,比如交易的参与方对交易做了标记,或者交易超过了由区块高度或时间戳标记的最终确定时间,交易就将被移动到主交易池。提交非最终交易(non-fianl transaction)的应用程序需要知道这笔交易是一笔付款,如果交易在被交易池删除之前被最终确定,那么付款就会被执行。如果这笔交易已经不是“待处理”或“不可获取”的状态,交易的参与方就应该进行协商,重新发起交易。

(一)向非最终交易池添加交易

矿工对交易的有效性做完验证后,需要决定要将它放在内存池还是非最终交易池。这意味着,在进入非最终交易池和主内存池之前,交易的验证标准是相同的;但是,要进入非最终交易池的交易还有其它限制:例如,如果一笔交易花费了另一笔非最终交易的输出,那么这笔交易就会被拒绝。此外,即便节点认为某笔交易有效并想把它添加至非最终交易池中,但此时这个交易池没有空间了,节点也会拒绝这笔交易。

(二)从非最终交易池中删除交易

非最终交易池会定期检查内部所有交易,若检测到已完成(到达终极状态)的交易,或缺乏活性的交易,节点就会把这些交易从这个交易池里删除。

(1)交易完成

如果交易的锁定时间已过,这时交易就会从非最终交易转化成为终极交易,它会从非最终交易池中删除,并且可能会被移动至主内存池。

(2)交易超时

若一笔交易在非最终交易池规定的最大有效期内始终未被更新过,那么这样的交易就会被删除。

当前非最终交易池的默认有效期为4星期。

 

交易内存池(the Mempool)的演变

自比特币首次发布以来,Bitcoin SV(BSV)走过了漫长的道路才在比特币中引入“二级内存池”概念,以及重新恢复“非最终交易池”。下面介绍这个过程中BSV网络所做的技术变更。

第一阶段:最早的中本聪客户端中的内存池

在比特币最初的源代码中,“mempool”实际上是一个内存里临时的交易池。如果节点重新启动,则该节点必须从其它节点获取信息,来重新填充它的内存池。假设所有节点都同时关闭了,那么所有节点的内存池都被清空,任何人的交易想要被打包都需要重新进行广播。

然而,非最终交易的概念在比特币最初设计中就存在,规则如下:

  1. 如果交易锁定时间设定为0,则这个交易直接就是最终交易。
  2. 如果交易的锁定时间设为过去的时间(不论是以区块高度还是UNIX来衡量),则这笔交易也是最终交易。
  3. 如果交易的锁定时间设定于未来,且交易输入的序列号(sequence number)小于序列号字段的最高值 (最高值为0xFFFFFFFF),则这笔交易被认为是非最终交易。

只要节点持续运行,内存池中的交易就会一直被保留下来。设计挖矿代码时也考虑到了这一点,因此节点可以根据交易是否是终极状态,而将非最终交易排除在内存池之外。对于那些有锁定时间的交易,只有当它们转化为最终交易时,才可以被打包入块。

手续费过低的交易也可以被打包入块,因为这些交易的总数据量不到10KB。那时的客户端规定每个区块中的前100笔交易都可以是免手续费的。

第二阶段:Bitcoin Core(BTC)的内存池

随后在Bitcoin Core的客户端里,“持久性”的概念引入了内存池中,为在内存池里的交易设置了到期时间。这时非最终交易的概念变得不必要了。这时内存池被定义为一个只存放可被立即打包的交易的地方。

内存池中的交易默认的“保质期”是2周,矿工可以自行修改这个参数。任何因支付的手续费过低,而被长期困在内存池的交易,都可以使用CPFP(子交易为父交易买单)的策略,加快交易被打包的过程。CPFP策略是建立一笔子交易,支付较高手续费,相当于为自己的父交易又垫付了一笔手续费,从而使父交易能够被尽快打包入块。

接着,交易的锁定时间字段也被Bitcoin Core重新利用起来了,设定了新的魔术值 500,000,000。如果锁定时间高于此值,则根据BIP 113,将被解读为与区块时间进行比较的UNIX时间戳;低于此值的锁定时间将被解读为区块高度。

同时,Bitcoin Core也根据BIP 68重新调整了交易输入的序列号。

 

推荐参考资料

[1] mempool inclusion size limit

[2] mempool tx spending another non-final tx disallowed

[3] time a tx can stay in the non-final mempool

[4] non-final pool check drops expired tx

[5] pool default maximum size

[6] mempool default maximum size

[7] mempool default expiry age (hours)

[8] Generic update specification non-final criteria section

网络
创世纪升级
mAPI(商户用API)
比特币测试网
矿工ID(Miner ID)
点对点协议
中本聪愿景
交易池