在 Blockcypher 上广播原始交易,在 POST 请求中收到错误

Posted

技术标签:

【中文标题】在 Blockcypher 上广播原始交易,在 POST 请求中收到错误【英文标题】:Broadcasting Raw Transaction on Blockcypher, getting a error on POST request 【发布时间】:2016-05-29 15:35:37 【问题描述】:

我有一个原始比特币交易,我想使用 Blockcypher API 进行广播,我正在使用 axios 发送 POST 请求:

var axios = require('axios')

axios.post('https://api.blockcypher.com/v1/bcy/test/txs/send', 
    "tx": "010000000174770a05466c28df24425ac50dba86ead47af31778f01fa1069bf01816810a2b010000008b48304502210090c86f59c8df34979ccb485c524803e9ba1290cc4448cdbfdcc8f3cf3337102302202357e77439354acf7b178392720f433cfeac952d34098addb2eea7edcf7884c20141048520397beff2fe111c7af8aa42c99b317453b1595ec5c3b3cf9eb2059dd06b9b956165419d51a48d885aacb4df1004d7c93b30e2e53c6d4f64f9668c9fd7e92fffffffff02cd0d0000000000001976a914243170728a9278ed24b4ac7ba9df33bdadf7afd488ac00000000000000004d6a4b77723335322d33316472342d4e42412d33323132322d333435352d363933352d323334392d323334302d31323333322d39392d30322d31362d323031352d32336f6c2d313030303030303000000000"
  )
  .then(function (response) 
    console.log(response);
  )
  .catch(function (response) 
    console.log(response);
  );

在终端中运行时出现错误:

 data:  error: 'Couldn\'t deserialize request: json: cannot unmarshal string into Go value of type pooch.JSONTx' 

知道我的 POST 有什么问题吗?我尝试使用 tx 而不是“tx”发布,但它仍然不起作用。在文档中,他们建议这样做:

var pushtx = 
  tx: "01000000011935b41d12936df99d322ac8972b74ecff7b79408bbccaf1b2eb8015228beac8000000006b483045022100921fc36b911094280f07d8504a80fbab9b823a25f102e2bc69b14bcd369dfc7902200d07067d47f040e724b556e5bc3061af132d5a47bd96e901429d53c41e0f8cca012102152e2bb5b273561ece7bbe8b1df51a4c44f5ab0bc940c105045e2cc77e618044ffffffff0240420f00000000001976a9145fb1af31edd2aa5a2bbaa24f6043d6ec31f7e63288ac20da3c00000000001976a914efec6de6c253e657a9d5506a78ee48d89762fb3188ac00000000"
;

$.post('https://api.blockcypher.com/v1/bcy/test/txs/push', JSON.stringify(pushtx))
  .then(function(d) console.log(d));

但是当我这样做时,我得到了错误:

TypeError: undefined is not a function

所以我认为使用 axios 更容易,因为我至少收到了 Blockcypher 的回复。任何帮助将不胜感激!

【问题讨论】:

看起来您在 POST 请求中发送的数据不正确。 'tx' 字段应该是符合其 TXSkeleton 类型的对象。 dev.blockcypher.com/#creating-transactions 【参考方案1】:

完整披露:BlockCypher 的开发者倡导者在这里。首先,根据 cmets 中的Greg's 建议,在第一种情况下,使用/txs/send 端点,我们期望TX Skeleton。这在文档的Creating Transactions section 中有更清楚的概述。

使用/txs/push 应该适用于您的情况,尽管我也遇到了错误。为了进行调查,我首先检查了我们的 /txs/decode 端点,这是调试的良好第一步,因为它将向您展示我们的服务器如何反序列化原始事务。你可以read more about it here。

var decodetx = 
  tx: "01000000011935b41d12936df99d322ac8972b74ecff7b79408bbccaf1b2eb8015228beac8000000006b483045022100921fc36b911094280f07d8504a80fbab9b823a25f102e2bc69b14bcd369dfc7902200d07067d47f040e724b556e5bc3061af132d5a47bd96e901429d53c41e0f8cca012102152e2bb5b273561ece7bbe8b1df51a4c44f5ab0bc940c105045e2cc77e618044ffffffff0240420f00000000001976a9145fb1af31edd2aa5a2bbaa24f6043d6ec31f7e63288ac20da3c00000000001976a914efec6de6c253e657a9d5506a78ee48d89762fb3188ac00000000"
;

$.post('https://api.blockcypher.com/v1/bcy/test/txs/decode', JSON.stringify(decode))
  .then(function(d) console.log(d));

