當前位置:
首頁 > 最新 > 深入比特幣原理——隔離見證

深入比特幣原理——隔離見證

在本節開始前,建議先溫習一下《深入比特幣原理(四)》與《深入比特幣原理(五)》的內容,以便更好的理解隔離見證的原理。

隔離見證(Segregated Witness)是什麼?

在比特幣中,見證(witness)通常指的是鎖定腳本(unlocking script)和解鎖腳本(scriptSig),在之前對於比特幣交易的學習中我們知道鎖定腳本與解鎖腳本都是交易(transcation)的一部分。顧名思義,隔離見證就是指將鎖定腳本與解鎖腳本中的部分內容從交易中分離出來,放入一個獨立的數據結構中。隔離見證簡稱Segwit

Segwit如何工作?

目前Segwit支持P2PKH與P2SH支付,加入隔離見證的交易取名為P2WPKH與P2WSH,分別來看一下他們的區別。

1.P2WPKH(Pay-to-Witness-Public-Key-Hash)

首先回顧下P2PKH的鎖定腳本(scriptPubKey)與解鎖腳本(scriptSig)內容

P2PKH

scriptSig:

scriptPubKey: OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG

再來看一下P2WPKH的腳本內容

P2WPKH

scriptSig: (empty)

scriptPubKey: 0

witness:

P2WPKH的鎖定腳本較P2PKH要精簡不少,第一位的數字0是版本號,有了版本號,未來腳本升級就能更容易的向前兼容。

P2WPKH的解鎖腳本為空,而真正的解鎖腳本內容被移到了原交易之外的witness部分。

2.P2WSH(Pay-to-Witness-Script-Hash)

P2SH

scriptSig: 0

scriptPubKey: HASH160 EQUAL

P2WSH

scriptSig: (empty)

scriptPubKey: 0

witness: 0

P2WSH鎖定腳本與P2WPKH類似,第一位是版本號,第二位是贖回腳本(Redeem script)的Hash值。

值得注意的是P2WSH鎖定腳本中的Hash值是256位(32位元組)的,是使用SHA256(pubkey)計算得到;而P2WPKH中的Hash值是160位(20位元組)的,是使用RIPEMD160(SHA256(pubkey))計算得到的。

這樣做的目的是讓錢包可以根據Hash值的長度區分交易使用的是P2WPKH還是P2WSH。(思考一下為什麼P2PKH與P2SH不需要做這樣的區分?)

在P2SH交易中常常會有多重簽名驗證,所以驗證信息會佔用更多空間,將這些信息移到原交易之外能更大程度的降低交易大小。

Segwit如何升級?

在前面的章節我們講述過,比特幣的升級往往伴隨著硬分叉或軟分叉。軟分叉影響較小,但要求更嚴格,需要非常嚴謹的考慮向前兼容性問題。

開發者希望隔離見證能通過軟分叉進行升級,也就是說新舊客戶端可以在同一區塊鏈上共存。於是我們要考慮兩種場景:

(1)付款人的客戶端支持隔離見證,而收款人不支持

(2)付款人的客戶端不支持隔離見證,而收款人支持

對於第一種情況,如果收款人不支持隔離見證,那最終發布的地址將會是普通地址(P2PKH或P2SH),那所有交易按照原有的規則進行即可。

而對於第二種情況,聰明的社區開發者想出了一個過渡方案,即將P2WPKH或P2WSH植入P2SH。

P2WPKH植入P2SH後,交易信息如下:

scriptSig: 0

scriptPubKey: HASH160 EQUAL

witness:

此處的腳本Hash值為RIPEMD160(SHA256(0 ))的結果,將該腳本Hash轉換為P2SH地址,就是一個兼容segwit的地址,不支持隔離見證的客戶端可以正常支付比特幣給這種P2SH地址。

而對於支持隔離見證的客戶端,仍可以將驗證信息放在witness結構中,當然這種過渡方案的交易會較完全形態的方案稍大一些,但比無隔離見證的情況要小。

P2WSH植入P2SH

witness: 0

scriptSig: 0

scriptPubKey: HASH160 EQUAL

使用的方法和P2WPKH植入P2SH是一樣的

Segwit的地址什麼樣?

在新版本客戶端激活隔離見證後,會有較長一段時間才會被大多數錢包升級。所以新舊客戶端一開始將會以植入P2SH(上一節已描述)的方式互相兼容。

當隔離見證被大範圍接受後,錢包將開始使用一種新的專門針對Segwit原生的地址類型,這種地址將使用Base32編碼,而不再使用Base58,即全部使用小寫字母和數字表達。舉例如下:

Mainnet P2WPKH: bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4

Mainnet P2WSH: bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3

如果你看到以bc1開頭的地址,就是使用隔離見證地址進行的交易,如以下https://blockchain.info上的某交易為例

Segwit的區塊大小有限制嗎?

有限制。

比特幣的區塊大小限制為1000000bytes,由於witness數據不包含在這個限制中,為了防止witness數據被濫用,仍然對總的區塊大小做了限制。

引入了一個新概念叫塊重量(Block weight)

Block weight = Base size * 3 + Total size

Base size是不包含witness數據的塊大小

Total size是包含了witness數據的總大小

隔離見證限制Block weight

為什麼要使用Segwit?

1.交易延展性

比特幣的驗證信息是交易中第三方唯一可以修改的數據,移除交易中的驗證信息,可防止交易延展性攻擊。交易延展性攻擊通常是客戶端發出交易後,第三方通過修改或增加一些內容到驗證信息中,改變交易ID(txid),引起客戶端誤以為交易失敗(實際已成功,但不再是原始的txid)。

交易延展性問題的解決可以大大提升支付通道(payment channels),鏈式交易(chained transactions),閃電網路(lighting networks)的可操作性。

鑒於篇幅有限,交易延展性問題詳細信息可參考:https://github.com/bitcoin/bips/blob/master/bip-0062.mediawiki

2.腳本版本化

使用隔離見證後,鎖定腳本(Locking script)將被加上版本號,從而使腳本語言的升級更容易向前兼容,這種不造成太大影響的腳本語言修改方式將加快比特幣的創新

3.網路與存儲伸縮性

交易中驗證數據(witness data)佔據了不小的比例,特別是一些複雜的交易,如多重簽名,支付通道等.在一些情況下可以佔據超過75%的交易大小。將驗證數據放到交易外,可提高比特幣的伸縮性。

節點可以在驗證簽名後刪除驗證數據或在簡單支付驗證時忽略它,驗證數據不需要被傳輸到所有節點或存儲在所有節點的硬碟上。

另外節點在計算塊大小時,會忽略驗證數據的大小,從而變相增加了單個區塊可以包含的交易數量。

4.簽名驗證優化

隔離驗證降低簽名驗證的演算法複雜性,在隔離驗證前,哈希的計算次數為O(n2),使用隔離驗證後,計算次數降為O(n),n為簽名操作的數量

對於隔離見證技術,仍然在不斷發展中,有興趣的朋友可以繼續保持關注,更詳細的信息可參考

BIP141:https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki

加入知識星球和HWer一起成長

更多好文請關注後查看歷史消息

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 區塊鏈Times 的精彩文章:

TAG:區塊鏈Times |