注:純粹是自己的記錄,沒有任何參考價值
面對著不知所云的比特幣源碼撬碟,我嘗試著采用逐字閱讀的笨辦法來解讀鹃答。同時也參考菜菜子的文章還有網(wǎng)上搜索來的解讀。
本次選取的是merkle.h壤短,面對浩瀚的程序,我選擇挨個打開慨仿,當(dāng)看到merkle.h時久脯,有一種熟悉感,因為區(qū)塊頭里面有Merkle樹的根值镰吆,那就從它開始了帘撰。
// Copyright (c) 2015 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
//file COPYING orhttp://www.opensource.org/licenses/mit-license.php.
一般每段程序前面都會有這樣幾句,BIECOIN Core團隊開發(fā)的程序万皿,根據(jù)MIT軟件開發(fā)協(xié)議發(fā)布摧找,見下文,文件附件及網(wǎng)址牢硅。
#ifndef BITCOIN_MERKLE
#define BITCOIN_MERKLE
搜索解釋:頭件的中的#ifndef蹬耘,這是"if not defined"的簡寫,是宏定義的一種减余。比如你有兩個C文件综苔,這兩個C文件都include了同一個頭文件。而編譯時位岔,這兩個C文件要一同編譯成一個可運行文件如筛,于是問題來了,大量的聲明沖突抒抬。條件指示符#ifndef的最主要目的是防止頭文件的重復(fù)包含和編譯杨刨。一般格式是這樣的:
#ifndef <標(biāo)識>
#define <標(biāo)識>
...
...
#endif
查看程序,果然在最后有#endif擦剑。
#include
#include
#include是在程序編譯之前要處理的內(nèi)容拭嫁,稱為編譯預(yù)處理命令。編譯預(yù)處理命令還有很多抓于,它們都以“#”開頭,并且不用分號結(jié)尾浇借,所以不是c語言的程序語句捉撮。
C系統(tǒng)的編程語言中,聲明在這個地方插入別的文件中的代碼妇垢,打“<>”這種尖括號巾遭,說的是肉康,這個文件是編程環(huán)境標(biāo)配擁有的文件,到默認(rèn)的標(biāo)配的地方去找這個文件灼舍。
stdint.h是標(biāo)準(zhǔn)C庫的頭文件吼和,#include 屬于STL庫 模板庫,但為什么沒有后綴呢骑素,這是C++里包含的東西寫庫的人為了和標(biāo)準(zhǔn)C和C++庫區(qū)分開炫乓,所有的模板庫的文件都沒有后綴。
#include "primitives/transaction.h"
#include "primitives/block.h"
#include "uint256.h"
下面緊接著就是打“”的文件了献丑,表示這不是編程環(huán)境標(biāo)配擁有的文件末捣,要在你的工程文件所在的目錄中找,或是在編程環(huán)境設(shè)定中要查找的目錄中去找创橄÷嶙觯或者說標(biāo)準(zhǔn)模板庫里沒有,但是我需要經(jīng)常用到妥畏,那好我自己就編寫一段保存起來邦邦,用的時候再調(diào)用,因為是自己制作的醉蚁,那就放在工程文件里燃辖,而不是放在標(biāo)準(zhǔn)庫房里。這和我們的工作很相似馍管。
uint256 ComputeMerkleRoot(const std::vector& leaves, bool* mutated = NULL);
std::vector ComputeMerkleBranch(const std::vector& leaves, uint32_t position);
uint256 ComputeMerkleRootFromBranch(const uint256& leaf, const std::vector& branch, uint32_t position);
下面就是注釋了郭赐,
/*
* Compute the Merkle root of the transactions in a block.
* *mutated is set to true if a duplicated subtree was found.
*/
我嘗試著將/*用在程序中,發(fā)現(xiàn)了規(guī)律确沸,這很小的發(fā)現(xiàn)雖說時別人的基本功捌锭,因為枯燥的閱讀添加了樂趣。計算區(qū)塊里交易的Merkle根值罗捎。當(dāng)找到復(fù)制出的子樹時观谦,指針變量mutated就被置1岭佳。
uint256 BlockMerkleRoot(const CBlock& block, bool* mutated = NULL);
/*
* Compute the Merkle root of the witness transactions in a block.
* *mutated is set to true if a duplicated subtree was found.
*/
Witness見證
uint256 BlockWitnessMerkleRoot(const CBlock& block, bool* mutated = NULL);
/*
* Compute the Merkle branch for the tree of transactions in a block, for a
* given position.
* This can be verified using ComputeMerkleRootFromBranch.
*/
我理解的意思是畅卓,計算出根植來了连茧,當(dāng)你想要查詢交易時喊崖,可以根據(jù)構(gòu)造出的二叉樹結(jié)構(gòu)來很快查詢到赦政,上一條是構(gòu)造励烦,這一條是查詢某條交易负敏。
std::vector BlockMerkleBranch(const CBlock& block, uint32_t position);
#endif
因為涉及到uint256.h或颊,又找來該頭文件來讀一讀
// Copyright (c) 2009-2010 Satoshi Nakamoto
// Copyright (c) 2009-2016 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING orhttp://www.opensource.org/licenses/mit-license.php.
同樣是前面一段描述霞掺,多了一行中本聰?shù)陌姹尽?/p>
#ifndef BITCOIN_UINT256_H
#define BITCOIN_UINT256_H
#include
#include
#include
#include
#include
#include
#include "crypto/common.h"
和前面一樣谊路,先把一些工具拿來備著,等用到的時候立等可取菩彬。
自己的感覺就像是面對一本書缠劝,一個字都不認(rèn)識潮梯,開始從字母開始,研究半天大概明白了一個字的意思惨恭。