Segregated-Witness

為什麼見證人使用計數而不是長度?

  • March 29, 2019

在遺留事務(沒有 SegWit)中,scriptSig 很容易通過知道它的長度(一個CompactInt值)來解析,而無需讀取腳本。

然而,在 SegWit 交易中,移動到見證位置的 scriptSig 現在由腳本內部項目的“計數”標識,這意味著需要在適當的位置讀取(解釋)腳本。

大小(在多重簽名腳本中節省 2 個字節)是造成這種差異的唯一原因嗎?

由於這種差異,對於可以在見證人內部的腳本中使用的 OP 程式碼是否有任何限制?

請注意,見證人不是腳本。它們不包含操作碼。它們是堆棧元素。見證人沒有明確的操作碼(見證人腳本是腳本,但是是單個見證人堆棧元素,因此它們的操作碼不計算在內)。

使用計數是因為它清楚地描繪了輸入的堆棧項的末尾和下一個輸入的堆棧項的開始之間。計數的使用遵循比特幣其他地方用於序列化項目數組的標準序列化方法。在這種情況下,輸入的見證數據是字節數組的數組(在程式碼中,即std::vector<std::vector<unsigned char>>)。

因此,按照 s 的標準序列化方法std::vector,在頂層我們得到下一層的項數(即std::vector<unsigned char>元素數),恰好是堆棧項數。然後下一級序列化我們得到下一級項目數的另一個長度(即unsigned char每個向量中的數量)。所以現在我們有了每個堆棧項的長度。然後是堆棧項本身。

這種方法用於 segwit 的原因可能是因為 Bitcoin Core 中的堆棧被實現為std::vector<std::vector<unsigned char>>. 此外,這種方式的向量序列化在比特幣中無處不在,因此序列化程式碼基本上已經存在於每個現有的錢包軟體中。

引用自:https://bitcoin.stackexchange.com/questions/85704