比特幣的設計目標在於支持一套安全、開放、分佈式的數字貨幣系統。圍繞這一目標,比特幣協議的設計中很多地方都體現了權衡(trade-off)的思想。
- 區塊容量:更大的區塊容量可以帶來更高的交易吞吐率,但會增加挖礦成本,帶來中心化的風險,同時增大存儲的代價。兼顧多方面的考慮,當前的區塊容量上限設定為 1MB。
- 出塊間隔時間:更短的出塊間隔可以縮短交易確認的時間,但也可能導致分叉增多,降低網絡可用性。
- 腳本支持程度:更強大的腳本指令集可以帶來更多靈活性,但也會引入更多安全風險。
比特幣協議不會一成不變。當需要修復漏洞、擴展功能或調整結構時,比特幣需要在全網的配合下進行升級。升級通常涉及更改交易的數據結構或區塊的數據結構。
由於分佈在全球的節點不可能同時完成升級來遵循新的協議,因此比特幣區塊鏈在升級時可能發生分叉(Fork)。對於一次升級,如果把網絡中升級了的節點稱為新節點,未升級的節點稱為舊節點,根據新舊節點相互兼容性上的區別,可分為軟分叉(Soft Fork)和硬分叉(Hard Fork)。
- 如果舊節點仍然能夠驗證接受新節點產生的交易和區塊,則稱為軟分叉。舊節點可能不理解新節點產生的一部分數據,但不會拒絕。網絡既向後和向前兼容,因此這類升級可以平穩進行。
- 如果舊節點不接受新節點產生的交易和區塊,則稱為硬分叉。網絡只向後兼容,不向前兼容。這類升級往往引起一段時間內新舊節點所認可的區塊不同,分出兩條鏈,直到舊節點升級完成。
儘管通過硬分叉升級區塊鏈協議的難度大於軟分叉,但軟分叉能做的事情畢竟有限,一些大膽的改動只能通過硬分叉完成。
交易延展性(Transaction Malleablility)是比特幣的一個設計缺陷。簡單來講,是指當交易發起者對交易簽名(sign)之後,交易 ID 仍然可能被改變。
下面是一個比特幣交易的例子。
{
"txid": "f200c37aa171e9687452a2c78f2537f134c307087001745edacb58304053db20",
"version": 1,
"locktime": 0,
"vin": [
{
"txid": "21f10dbfb0ff49e2853629517fa176dc00d943f203aae3511288a7dd89280ac2",
"vout": 0,
"scriptSig": {
"asm": "304402204f7fb0b1e0d154db27dbdeeeb8db7b7d3b887a33e712870503438d8be2d66a0102204782a2714215dc0d581e1d435b41bc6eced2c213c9ba0f993e7fcf468bb5d311[ALL] 025840d511c4bc6690916270a54a6e9290fab687f512c18eb2df0428fa69a26299",
"hex": "47304402204f7fb0b1e0d154db27dbdeeeb8db7b7d3b887a33e712870503438d8be2d66a0102204782a2714215dc0d581e1d435b41bc6eced2c213c9ba0f993e7fcf468bb5d3110121025840d511c4bc6690916270a54a6e9290fab687f512c18eb2df0428fa69a26299"
},
"sequence": 4294967295
}
],
"vout": [
{
"value": 0.00167995,
"n": 0,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 7c4338dea7964947b3f0954f61ef40502fe8f791 OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a9147c4338dea7964947b3f0954f61ef40502fe8f79188ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"1CL3KTtkN8KgHAeWMMWfG9CPL3o5FSMU4P"
]
}
}
]
}
發起者對交易的簽名(scriptSig)位於交易的輸入(vin)當中,屬於交易內容的一部分。交易 ID(txid)是整個交易內容的 Hash 值。這就造成了一個問題:攻擊者(尤其是簽名方)可以通過改變 scriptSig 來改變 txid,而交易仍舊保持合法。例如,反轉 ECDSA 簽名過程中的 S 值,簽名仍然合法,交易仍然能夠被傳播。
這種延展性攻擊能改變交易 ID,但交易的輸入和輸出不會被改變,所以攻擊者不會直接盜取比特幣。這也是為什麼這一問題能在比特幣網絡中存在如此之久,而仍未被根治。
然而,延展性攻擊仍然會帶來一些問題。比如,在原始交易未被確認之前廣播 ID 改變了的交易可能誤導相關方對交易狀態的判斷,甚至發動拒絕服務攻擊;多重簽名場景下,一個簽名者有能力改變交易 ID,給其他簽名者的資產帶來潛在風險。同時,延展性問題也會阻礙閃電網絡等比特幣擴展方案的實施。
比特幣當前將區塊容量限制在 1MB 以下。如圖所示,隨著用戶和交易量的增加,這一限制已逐漸不能滿足比特幣的交易需求,使得交易日益擁堵、交易手續費不斷上漲。
關於比特幣擴容的持續爭論從 2015 年便已開始,期間有一系列方案被擺上檯面,包括各種鏈上擴容提議、用側鏈或閃電網絡擴展比特幣等。考慮到比特幣複雜的社區環境,其擴容方案早已不是一方能說了算;而任何一個方案想讓要達成廣泛共識都比較困難,不同的方案之間也很難調和。
當前,擴容之爭主要集中在兩派:代表核心開發者的 Bitcoin Core 團隊主推的隔離見證方案,和 Bitcoin Unlimited 團隊推出的方案。
隔離見證(Segregated Witness,簡稱 SegWit)是指將交易中的簽名部分從交易的輸入中隔離出來,放到交易末尾的被稱為見證(Witness)的字段當中。
對交易 ID 的計算將不再包含這一簽名部分,所以這也是延展性問題的一種解法,給引入閃電網絡等第二層協議增強了安全性。
同時,隔離見證會將區塊容量上限理論上提高到 4MB。對隔離見證的描述可詳見五個比特幣改進協議(Bitcoin Improvement Proposal):BIP 141 ~ BIP 145。
Bitcoin Unlimited 方案(簡稱 BU)是指擴展比特幣客戶端,使礦工可以自由配置他們想要生成和驗證的區塊的容量。
根據方案的設想,區塊容量的上限會根據眾多節點和礦工的配置進行自然收斂。Bitcoin Unlimited Improvement Proposal(BUIP) 001 中表述了這一對比特幣客戶端的拓展提議,該方案已獲得一些大型礦池的支持和部署。
比特幣的匿名特性,使得其上交易的監管變得十分困難。
不少非法分子利用這一點,通過比特幣轉移資金。例如 WannaCry 網絡病毒向受害者勒索比特幣,短短三天時間裡傳播並影響到全球 150 多個國家。儘管這些不恰當的行為與比特幣項目自身並無直接關係,但都或多或少給比特幣社區帶來了負面影響。
實際上,認為通過比特幣就可以實現完全匿名化並不現實。雖然交易賬戶自身是匿名的 Hash 地址,但一些研究成果(如《An analysis of anonymity in the bitcoin system》)表明,通過分析大量公開可得的交易記錄,有很大概率可以追蹤到比特幣的實際轉移路線,甚至可以追蹤到真實用戶。