Transaction-Verification

比特幣簽名驗證

  • September 10, 2019

我正在嘗試實現比特幣的 OP_CHECKSIG 操作碼並驗證簽名是否有效。我有從交易數據和公鑰收到的簽名(P2PKH 交易的十六進製欄位應該包含兩者)。我試圖弄清楚簽名的消息摘要本身是什麼。據我所知,這些是必需的項目 -

1.版本號(4字節)

2.輸入的數量(1字節) 3.

被贖回的輸入的交易雜湊4.被贖回的輸出的索引

(4字節)

5.被贖回的輸出的ScriptPubKey前面加上腳本的長度

6.Sequence Number(4 bytes) 7.No

of outputs we are signed over(1 byte)

8.total value of the output(8 bytes)

9.ScriptSig 用於輸出前面的長度

10.locktime欄位(4 字節)

11.hashcode 類型(4 字節)

因此,如果我使用 SHA256 算法以字節格式對這些數據進行兩次雜湊處理,我的簽名驗證會通過嗎?我正在嘗試使用 Java 來實現它,這是我的程式碼 -

public static boolean verifyUsingSecp256k1(byte[] pub, byte[] dataForSigning,
   BigInteger[] rs) throws Exception {
ECDSASigner signer = new ECDSASigner();
X9ECParameters params = SECNamedCurves.getByName("secp256k1");
ECDomainParameters ecParams = new ECDomainParameters(params.getCurve(),
       params.getG(), params.getN(), params.getH());
ECPublicKeyParameters pubKeyParams = new ECPublicKeyParameters(ecParams
       .getCurve().decodePoint(pub), ecParams);
signer.init(false, pubKeyParams);

return signer.verifySignature(dataForSigning, rs[0].abs(), rs[1].abs());}

但是,當我嘗試驗證我的簽名時,它返回為假。我在這裡錯過了什麼嗎?

儘管上述所有步驟都是正確的。這裡唯一的問題是,除了腳本之外,其他所有內容都以 Little Endian 格式擷取(無論出於何種原因)。因此,除了第 5 步和第 9 步之外,所有其他數據都以 Little Endian 格式儲存。我花了一段時間才得到這個答案!只是在實施時要記住的一個小提示!

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