比特幣區(qū)塊分析

前言

我們知道區(qū)塊鏈?zhǔn)怯啥鄠€(gè)區(qū)塊鏈接而成的一條鏈,每一個(gè)區(qū)塊都包含著一些數(shù)據(jù),我們通過(guò)比特幣區(qū)塊的解析來(lái)了解一下區(qū)塊鏈。

區(qū)塊結(jié)構(gòu)

比特幣大概每10分鐘左右產(chǎn)生一個(gè)區(qū)塊,每個(gè)區(qū)塊的容量是中本聰設(shè)置的1M大小。我們可以在blockchain這個(gè)網(wǎng)站上看到最近產(chǎn)生的區(qū)塊。

一個(gè)完整的區(qū)塊包括以下5塊內(nèi)容:

名稱 數(shù)據(jù)大小 說(shuō)明
魔數(shù)(Magic NO) 4字節(jié) 總為常數(shù)0xD9B4BEF9,作為區(qū)塊之間的分隔符
區(qū)塊大小(Blocksize) 4字節(jié) 用于記錄當(dāng)前區(qū)塊的大?。丛撟侄沃蟮膮^(qū)塊大小)
區(qū)塊頭(Blockheader) 80字節(jié) 記錄當(dāng)前區(qū)塊頭上的一些信息
交易計(jì)數(shù)(Transaction counter) 1-9字節(jié) 該區(qū)塊包含的交易數(shù)量,包含coinbase交易
交易詳情(Transactions) 不定 包含了當(dāng)前區(qū)塊保存的所有交易細(xì)節(jié)

區(qū)塊內(nèi)容解析

我們從webbtc里隨便選一個(gè)區(qū)塊,看到內(nèi)容如下圖所示:

image

這里是從區(qū)塊里讀出的一個(gè)數(shù)據(jù)的概要。具體的原始數(shù)據(jù)可以查看Formats那一行,一個(gè)是json數(shù)據(jù),一個(gè)是十六進(jìn)制的數(shù)據(jù),還有一個(gè)是二進(jìn)制的數(shù)據(jù)。我們這里直接查看json數(shù)據(jù)即可。下面我把整個(gè)json數(shù)據(jù)分成了三個(gè)部分便于查看。

當(dāng)前區(qū)塊Hasn、區(qū)塊頭、交易計(jì)數(shù)、區(qū)塊大小

{
  "hash": "000000000000000001806a922d4d35a37ad9324c690f72d556c6445cb7a9c214",
  "ver": 536870914,
  "prev_block": "000000000000000000f061205567dc79c4e718209a568879d66132e016968ac6",
  "mrkl_root": "83f5fdf40b0b02c09ae669041df1bedfc635c45f696057a8c29e1bde1f4cbd24",
  "time": 1482006384,
  "bits": 402885509,
  "nonce": 636041063,
  "n_tx": 20,
  "size": 6264
}

當(dāng)前區(qū)塊Hasn

我們看這段json數(shù)據(jù),第一個(gè)是當(dāng)前區(qū)塊的Hash,但它并不保存在區(qū)塊的數(shù)據(jù)結(jié)構(gòu)里,不管是該區(qū)塊在網(wǎng)絡(luò)上傳輸時(shí),抑或是它作為區(qū)塊鏈的一部分被存儲(chǔ)在某節(jié)點(diǎn)的永久性存儲(chǔ)設(shè)備上時(shí)。相反,區(qū)塊哈希值是當(dāng)該區(qū)塊從網(wǎng)絡(luò)被接收時(shí)由每個(gè)節(jié)點(diǎn)計(jì)算出來(lái)的。區(qū)塊的哈希值可能會(huì)作為區(qū)塊元數(shù)據(jù)的一部分被存儲(chǔ)在一個(gè)獨(dú)立的數(shù)據(jù)庫(kù)表中,以便于索引和更快地從磁盤檢索區(qū)塊。

簡(jiǎn)單的說(shuō)就是這個(gè)值被算出來(lái)后在本地?cái)?shù)據(jù)庫(kù)或緩存中,然后供下個(gè)區(qū)塊生成或者是到來(lái)較驗(yàn)用,然后在下一個(gè)區(qū)塊生成時(shí),在下一個(gè)區(qū)塊的區(qū)塊頭中保存。

