Tx 延展性:為什麼腳本不包含在簽名雜湊中?
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 簽名的東西在比特幣網路上都將被視為無效。
這是一項不平凡的任務。並非不可能,但它不會“快速簡單”地解決,據我所知,這需要網路的硬分叉。這意味著需要額外的時間進行測試、增加前向兼容性和建立共識,以避免意外後果,例如將大部分網路留在舊分叉上。