Bitcoin UTXO代码分析(一)-UTXO的相关表示

昕阳小编 98 0

在比特币代码中,使用硬币类来表示单个交易对象中某个输出的币:

类币{ public: //!未用事务输出CTxOut out//!包含事务是否为币基无符号int fCoinBase:1;//!此包含事务以何种高度包含在活动区块链uint32 _ t高度:31中;.}

数据元素除了CTxOut中的币值(名词值)花费条件(scriptPubKey)之外,还附带了一些元信息:是否是coinbase,所在交易在哪个高度被打包进入区块链。

再使用CCoinsView抽象类表达整个区块链上的币的集合:

class CCoinsView { public: /**检索给定输出点的硬币(未用完的交易输出)。*仅当找到未用完的硬币时返回没错,该硬币以硬币形式返回。*当返回错误的时,未指定硬币的值* virtual bool get Coin(const cout point outpoint,Coin Coin)const;//!只需检查给定的输出点是否未用完。虚拟布尔有币(const cout point outpoint)const;//!检索此CCoinsView当前表示其状态的块哈希虚拟uint 256 GetBestBlock()const;//!检索可能只被部分写入的块的范围。//!如果数据库处于一致状态,则结果是空向量。//!否则,将返回一个由新的和//组成的双元素向量!旧块哈希,按此顺序虚拟STD:vector get head blocks()const;//!进行批量修改(多次硬币更改最好是批量更改)。//!传递的地图币可以修改。虚拟bool批量写(CCoinsMap映射币,const uint 256哈希块);//!获取游标以迭代整个状态虚拟CCoinsViewCursor * Cursor()const;//!当我们多态地使用CCoinsViews时,有一个虚析构函数virtual ~CCoinsView() {} //!估计数据库大小(未实现时为0)virtual size _ t estimate size()const { return 0;} };

Cinsview类作为接口类,有很多具体实现子类:

Bitcoin UTXO代码分析(一)-UTXO的相关表示-第1张图片-昕阳网

CoinsViewDB类主要服务于从比特币数据目录下的连锁状态子目录下保存和读取存盘的UTXO集合:

class CCoinsViewDB final:public CCoinsView { protected:CDB包装数据库;public:explicit CCoinsViewDB(size _ t nCacheSize,bool fMemory=false,bool fWipe=false);bool get Coin(const cout point outpoint,Coin coin)常量覆盖;布尔有硬币(const cout point outpoint)常量覆盖;uint256 GetBestBlock()常量覆盖;STD:vector GetHeadBlocks()const override;bool批量写入(CCoinsMap map coins,const uint256 hashBlock)覆盖;CCoinsViewCursor *Cursor()常量覆盖;//!尝试从旧的数据库格式更新。返回是否发生了错误布尔。升级();size_t EstimateSize()常量覆盖;};

此类只有一个全局实例,在验证。卡片打印处理机(Card Print Processor的缩写)中定义:

STD:unique _ ptr pcoinsdbview;

在初始化。卡片打印处理机(Card Print Processor的缩写)中进程启动时,会对改对象进行初始化:

pcoinsdbview。reset(new CCoinsViewDB(nCoinDBCache,false,fReset | | fReindexChainState));

类CCoinsViewBacked本身没什么实际用处,主要是作为多个Coinview层级之间的转接层,它的数据成员CCoinView * base指向的就是后端即父视图,如果某个coinsviewBacked的子类没有覆盖接口类CCoinsView中的方法,就会调用基础指向的后端相应的方法。

类CCO inview backed:public CCO inview { protected:CCO inview * base;public:CCoinsViewBacked(CCoinsView * viewIn);bool get Coin(const cout point outpoint,Coin coin)常量覆盖;布尔有硬币(const cout point outpoint)常量覆盖;uint256 GetBestBlock()常量覆盖;STD:vector GetHeadBlocks()const override;void set后端(CCoinsView视图);bool批量写入(CCoinsMap map coins,const uint256 hashBlock)覆盖;CCoinsViewCursor *Cursor()常量覆盖;size_t EstimateSize()常量覆盖;};CCoinsViewBacked:CCoinsViewBacked(CCoinsView * viewIn):base(viewIn){ } bool CCoinsViewBacked:get Coin(const cout point outpoint,Coin Coin)const { return 尚力财经小编2022 base-get Coin(outpoint,Coin);} bool CCoinsViewBacked:have coin(const cout point outpoint)const { return base-have coin(outpoint);} uint 256 ccoinviewbacked:GetBestBlock()const { return base-GetBestBlock();} STD:vector CCoinsViewBacked:GetHeadBlocks()const { return base-GetHeadBlocks();} void ccoinviewbacked:set back end(ccoinview viewIn){ base=viewIn;} bool CCoinsViewBacked:batch write(CCoinsMap地图币,const uint 256哈希块){ return base-batch write(地图币,哈希块);} ccoinviewcursor * ccoinviewbacked:Cursor()const { return base-Cursor();} size _ t ccoinviewbacked:EstimateSize()const { return base-EstimateSize();}

ccoinviewerrorcatcher,CCoinsViewMemPool,CCoinsViewCache三个定制实现在初始化时需要指定父视图,所以要继承于CCoinsViewBacked类coinsviewErrorCatcher主要用途是包装对数据库读取做错误处理,后端是全局的磁盘实现pcoinsdbview。

class ccoinsviewrocketcher final:public ccoinsviewbacketer { 尚力财经小编2022 public:explicit ccoinsviewrocketcher(CCoinsView * view):CCoinsViewBacked(view){ } bool get Coin(const cout point outpoint,Coin Coin)const override { try { return CCoinsViewBacked:get Coin(outpoint,Coin);} catch(const STD:runtime _ error e){ ui interface .ThreadSafeMessageBox(_('从数据库读取时出错,正在关闭.)),"",CClientUIInterface:MSG _ ERROR);LogPrintf('从数据库读取时出错:%s 'e . what());abort();} } };

启动时的初始化代码:

//init。CPP AppInitMain()pcoinscatcher。reset(新ccoinsviewroccatcher(pcoinsdbview。get()));

CCoinsViewCache类是一个内存缓存的实现,内部使用散列表存储了某个以点数战胜到硬币对象的映射,有一个全局实例pcoinsTip,指向活动链的utxo,后端是磁盘实现CCoinsViewDB对象pcoinsdbview。

类ccoinviewcache:public ccoinviewbacked { protected:/* * * Make mutable,以便我们甚至可以从声明为"常数"的Get-methods *中"填充缓存"。*/可变uint256哈希块可变CCoinsMap缓存硬币;/*内部硬币对象的缓存动态内存使用情况*可变大小_ t cachedCoinsUsage.}

启动时的初始化代码:

//init。CPP 尚力财经小编2022 AppInitMain()pcoinstip。重置(新CCoinsViewCache(pcoinscatcher。get()));

它的内部散列表使用了定制的混杂方法西帕西,没有使用默认的标准:哈希方法(不是加密学安全的哈希),估计是防止混杂的键冲突,

typedef STD:unordered _ map CCoinsMap;class SaltedOutpointHasher { private:/* * Salt */const uint 64 _ t k0,k1;public:SaltedOutpointHasher();size _ t operator()(const cout point id)const { return siphashuint 256 extra(k0,k1,id.hash,id。n);} };

这篇文章介绍了表示UTXO的相关表示的数据结构,下一篇文章将会UTXO的标记以及保存十.

标签: 2022 比特币

抱歉,评论功能暂时关闭!

微信号已复制,请打开微信添加咨询详情!