使用Bitcoin Crate签名SegWit交易遇验证错误求助
求助:P2WPKH交易签名后广播报错排查
我正在用Rust编写代码,创建一笔花费P2WPKH地址关联输出的交易,使用标准的bitcoin crate开发,相关代码片段如下:
fn sign_transaction<SignFun>( own_public_key: &[u8], own_address: &Address, own_utxos: &[Utxo], mut transaction: Transaction, key_name: String, derivation_path: Vec<Vec<u8>>, signer: SignFun, ) -> Transaction where SignFun: Fn(String, Vec<Vec<u8>>, Vec<u8>) -> Fut, { let txclone = transaction.clone(); let mut hash_cache = sighash::SighashCache::new(&txclone); for (index, input) in transaction.input.iter_mut().enumerate() { let value = get_value(input, own_utxos); // 通过查找对应UTXO获取金额 let sighash = hash_cache .segwit_signature_hash(index, &own_address.script_pubkey(), value, SIG_HASH_TYPE) .expect("创建隔离见证签名哈希失败"); let signature = signer(key_name.clone(), derivation_path.clone(), sighash.to_vec()).await; // 将签名转换为DER格式 let der_signature = sec1_to_der(signature); let mut sig_with_hashtype = der_signature; sig_with_hashtype.push(SIG_HASH_TYPE.to_u32() as u8); let witness_bytes = vec![sig_with_hashtype, own_public_key.to_vec()]; input.witness = Witness::from_vec(witness_bytes); } transaction }
将签名后的交易发送到本地RegTest模式的Bitcoin节点时,收到如下错误:
error code: -26 error message: non-mandatory-script-verify-flag (Signature must be zero for failed CHECK(MULTI)SIG operation)
我记录了以下关键信息:
- 公钥:0377f5de845ac601f24e7cbf2e4abcc9e1040cd4ae971ecaa00837b1c74684e15b
- 地址:bcrt1qh3zle7xs34azdyycg8cpf9wx5nxjpcqyqv4eyc
- 花费的输入金额:625000000
- 待签名交易:0100000001ceac446d9350730c2a886220bed7ae154ca3f717897819091d5e72dcd0f0895e0000000000ffffffff0200e1f505000000001600148be949ae15ee4b5da9af0ce2bf8d3f3c43c582da26dc4a1f00000000160014bc45fcf8d08d7a26909841f01495c6a4cd20e00400000000
- 签名哈希(Sighash):d7e5696f18363b58c84b8d57014d291c9f7ebbac562d219f7e7014b9a5685bbf
- SEC1签名:c10c09b210914e49f295c07c9f96352e085df9d2c4272292239445d6f89483bc64c9903bebaba4bbf998d217c80375c36b60b212a824b63435e30205b2ed5a6a
- DER签名:3045022100c10c09b210914e49f295c07c9f96352e085df9d2c4272292239445d6f89483bc022064c9903bebaba4bbf998d217c80375c36b60b212a824b63435e30205b2ed5a6a
- 带签名哈希类型的DER签名:3045022100c10c09b210914e49f295c07c9f96352e085df9d2c4272292239445d6f89483bc022064c9903bebaba4bbf998d217c80375c36b60b212a824b63435e30205b2ed5a6a01
- 已签名交易:01000000000101ceac446d9350730c2a886220bed7ae154ca3f717897819091d5e72dcd0f0895e000000000ffffffff0200e1f505000000001600148be949ae15ee4b5da9af0ce2bf8d3f3c43c582da26dc4a1f00000000160014bc45fcf8d08d7a26909841f01495c6a4cd20e00402483045022100c10c09b210914e49f295c07c9f96352e085df9d2c4272292239445d6f89483bc022064c9903bebaba4bbf998d217c80375c36b60b212a824b63435e30205b2ed5a6a01210377f5de845ac601f24e7cbf2e4abcc9e1040cd4ae971ecaa00837b1c74684e15b00000000
注:同一ECDSA签名器用于传统(P2PKH)交易的代码可正常运行,因此签名器本身无问题。
恳请帮忙排查问题所在!
内容的提问来源于stack exchange,提问作者THLO
相关产品推荐
相关产品推荐

