比特币中的区块交易索引txindex底层实现

txindex的意义

txindex:全称Transaction index 。
比特币核心默认建立包含仅与用户钱包相关交易的数据库。若你想使用类似gettransaction的命令访问所有交易,你需要配置比特币核心去建立一个完整的交易索引,这个可以通过txindex选项实现。在比特币核心配置文件中将txindex赋值为1(通常在安装目录的.bitcoin/bitcoin.conf中可以找到), 或者使用命令行参数 txindex=1。一旦你改变了此参数,你需要重启bitcoind,并等待其重建索引。这个参数txindex的值会写入pblocktree数据库中,data/blocks/index目录下,

tx 索引实现

bitcoind 启动的时候,初始化执行LoadBlockIndexDB的时候读取txindex在数据库pblocktree中的值(历史配置txindex信息),并检查历史配置信息与当前配置的值是否一致,如果不一致使用 -reindex-chainstate修改 txindex的值。

worddav1ce8c50643f632c4eec41fb3594928d9.png

将txindex的值持久化到数据库中的调用堆栈

worddavc193215b5a0aa024380b175488dc0a98.png

txindex的值保存在全局变量fTxIndex中。 
构建tx索引的机制:挖矿产生新区快或者接收到新区快的时候,程序会调用ConnectBlock进行区块共识验证,在验证交易的时候,先创建交易偏移对象数组vPos,每验证一条交易的时候,计算出该交易在当前区块的偏移,并保存在pos对象中。 最后通过pblocktree的WriteTxIndex将偏移信息写入leveldb数据库中。

worddav975df92a602457c2e5fe90ebdc8ed00f.png

挖矿 调用堆栈 
查询:使用rpc指令getrawtransaction查询时调用屈居函数GetTransaction从pblocktree读出索引,然后查询到交易信息:先通过交易哈希获取到交易所在区块的偏移信息结构, 读取偏移信息结构,然后通过偏移信息结构拿到交易在区块中的偏移, 读出交易

猜你喜欢

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