底层实现
boost::multi_index_container 多索引容器
唯一索引:交易哈希
排序索引 :交易费率(祖先) 、时间戳 、 挖矿优先级等
增删改查
交易创建、接收到交易广播时,加入内存池,更新父子交易关系;
交易上链后,递归删除在内存池中的区块的交易;在交易加入内存池的过程中,如果内存池的交易超时、满,删除这些交易;
加入、删除交易时,会触发内存池交易的更新操作(该交易的父子链表);
根据交易哈希查询内存池交易:哈希表查询效率高;
超时处理
程序启动时通过读取配置maxmempool(内存池大小)、mempoolexpiry(内存池交易超时时间)来对内存池进行操作 maxmempool :单位 M (默认300M) mempoolexpiry :单位 小时(默认 336h)
机制: 处理点:接收到新交易、更新最优链、检测到非法区块
内部实现: 先检测是否存在超时交易(交易加入内存池的过程中,会给一个时间戳,交易通过时间戳进行排序(升序));
删除时,会依次删除子孙交易,对应的这些交易的utxo也会删除。
打包交易
零手续费交易:blockprioritysize如果开启此配置,可以打包零手续费交易,按照交易的年龄优先级进行选取(交易手续费、父交易高度、交易加入内存池高度、打包高度、手续费等)。
普通交易: 按照交易手续费比率进行挑选交易打包,越高越先打包。
持久化
关闭:排序交易(祖先交易,手续费),将内存交易dump到vector中,打开mempool.dat.new文件句柄将vector中的元素写入文件,将文件关闭,重命名覆盖mempool.dat;
启动:加载mempool.dat中的交易,对交易进行排序、广播等;
运行中:程序崩溃,内存池交易可能消失,需要同步过来。