區(qū)塊頭

//bitcoin 區(qū)塊頭的代碼

class CBlockHeader
{
public:
    // header
    int32_t nVersion;
    uint256 hashPrevBlock;
    uint256 hashMerkleRoot;
    uint32_t nTime;
    uint32_t nBits;
    uint32_t nNonce;

    CBlockHeader()
    {
        SetNull();
    }

    ADD_SERIALIZE_METHODS;

    template <typename Stream, typename Operation>
    inline void SerializationOp(Stream& s, Operation ser_action) {
        READWRITE(this->nVersion);
        READWRITE(hashPrevBlock);
        READWRITE(hashMerkleRoot);
        READWRITE(nTime);
        READWRITE(nBits);
        READWRITE(nNonce);
    }

    void SetNull()
    {
        nVersion = 0;
        hashPrevBlock.SetNull();
        hashMerkleRoot.SetNull();
        nTime = 0;
        nBits = 0;
        nNonce = 0;
    }

    bool IsNull() const
    {
        return (nBits == 0);
    }

    uint256 GetHash() const;

    int64_t GetBlockTime() const
    {
        return (int64_t)nTime;
    }
};

區(qū)塊頭包含以下6個(gè)部分:版本、父區(qū)塊頭哈希值、Merkle根、時(shí)間戳、難度目標(biāo)、隨機(jī)數(shù),總共80個(gè)字節(jié)。

名稱 數(shù)據(jù)大小 說(shuō)明
版本(ver) 4字節(jié) 數(shù)據(jù)區(qū)塊的版本號(hào)
父區(qū)塊頭哈希值(prev_block) 32字節(jié) 記錄了前一個(gè)區(qū)塊的哈希值,當(dāng)前區(qū)塊的哈希值一定比它小
Merkle根(mrkl_root) 32字節(jié) 該區(qū)塊中交易的Merkle樹根的哈希,是根據(jù)當(dāng)前區(qū)塊所有交易的哈希值生成的
時(shí)間戳(time) 4字節(jié) 該區(qū)塊產(chǎn)生的近似時(shí)間,精確到秒的UNIX時(shí)間戳,必須嚴(yán)格大于前11個(gè)區(qū)塊時(shí)間的中值,同時(shí)全節(jié)點(diǎn)也會(huì)拒絕那些超出自己2個(gè)小時(shí)時(shí)間戳的區(qū)塊
難度目標(biāo)(bits) 4字節(jié) 該區(qū)塊工作量證明算法的難度目標(biāo),已經(jīng)使用特定算法編碼
隨機(jī)數(shù)(nonce) 4字節(jié) 為了找到滿足難度目標(biāo)所設(shè)定的隨機(jī)數(shù),為了解決32位隨機(jī)數(shù)在算力飛升的情況下不夠用的問(wèn)題,規(guī)定時(shí)間戳和coinbase交易信息均可更改,以此擴(kuò)展nonce的位數(shù)

交易計(jì)數(shù)

n_tx即是當(dāng)前區(qū)塊的交易計(jì)數(shù),我們能看到一共有20筆

區(qū)塊大小

size即為當(dāng)前區(qū)塊的大小,這里看到的為6264字節(jié)

交易詳情

以下數(shù)據(jù)即為交易詳情,一共20筆,我這里只取了其中的兩筆交易,其中第一筆為coinbase交易,即由挖礦產(chǎn)生的比特幣獎(jiǎng)勵(lì)。

