|
July 26, 2021, 11:20:53 AM Merited by NotATether (5) |
|
when I send tx but catch this message "Don't know how to sign for this kind of scriptPubKey",I don't know what happen I hope someone help me,my code is:
public String sign(String fromAddress, String toAddress, String privateKey, long amount, long fee, List<UTXO> utxos) throws Exception { NetworkParameters networkParameters = MainNetParams.get(); Transaction transaction = new Transaction(networkParameters); String changeAddress = fromAddress;//找零地址 Long changeAmount = 0L; Long utxoAmount = 0L; List<UTXO> needUtxos = new ArrayList<UTXO>(); if (utxos == null || utxos.size() == 0) { throw new Exception("未消费列表为空"); } //遍历未花费列表,组装合适的item for (UTXO utxo : utxos) { if (utxoAmount >= (amount + fee)) { break; } else { needUtxos.add(utxo); utxoAmount += utxo.getValue().value; } } transaction.addOutput(Coin.valueOf(amount), LegacyAddress.fromBase58(networkParameters, toAddress)); //消费列表总金额 - 已经转账的金额 - 手续费 就等于需要返回给自己的金额了 changeAmount = utxoAmount - (amount + fee); //余额判断 if (changeAmount < 0) { throw new Exception("utxo余额不足"); } //输出-转给自己(找零) if (changeAmount > 0) { transaction.addOutput(Coin.valueOf(changeAmount), LegacyAddress.fromBase58(networkParameters, changeAddress)); } //输入未消费列表项 DumpedPrivateKey dumpedPrivateKey = DumpedPrivateKey.fromBase58(networkParameters, privateKey); ECKey ecKey = dumpedPrivateKey.getKey(); for (UTXO utxo : needUtxos) { TransactionOutPoint outPoint = new TransactionOutPoint(networkParameters, utxo.getIndex(), utxo.getHash()); transaction.addSignedInput(outPoint, utxo.getScript(), ecKey, Transaction.SigHash.ALL, true); } byte[] bytes = transaction.bitcoinSerialize(); String hash = Hex.toHexString(bytes); log.info("fee:{},utxoAmount:{},changeAmount{}", fee, utxoAmount, changeAmount); return hash; }
the exception at the red color
|