风险提示:理性看待区块链,提高风险意识!
比特币源码分析:utxo刷盘
首页 > 币界资讯 > 区块链知识 2018-03-02 09:45
摘要
utxo的刷盘逻辑主要在txdb.cpp中实现,主要是 CoinsViewDB::batchwrite这个函数。下面我们来分析一下:bool CCoinsViewDB::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock) { CDBBa 。
币界网报道:

utxo的刷盘逻辑主要在txdb.cpp中实现,主要是 CoinsViewDB::batchwrite这个函数。下面我们来分析一下:

bool CCoinsViewDB::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock) {
 CDBBatch batch(db);
 size_t count = 0;
 size_t changed = 0;
 for (CCoinsMap::iterator it = mapCoins.begin(); it != mapCoins.end();) {
 if (it->second.flags & CCoinsCacheEntry::DIRTY) {
 CoinEntry entry(&it->first);
 if (it->second.coin.IsSpent()) {
 batch.Erase(entry);
 } else {
 batch.Write(entry, it->second.coin);
 }
 changed++;
 }
 count++;
 CCoinsMap::iterator itOld = it++;
 mapCoins.erase(itOld);
 }
 if (!hashBlock.IsNull()) {
 batch.Write(DB_BEST_BLOCK, hashBlock);
 }
 bool ret = db.WriteBatch(batch);
 LogPrint("coindb", "Committed %u changed transaction outputs (out of %u) "
 "to coin database...\n",
 (unsigned int)changed, (unsigned int)count);
 return ret;
 }

在前面我们介绍过 CDBWrapper主要是对 leveldb的一个简单封装,定义一个CDBWrapper db;我们拿着 db 就可以实现相应的操作。

1

接下来迭代mapCoins,并填充其值,这里最主要的就是作为k-v数据库的leveldb中的key与value如何获得:

key

CoinEntry是一个辅助工具类。

struct CoinEntry {
 COutPoint *outpoint;
 char key;
 CoinEntry(const COutPoint *ptr)
 : outpoint(const_cast(ptr)), key(DB_COIN) {}
 template void Serialize(Stream &s) const {
 s << key;
 s << outpoint->hash;
 s << VARINT(outpoint->n);
 }
 };

key指向的是outpoint,具体结构如下:

2

我们将序列化后的值当作key,作为entry的参数,同时作为db.write的key。

关于db.write和db.WriteBatch二者之间的联系,前面已经详细分析。

value

value的值就是 coin 序列化后的值,而 coin 又包含了txout,如下:

