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