摘要:區(qū)塊中存放著交易,區(qū)塊按照高度有序鏈接起來的這種數(shù)據(jù)結(jié)構(gòu)被稱為區(qū)塊鏈。區(qū)塊頭區(qū)塊頭的長度是字節(jié),將區(qū)塊頭數(shù)據(jù)進行兩次運算將得到區(qū)塊哈希。比特幣白皮書中定義的交易結(jié)構(gòu)和新的隔離見證交易結(jié)構(gòu)。
區(qū)塊鏈是一種賬本數(shù)據(jù)庫,分布式,數(shù)據(jù)存儲的每個節(jié)點都會同步復制整個賬本,信息透明難以篡改。
區(qū)塊中存放著交易,區(qū)塊按照高度有序鏈接起來的這種數(shù)據(jù)結(jié)構(gòu)被稱為區(qū)塊鏈。每個區(qū)塊都指向前一個區(qū)塊,一個區(qū)塊由 區(qū)塊頭 和 交易 組成。
區(qū)塊區(qū)塊由一個包含元數(shù)據(jù)的區(qū)塊頭和緊跟其后的構(gòu)成區(qū)塊主體的一長串交易列表組成。區(qū)塊結(jié)構(gòu)如圖:
區(qū)塊頭中數(shù)據(jù)有:
區(qū)塊版本
前個區(qū)塊哈希
Merkle Root 哈希
時間戳
Bits 難度
Nonce “挖礦” 隨機數(shù)
Coinbase 交易:每個區(qū)塊中的第一條交易都是 Coinbase 交易,用于獎勵 “礦工” 將交易打包到區(qū)塊。獎勵分為兩部分,一是區(qū)塊獎勵,一是區(qū)塊中除 Coinbase 交易外其它交易手續(xù)費總和。
區(qū)塊頭區(qū)塊頭的長度是80字節(jié),將區(qū)塊頭數(shù)據(jù)進行兩次 Sha256 運算將得到區(qū)塊哈希。
區(qū)塊頭結(jié)構(gòu)如下:
Field | Size | Data |
---|---|---|
Version | 4 bytes | Little-endian ? |
Previous Block Hash | 32 bytes | Little-endian ? |
MerkleRoot | 32 bytes | Little-endian ? |
Timestamp | 4 bytes | Little-endian ? |
Bits (Difficulty Target) | 4 bytes | Little-endian ? |
Nonce | 4 bytes | Little-endian ? |
Merkle Tree 是一種哈希二叉樹,用于歸納一個區(qū)塊中的所有交易,同時生成整個交易集合的數(shù)字簽名,且提供了一種校驗區(qū)塊是否存在某交易的高效途徑。
區(qū)塊鏈中的每個區(qū)塊都包含了產(chǎn)生于該區(qū)塊的所有交易,且以Merkle樹表示。那么如何獲得它呢?
從區(qū)塊交易列表中獲取每對Txid,并對它們進行兩次 Sha256 運算,得到哈希。
如果為奇數(shù),則復制一份湊成偶數(shù)再進行兩次 Sha256 運算,得到哈希。
遞歸1、2,直到最終獲得一個哈希,它就是Merkle Root。
為什么使用 Merkle Root 方式呢,為什么不對區(qū)塊內(nèi)所以交易一次性進行哈希呢,那樣不是更快么?
使用 Merkle Root 原因有二:
完整性驗證,任何一個節(jié)點的哈希發(fā)生變化,都會導致最終的 Root 節(jié)點哈希發(fā)生變化。這一特性也可用于快速定位問題節(jié)點。
零知識證明,如下圖,16 條交易的節(jié)點能夠通過生成一條僅有 4 個 32 字節(jié)哈希值長度(總128字節(jié))的 Merkle 路徑,來證明區(qū)塊中存在一筆交易 K,該路徑有4個哈希值 HL、HIJ、HMNOP 和 HABCDEFGH。由這4個哈希值產(chǎn)生的認證路徑,再通過計算另外四對哈希值 HKL、HIJKL、HIJKLMNOP 和 Merkle Root,任何節(jié)點都能證明 HK 包含在Merkle Root。
關(guān)于 Merkle 路徑,我們來看一張圖:
交易數(shù)量 | 區(qū)塊大小 | 路徑數(shù)量 | 路徑大小 |
---|---|---|---|
16 | 4 KB | 4 | 128 bytes |
512 | 128 KB | 9 | 288 bytes |
2048 | 512 KB | 11 | 352 bytes |
4096 | 1 MB | 12 | 384 bytes |
65,535 | 16 MB | 16 | 512 bytes |
即使增長到交易數(shù)量為 262144,區(qū)塊大小到 65M,路徑數(shù)也才 18。所以使用 Merkle Root 非常高效,如果是所有交易進行一次哈希,雖然獲得 Hash 是快些,但對于要驗證問題交易或節(jié)點,將是個災難。
Bits 和 NonceBits 是挖礦目標難度 Target 的緊湊格式。
Nonce 是挖礦遍歷時的隨機數(shù)。
關(guān)于 “挖礦” 的具體內(nèi)容,我會多帶帶總結(jié)一篇,感興趣可以關(guān)注后續(xù)文章。
這里有一個在線的模擬挖礦,各種數(shù)據(jù)顯示都很直觀,適合了解挖礦內(nèi)部運作:點我前往模擬挖礦
目前存在兩種交易結(jié)構(gòu)。比特幣白皮書中定義的交易結(jié)構(gòu)和新的隔離見證交易結(jié)構(gòu)。
BIP 141 定義一種新的交易結(jié)構(gòu),我們稱之為 “Segregated Witness (隔離見證)” 交易。舊交易結(jié)構(gòu)簽名數(shù)據(jù)放在交易輸入里,隔離見證交易則將簽名數(shù)據(jù) “分離” 出來,放在交易的 Locktime 之前。
交易結(jié)構(gòu):
[nVersion] [n] [tx inputs] [n] [tx outputs] [nLockTime] | | | | 4 bytes varint varint 4 bytes
隔離見證(Segregated Witness)交易結(jié)構(gòu):
[nVersion] [marker] [flag][n] [tx inputs] [n] [tx outputs] [witness][nLockTime] | / / | | / | 4 bytes 0x00 0x01 varint varint scriptSig 4 bytes
Field | Size | Data |
---|---|---|
Version | 4 bytes | Little-endian ? |
* Marker | 1 bytes | 0x00 |
* Flag | 1 bytes | 0x01 |
Input Counter | 1–9 bytes | VarInt |
Inputs | Variable | |
Output Counter | 1–9 bytes | VarInt |
Outputs | Variable | |
* Witness | Variable | |
Locktime | 4 bytes | Little-endian ? |
* 為 Segregated Witness 交易字段。
我們解析一條 Segregated Witness (P2SH-P2WPKH)交易:
如果你對 P2SH-P2WPKH 交易感興趣可以查看我之前寫的一篇介紹 Segregated Witness 的文章。
{ "txid": "af0c4cdd2537ae367b0e03db0cd795fa37543bd672c9234b2c307009a9a8108f", "hash": "ff300093626745127aad29e8628ee4606b87cb660f7ff63817dd4857cd15a175", "version": 2, "size": 248, "vsize": 166, "locktime": 0, "vin": [], "vout": [] }
HEX 數(shù)據(jù):
Inputs交易輸入結(jié)構(gòu):
Field | Size | Data |
---|---|---|
TXID | 32 bytes | Little-endian ? |
VOUT | 4 bytes | Little-endian ? |
ScriptSig Size | 1–9 bytes | VarInt |
ScriptSig | Variable | |
Sequence | 4 bytes | Little-endian ? |
輸入JSON:
{ "txid": "6635d3f451478f0e1f88692d5cfb9194f133fbb314cb87fa9483f89bd296284b", "vout": 0, "scriptSig": { "asm": "0014db75523757a256579a197746568f331103417b85", "hex": "160014db75523757a256579a197746568f331103417b85" }, "txinwitness": [ "3045022100c8b2a6027f939bb964e395c94cd6f1d8ff9d1f406e41975b2ac979a6007c3ac4022019953dfe376d0152152955e02d72e7a7b9a61f8d5700642c97a2dc4ba13628b801", "02983f3687310bcfe2ad1ad55d011112c3f8d659950c10cab9ff43ae34d7b6280e" ], "sequence": 4294967293 }outputs
交易輸出結(jié)構(gòu):
Field | Size | Data |
---|---|---|
Value | 8 bytes | Little-endian ? |
ScriptPubKey Size | 1–9 bytes | VarInt |
ScriptPubKey | Variable |
輸出JSON:
{ "value": 1.00000000, "n": 0, "scriptPubKey": { "asm": "OP_HASH160 2228cecac3c1fa3143ba2ac7d2525d8b9b05c87b OP_EQUAL", "hex": "a9142228cecac3c1fa3143ba2ac7d2525d8b9b05c87b87", "reqSigs": 1, "type": "scripthash", "addresses": [ "2MvMqrBRct4F2zuyrpgrq2qqq61VZc1znPB" ] } }, { "value": 48.99996680, "n": 1, "scriptPubKey": { "asm": "OP_HASH160 22e2f5339cdf0778935e8127dc51e4a0ae62d162 OP_EQUAL", "hex": "a91422e2f5339cdf0778935e8127dc51e4a0ae62d16287", "reqSigs": 1, "type": "scripthash", "addresses": [ "2MvRgr7SeyTVutrUaJdmZ5ETVdoPp5eWoj5" ] } }VarInt
比特幣使用可變字節(jié)表示腳本長度,當一個字節(jié)不夠表示時,如下規(guī)律:
Size | Example | Description |
---|---|---|
<= 0xfc | 0x12 | 1 個字節(jié) |
<= 0xffff | 0xfd1234 | 前綴是fd,小端表示接下來的2個字節(jié) |
<= 0xffffffff | 0xfe12345678 | 前綴是fe,小端表示接下來的4個字節(jié) |
<= 0xffffffffffffffff | 0xff1234567890abcdef | 前綴是ff,小端表示接下來的8個字節(jié) |
如:0x48,沒有 fd、fe、ff 前綴,所以我們知道它是2 bytes表示的。
VarInt: 0x48 = 72 bytes
如:fd2606,因為是 fd 前綴,我們讀取fd之后的 4 bytes,反轉(zhuǎn)小端再轉(zhuǎn)換為十進制表示。
VarInt: 0xfd2606 = 0x2602 (next 2 bytes) = 0x0226 (Little-Endian) = 550 bytesLittle-Endian
小端 (Little-endian) 字節(jié)序。如:0x12345678
大端類似于十六進制字節(jié)從左到右的閱讀順序。小端最低位字節(jié)是 0x78 存儲在最低的內(nèi)存地址處,后面的字節(jié)依次往后存。
Big-Endian: |12|34|56|78| Little-Endian: |78|56|34|12|
比特幣在很多地方數(shù)據(jù)都是用小端序表示。
參考https://github.com/bitcoinboo...
http://learnmeabitcoin.com/gl...
http://learnmeabitcoin.com/gl...
http://learnmeabitcoin.com/gl...
http://yogh.io
http://royalforkblog.github.i...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/24422.html
摘要:目前整個歷史的大小所有區(qū)塊加起來的大小大約是,而狀態(tài)的大小只有大約由約萬個組成。通過每個區(qū)塊的,間接限制了歷史和狀態(tài)的增長速度。常見的一個誤解是的區(qū)塊鏈大小已經(jīng)超過了。區(qū)塊鏈節(jié)點為保存歷史和狀態(tài)付出的存儲,正是這樣一種共享資源。 showImg(https://segmentfault.com/img/bVbsfg9?w=1920&h=815); 如果 Layer 1 的關(guān)注點應(yīng)該是狀...
摘要:在本次秘猿科技區(qū)塊鏈小課堂中,我們帶大家來了解一個全新的狀態(tài)爆炸問題。目前整個歷史的大小所有區(qū)塊加起來的大小大約是,而狀態(tài)的大小只有大約由約萬個組成。通過每個區(qū)塊的,間接限制了歷史和狀態(tài)的增長速度。常見的一個誤解是的區(qū)塊鏈大小已經(jīng)超過了。 在設(shè)計全新的區(qū)塊鏈經(jīng)濟模型之前,我們以 SoV(價值存儲) 和 MoE(交易媒介) 兩個框架分析了比特幣和以太坊經(jīng)濟模型,得出了上一篇中的問題。在本...
摘要:書接上回區(qū)塊鏈筆記基礎(chǔ)概念掃盲,我們討論了關(guān)于比特幣以及區(qū)塊鏈的許多基礎(chǔ)概念,可能通過我略帶類比的描述,讓你初步有了一些概念,但是對于一個比特幣到底長什么樣以及如何使用比特幣進行交易可能還不是很清楚,說的直白點就是聽過豬叫,但沒吃過豬肉。 解惑是每個人都在走的一條路,可誰又能解這漫漫無期呢?路上總是麻醉的人多,釋懷的人少。 書接上回區(qū)塊鏈筆記(1)基礎(chǔ)概念掃盲,我們討論了關(guān)于比特幣以及...
摘要:為了理解底層公鏈的模型,我們前置了幾篇概念性文章,講述了我們應(yīng)該以狀態(tài)為中心設(shè)計區(qū)塊鏈系統(tǒng)的,以及這么做帶來的好處。交易依然表示狀態(tài)的變化遷移。 為了理解底層公鏈 CKB 的 Cell 模型,我們前置了幾篇概念性文章,講述了我們應(yīng)該以狀態(tài)為中心設(shè)計區(qū)塊鏈系統(tǒng)的,以及這么做帶來的好處。并且在上一篇文章中,詳細分析了比特幣 UTXO 模型和以太坊的 Account 模型,以及進行了對比分析...
摘要:交易依然表示狀態(tài)的變化遷移。這樣一個模型的特點是狀態(tài)是第一性的所有者是狀態(tài)的屬性,每一份狀態(tài)只有一個所有者狀態(tài)不斷的被銷毀和創(chuàng)建。值得指出的是,的編程模型之所以強大,更多是因為它有狀態(tài),而不是因為它的有限圖靈完備。 在設(shè)計 CKB 的時候,我們想要解決三個方面的問題: 狀態(tài)爆炸引起的公地悲劇及去中心化的喪失;計算和驗證耦合在了一起使得無論是計算還是驗證都失去了靈活性,難以擴展;交易與價...
摘要:比特幣主網(wǎng)絡(luò)現(xiàn)在已經(jīng)有數(shù)百大小。加密錢包密碼應(yīng)該包括位以上,且不要使用生日名字證件號碼等易被猜測的密碼。警告遺忘密碼等于丟失所有比特幣。例如比特幣免費領(lǐng)取測試比特幣。 showImg(https://upload-images.jianshu.io/upload_images/4834364-4db38e8ae57ed028.png?imageMogr2/auto-orient/str...
閱讀 3329·2021-11-16 11:45
閱讀 2673·2021-09-22 15:23
閱讀 577·2021-07-30 14:58
閱讀 474·2019-08-30 15:54
閱讀 2253·2019-08-29 16:19
閱讀 3030·2019-08-29 12:45
閱讀 957·2019-08-23 17:57
閱讀 1807·2019-08-23 17:54