{  "tx": [
    {
      "hash": "f94528b2012446f4e367694871d07d5c726788e2f20d5553161a24debbec5118",
      "ver": 1,
      "vin_sz": 1,
      "vout_sz": 1,
      "lock_time": 0,
      "size": 154,
      "in": [
        {
          "prev_out": {
            "hash": "0000000000000000000000000000000000000000000000000000000000000000",
            "n": 4294967295
          },
          "coinbase": "03efc506fabe6d6d3146d1ecf0c8b111d52ee100ef81dc1ab32ce28f4f6b677e9eb0f0a5032fa9270100000000000000016506008508ed705d0000ea6e1c2f736c7573682f",
          "sequence": 0
        }
      ],
      "out": [
        {
          "value": "12.50503278",
          "scriptPubKey": "OP_DUP OP_HASH160 7c154ed1dc59609e3d26abb2df2ea3d587cd8c41 OP_EQUALVERIFY OP_CHECKSIG",
          "address": "1CK6KHY6MHgYvmRQ4PAafKYDrg1ejbH1cE"
        }
      ],
      "nid": "0f66ac12827c122c2df335ba8c4d89ca0d0b071cab39ab1e6b436ed3fb246d36"
    },
    {
      "hash": "c8a340969b594332876f357207083a6a36b3269e37302315e8bef05032105346",
      "ver": 1,
      "vin_sz": 1,
      "vout_sz": 2,
      "lock_time": 0,
      "size": 334,
      "in": [
        {
          "prev_out": {
            "hash": "8529367f8e6d3cf34fe702eb05a18e67e521385835e735e5c69184b14d19f688",
            "n": 1
          },
          "scriptSig": "0 30450221009c1503bc1500b58aab48bfe62d40fb511a03193e8a7fbdefde4915949dc2ade902207920d7a86e819b568d34d931871d94824cec8dad63dc977d354b65264380907501 304502210095b2184dd3649e2a5025cd8e67a2c3aad6dc022848160f169006c322d77f67d302205ff0f8417126650c5b5e71abc64e37c1769a312d613602b96a944a8281f6c69c01 5221032284521d6790130f7043136a14b60119cea371c754cb3743b56c61b7d495d6e42103f15e3cdd49c26ea7b00c9b5ddeac06129033ac38e5a0b739883e0b302138ec3552ae"
        }
      ],
      "out": [
        {
          "value": "0.00149700",
          "scriptPubKey": "OP_HASH160 88196be31c9252c3895e495bd657d7dd389ddd94 OP_EQUAL"
        },
        {
          "value": "0.00824600",
          "scriptPubKey": "OP_HASH160 d4dc84eedfec38bad0510d364b2c8fd4fce57151 OP_EQUAL"
        }
      ],
      "nid": "ccd4371ec31f533884416959ad1e5503c9be5fb3262d7a40fc6ec58f9cf54090"
    }
    ·
    ·
    ·
    ·
    ]
}    

我們能看到每一筆都有輸入和輸出,以及交易哈希、版本號(hào)等等。

默克樹(Merkle Tree)

