涉及的bip

  • bip68 交易输出会锁定一段时间不允许消费
  • bip125 如果mempool已经有相同交易输入的交易,具备更高手续费(小费)的新加入交易会替换掉旧的交易。

ctxmempoolentry

存储一个交易的相关信息和其他在mempool中与这个交易有关的祖先、后裔交易的数据。
每当有新的交易添加到mempool,都需要更新这个新交易的所有祖先交易的相关状态。

ctxmempool

存储那些对于the-current-best-chain有效且准备存储到下一个区块的交易。
网络上被见到(seen on the network)的交易(包括在本地节点创建的交易)都会添加到该mempool。除了:

  • 交易手续费不满足最低要求
  • mempool中已有相同交易输入的交易
  • 非标准交易

ctxmempool::mapTx 和 ctxmempoolentry

mapTx是一个 boost::multi_index,并会以四个标准去整理mempool(中的交易):

  • 交易hash
  • 后裔交易的税率,max(feerate of tx,feerate of tx with all descendants(in-mempool transactions that depend on this one))
  • 在mempool中的时间
  • 祖先交易的税率,min(feerate of tx, feerate of tx with all unconfirmed ancestors(in-mempool transactions that a given transaction depends on))

为了加速税率的排序整理,有一个mapLink来维护交易相关的祖先和后裔的集合。

通常情况下,当一个新的交易加入到mempool,它都不会有任何的子交易(类似这种情况的交易是孤儿交易orphan trx),所以在addUnchecked():

  • 更新 新交易的setMemPoolParents来包括所有in-mempool父母
  • 更新 新交易的父母来include该新交易作为儿子
  • 更新 新交易的祖先来以新交易的size和fee来更新他们自身的状态

当一个交易从mempool中剔除,会调用UpdateForRemoveFromMempool()来更新相关的状态:

  • 更新所有in-mempool父母交易不再跟踪该交易(setMempoolChildren)
  • 更新所有in-mempool祖先交易不再包括这个交易的size和fees(in descendant state)
  • 更新所有in-mempool儿子交易不再包括该交易(作为父母交易)

在把一个交易从mempool中剔除时,可能会引发连锁反应,所有的子交易都会成为孤儿交易而被一起剔除,此时就需要计算被移除的交易的集合,否则会产生一个不连续的mempool(也即正常的mempool,应该是一个连续的交易链集合)。

在重组(reorganization)事件中,新加入的交易不存在in-mempool子交易的假设是不成立的。特别地,在新交易加入时,mempool就已经是非连续状态,存在来自于disconnected block的后裔交易(linking交易也可能来自disconnected block,等待加入)。因此,就没有必要再通过addUnchecked来搜索in-mempool中的子交易。相应地,应该调用UpdateTransactionsFromBlock()来更新out-of-block后裔交易的状态(在该函数被调用之前,mempool的状态都是非连续,且mapLinks也是不正确的)。
所有的待再校验的交易(disconnected block trx)会等待重组事件结束以后才全部加入到mempool中,在重组过程中,不会将其加入到mempool中。

bitcoin-memorypool源码分析相关推荐

  1. Spark源码分析之九:内存管理模型

    Spark是现在很流行的一个基于内存的分布式计算框架,既然是基于内存,那么自然而然的,内存的管理就是Spark存储管理的重中之重了.那么,Spark究竟采用什么样的内存管理模型呢?本文就为大家揭开Sp ...

  2. NEO从源码分析看数字资产

    0x00 引言 比特币是泡沫么?也许是的.毕竟这东西除了用来炒,干什么实事都感觉肉疼.但是有人将比特币泡沫和郁金香泡沫相提并论就很气人了,郁金香什么鬼,长那么一年,开那么几天,泡沫还没破呢,郁金香已经 ...

  3. NEO源码分析之UTXO全局资产

    作者:廖京辉 原文链接:https://mp.weixin.qq.com/s?__biz=MzUzNDQwNDQ0Mw==&mid=2247483941&idx=1&sn=4a ...

  4. cl.zk0.info/index.php,兄弟连区块链入门到精通教程btcpool矿池源码分析环境搭建

    原标题:兄弟连区块链入门到精通教程btcpool矿池源码分析环境搭建 btcpool矿池-测试环境搭建及使用cgminer测试 本文档基于Ubuntu 16.04 LTS, 64 Bits. 安装Bi ...

  5. pybitcointools源码分析之BIP32实现

    在看本篇之前,需要了解一个很重要的背景知识.那就是 HD钱包和 比特币协议 BIP32. 关于HD钱包的概念,建议大家去看看<<精通比特币>>.BIP32可以看下下面这篇翻译: ...

  6. 以太坊源码阅读5——POW源码分析

    以太坊源码阅读5--POW源码分析 介绍 POW,proof of work,即工作量证明,是著名公bitcoin所采用的共识算法.简单来说,pow就是一个证明,由矿工使用算力进行计算(挖矿),竞争记 ...

  7. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  8. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  9. SpringBoot-web开发(二): 页面和图标定制(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...

  10. SpringBoot-web开发(一): 静态资源的导入(源码分析)

    目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...

最新文章

  1. I/O多路复用之epoll(转)
  2. 适合打游戏的计算机内存品牌型号,玩游戏电脑内存要多大合适?不同内存容量玩游戏区别实测...
  3. code换取微信openid_JSamp;微信_微信授权
  4. 48.检测对象是否为空
  5. 硬盘对应计算机主板,主板硬盘一般有哪些接口
  6. hive分桶表join_Hive知识梳理
  7. jsp mysql论坛_体育论坛ssm,mysql)
  8. (摘)老司机也必须掌握的MySQL优化指南
  9. 拓端tecdat|R语言自定义两种统计量度:平均值和中位数,何时去使用?
  10. 关于进行安装程序出现注册DLL/OCX失败,返回码:0x5问题
  11. 油猴脚本(Tampermonkey)的安装和使用小结
  12. putty安装和使用
  13. 计算机仿真 matlab,计算机仿真(matlab)PPT教程.ppt
  14. BOSS直聘简历导出为PDF文档
  15. python数据驱动创建账号_20190705-Python数据驱动之DDT
  16. 51nod 1108.距离之和最小 V2 - 曼哈顿距离
  17. Unity-- Gfx.WaitForPresentOnGfxThread占用CPU过高导致帧率低
  18. MPI实现并行pagerank
  19. 关于智能车三岔路识别
  20. P1972 [SDOI2009] HH的项链

热门文章

  1. .NET和JAVA的比较- 体系结构
  2. Tomcat部署项目的方法
  3. 洛谷 P2257 YY的GCD
  4. Django去操作已经存在的数据库
  5. Python学生信息管理系统的开发
  6. 【6.0】组合主键映射
  7. 201521123061 《Java程序设计》第六周学习总结
  8. 如何在MySQL中设置外键约束以及外键的作用
  9. 使用了visual assist.net
  10. linux下slow,慢查询日志的分析工具mysqlsla的使用