java - 验证生成的交易时出错。区块密码
问题描述
我从这里https://github.com/blockcypher/java-client使用 blockcypher api
并在尝试发送交易时出现异常:
IntermediaryTransaction transaction = context.getTransactionService().
newTransaction(
new ArrayList<>(Arrays.asList("mntg5ArRYYm9PirCaJYNxvHoMKbe2B4Q1b")),
new ArrayList<>(Arrays.asList("mzF8NP6rHYG9ehVPYSJBFygu6LSYVqZLZg")), 30000);
String privateKey = "9acdde15b65eae424f06fd5b5e20572b20c38a25c7daf5b3244508940887dc68";
SignUtils.signWithHexKeyWithPubKey(transaction, privateKey);
context.getTransactionService().sendTransaction(transaction);
这是日志:
3425 [ main] DEBUG ls.rest.jersey.JerseyRestUtils -
Posting to https://api.blockcypher.com/v1/btc/test3/txs/new?token=mytoken: {"double_spend":false,"inputs":[{"addresses":["mntg5ArRYYm9PirCaJYNxvHoMKbe2B4Q1b"]}],"outputs":[{"value":30000,"addresses":["mzF8NP6rHYG9ehVPYSJBFygu6LSYVqZLZg"]}]}
5339 [ main] INFO ockcypher.utils.sign.SignUtils - Pushing Pub key for input
5382 [ main] DEBUG ls.rest.jersey.JerseyRestUtils - Posting to https://api.blockcypher.com/v1/btc/test3/txs/send?token=mytoken: {"tx":{"hash":"b37e8f5dfa909876fe636c07db13a65ea6671ea723847f2e58815e6357200dcb","block_height":-1,"addresses":["mzF8NP6rHYG9ehVPYSJBFygu6LSYVqZLZg","mntg5ArRYYm9PirCaJYNxvHoMKbe2B4Q1b"],"total":4219700,"fees":10300,"relayed_by":"78.128.153.1","received":"2018-09-18T14:37:52.357270154Z","ver":1,"vin_sz":1,"vout_sz":2,"confirmations":0,"preference":"high","double_spend":false,"inputs":[{"prev_hash":"68553b72dad64595bd2052547fcbe84a17e3966a01386b4caefb4518324cf2f9","output_index":0,"output_value":4230000,"addresses":["mntg5ArRYYm9PirCaJYNxvHoMKbe2B4Q1b"],"script_type":"pay-to-pubkey-hash"}],"outputs":[{"value":30000,"script":"76a914cd6c24f57b38917f2066b342147a3802d0a2f6f788ac","addresses":["mzF8NP6rHYG9ehVPYSJBFygu6LSYVqZLZg"],"script_type":"pay-to-pubkey-hash"},{"value":4189700,"script":"76a91450e47d76f6f5dfe1de7de1f19e40afaefbfc008c88ac","addresses":["mntg5ArRYYm9PirCaJYNxvHoMKbe2B4Q1b"],"script_type":"pay-to-pubkey-hash"}]},"tosign":["936678acb668bbe3055d98daf2bf43f7fd8c45e4948c9db01eca16759cbafc26"],"signatures":["3045022100c93d97a73c19c96a521c88d05ec1e11405611dd82407461a5a27dabf2d3d92540220574d453f707f3c40c862e8a1fd8a43c08a68e970fceaee21406aae75172ff137"],"pubkeys":["04a1cfb3e4c4088a4b8a30e09cd2e2ad0503948edab552dbe6550979fb77d3808fea0add24063d1249f2e54ec4dd01308961426f43b83393d367ac529fa8bbed9d"]}
Exception in thread "main" BlockCypherException{message=Bad Request, status=400, blockCypherError=[Error{error='Error validating generated transaction: Error running script for input 0 referencing 68553b72dad64595bd2052547fcbe84a17e3966a01386b4caefb4518324cf2f9 at 0: Script was NOT verified successfully.'}], exception=null}
at com.blockcypher.utils.rest.jersey.JerseyRestUtils.getBlockCypherException(JerseyRestUtils.java:90)
at com.blockcypher.utils.rest.jersey.JerseyRestUtils.post(JerseyRestUtils.java:33)
at com.blockcypher.utils.rest.jersey.JerseyRestUtils.post(JerseyRestUtils.java:50)
at com.blockcypher.utils.rest.RestUtils.post(RestUtils.java:20)
at com.blockcypher.service.TransactionService.postTransaction(TransactionService.java:59)
at com.blockcypher.service.TransactionService.sendTransaction(TransactionService.java:133)
at _test.sendBtc(_test.java:46)
at _test.main(_test.java:27)
我正在使用比特币测试网。
解决方案
我找到了解决方案。您必须向 IntermediaryTransaction添加一个公钥,并且仅使用带有十六进制格式的 privateKey 的 signWithHexKeyNoPubKey (wtf?) 方法。其他变体不起作用。我不知道它为什么有效,但它有效。这是正确的工作代码:
private static Transaction sendBtc(String addrFrom, String addrTo, String privateKey, String pubKey, long value) throws BlockCypherException {
IntermediaryTransaction unsignedTX = context.getTransactionService().
newTransaction(
new ArrayList<>(Arrays.asList(addrFrom)),
new ArrayList<>(Arrays.asList(addrTo)), value);
unsignedTX.addPubKeys(pubKey);
SignUtils.signWithHexKeyNoPubKey(unsignedTX, privateKey);
return context.getTransactionService().sendTransaction(unsignedTX);
}
推荐阅读
- webpack-4 - webpack:使用 2 个入口文件时,两个文件都包含相同的 css - 有解决方法吗?
- angular - 无法读取 HTML 中未定义的属性“temp”,
- flutter - 将“多个”有状态和无状态小部件存储在一个 dart 文件中。没事吧?
- jsp - 如何在从oracle数据库获取的jsp页面中播放视频
- javascript - WebRTC 和 textTrack (caption) to Peer 是可能的吗?
- xml - 如何在 xslt 文件中正确使用 for-each?
- python - 如何从元组中删除括号(两边)?
- c++ - 读取 CSV 文件中的整数
- python - 将带有命令的电子邮件发送到其他电子邮件 discord.py
- java - 如何以给定的总和最佳地将多重集分配到子多重集中