Transactions

Tx 延展性:為什麼腳本不包含在簽名雜湊中?

  • March 15, 2014

Sipa 在此處列出了 tx 延展性的來源:https ://gist.github.com/sipa/8907691

我很清楚簽名本身或簽名格式的變化如何導致不同的 tx 雜湊(1. & 2.)。但是為什麼允許修改腳本的其餘部分(可能是“”)

據我了解,只有 txin 腳本可以修改,因為 txout 腳本包含在簽名雜湊中。顯然簽名本身不能包含在簽名雜湊中。

對於每個簽名,相應的 txin 腳本被適當的先前輸出腳本 (?) 替換,並且 tx 中的所有其他 txin 腳本都被刪除。

為什麼 txin 腳本(沒有簽名,因此它是標準 tx 的空字元串)不包含在散列和簽名數據中?

(如果我說錯了,請糾正我。)

編輯:試圖更清楚地表達自己:

當然,簽名的範圍和格式需要標準化。但是,正如 Sipa 指出的那樣,還有其他可延展性的案例,例如在 tx_in 腳本中添加無意義的 OP,或者使用具有相同或相似效果的替代 OP。我只是在談論這些其他情況。

我的觀點是:簽名本身無法簽名,但為什麼 txin 腳本中可能存在或不存在的 OP 程式碼未簽名?

範例:

今天:

正常 txinscript:“sig”–> 簽名格式:“”–> 有效

的 malled txinscript:“OP_NULL sig”–> 簽名格式:“”–> 有效

為什麼不:

正常的 txinscript:“sig”–> 簽名格式:“”–> 有效

的 malled txinscript:“OP_NULL sig”–> 簽名格式:“OP_NULL”–> FAIL

今天的簽名格式將整個 txinscript 替換為 “"。對我來說,似乎只刪除簽名本身但保留操作碼(如果存在)會更安全,這樣就不可能更改現有的操作碼或添加無意義的操作碼。

是不是因為不知道腳本的哪一部分是簽名?我認為如果這是問題,它可以被標記為這樣。

你是絕對正確的。

這樣做的唯一原因是因為這不是共識規則目前的工作方式。改變它需要一個硬分叉,更新每個節點,最終更新每個錢包。

tx_in “腳本”是簽名(以及 pubkey 和一些格式)。這是一個有點令人困惑的名字,它有點暗示有一個 tx_in 腳本,然後在其他地方這些就是這個簽名,但事實並非如此。

簽名不能包含在形成簽名的輸入中。

這張圖可能會有所幫助。 <https://en.bitcoin.it/w/images/en/e/e1/TxBinaryMap.png>

左邊的圖表是一個“標準”tx_in。

tx_input 結構包括

Previous txout-hash (tx_id)
Previous Txout-index
Txin-script length
Txin-script 
sequence_no

然而,這實際上只是一個抽象,Txin_script 只是簽名和公鑰,包括:

L(sig)
0x30
L(rs)
0x02
L(r)
Sig r
0x02
L(s)
Sig s
0x01
L(key)
0x04
Key X
Key y (only for uncompressed keys)

所以你說 txin 腳本是可變的只是另一種表達簽名(和格式)的方式。可變性沒有一種單一的方法。ECDSA 本身俱有可變簽名,簽名的填充和格式可以修改並且仍然有效。

使 tx_id 不可變需要使用替代方法計算 tx_id(雜湊),其中雜湊的有效負載都是不可變的元素,或者將 ECDSA 簽名限制為參數、格式和填充的特定子集,這樣對於給定的有效負載只是一種可能的“正確”比特幣簽名。其他任何可能是有效的 ECDSA 簽名的東西在比特幣網路上都將被視為無效。

這是一項不平凡的任務。並非不可能,但它不會“快速簡單”地解決,據我所知,這需要網路的硬分叉。這意味著需要額外的時間進行測試、增加前向兼容性和建立共識,以避免意外後果,例如將大部分網路留在舊分叉上。

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