比特币的区块结构解析
比特幣的區(qū)塊數(shù)據(jù)里包含了比特幣鏈上的核心信息,包括比特幣如何交易,區(qū)塊擴(kuò)容等問題。
比特幣從誕生到現(xiàn)在,每10分鐘誕生一個區(qū)塊,訪問?https://blockchain.info/?查看最近的區(qū)塊信息,可以看到當(dāng)前的區(qū)塊大小已經(jīng)接近或超過中本聰設(shè)置的1MB容量。
一、區(qū)塊鏈數(shù)據(jù)結(jié)構(gòu)
一個完整的區(qū)塊結(jié)構(gòu)主要由以下幾部分構(gòu)成:
| Magic NO | 4 | 魔數(shù) | 常數(shù)0xD9B4BEF9 |
| Blocksize | 4 | 區(qū)塊大小 | 用字節(jié)表示的該字段之后的區(qū)塊大小 |
| Blockheader | 80 | 區(qū)塊頭 | 組成區(qū)塊頭的幾個字段 |
| Transaction counter | 1-9 | 交易計數(shù)器 | 該區(qū)塊包含的交易數(shù)量,包含coinbase交易 |
| Transactions | 不定 | 交易 | 記錄在區(qū)塊里的交易信息,使用原生的交易信息格式,并且交易在數(shù)據(jù)流中的位置必須與Merkle樹的葉子節(jié)點(diǎn)順序一致 |
?
二、區(qū)塊信息解析
我們從?https://webbtc.com?選擇一個區(qū)塊哈希值為000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506的早期區(qū)塊進(jìn)行分析。
可以看到該區(qū)塊中包含了三筆交易信息,下面對區(qū)塊信息字段進(jìn)行解析。
?
1.區(qū)塊頭分析
前80個字節(jié)是區(qū)塊頭。
| 1 2 3 4 5 6 7 8 9 | { ????"hash":?"000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506", ????"ver": 1, ????"prev_block":?"000000000002d01c1fccc21636b607dfd930d31d01c3a62104612a1719011250", ????"mrkl_root":?"f3e94742aca4b5ef85488dc37c06c3282295ffec960994b2c0d5ac2a25a95766", ????"time": 1293623863, ????"bits": 453281356, ????"nonce": 274148111 } |
| 4 | 版本 | 區(qū)塊版本號,表示本區(qū)塊遵守的驗(yàn)證規(guī)則 |
| 32 | 父區(qū)塊頭哈希值 | 前一區(qū)塊的哈希值,使用SHA256(SHA256(父區(qū)塊頭))計算 |
| 32 | Merkle根 | 該區(qū)塊中交易的Merkle樹根的哈希值,同樣采用SHA256(SHA256())計算 |
| 4 | 時間戳 | 該區(qū)塊產(chǎn)生的近似時間,精確到秒的UNIX時間戳,必須嚴(yán)格大于前11個區(qū)塊時間的中值,同時全節(jié)點(diǎn)也會拒絕那些超出自己2個小時時間戳的區(qū)塊 |
| 4 | 難度目標(biāo) | 該區(qū)塊工作量證明算法的難度目標(biāo),已經(jīng)使用特定算法編碼 |
| 4 | Nonce | 為了找到滿足難度目標(biāo)所設(shè)定的隨機(jī)數(shù),為了解決32位隨機(jī)數(shù)在算力飛升的情況下不夠用的問題,規(guī)定時間戳和coinbase交易信息均可更改,以此擴(kuò)展nonce的位數(shù) |
說明:
- 版本、父區(qū)塊頭哈希值和Merkle根采用的是小端格式編碼,即低有效位放在前面。
- 時間戳表示的是自1970年1月1日0時0分0秒以來的秒數(shù)
?
2.Coinbase交易信息分析
一個區(qū)塊第一個交易規(guī)定為coinbase交易,即由挖礦產(chǎn)生的比特幣獎勵,可以看到目前挖出每個區(qū)塊的獎勵是12.5個比特幣,下一次減半會發(fā)生在2020年。
除了挖礦獎勵,“礦工”的激勵還有新增賬本記賬的手續(xù)費(fèi),在未來比特幣總量不增加之后,后者會成為礦工的主要收入。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | { ????"hash":?"8c14f0db3df150123e6f3dbbf30f8b955a8249b62ac1d1ff16284aefa3d06d87", ????"ver": 1, ????"vin_sz": 1, ????"vout_sz": 1, ????"lock_time": 0, ????"size": 135, ????"in": [{ ????????"prev_out": { ????????????"hash":?"0000000000000000000000000000000000000000000000000000000000000000", ????????????"n": 4294967295 ????????}, ????????"coinbase":?"044c86041b020602" ????}], ????"out": [{ ????????"value":?"50.00000000", ????????"scriptPubKey":?"041b0e8c2567c12536aa13357b79a073dc4444acb83c4ec7a0e2f99dd7457516c5817242da796924ca4e99947d087fedf9ce467cb9f7c6287078f801df276fdf84 OP_CHECKSIG", ????????"next_in": { ????????????"hash":?"f3e6066078e815bb24db0dfbff814f738943bddaaa76f8beba360cfe2882480a", ????????????"n": 12 ????????} ????}], ????"nid":?"70ab531a68f973f7d20b8260cb5e7fecba3699c48715b8b44539ff9776d0b88e" } |
| 4 | 版本 | 這筆交易參照的規(guī)則 |
| 1-9 | 輸入計數(shù)器 | 包含的交易輸入數(shù)量 |
| 32 | 交易哈希 | 不引用任何一個交易,值全部為0 |
| 4 | 交易輸出索引 | 固定為0xFFFFFFFF |
| 1-9 | Coinbase數(shù)據(jù)長度 | coinbase數(shù)據(jù)長度 |
| 不定 | Coinbase數(shù)據(jù) | 在V2版本的區(qū)塊中,除了需要以區(qū)塊高度開始外,其它數(shù)據(jù)可以任意填寫,用于extra nonce和挖礦標(biāo)簽 |
| 4 | 順序號 | 值全部為1,0xFFFFFFFF |
| 1-9 | 輸出計數(shù)器 | 包含的交易輸出數(shù)量 |
| 8 | 總量 | 用聰表示的比特幣值 |
| 1-9 | 鎖定腳本大小 | 用字節(jié)表示的后面的鎖定腳本長度 |
| 不定 | 鎖定腳本 | 一個定義了支付輸出所需條件的腳本 |
| 4 | 鎖定時間 | 一個區(qū)塊號或UNIX時間戳 |
?
3.交易信息記錄
下面來看下普通的交易記錄。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | { ????"hash":?"fff2525b8931402dd09222c50775608f75787bd2b87e56995a7bdd30f79702c4", ????"ver": 1, ????"vin_sz": 1, ????"vout_sz": 2, ????"lock_time": 0, ????"size": 259, ????"in": [{ ????????"prev_out": { ????????????"hash":?"87a157f3fd88ac7907c05fc55e271dc4acdc5605d187d646604ca8c0e9382e03", ????????????"n": 0 ????????}, ????????"scriptSig":?"3046022100c352d3dd993a981beba4a63ad15c209275ca9470abfcd57da93b58e4eb5dce82022100840792bc1f456062819f15d33ee7055cf7b5ee1af1ebcc6028d9cdb1c3af774801 04f46db5e9d61a9dc27b8d64ad23e7383a4e6ca164593c2527c038c0857eb67ee8e825dca65046b82c9331586c82e0fd1f633f25f87c161bc6f8a630121df2b3d3" ????}], ????"out": [{ ????????????"value":?"5.56000000", ????????????"scriptPubKey":?"OP_DUP OP_HASH160 c398efa9c392ba6013c5e04ee729755ef7f58b32 OP_EQUALVERIFY OP_CHECKSIG", ????????????"address":?"1JqDybm2nWTENrHvMyafbSXXtTk5Uv5QAn", ????????????"next_in": { ????????????????"hash":?"5aa8e36f9423ee5fcf17c1d0d45d6988b8a5773eae8ad25d945bf34352040009", ????????????????"n": 6 ????????????} ????????}, ????????{ ????????????"value":?"44.44000000", ????????????"scriptPubKey":?"OP_DUP OP_HASH160 948c765a6914d43f2a7ac177da2c2f6b52de3d7c OP_EQUALVERIFY OP_CHECKSIG", ????????????"address":?"1EYTGtG4LnFfiMvjJdsU7GMGCQvsRSjYhx", ????????????"next_in": { ????????????????"hash":?"220ebc64e21abece964927322cba69180ed853bb187fbc6923bac7d010b9d87a", ????????????????"n": 0 ????????????} ????????} ????], ????"nid":?"fc7704fdd7ec5e69163e51b827fea2133990a26defee2b475408b3c16fd9a968" } |
三、擴(kuò)容問題如何解決
在比特幣誕生初期,中本聰為了比特幣系統(tǒng)的安全和穩(wěn)定,防止比特幣系統(tǒng)被攻擊而把區(qū)塊大小設(shè)置為1M。在當(dāng)時比特幣用戶量少,比特幣交易是不存在擁堵問題的。
隨著比特幣網(wǎng)絡(luò)的發(fā)展,單個區(qū)塊存儲的交易信息越來越多,1MB區(qū)塊僅能容納2000條左右交易,
交易量大時需要排隊等待區(qū)塊寫入確認(rèn),交易網(wǎng)絡(luò)擁堵問題越來越嚴(yán)重,為此也出現(xiàn)了解決容量問題的幾個方案。
1.區(qū)塊擴(kuò)容
解決區(qū)塊過小問題,最直接的辦法就是擴(kuò)容。區(qū)塊體積中位數(shù)在2015年里得到了翻番,從1月份的292KB快速增長至12月份的749KB。
2015 年12月比特幣香港擴(kuò)容會議由Pieter Wuille提出了隔離見證(Segregated Witness)之后,擴(kuò)容問題甚至已經(jīng)簡化為僅升級至2MB。
為什么不把區(qū)塊設(shè)置的更大一些,比如30MB?
區(qū)塊存儲的是交易信息,若提高區(qū)塊體積限制至30MB,最大的問題不是CPU計算能力瓶頸,而是塊的傳播與存儲。
30MB的塊可能會導(dǎo)致全網(wǎng)孤塊率和空塊率大幅上升,一年產(chǎn)出1.5TB的區(qū)塊鏈數(shù)據(jù)也超出大部分節(jié)點(diǎn)機(jī)器的硬盤容量。
基于這1.5TB的數(shù)據(jù),區(qū)塊鏈瀏覽器、錢包服務(wù)商等則可能膨脹10倍達(dá)到15TB,對于目前來說已經(jīng)遠(yuǎn)超普通機(jī)器/數(shù)據(jù)庫的磁盤容量。
除了擴(kuò)容,還有另外的解決方案就是隔離見證和閃電網(wǎng)絡(luò)。
2.隔離見證和閃電網(wǎng)絡(luò)
隔離見證(SegWit)是把交易的簽名數(shù)據(jù)從交易數(shù)據(jù)中剝離出來,用于解決延展性攻擊。
比特幣交易主要是由兩部分?jǐn)?shù)據(jù)組成。其中一部分為交易數(shù)據(jù),它負(fù)責(zé)記錄比特幣的來源和去處。
而另外一部分則是見證數(shù)據(jù),這部分?jǐn)?shù)據(jù)由一些加密數(shù)據(jù)組成,用于證明這些交易請求是真實(shí)可信的。
中本聰在設(shè)計比特幣的時候直接把這兩部分信息都放在了區(qū)塊內(nèi),所以一個區(qū)塊就承載不了更多的交易信息。
如果隔離了“見證數(shù)據(jù)”,那么區(qū)塊鏈只記錄交易數(shù)據(jù),那么一個區(qū)塊可承載更多的交易。
閃電網(wǎng)絡(luò)(Lightning Network)方案是在比特幣網(wǎng)絡(luò)上再外加一個「閃電網(wǎng)絡(luò)(Lightning Network)」,
把原有比特幣鏈上金額較少的交易,轉(zhuǎn)移到這個閃電網(wǎng)絡(luò)來處理,完成后再記錄到原鏈上。
這是一種鏈外交易(Off-chain transaction),目的是解決加快交易速度,以太坊(Ethereum)也有類似的方案叫Raiden Network。
?
用搭乘公共汽車的來假設(shè),試想像比特幣的區(qū)塊是一輛公共汽車,每隔十分鐘,固定時間發(fā)車,
當(dāng)要乘車的人超過公共汽車容量,不能上車的人就要等待下一班。我們的目的就是讓更多的人可以乘車,即承載更多的交易。
比特幣區(qū)塊鏈本身是可以根據(jù)交易費(fèi)率來優(yōu)先完成交易的,如果你想快速完成轉(zhuǎn)賬等功能,可以設(shè)置較高的手續(xù)費(fèi)。
這就類似公共汽車讓出更高價格買票的人先上車,不愿付高車票的人就要一直等下去,直到坐車的人變少。
?
隔離見證就是我們在公共汽車后面加掛一個貨車(SegWit車箱),所有乘車的人都要把背包和行李放到這個貨車上面,
因?yàn)樯倭穗S身物品,每個人占的空間變少了,公共汽車就可以多載一些人,乘載量就變多了。
閃電網(wǎng)絡(luò)可以理解為在公交車路線旁邊再架一條鐵路,讓擠不上公共汽車的人直接去坐火車,解決掉太多人要搭乘車(交易),而汽車太小的問題。
?
隔離見證和閃電網(wǎng)絡(luò)在技術(shù)上有可行性,但是同樣有許多質(zhì)疑。
依賴于隔離見證的閃電網(wǎng)絡(luò)等二層網(wǎng)絡(luò)并不能被認(rèn)為是比特幣的擴(kuò)容方案,因?yàn)殚W電網(wǎng)絡(luò)的交易并不等價于比特幣的點(diǎn)對點(diǎn)的鏈上交易,大部分比特幣交易的場景并不適用于閃電網(wǎng)絡(luò)。
假設(shè)閃電網(wǎng)絡(luò)部署成功,也會存在大型支付中心的問題,這違背了比特幣做為點(diǎn)對點(diǎn)支付系統(tǒng)的初衷。
?
參考
Master Bitcoin 精通比特幣?
《區(qū)塊鏈:從數(shù)字貨幣到信用社會》
總結(jié)
以上是生活随笔為你收集整理的比特币的区块结构解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式系统Paxos算法
- 下一篇: 理解区块链