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