WEEX 唯客博客, 原文作者:付少慶,SatoshiLab,萬物島 BTC 工作室 1. 比特幣原有技術的主要探索與衝突 比特幣的原有技術一直存在大規模應用與比特幣應該具有的能力的衝突問題。大規模應用和交易規模是否意味著更複雜的交易指令和更大的交易空間?是否意味著一定要在比特幣單一系統上實現所有的功能?在早期,比特幣生態技術發展不完善的情況下,這些現象似乎都是比特幣本身的問題。隨著技術的發展,很多問題會得到更清晰的答案。 在本文中列出一些相關問題,以及對這些問題的產生與解決過程。通過這篇文章,可以看到這些問題與技術之間的關聯性,以及比特幣主鏈與相關「測試鏈」的變化過程。比特幣的技術一直被不同的項目與團隊在探索中(包括以太坊都是對比特幣不完善的一種探索),只是在比特幣主網上產生的變化一直不夠明顯,直到 Taproot 等技術的產生,推動了 Ordinals 協議等協議產生之後,重新進入了一個新的發展高潮。 從整體看這些發展過程與產生的相關技術,我們能夠看到他們之間的聯繫,可以推測出更多發展方向與整體架構。 1.1. 比特幣的腳本語言與幾次刪減指令 比特幣的編程語言是一種逆波蘭範式的腳本語言,沒有循環語句和條件控制語句(稍後看 Taproot&Taproot Script 擴充了這塊能力)。因此,人們常說:比特幣腳本語言不是圖靈完備的,這導致比特幣腳本語言,有一定的局限性。 當然,由於這些局限性,黑客就沒辦法使用這種腳本語言寫一些死循環(會造成網路癱瘓),或者一些能導致 DOS 攻擊的惡意代碼,也就避免了比特幣網路受到 DOS 攻擊。比特幣的開發者,也認為核心區塊鏈,不應該具備圖靈完整性,來避免一些攻擊和網路堵塞。 但是,也正是由於這些局限性,比特幣網路,沒有辦法運行其他複雜的程序了,沒辦法完成一些「有用」的功能。而後面發展的一些區塊鏈系統,為了解決具體問題,滿足用戶的需求,直接改變了這點。如,以太坊使用的語言就具備了圖靈完備。 比特幣腳本指令常見的類型: 關鍵字: 1. 常數。 如:OP_ 0 ,OP_FALSE 2. 流程式控制制。 如: OP_IF,OP_NOTIF,OP_ELSE,…… 3. 堆棧。 如:OP_TOALTSTACK(把輸入壓入輔堆棧的項部,從主堆棧刪除),…… 4. 字元串。 如:OP_CAT(連接兩個字元串,已禁用),OP_SIZE(把棧頂元素的字元串長度壓入堆棧(無需彈出元素)) 5. 位邏輯。 如:OP_AND,OP_OR,OP_XOR 6. 算術邏輯。 如:OP_ 1 ADD(輸入值加 1),OP_ 1 SUB(輸入值減 1) 7. 加密。如:OP_SHA 1 (輸入用 SHA-1 演算法 HASH.),OP_CHECKSIG() 8. 偽關鍵字 9. 保留關鍵字 比特幣腳本指令常見的類型: 腳本: 1. 支付到比特幣地址的標準交易(pay-to-pubkey-hash) 2. 標準比特幣產生交易(pay-to-pubkey) 3. 可證明的無法花掉/可刪除的輸出 4. Anyone-Can-Spend 輸出 5. 猜謎交易 五個標準類型的交易腳本包括:支付到公鑰哈希(P2P KH)、支付到公鑰、多重簽名(限定最多 15 個密鑰)、支付到腳本哈希(P 2 SH),以及數據輸出(OP_RETURN)。 在網頁:https://en.bitcoin.it/wiki/Script中有詳細的說明。 刪減比特幣支持的指令 比特幣歷史上有多次刪減指令的事情發生。下面的圖表中,紅色部分是已經刪減掉的指令。 (1)字元串操作 (2) (3)算術操作 為什麼要刪減指令?安全性只是一方面的考慮,如果我們用分層設計的思想看待刪減指令會理解其合理性,這樣做能讓底層協議更基礎更穩定。也許中本聰一開始就意識到了這個問題,不然不會主動的刪減指令。我們常人的思維是建造一個直接滿足用戶的需求,具有完善指令和系統功能的小系統,而不是一個需要協作的大型協議。 這樣也就造成了一種事實,只有比特幣適合作為一層網路。我在《比特幣價格過高會促生一個新的替代鏈產生》文章中分析過這種現象,從經濟學視角和技術視角分析,有產生比特幣替代鏈的可能性。但從比特幣的基本特點和分層設計的角度,幾乎只有比特幣能夠作為一層網路基礎設施,即使有替代鏈也是一個 1.5 層的產物。在一層網路這個層面,真品只有比特幣,能有一些替代作用的鏈最多是 A 貨。 1.2. 比特幣分叉歷史、原因與意義 在比特幣的發展歷史,除了刪減指令問題,另一方面是區塊大小之爭,這經常造成比特幣的硬分叉。 BTC 創立之初並沒有限制區塊大小,以便能夠在相同時間處理的交易筆數。但當早期 BTC 價格非常低,惡意交易的成本也非常低,為了解決這一問題,中本聰在 2010 年 9 月 12 日主持了一次軟分叉,添加了區塊體積不得超過 1 MB 的限制。中本聰指出但這種限制是臨時性的,未來可以以可控和逐步的方式提高區塊限制,以便滿足擴容的需要。 下圖為比特幣的分叉歷史: 隨著比特幣的流行,網路交易擁堵和確認時間增長問題愈發嚴重。2015 年 Gavin Andresen 和 Mike Hearn 宣布將在新版 BitcoinXT 中實現 BIP-101 提案,希望將區塊上限提高至 8 MB。而 Greg Maxell,Luke Jr,Pieter Wuille 等核心開發者則持反對意見,認為這種做法會提高運行全節點的門檻,而且帶來不可控的影響。這場爭論最終在議題和參與範圍均出現了擴大化。 從上面的內容,我們看到中本聰也表達了「區塊大小這種限制是臨時性的,未來可以以可控和逐步的方式提高區塊限制,以便滿足擴容的需要。」但什麼時候分叉支持更大區塊,單獨分出一條鏈支持大區塊是否可以解決問題?在不斷的爭議中,也產生了眾多的案例。如,BCH 區塊大小是 8 M,後來又增加的 32 M。BSV 區塊大小是 128 M。而除了 BCH(和後面的 BSV)以外,這一時期還出現了許多其它 BTC 分叉幣,據 BitMEXResearch,僅在 BCH 分叉后的一年內,就出現了至少 50 種新的分叉幣。 稍後的內容我們會看到,在比特幣主網上面 Segwit 和 Taproot 也在一定程度上將區塊的空間從 1 M 提升到了 4 M。 比特幣的分叉是一種發展探索,在嘗試通過自身的改變來完成對更多需求的支持。其中有用戶需求、礦工需求、投資人需求、開發者需求、……。 1.3. 比特幣發展中的幾個典型探索 中本聰離開后,繼承人 Gavin Andresen 主導建立了 Bitcoin Core 和 Bitcoin 基金會。在此期間,針對 BTC 的可拓展性探索一直存在,尤其是在資產發行領域。 (1)Colored Coins(染色幣) eToro 首席執行官 Yoni Assia 在 2012 年 3 月 27 日發表的一篇文章中第一個提出彩色幣。這個想法不斷發展,在 Bitcointalk 等論壇上,彩色硬幣的概念開始形成並獲得關注。最終 Meni Rosenfeld 於 2012 年 12 月 4 日發布了一份詳細介紹彩色貨幣的白皮書。 染色幣的設想是通過給比特幣的特定部分添加特殊的標註(即染色),來代表更廣泛的資產和價值。染色幣在實現上出現了一系列實體,大致分為兩類: 1)基於 OP_RETURN:如 Flavien Charlon 在 2013 年提出的 Open Assets,利用 OP_RETURN(在 Bitcoin v 0.9.0 中被提出,可以用於在 Bitcoin 上存放少量的數據,最初的限制為 40 bytes,后提高至 80 bytes)。操作碼存儲到腳本中,並通過外界讀取的方式來完成「染色」和交易。(這種模式與 Ordinals 依靠外部索引確定資產合法性類似)。 2)基於 OP_RETURN:典型代表是 ChromaWay 在 2014 年提出的 EPOBC Protocol,EPOBC 資產的額外信息存儲在比特幣交易中的 nSequence 欄位,每個 EPOBC 資產的類別和及合法性需要追溯到 genesis 交易來確定。 (2)MasterCoin(OMNI) JR Willett 在 2012 年 1 月 6 日發布了 MasterCoin 的設想,並取名「比特幣第二份白皮書」,並在 2013 年 7 月通過 ICO 的方式正式啟動項目,最終募集到了 5120 個 BTC(當時價值 50 萬美元)。MasterCoin 和 Colored Coins 區別在於它建立了一個完整的節點層,通過掃描比特幣區塊來維護狀態模型資料庫,該資料庫駐留在區塊鏈之外的節點中。這種設計可以提供比 Colored Coins 更複雜的功能,例如創建新的資產、去中心化交易所、自動化價格反饋等。2014 年,Tether 也通過 Mastercoin 協議在比特幣上推出了穩定幣,即我們熟知的 Tether USD (OMNI)。 ( 3)CounterParty Counterparty 於 2014 年正式推出。Counterparty 也使用 OP_RETURN 將數據存儲至 BTC 網路中。但與染色幣不同,資產在 Counterparty 不是以 UTXO 的形式存在,而是通過 OP_RETURN 載入信息來表明資產的轉移,當一個資產持有者使用持有地址對歹有特殊數據的交易進行簽名后,資產便完成了轉移。通過這種方式,Counterparty 可以實現資產的發行、交易以及兼容以太坊智能合約的平台。 除此以外,也有觀點認為 Ethereum、Ripple 和 BitShares 也屬於更廣義的「Bitcoin 2.0 」。 1.4. 比特幣的不完美與分層協議 比特幣系統的不完善(或局限性)主要表現在幾個方面(本文中的不完善是根據以太坊白皮書中的總結,並非是真正的不完善。 1. 比特幣的賬戶系統 UTXO 在當前的區塊鏈項目中,主要有兩種記錄保存方式,一種是賬戶/餘額模型,一種是 UTXO 模型。比特幣採用就是 UTXO 模型,以太坊、EOS 等則採用的是賬戶/餘額模型。 在比特幣錢包當中,我們通常能夠看到賬戶餘額,然而在中本聰設計的比特幣系統中,並沒有餘額這個概念。「比特幣餘額」是由比特幣錢包應用派生出來的產物。UTXO(Unspent Transaction Outputs)是未花費的交易輸出,它是比特幣交易生成及驗證的一個核心概念。交易構成了一組鏈式結構,所有合法的比特幣交易都可以追溯到前向一個或多個交易的輸出,這些鏈條的源頭都是挖礦獎勵,末尾則是當前未花費的交易輸出。 所以現實世界中沒有比特幣,只有 UTXO。比特幣的交易由交易輸入和交易輸出組成,每一筆交易都要花費(spend)一筆輸入,產生一筆輸出(output),而其所產生的輸出,就是「未花費過的交易輸出」,也就是 UTXO。 如果要實現智能合約,UTXO 這種賬戶模型存在非常大的問題。以太坊黃皮書的設計者 Gavin Wood 對 UTXO 的理解十分深刻。 以太坊的最大新功能點是智能合約,因為智能合約的考慮,Gavin Wood 要基於 UTXO 去實現圖靈完備的智能合約是困難的。而賬戶模型是天然的面向對象的,對每一筆交易,都會在相對應賬戶上進行記錄(nonce++)。為了易於管理賬戶,而引入了全局狀態,每一筆交易都會改變這個全局狀態。這和現實世界是相對應的,每一個微小的改變,都會改變這個世界。因此以太坊使用了賬戶系統,後期的公鏈基本都是基於各種類型的賬戶系統實現的。 UTXO 的另一個嚴重缺陷是,不能為賬戶的取款額度提供精細的的控制。這點在以太坊的白皮書中有相關的說明。 2. 比特幣的腳本語言,非圖靈完備 儘管比特幣腳本語言可以支持多種計算,但是它不能支持所有的計算。最主要的缺失是比特幣的腳本語言,沒有循環語句和條件控制語句。因此,我們說:比特幣腳本語言不是圖靈完備的。這導致比特幣腳本語言,有一定的局限性。當然,由於這些局限性,黑客就沒辦法使用這種腳本語言,寫一些死循環(會造成網路癱瘓),或者一些能導致 DOS 攻擊的惡意代碼,也就避免了比特幣網路受到 DOS 攻擊。比特幣的開發者,也認為核心區塊鏈,不應該具備圖靈完整性,來避免一些攻擊和網路堵塞。但是,也正是由於這些局限性,比特幣網路,沒有辦法運行它複雜的程序了。不支持循環語句的目的是避免交易確認時出現無限循環。 為了安全性,不支持圖靈完備的理由是不充分的。而且非圖靈完備的語言所做的事情很有限。 3. 比特幣的其他不完善,安全性、擴展性 挖礦的中心化問題,比特幣挖礦演算法基本上是讓礦工千萬次地輕微改動區塊頭,直到最終某個節點的改動版本的哈希小於目標值。然而,這種挖礦演算法容易被兩種形式的中心化攻擊。第一種,挖礦生態系統被專門設計的因而在比特幣挖礦這一特殊任務上效率提高上千倍的 ASICs(專用集成電路)和電腦晶元控制。這意味著比特幣挖礦不再是高度去中心化的和追求平等主義的,而是需要巨額資本的有效參與。第二種,大部分比特幣礦工事實上不再在本地完成區塊驗證;而是依賴中心化的礦池提供區塊頭。這個問題可以說很嚴重:當前,排名前三的採礦池間接控制著比特幣網路中約 50 %的處理能力。 擴展性問題是比特幣的一個重要問題。使用比特幣,每小時增長約 1 MB。如果比特幣網路每秒處理 Visa 的 2000 次交易,則每三秒鐘將增長 1 MB(每小時 1 GB,每年 8 TB)。較低的交易次數,也引起比特幣社區的爭議,大區塊鏈雖然可以提高性能,但問題是中心化風險。 從產品生命周期的角度,比特幣一些小的不完善,可以在自身系統中得到改善,改善的方法受到當前系統的限制。但如果可以在一個新系統中解決這些問題,就完全可以不考慮老系統的限制問題。既然要打造一個新的區塊鏈系統,那麼設計新系統的時候,這些小的功能完善也一併進行設計與升級改造。 分層設計 分層設計是一種人類處理複雜系統的手段和方法論,通過將系統劃分為多個層次結構並定義各層之間的關係和功能,以實現系統的模塊化、可維護性和可擴展性,從而提高系統的設計效率和可靠性。 對於一項廣泛和龐大的協議體系,使用分層會有明顯的好處。這樣做使人們容易理解,容易分工實現與容易分模塊改進等優點。如計算機網路中的 ISO/OSI 的七層模型設計,但具體的實現中,可以合併一些分層,例如,具體的網路協議 TCP/IP 是四層協議。具體說協議分層的優點:各層次之間是獨立的、靈活性好、結構上可分割開、易於實現和維護、能促進標準化工作。 從分層協議的角度看,比特幣因為要處於最基礎的底層,那麼他的 UTXO、非圖靈完備、出塊時間長、區塊容量小、創始人的消失、……,都不是缺點,反而是作為一層網路應該具有的特點。 註釋:作者在《一文梳理比特幣二層(Layer 2)建設的基礎知識體系V1.5 版》對協議分層有更詳細的說明。 2. 比特幣發展中的重要新技術(區塊擴容與能力擴容) 在上一節我們探討了比特幣原有技術的主要衝突和一些探索案例,但很多導致了硬分叉或產生了全新的異構鏈。在比特幣本身這條區塊鏈上,這種探索也產生了很多成果,本質上是區塊的擴容與能力的擴容。他們主要表現在以下幾個方面。 2.1. OP_RETURN 比特幣的開發者一直想擴展比特幣的能力,表現在幾個方面: (1)OP_RETURN 的使用 OP_RETURN 是一個腳本操作碼,用來終止腳本並返回棧頂的值。這個操作碼類似於編程語言中的返回函數。在比特幣的歷史上,OP_RETURN 操作碼的功能被多次修改,現在它主要被用作為在賬本上存儲數據的一種方法。OP_RETURN 操作碼的功能曾在過去發生過重大變化,現在它是一個重要的機制,使用它我們就能在鏈上存儲任意數據。 OP_RETURN 最初是用於提前結束腳本執行的返回操作,執行結果將作為棧頂項目被呈現出來。這個操作碼最初有一個容易被利用的漏洞,但中本聰很快修補了該漏洞。 對 OP_RETURN 功能的進一步更改 在 Bitcoin Core 的 v 0.9.0 那次升級中,「OP_RETURN 輸出」腳本被製作成標準輸出類型,允許用戶將數據附加到「不可花費的交易輸出(unspendable transaction output)」上。這類腳本中可用的數據量的上限最初被限制為 40 位元組,然後提升至 80 位元組。 將數據存儲在區塊鏈上: 將 OP_RETURN 改為始終返回 false 造成了有趣的結果。由於在 OP_RETURN 之後不會評估任何操作碼或數據,因此網路用戶開始使用此操作碼來存儲任意格式的數據。 在比特幣現金(BCH)的時期,即 2017 年 8 月 1 日-2018 年 11 月 15 日,能夠附加到 OP_RETURN 輸出的數據長度被擴展到 220 位元組,更大的數據能夠促進區塊鏈上創新的應用,例如在區塊鏈社交媒體上發布內容等。 在 BSV 上, 220 位元組的限制依然被保留了一小段時間。隨後,在 2019 年 1 月,由於 OP_RETURN 操作碼以節點不驗證任何後續操作碼的方式終止腳本,所以節點也不會檢查腳本是否在 520 位元組的最大腳本大小限制內。由此一來,網路上的節點運營商決定將最大交易體積提高到 100 KB,從而賦予開發者有更多應用創新的自由,讓新的應用可以將更大、更複雜的數據放入比特幣賬本。那時有一個應用例子,有人將將整個網站都放入了 BSV 帳本中。 OP_RETURN 雖然有一定的功能擴展,但總體來說能力還是有限。於是產生了隔離見證的技術。 (2)Segwit 隔離見證 隔離見證,即 Segregated Witness(簡稱 SegWit),由 Pieter wuile(比特幣核心開發人員、Blockstream 聯合創始人)在 2015 年 12 月首次提出,後來形成了比特幣 BIP 141 。隔離見證將比特幣區塊中交易的數據結構稍加修改,以解決如下問題: 1)transaction malleability 問題。 2)SPV 證明中傳輸交易的簽名成為可選項,能夠減少 Merkle proof 傳輸的數據量。 3)變相增加區塊容量。 前兩項主要是增加安全性和性能,其中對新技術影響最多的是第三項,變現增加了區塊的容量(見下面的概念 Block weight),從而為比特幣的能力擴容打下來基礎,以至於後面的 Taproot(隔離見證的第二個版本)的進一步加強。 雖然變現擴大了區塊容量,但隔離見證也受到區塊大小限制。比特幣的區塊大小限制為 1 M bytes,由於 witness 數據不包含在這個限制中,為了防止 witness 數據被濫用,仍然對總的區塊大小做了限制。引入了一個新概念叫塊重量(Block weight) Block weight = Base size * 3 + Total size Base size 是不包含 witness 數據的塊大小 Total size 總大小是按 BIP 144 中所述序列化交易的塊大小(以位元組為單位),包括基礎數據和見證數據。 隔離見證限制 Block weight