引言
同志們,幣圈又見君,吾心神搖曳。
比特幣的可擴展性問題是其面臨的主要問題之一,也是許多人努力的方向。因為比特幣自身的一些缺陷,另一個解決方案“隔離見證”也致力于提高可擴展性,但它同時也解決了許多問題,包括閃電網絡實現所需修補的一些缺陷。本文中將會講解隔離見證的優勢及其工作原理。
隔離見證是由多個BIP描述的軟分叉,其主要用意是優化比特幣交易和區塊的結構,將交易的簽名”、“witness”或“解鎖腳本”)從交易中移到一個獨立的結構中。它不僅允許降低比特幣交易的數據量大小,能讓一個區塊塞下更多的交易,也能解決“交易熔融性”問題,對支付通道和閃電網絡這樣基于比特幣交易結構的技術來說極為關鍵。
向后兼容性
實際上,隔離見證不僅改變了交易的結構,也改變了交易的輸出。不過,這不是說傳統類型的UTXO和SegWit類型的UTXO無法在同一筆交易中花費:這種情況下,傳統類型的UTXO將在輸入內加載所有權證明,而隔離見證類型的UTXO將在交易輸入以外的結構中加載證明。
不管怎么說,隔離見證的定位是一個軟分叉,這個升級應該是可以忽略,無需強制的,而且,這也意味著,未升級的節點應該可以處理隔離見證類型的輸出。實際上,舊的節點和錢包將以為任何人都能花費這些UTXO,也即這些UTXO是空簽名也可花費的,因此即使在交易中沒有看到簽名,交易也仍然是有效的。而升級后的節點和錢包將在交易輸入以外的地方,一個專門的“witness”字段尋找簽名。
什么是UTXO?
一個未花費的交易輸出就代表一定數量的比特幣。多個UTXO可以組合、單個UTXO也可以拆分,做出支付所需的任何面額。
我們可以將UTXO理解成實物貨幣,因為它們必須作為完整的一個單元來使用。如果你想花5毛錢,你不可能掰開一個1塊錢硬幣來付款。相反,你必須花掉整個1塊錢,然后拿5毛錢的找零。但是,不同于實物貨幣,UTXO沒有標準面額。一個UTXO可以是任意數量的比特幣。
顧名思義,一個UTXO就是一個比特幣交易的輸出。輸出以UTXO的形式存在,直到被用作另一個交易的輸入為止,這時就不再是未花費的。
在任意時間點,現有UTXO的集合都被稱為UTXO集。比特幣節點會追蹤UTXO集,從而確定哪些代幣未被花費,以及哪些人可以花費它們。該系統可以讓比特幣解決多重支付問題。雙重花費問題是長期困擾數字貨幣嘗試的一大難題。
理解比特幣的UTXO模型
新的UTXO是通過花費現有UTXO創建的。每個比特幣交易都由輸入和輸出組成。輸入花費已有UTXO,輸出則創建新的UTXO。Coinbase交易是一種特殊類型的交易,通過創建新的比特幣來獎勵找到區塊的礦工。由于創造了新的比特幣,coinbase交易沒有輸入,但是會產生一個或多個輸出。
就像所有正常輸出一樣,coinbase交易的輸出是新的UTXO。每個UTXO的歷史都可以追溯到coinbase交易的一個或多個輸出。比特幣的UTXO模型不同于大多數數字貨幣系統,比特幣的初衷是實現完全透明化、公平性和可審計性,UTXO可以幫助比特幣實現這些目標。
在傳統金融系統中,交易會從一個賬戶中取出資金轉移到另一個賬戶中。比特幣的UTXO模型沒有賬戶,因此沒有專門的發送方賬戶/地址,地址雖然被用來接收UTXO,但是永遠不會直接記錄在區塊鏈上。比特幣地址是scriptPubKeys的編碼,包含在每個交易的輸出中。
當比特幣被花費出去時,輸入只包含執行scriptPubKey所必需的簽名和公鑰,并沒有提到比特幣來自區塊鏈上的哪個地址。但是,UTXO的上一個地址是可以輕松計算得出的,每個交易輸入都通過交易id來指明其前序交易,并通過索引來指明使用該前序交易的哪一個輸出,被引用的交易輸出的scriptPubKey可以被轉化成比特幣地址。
UTXO模型可以讓所有比特幣節點在任意時刻就比特幣的存在情況達成共識,也就是說,任何人都可以審計比特幣的總供應量,來確保比特幣的貨幣政策被嚴格遵守。
UTXO的組合和拆分
一個比特幣交易可以包含任意數量的輸入和輸出。因此,用戶可以任意組合和拆分UTXO來完成任意金額的付款。
例如,Alice持有兩個UTXO,分別價值0.5BTC和0.7BTC。當她向Bob支付1BTC時,可以使用這兩個UTXO作為輸入,然后將1BTC的輸入發送給Bob。
Alice還另外創建了一個0.199BTC的輸出作為找零發送給自己。由于需要支付交易費,她無法給自己發送0.2BTC。
注意:交易費不以交易輸出的形式體現。它是通過輸入值和輸出值之間的差額推算得出。
UTXO模型可以讓比特幣節點有效驗證鏈上的每個交易。當節點收到一個交易時,無論該交易是否已經打包進區塊,均可驗證該交易內的UTXO是否真的有效且沒有被花費。正因如此,比特幣可以在不依賴可信第三方的情況下解決雙重花費問題。
UTXO模型vs賬戶模型
大多數金融系統不使用UTXO模型。因此,用戶不依靠某幾種代幣來控制資產,而是使用一個或多個賬戶,且每個賬戶都有余額,賬戶模型可以讓金融機構和商家精確記錄個人賬戶的借入貸出情況,避免找零和選幣問題。
賬戶模型的優勢是以犧牲透明性和可審計性為代價的,審計所有銀行賬戶中的美元總量是不可能的。
另外,大多數賬戶模型飽受退單和賬戶透支等問題的困擾,由于比特幣交易必須引用要被花費的UTXO,無效交易不可能被添加到區塊鏈上。
UTXO模型為用戶提供隱私優勢。比特幣用戶可以將每個UTXO存儲在不同的地址中分別處理。通過這種方式,用戶可以隱藏其持有的UTXO之間的聯系,避免暴露在公眾視線中,對于區塊鏈觀察者來說,確定哪些UTXO屬于哪些用戶會變得更有難度。
比特幣的設計極大降低了生成新地址的難度。賬戶模型系統使得生成新賬戶變得非常麻煩,甚至不可行,迫使用戶將全部或大部分資金存放在一個賬戶中。
鏈分析公司試圖通過各種方法破壞比特幣的隱私性并確定UTXO的所有權,然而,這些方法靠的是假設和間接證據,而非嚴格的邏輯。
相關術語
交易:交易是比特幣從一個地址轉移到另一個地址的記錄。所有交易都記錄在區塊鏈上的區塊中。
UTXO集:是某一時間點存在的所有UTXO的集合。所有UTXO的總量就是比特幣的當前供應量。
交易ID:是標識特定交易的一串字母和數字。這個字符串只是對交易進行二次SHA256計算得到的哈希值。
多重支付:就是有人將同一筆錢花了不止一次,并讓一方或雙方相信他們已經拿到了錢。比特幣利用去中心化賬本和帶有時間戳的區塊鏈解決了雙重花費問題。
稀缺性:貨幣稀缺性指的是貨幣很難被找到或創造出來。雖然貨幣普及很重要,但是一旦貨幣可以被輕而易舉地創造出來,會對經濟產生負面影響。
案例講解
Pay-to-Witness-Public-Key-Hash
我們用例子來說明一下隔離見證會如何改變交易的數據結構。從標準的Pay-to-Public-Key-Hash(P2PKH)交易類型開始。我們感興趣的部分是輸出,尤其是其“scriptPubKey”字段。我們先考慮一種標準的鎖定腳本:
OP_DUPOP_HASH160<PubKeyHash>OP_EQUALVERIFYOP_CHECKSIG
而隔離見證之后的鎖定腳本如下所示:
0<PubKeyHash>
如你所見,隔離見證的輸出比傳統類型的輸出要簡單很多:只有兩個值會被推入腳本執行棧中。如我們上面說的,舊版本的比特幣客戶端會以為這個輸出是掉在地上的錢,無需提供簽名就能花費這個輸出。不過,新的客戶端會將第一個數字解釋為版本號,而第二個則對應著一個鎖定腳本。在現實中,只有壓縮公鑰的哈希值可以用在這里。再來看看這個輸出被花費時的情形。傳統交易的輸出在花費時的數據結構如下:
"Vin":[
{"txid":"8adbca5e652c68f8f3c30ac658115bc4af395d0cc7e6beaea18168295c29d011",
"vout":0,
"scriptSig":"<ourscriptSig>"}]
但是,在花費一個隔離見證輸出的時候,交易的scriptSig將為空,而所有的簽名都會放到一個專門的地方:
"Vin":[
{"txid":"8adbca5e652c68f8f3c30ac658115bc4af395d0cc7e6beaea18168295c29d011",
"vout":0,
"scriptSig":""}]
"witness":"<Witnessdata>"
警告
雖然傳統的客戶端可以處理隔離見證的交易,但他們自己沒法花這些錢:舊型的錢包可能會嘗試用空簽名來花用一個隔離見證的輸出,但這筆交易在現實中是無效的。這就意味著,發送者必須知道接受方的錢包支不支持隔離見證,這樣才能為之創建合適類型的輸出。
由BIP143定義,隔離見證的輸出應該用壓縮公鑰的哈希值來創建。如果你用的是傳統類型的地址或者非壓縮公鑰的哈希值,這個輸出將變得不可用。
Pay-to-Witness-Script-Hash
另一個關鍵的交易類型是P2SH。它讓交易可以發送給腳本的哈希值。要花費P2SH交易的輸出,花費者需要提供一個腳本,其哈希值應該與UTXO中的腳本哈希值匹配,并基于這個腳本提供簽名/口令/別的東西。這個用法可以把解鎖腳本保護起來,讓發送者無從知曉一個地址的內容,并且也能節約空間:舉個例子,一個多簽名錢包的鎖定腳本可能非常長,這樣我們就必須把整個鎖保存起來;有了P2SH可以只保存一個哈希值。假設現在有一個需要提供5個私鑰中的2個的簽名才能使用的多簽名錢包。如果你使用傳統的交易,P2SH交易輸出的鎖定腳本將如下:
HASH16054c557e07dde5bb6cb791c7a540e0a4796f5e97eEQUAL
要花它的時候,花費的人需要提供一個贖回腳本,這個腳本定義了花費條件,還有兩個簽名。所有這些都要放在交易的輸入中:
"Vin":
[
"txid":"abcdef12345...",
"vout":0,
"scriptSig":"<SigA><SigB><2PubAPubBPubCPubDPubE5CHECKMULTISIG>",
]
再來看看使用隔離見證后的發送者和接收者。輸出的鎖定腳本如下:
09592d601848d04b172905e0ddb0adde59f1590f1e553ffc81ddc4b0ed927dd73
就像P2PKH交易一樣,這個輸出的腳本也變得更簡單。第一個數值表示版本號,第二個是對應于贖回腳本的SHA256哈希值。使用這個函數某種意義上是為了用長度來區分P2WPKH的見證程序以及P2WSH的見證程序。
使用這一輸出的交易如下所示:
"Vin":[
"txid":"abcdef12345...",
"vout":0,
"scriptSig":"",]
"witness":"<SigA><SigB><2PubAPubBPubCPubDPubE5CHECKMULTISIG>"
在P2SH中嵌入隔離見證
我們已經看到,使用隔離見證是有好處的。不過,上面的例子只對發送者和接收者都有升級軟件的情形才適用。但現實并不總是如此。考慮這樣一種情形:
Alice希望給Bob轉賬一些btc,Bob有支持隔離見證的錢包軟件而她沒有。他們顯然只能用標準形式的交易,但Bob希望使用SegWit來減少手續費。
這時候,Bob可以創建一個包含了SegWit腳本的P2SH地址、Alice會把這個地址當成一個普通的P2SH地址,因此可以直接向這個地址轉賬而沒有任何問題。但Bob可以使用SegWit交易來使用這個輸出,并獲得手續費折扣。
這就是SegWit交易的兩種類型P2WSH和P2WPKH在P2SH內實現的方式。
P2SH(P2WPKH)
想在P2SH交易中實現一筆P2WPKH交易,Bob需要使用其公鑰創建一個見證程序。然后把結果哈希、轉碼成一個地址:
0ab68025513c3dbd2f7b92a94e0581f5d50f654e7
第一個數值是版本號,而第二個數值是20字節的公鑰哈希值。這個腳本先做SHA256哈希運算,再做RIPEMD160運算,就可得到一個20字節的哈希值。
3e0547268b3b19288b3adef9719ec8659f4b2b0b
轉化成一個地址:
37Lx99uaGn5avKBxiW26HjedQE3LrDCZru
發送給這個地址的輸出的鎖定腳本,看起來也就跟一個普通的P2SH地址的腳本沒啥區別:
HASH1603e0547268b3b19288b3adef9719ec8659f4b2b0bEQUAL
那么Bob花費輸出的時候,交易的結構會像這樣:
"Vin":[
{"txid":"8adbca5e652c68f8f3c30ac658115bc4af395d0cc7e6beaea18168295c29d011",
"vout":0,
"scriptSig":"0ab68025513c3dbd2f7b92a94e0581f5d50f654e7"}]
"witness":"<Witnessdata>"
在一開始,我們創建的贖回腳本會經過一次哈希計算,如果結果符合鎖定腳本,這個腳本就會得到執行,程序會驗證放在witness字段的簽名。
P2SH(P2WSH)
P2WSH腳本也可以用P2SH來實現。我們考慮上面所說的2-5多簽名錢包的例子。所有的步驟都跟P2SH(P2WPKH)沒什么區別:首先,創建一個見證程序:
09592d601848d04b172905e0ddb0adde59f1590f1e553ffc81ddc4b0ed927dd73
第一個數值是版本號,第二個數值是32位的SHA256哈希值,對應于我們的簽名腳本。然后我們拿這個見證程序的HASH160哈希值轉成一個普通的P2SH地址。要使用發往這個地址的輸出時,我們需在scriptSig字段公布這個見證程序,在witeness字段提供完整的多簽名腳本。
隔離見證的好處
交易熔融性漏洞
SegWit解決的一個關鍵問題就是比特幣交易的“熔融性”,也即比特幣交易的ID是哈希值這一點所帶來的問題。
在以往的比特幣交易中,簽名是放在交易的輸入部分的,第三方可以更改簽名且不會讓交易失效。這使得第三方可以在完全不更改交易的“關鍵”字段的前提下更改交易的ID。這樣一來,交易還是有效的,含義也還是一樣的,但是有了另一個ID,這可以用來執行另一種攻擊,比如DoS攻擊。
SegWit解決了這個問題,因為所有的簽名都是放在交易外面的,因此簽名的變動不會導致交易的哈希值變動,也就不會影響交易的ID。隔離見證還引入了一個專門的標識符,叫做“wtxid”:它是交易和整個witness部分的哈希值,所以如果一筆交易在傳播時沒有附帶任何witness數據,交易ID就等于wtxid。
這個解決方案使得我們可以創建一系列前后相繼的未確認交易,而無需擔心任何風險,這對閃電網絡這樣的協議來說是非常重要的。這里的意思是,如果不解決交易熔融性問題,支付通道的參與者就無法快速檢索對手有沒有把一筆過時的通道交易上鏈,因為同樣內容的交易可能會以完全不同的ID出現。
網絡和存儲的擴展
Witness數據往往是交易數據中占比最大的一部分。在使用多簽名腳本的交易中,witness最多可能占據交易數據量的75%。感謝SegWit,簽名的傳輸變成了一個可選項:只有節點想要驗證交易時,才需要請求這些數據。而沒有支持SegWit的SPV客戶端和節點也無需下載額外的數據,可以節省硬盤空間。
降低交易手續費
SegWit類型的交易比以往的交易類型更便宜,因為它減少了需要存儲的witness數據。準確來說,“Size”的概念在SegWit類型的交易上略有不同。它引入了一個“虛擬大小”的概念:所有放在witness部分的數據都會乘以0.25來計算數據量大小,從而一個區塊中可以塞進更多的交易。來看一個例子。
假設我們有一筆傳統類型的交易,數據量大小為200字節,那么1MB的區塊里面可以放進5000筆這樣的交易。而一筆等效的SigWit交易有120字節是放在witness區域的,因此其虛擬大小為80+0.25*120=110字節,所以區塊可以放入9090筆這樣的交易。如果上鏈的手續費是每字節40聰,則交易費會從8000聰減低到4400聰,幾乎打了個對折。
腳本版本
你可能已經注意到了,每個鎖定腳本都會有1個字節來表示腳本的版本。使用不同的版本號就能以軟分叉的形式增加或變更功能,語法改變、新的操作符等等。
簽名驗證的效率優化
隔離見證也優化了簽名算法的效率,如CHECKSIG、CHECKMULTISIG等。在SegWit之前,哈希計算的次數與簽名數量的平方成正比,但有了隔離見證后,算法的計算復雜度就減低到了O(n)。
SegWit所遇問題及挑戰
即使它有這么多長處,它也有一些缺點。比特幣社區也有許多人反對這一升級。我們來看看反對方提出的一些意見。
因為SegWit是一個軟分叉,許多客戶端可能不會升級,因此兩種類型的UTXO會在網絡中同時存在;諸如消除交易ID熔融性以及哈希計算次數線性上升這樣的重大變更對非SegWit輸出無效,因此網絡仍會暴露在交易ID熔融性和哈希時間平方級上升的風險中。
SegWit會降低網絡的安全性,執行完全驗證的節點會大幅減少,因為只有那些適配了SegWit的節點才有能力驗證交易的witness部分。
SegWit不能被廢除。如果廢除了它,所有變更都撤銷,那么所有的SegWit輸出就會變成大街上任人撿拾的錢。
SegWit希望一次解決所有問題,也正因此,它導致了大量的代碼改動。它會讓未來的工作更加負載,而且提高了出現驅之不去的軟件bug的機會。
結論
雖然由SW解決的問題很有可能有更優雅的解決方案,我們仍然相信,這是提高網絡的可擴展性并開啟閃電網絡等技術實現的最佳辦法。
Billions項目組
諸君喜歡的話,還請點贊轉發支持,我會持續更新,與君共同進步。
-END-
Tags:比特幣比特幣交易BTC比特幣中國官網聯系方式40億比特幣能提現嗎比特幣最新價格行情走勢比特幣交易會被判刑嗎比特幣交易網官網比特幣交易app官網BTCs是不是黃了btc錢包官網btc短線
來源/LongHash 比特幣網絡幾乎自問世以來就一直在擴張,但是這種趨勢可能即將逆轉。基于CoinMetrics的每日活躍的地址的統計數據,我們觀察了自2009年1月10日至2019年12月1.
1900/1/1 0:00:00據以太坊聯合創始人VitalikButerin的說法,加密貨幣的三個“巨大”前景尚未實現:錢包的廣泛使用、抗通脹的穩定幣和以太坊支持的網站登錄.
1900/1/1 0:00:00Billions項目組 Filecoin的目標是建立一個去中心化、高效、穩定、宏大的人類信息基礎,也就是Web3.0的存儲網絡.
1900/1/1 0:00:00這是一臺被譽為“Pi網絡礦機”的神秘設備,據說是由中國人開發的。它外觀簡約,礦機的外殼采用了鋁合金材料,表面光滑,手感極佳.
1900/1/1 0:00:00來源/LongHash 面對最近的全球市場暴跌,加密市場并未幸免于難。比特幣價格與全球股票及商品同步下跌,截至4月18日,其價格相較于2月的最高位10500美元縮水了約33%.
1900/1/1 0:00:00作者/LongHashKyleTorpey數據可視化/LongHashXinheYu 來源/LongHash 在宣傳穩定幣時,人們通常會形容穩定幣擁有加密貨幣所有的優點.
1900/1/1 0:00:00