使用bitcoinjs与Blockcypher签名比特币测试网交易遇反序列化错误求助
解决Blockcypher交易签名时的反序列化错误
我看了你的代码和遇到的错误信息,这个问题的核心是请求格式不匹配导致Blockcypher无法正确解析你的请求。
错误原因分析
你在调用/txs/send接口时,直接把tmptx对象传给了$.post,而jQuery默认会把对象序列化为application/x-www-form-urlencoded格式的表单数据,但Blockcypher的API要求接收的是application/json格式的请求体。这种格式不匹配就导致了服务端无法反序列化请求,抛出了invalid character 'x' in literal true (expecting 'r')的错误。
另外还有一个小细节:你使用buffer.Buffer的时候,在Node.js环境里其实不需要额外引入buffer模块,直接用全局的Buffer就行,不过这个不是引发当前错误的主要原因。
修正后的代码
下面是调整后的完整代码,主要修改了请求格式相关的部分,确保符合Blockcypher API的要求:
var bitcoin = require("bitcoinjs-lib"); var keys = new bitcoin.ECPair.fromWIF('cMvPQZiG5mLARSjxbBwMxKwzhTHaxgpTsXB6ymx7SGAeYUqF8HAT', bitcoin.networks.testnet); var newtx = { inputs: [{addresses: ['ms9ySK54aEC2ykDviet9jo4GZE6GxEZMzf']}], outputs: [{addresses: ['msWccFYm5PPCn6TNPbNEnprA4hydPGadBN'], value: 1000}] }; // 调用txs/new时明确指定请求格式为JSON $.post('https://api.blockcypher.com/v1/btc/test3/txs/new', JSON.stringify(newtx), null, 'application/json') .then(function(tmptx) { tmptx.pubkeys = []; tmptx.signatures = tmptx.tosign.map(function(tosign, n) { tmptx.pubkeys.push(keys.publicKey.toString("hex")); const SIGHASH_ALL = 0x01; // 使用全局Buffer处理签名数据 return bitcoin.script.signature.encode(keys.sign(Buffer.from(tosign, "hex")), SIGHASH_ALL).toString("hex"); }); // 改用$.ajax精确控制请求参数,确保发送JSON格式数据 $.ajax({ url: 'https://api.blockcypher.com/v1/btc/test3/txs/send', method: 'POST', contentType: 'application/json', data: JSON.stringify(tmptx), success: function(finaltx) { console.log(finaltx); }, error: function(response) { console.log(response.responseText); } }); }).catch(function(response) { console.log(response.responseText); });
关键修改点
- 调用
/txs/new时,明确指定第四个参数为'application/json',确保请求头和请求体格式匹配 - 调用
/txs/send时,改用$.ajax来精确控制请求:- 设置
contentType: 'application/json'告诉服务端请求体是JSON格式 - 用
JSON.stringify(tmptx)把对象转为JSON字符串再发送
- 设置
- 移除了不必要的
buffer模块引入,直接使用Node.js全局的Buffer.from()
这样调整后,Blockcypher就能正确解析你的请求,应该可以解决这个反序列化错误了。
内容的提问来源于stack exchange,提问作者brandbei37
相关产品推荐
相关产品推荐