这对我有用,返回已解码(但未推送!)事务:


  "block_height": -1,
  "block_index": -1,
  "hash": "4e6dfb1415b4fba5bd257c129847c70fbd4e45e41828079c4a282680528f3a50",
  "addresses": [
    "CEztKBAYNoUEEaPYbkyFeXC5v8Jz9RoZH9",
    "C1rGdt7QEPGiwPMFhNKNhHmyoWpa5X92pn"
  ],
  "total": 4988000,
  "fees": 12000,
  "size": 226,
  "preference": "high",
  "relayed_by": "54.213.170.147, 127.0.0.1",
  "received": "2016-02-17T20:16:43.124983132Z",
  "ver": 1,
  "lock_time": 0,
  "double_spend": false,
  "vin_sz": 1,
  "vout_sz": 2,
  "confirmations": 0,
  "inputs": [
    
      "prev_hash": "c8ea8b221580ebb2f1cabc8b40797bffec742b97c82a329df96d93121db43519",
      "output_index": 0,
      "script": "483045022100921fc36b911094280f07d8504a80fbab9b823a25f102e2bc69b14bcd369dfc7902200d07067d47f040e724b556e5bc3061af132d5a47bd96e901429d53c41e0f8cca012102152e2bb5b273561ece7bbe8b1df51a4c44f5ab0bc940c105045e2cc77e618044",
      "output_value": 5000000,
      "sequence": 4294967295,
      "addresses": [
        "CEztKBAYNoUEEaPYbkyFeXC5v8Jz9RoZH9"
      ],
      "script_type": "pay-to-pubkey-hash",
      "age": 386562
    
  ],
  "outputs": [
    
      "value": 1000000,
      "script": "76a9145fb1af31edd2aa5a2bbaa24f6043d6ec31f7e63288ac",
      "addresses": [
        "C1rGdt7QEPGiwPMFhNKNhHmyoWpa5X92pn"
      ],
      "script_type": "pay-to-pubkey-hash"
    ,
    
      "value": 3988000,
      "script": "76a914efec6de6c253e657a9d5506a78ee48d89762fb3188ac",
      "spent_by": "892fd7b36c1c3a2e5edb9b4a5d4ffd9ba74d78d3acf3b249991bd8d10a287dbd",
      "addresses": [
        "CEztKBAYNoUEEaPYbkyFeXC5v8Jz9RoZH9"
      ],
      "script_type": "pay-to-pubkey-hash"
    
  ]

这里的一切看起来都很好。于是我尝试使用/txs/push,这一次,通过一个cURL收集返回中的错误信息:

curl -d '"tx":"01000000011935b41d12936df99d322ac8972b74ecff7b79408bbccaf1b2eb8015228beac8000000006b483045022100921fc36b911094
280f07d8504a80fbab9b823a25f102e2bc69b14bcd369dfc7902200d07067d47f040e724b556e5bc3061af132d5a47bd96e901429d53c41e0f8cca012102152e2bb5b273561ece7bbe8b1d
f51a4c44f5ab0bc940c105045e2cc77e618044ffffffff0240420f00000000001976a9145fb1af31edd2aa5a2bbaa24f6043d6ec31f7e63288ac20da3c00000000001976a914efec6de6c2
53e657a9d5506a78ee48d89762fb3188ac00000000"' https://api.blockcypher.com/v1/bcy/test/txs/push
"error": "Error validating transaction: Transaction with hash 4e6dfb1415b4fba5bd257c129847c70fbd4e45e41828079c4a282680528f3a50 already exists.."

果然,根据该错误消息,该交易已经存在于我们的内部测试网上,如下所示:

https://live.blockcypher.com/bcy/tx/4e6dfb1415b4fba5bd257c129847c70fbd4e45e41828079c4a282680528f3a50/

我认为您正在尝试推送已经推送的原始交易。如果您想测试交易创建,我建议您在我们的测试网上生成您自己的地址:

http://dev.blockcypher.com/#generate-address-endpoint

您可以使用我们的水龙头向这些地址发送一些硬币:

http://dev.blockcypher.com/#testing (或通过此处的网络界面:https://accounts.blockcypher.com/blockcypher-faucet)。

然后按照“创建事务”中概述的步骤进行操作:

http://dev.blockcypher.com/#creating-transactions

希望有帮助!

【讨论】:

谢谢乔希!我真的很感谢你的快速反应。看起来我尝试发送的对象的格式不正确。对于使用 axios 寻找解决方案的其他人,请查看此链接:gist.github.com/LAMike310/96104a94427db04eefb2 我的问题是对 JSON 事务进行 HEX 编码。如何在发送之前对已签名的交易进行十六进制编码?

以上是关于在 Blockcypher 上广播原始交易,在 POST 请求中收到错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 litecoire-lib 广播交易?

比特币如何防止伪造交易记录?

用于状态网络的可扩展广播方案

区块链入门到实战(10)之区块链 – 交易流程与挖矿

发送原始交易 Ethereum infura nodejs npm

Android - 在动态注册的广播接收器上出现“无法传递广播”错误