Bitcoin-Core
為什麼單獨簽署的相同交易具有不同的見證值?
我使用 nbitcoin 庫簽署了比特幣測試網交易並得到了輸出:
02000000000101853b6bcbc78cf4cd621abb7edca78383ce15a34b6617347258d72d13ecb8fcbc000000001716001487463af228c128aad9371c3df1236d0518c32f44ffffffff01604898000000000017a9141b16cfd66b7f084bf95baf36d14df67f03ef230487024730440220376c73ba8bacbc791fc45ed596c8f973fe79ef0c1bb37a16fb2043dc0998ea62022027c7135359a103f243d865d89eb913e180ea751669b7a2f910b08eb3edcc76f5012102739a2f893507714c7e1b37510dede5aad15862b018f6ad9e9402e0b7290a133300000000
然後我用比特幣核心簽署了相同的交易,它返回了一個輸出:
02000000000101853b6bcbc78cf4cd621abb7edca78383ce15a34b6617347258d72d13ecb8fcbc000000001716001487463af228c128aad9371c3df1236d0518c32f44ffffffff01604898000000000017a9141b16cfd66b7f084bf95baf36d14df67f03ef23048702473044022015499aee1e03fc9dd853abf3a9307ebd19dfd9e4f5209a7810be48dfed1c698002205d6c0da0a26918ca38d5aaf9629f7dd71119334e168aafd9f3363f05cb06c967012102739a2f893507714c7e1b37510dede5aad15862b018f6ad9e9402e0b7290a133300000000
在比較輸出時,txwitness 堆棧值不同。
比特幣核心見證數據
"txinwitness": [ "3044022015499aee1e03fc9dd853abf3a9307ebd19dfd9e4f5209a7810be48dfed1c698002205d6c0da0a26918ca38d5aaf9629f7dd71119334e168aafd9f3363f05cb06c96701", "02739a2f893507714c7e1b37510dede5aad15862b018f6ad9e9402e0b7290a1333" ]
nBitcoin 見證數據
"txinwitness": [ "30440220376c73ba8bacbc791fc45ed596c8f973fe79ef0c1bb37a16fb2043dc0998ea62022027c7135359a103f243d865d89eb913e180ea751669b7a2f910b08eb3edcc76f501", "02739a2f893507714c7e1b37510dede5aad15862b018f6ad9e9402e0b7290a1333" ]
但是,我仍然能夠發送由 nBitcoin 簽名的交易。
所以我的問題是:
1)見證堆棧中的值是什麼?
- 為什麼同一筆交易有不同的 txwitness 價值?
比特幣簽名有兩個組成部分:s和R。要使用私鑰k簽署比特幣交易,簽名算法會生成一個臨時私鑰r。簽名的R分量是該臨時公鑰的 x 座標。簽名的 s 分量按以下方式計算: s = r -1 (Hash(m) + k * R) mod p; 其中 Hash(m) 是交易數據 m 的雜湊值。
因為,
s
隨著 的變化r
,如上式所示,當您比較兩個已簽名的交易時,如果它們的臨時密鑰生成算法不同,則簽名組件將完全不同。大多數軟體使用 RFC 6979 確定性但安全地生成用於簽署交易的臨時密鑰。所以對於兩個相同的交易,臨時密鑰應該是相同的,這就是你在不同的比特幣核心軟體上看到相同簽名的原因。但是,RFC 6979 算法還允許在生成臨時密鑰時使用其他額外的可選數據。對於不同的軟體,這些額外的可選數據可能會有所不同,因此您會看到來自 Bitcoin-Core 和 nBitcoin 的不同 (s,R) 簽名。