比特币原理分析之交易内存池原理浅析

底层实现

boost::multi_index_container 多索引容器

唯一索引:交易哈希

排序索引 :交易费率(祖先) 、时间戳 、 挖矿优先级等

增删改查

交易创建、接收到交易广播时,加入内存池,更新父子交易关系;

交易上链后,递归删除在内存池中的区块的交易;在交易加入内存池的过程中,如果内存池的交易超时、满,删除这些交易;

加入、删除交易时,会触发内存池交易的更新操作(该交易的父子链表);

根据交易哈希查询内存池交易:哈希表查询效率高;

超时处理

程序启动时通过读取配置maxmempool(内存池大小)、mempoolexpiry(内存池交易超时时间)来对内存池进行操作 maxmempool :单位 M (默认300M) mempoolexpiry :单位 小时(默认 336h)

机制: 处理点:接收到新交易、更新最优链、检测到非法区块

内部实现: 先检测是否存在超时交易(交易加入内存池的过程中,会给一个时间戳,交易通过时间戳进行排序(升序));

删除时,会依次删除子孙交易,对应的这些交易的utxo也会删除。

打包交易

零手续费交易:blockprioritysize如果开启此配置,可以打包零手续费交易,按照交易的年龄优先级进行选取(交易手续费、父交易高度、交易加入内存池高度、打包高度、手续费等)。

普通交易: 按照交易手续费比率进行挑选交易打包,越高越先打包。

持久化

关闭:排序交易(祖先交易,手续费),将内存交易dump到vector中,打开mempool.dat.new文件句柄将vector中的元素写入文件,将文件关闭,重命名覆盖mempool.dat;

启动:加载mempool.dat中的交易,对交易进行排序、广播等;

运行中:程序崩溃,内存池交易可能消失,需要同步过来。

猜你喜欢

转载自blog.csdn.net/guoguangwu/article/details/88863916