{
  "mrkl_tree": [
    "f94528b2012446f4e367694871d07d5c726788e2f20d5553161a24debbec5118",
    "c8a340969b594332876f357207083a6a36b3269e37302315e8bef05032105346",
    "460bf9d5db9f1df960c03b5225316ac77d1965b8f4ac429e0e66a6e097018a07",
    "104bf4664aab45e8e20274fbed530eccf22af9565e10597bd63965f0bbbf11ff",
    "9b49a5734b040cfcd370c0af924f590d79eceb1cfb77b655770713bff9e01281",
    "8da9855406072b487dc14c05f9d1fb98eaea5cdf802aafe9a361fd23531db819",
    "9430c839d5605f59ed7a47ed59d50c1cec2d62e771f7a02bfbb17d91416af4b9",
    "ebe8e007b49aceef46e3971564802b049029a9bdc31d2ed1b0be23633b01236b",
    "26ffe42a53c5caabd37ca0a260d3e6e15d0dbdb30cd641d8fa2690f065b5b712",
    "358f05fb03bad69fb4ebcef9a74dea2a7fd4368e31e0ac7794a155f4930ba4e6",
    "8d1ab4e9c5b788d97f126a7c22ab67b8326cbed2d1b992bbc8dcdbb74b13bf7d",
    "4c2980e9bca8044f61db1e1422fb92aab50389517c8d8da8dca79ae2d73776c4",
    "72fa5baf9250e5226afaaa1dd7194912027407111642f1e420e42f52023eba60",
    "3facb7091d0c4330735b3d184662a52902c820e98de65ac692075abb2d917db7",
    "46c33ae0d9f03cc97bcb94013f4c54640614db1768728c928d0ac7ebd9f8c1c9",
    "6dcaec17dc034f242166c8e2161acbefcf3b30087a96ed621da7cdccc8ff3002",
    "40edfee9764baab18bbe375fa5d15c26ecdf109f90fa27522809902c441e45ab",
    "45b3093eb524baa5b078f73755b80789af733c78c16ec612ed435860c33020fa",
    "2b05f2168afc22d73b929fbdcb8e38fea969fa1fbe7cb6e10efb37e876f5cfe2",
    "323c7c81cff26c38171c4740d5163ff5ef0ab23de80a2a069f95405d0945b693",
    "99deb2a2f7d199062e3a075e9bb0b58f7fb8498621e799e3365e1a3c4c255d8d",
    "ecfc6aea54b4d7e517a3170d291bde5f9edb0119dedf8193b8ddf90e583c19cc",
    "c549c24b1575ada64dd21a5b59f6018e44d9e4caec0a0505f034b7d4cb54c7d9",
    "c9001c84acba3b2e5c2020344552d29a09460dd86906757394caa80c49b84c08",
    "197eb574bcbf4b85c934bc985a15bfc6f2e5da513e5e8ccc9206a50edd66297f",
    "4e92a4eb49c494146a5172b0dddb903013d478c82f7c9da81a675872468ac7d6",
    "7849c98a4bd4af150eb9c954cda0734a9dbcf9e2f88e34480bc910544d3fdf4c",
    "dfd05872158c2a78923159f1cb1182c89641398967c458d768bdb422c397fa57",
    "9b27fb4636d299311abb6015ca27760e408fce7802d196fa14a0a9470e219bbb",
    "da9b1c4deda656cc215646f204700b7829fd72a2e2ebd967e1fa01e1811c7ec1",
    "b81ab1b0c6cc42fdb56176ede115bee5b66a571ebbf8053f6510fdd3a9927501",
    "7ca0e3b3e7cc193fbc1f6553cfca35b3358727b3107c0d5914311685bdf761a8",
    "5ce961502e61d22b77860d478dfb0b4073ba5249b11aaba32e2c13db4b4356c7",
    "c1a84c7a58fdf92834b05aadffaaaeef4745ea60a8914a250b010e581839221a",
    "f1e7cbe4a5f916c87fab0049eaccd6dc825ca7ac495575c01a3fc9b358d2c377",
    "bebd7be3317d84cce8c2674d39c883a4218d218294f7154c33359c34b7437fbb",
    "91f5ea3df74833e2dd94ecc2b8360a8a764a01c5c006baab88556b923434706a",
    "2298fca6dc939e048c79721afeaadfa6f8056eb8006b1f1e2d1d653e6baa438f",
    "bf57c77219a6d905440368629f593c4fb4c23cc35d68b7305cc8506bbdb4e452",
    "513be8c874a6bba6259e0a44a709e5a58c1cb0f610612c35b9725227b7c2bd78",
    "83f5fdf40b0b02c09ae669041df1bedfc635c45f696057a8c29e1bde1f4cbd24"
  ]
}

上面為默克樹(Merkle Tree)的整個(gè)樹節(jié)點(diǎn)的信息。保存在區(qū)塊頭中的mrkl_root就是由這個(gè)默克樹生成的,我們能看到以上數(shù)組的最后一個(gè)Hash值跟區(qū)塊頭中的mrkl_root相同,這個(gè)數(shù)據(jù)就是默克樹最后生成的默克根。所以我們一共20筆交易,那么加上mrkl_root一共就是20+10+5+3+2+1=41個(gè)Hash值。下圖是一個(gè)簡(jiǎn)單的默克樹生成過(guò)程:

比特幣使用默克樹的方式對(duì)交易進(jìn)行驗(yàn)證,相對(duì)于哈希列表,默克樹是一種哈希二叉樹,它的明顯的一個(gè)好處是可以單獨(dú)拿出一個(gè)分支來(lái)對(duì)部分?jǐn)?shù)據(jù)進(jìn)行校驗(yàn),更加高效。

參考

比特幣區(qū)塊鏈的數(shù)據(jù)結(jié)構(gòu)解析

比特幣的區(qū)塊結(jié)構(gòu)解析

當(dāng)前區(qū)塊的Hash保存在哪里

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容