class Coin {
 //! Unspent transaction output.
 CTxOut out;
 //! Whether containing transaction was a coinbase and height at which the
 //! transaction was included into a block.
 uint32_t nHeightAndIsCoinBase;

同样的,我们进行序列化并使用CTxOutCompressor对txout进行压缩,REF是一个宏定义,是非const转换,我们首先断言这个币是否被消费:

template void Serialize(Stream &s) const {
 assert(!IsSpent());
 ::Serialize(s, VARINT(nHeightAndIsCoinBase));
 ::Serialize(s, CTxOutCompressor(REF(out)));
 }

txout主要包含:

class CTxOut {
 public:
 Amount nValue;
 CScript scriptPubKey;

对nValue和scriptPubKey采用了不同的压缩方式来进行序列化,如下:

class CTxOutCompressor {
 private:
 CTxOut &txout;
 public:
 template
 inline void SerializationOp(Stream &s, Operation ser_action) {
 if (!ser_action.ForRead()) {
 uint64_t nVal = CompressAmount(txout.nValue);
 READWRITE(VARINT(nVal));
 } else {
 uint64_t nVal = 0;
 READWRITE(VARINT(nVal));
 txout.nValue = DecompressAmount(nVal);
 }
 CScriptCompressor cscript(REF(txout.scriptPubKey));
 READWRITE(cscript);
 }
 };

这时候我们就拿到了db.write的value值,这时候我们通过for循环,不断迭代,将值写入磁盘。

发表评论
发表评论
暂无评论
    相关阅读
    2024年,比特币的价格飙升至疯狂的新高,让金融界大吃一惊。它达到了10.8万美元,这是一个巨大的124%的涨幅
    比特币
    2025-01-08 09:24:13
    如果历史重演,死亡十字架可能标志着比特币主导地位的终结。但哪一个会领先——山寨币还是模因币?
    比特币
    2025-01-08 08:55:48
    一位备受关注的分析师认为,模因代币Floki(Floki)正在为反弹做准备,并有望创下历史新高(ATH)。
    区块链
    2025-01-08 07:45:59
    埃隆·马斯克赞扬了比特币倡导者、加拿大总理候选人Pierre Poilievre,他希望削减政府开支。
    比特币
    2025-01-08 07:43:53
    比特币重回10万美元,市场情绪转暖,机构增持加速推动价格上涨。川普上任或带来行情波动,建议稳重操作,关注ETH、川普相关币种及以太生态、AI板块。
    比特币
    2025-01-08 06:31:44
    推荐专栏
    Boss Wallet Web3 Econom Pass
    Fully On-Chain & AI-Powered Meme Trading | #Xbit #DEX #Web3 | English: @XBITDEX | Chinese 华语 : @XBITDEX_ZH | Support: @XbitHelpDesk
    一位相信价值投资的币圈KOL。稳定盈利的缠论野生交易员 #BTC行情分析师 #价值投资 #链上数据分析
    爱Web 3,爱生活,爱科技,爱炒币的老韭菜
    热门币种
    更多
    币种
    美元价格
    24H涨跌幅
    BTC比特币
    60,963.61 USDT
    ¥435,103.38
    -2.72%
    ETH以太坊
    3,368.69 USDT
    ¥24,042.67
    -0.3%
    BNB币安币
    570.68 USDT
    ¥4,073.00
    -0.28%
    USDT泰达币
    1.02 USDT
    ¥7.25
    -0.19%
    SOL
    135.96 USDT
    ¥970.36
    +7.66%
    USDC
    1.00 USDT
    ¥7.15
    -0.01%
    TON
    7.59 USDT
    ¥54.14
    +4.55%
    XRP瑞波币
    0.47720 USDT
    ¥3.41
    +0.48%
    DOGE狗狗币
    0.12210 USDT
    ¥0.87140
    +2.43%
    ADA艾达币
    0.39050 USDT
    ¥2.79
    +3.88%
    热搜币种
    更多
    币种
    美元价格
    24H涨跌幅
    狗狗币
    0.3541 USDT
    ¥2.59
    -9.65%
    Filecoin
    5.3381 USDT
    ¥39.11
    -10.48%
    比特币
    96512.03 USDT
    ¥707,090.56
    -5.13%
    Gatechain Token
    17.9689 USDT
    ¥131.65
    -2.85%
    Horizen
    23.2652 USDT
    ¥170.45
    -17.39%
    dYdX
    1.4038 USDT
    ¥10.28
    -13.8%
    Solana
    198.71 USDT
    ¥1,455.84
    -8.68%
    柚子
    0.814 USDT
    ¥5.96
    -10.6%
    Shiba Inu
    2.174E-5 USDT
    ¥0.00
    -9.45%
    艾达币
    0.998 USDT
    ¥7.31
    -8.29%
    FTX Token
    2.9131 USDT
    ¥21.34
    -13.97%
    火币积分
    0.9291 USDT
    ¥6.81
    -29.01%
    最新快讯
    更多
    WEEX交易所WE-Launch上线Violet,投入WXT瓜分3100万枚VIOLET代币
    2025-01-08 12:00:34
    美国现货比特币ETF昨日净流入5346万美元
    2025-01-08 12:00:02
    昨日美国比特币现货ETF净流入5348万美元
    2025-01-08 11:59:02
    CertiKAlert:7天前部署的IPC代币存在漏洞,黑客通过闪电贷保护机制盗取约59万美元
    2025-01-08 11:58:42
    IREN:2024全年比特币挖矿产出达3984枚BTC
    2025-01-08 11:57:41
    昨日贝莱德IBIT净流入5.9718亿美元,交易量达31亿美元
    2025-01-08 11:54:57
    IPC代币疑遭攻击,损失约59万美元
    2025-01-08 11:53:10