You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:02:38