javascript 使用bitcoinjs发送比特币交易

46qrfjad  于 12个月前  发布在  Java
关注(0)|答案(4)|浏览(229)

有人能解释一下我如何使用bitcoinjs发送比特币交易吗?我用比特币装了两个钱包。
我想从这里发送100000个聪:1G 4 iprWu 7 Q8 tNbQLA 8 UBM 2GearcnzwFrxM,伊斯坦布尔
到这里:1HsrKvboax 8 J3 X1 sgsRdWybEwnUNWsDw 4 Y
如果需要,这里是1G4iprWu7Q8tNbQLA8UBM2GearcnzwFrxM的最后一个事务
我使用的代码来自bitcoinjs.org网站:

var tx = new bitcoin.TransactionBuilder()

// Add the input (who is paying):
// [previous transaction hash, index of the output to use]
var txId = 'aa94ab02c182214f090e99a0d57021caffd0f195a81c24602b1028b130b63e31'
tx.addInput(txId, 0)

// Add the output (who to pay to):
// [payee's address, amount in satoshis]
tx.addOutput("1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK", 15000)

// Initialize a private key using WIF
var privateKeyWIF = 'L1uyy5qTuGrVXrmrsvHWHgVzW9kKdrp27wBC7Vs6nZDTF2BRUVwy'
var keyPair = bitcoin.ECPair.fromWIF(privateKeyWIF)

// Sign the first input with the new key
tx.sign(0, keyPair)

// Print transaction serialized as hex
console.log(tx.build().toHex())
// => 0100000001313eb630b128102b60241ca895f1d0ffca21 ...

// You could now push the transaction onto the Bitcoin network manually
// (see https://blockchain.info/pushtx)

现在我假设var txId是最后一个事务here的事务ID
我把费用放在tx.addInput``里了吗?100个够吗?tx.addOutput是obvs,所以我很好!var privateKeyWIF*是不是我把发送地址中的私钥放在了哪里? 不知道var keyPairtx.sign`做什么!
任何人谁可以帮助告诉我的细节应该去将不胜感激!对于这个例子,假设我的发送者地址的私钥是5 Kb 8 kLf 9 zgWQnogidDA 76 MzPL 6 TsZZY 36 hWXMssSzNydYXYB 9 KF
欢呼

clj7thdc

clj7thdc1#

let bitcoin = require('bitcoinjs-lib');
   const TESTNET = bitcoin.networks.testnet;
   const keyPair = bitcoin.ECPair.makeRandom({ network: TESTNET });
   const { address } = bitcoin.payments.p2pkh({
      pubkey: keyPair.publicKey,
      network: TESTNET,
   });;
   let wif = keyPair.toWIF()
// console.log(address, keyPair.publicKey.toString('hex') , keyPair.privateKey.toString('hex') , wif);

   let fkeyPair = bitcoin.ECPair.fromWIF(fwif , TESTNET);
   const result = await axios.get(`https://testnet.blockchain.info/rawaddr/${fAddress}`);
   let balance = result.data.final_balance;
   let latestTx = result.data.txs[0].hash;
   console.log('testAddress balance:' , balance);
   console.log('latest tx: ', latestTx);
   var txb = new bitcoin.TransactionBuilder(bitcoin.networks.testnet);
   let sendAmount = 15000;
   let fee = 26456;
   let whatIsLeft = balance - fee - sendAmount;
   txb.addInput(latestTx, 1);
   txb.addOutput(f2Address, sendAmount);
   txb.addOutput(f2Address, whatIsLeft);
   txb.sign(0, fkeyPair);
   let body = txb.build().toHex();
   console.log(body);
qmb5sa22

qmb5sa222#

我发现很多人对这一部分感到困惑-“如何将交易发布到网络”。简而言之,你需要访问一个单独的比特币核心完整节点。完整节点包括JSON API,您可以将原始交易十六进制发布到这些API,然后完整节点基本上在幕后为您完成其余的工作(通过gossip网络广播到其他节点,然后将交易添加到自己的mempool中,然后等待矿工处理它,以便将其添加到区块链中)。
将交易发送到网络的方法主要有两种(通过Bitcoin Core中的JSON RPC API发送,或者通过bitcoin-BTC发送):
1.您可以添加一个nodeJS库,允许您对web服务器进行socket访问,然后像从nodeJS代码调用任何其他REST服务一样调用它。
1.对于测试来说,使用完整节点附带的“bitcoin-Bit”更容易。确保您的完整节点正在运行,SSH连接到它,然后从bitcoin-task中调用sendrawtransaction命令。具体来说,在UNIX提示符中,只有一行:

% bitcoin-cli sendrawtransaction 0000000001186f9f....00000000

那个大的长十六进制数是你的比特币代码将生成的交易十六进制数。未经确认的交易将在几秒钟内出现在您的钱包中。即,已验证,但尚未确认。

j8ag8udp

j8ag8udp3#

比特币交易通常将先前的交易输出作为新的交易输入。
首先,您需要查看以前的交易。正如你可以看到here或在上面的代码片段中,txId是:4303caa91ca5a2236396af3bfae26b70a223a2bcee2fe8d23a7b24626c3c4bd2

{
   "hash":"4303caa91ca5a2236396af3bfae26b70a223a2bcee2fe8d23a7b24626c3c4bd2",
   "ver":1,
   "vin_sz":1,
   "vout_sz":2,
   "size":225,
   "weight":900,
   "fee":18713,
   "relayed_by":"0.0.0.0",
   "lock_time":448506,
   "tx_index":7399058499716239,
   "double_spend":false,
   "time":1484590465,
   "block_index":448507,
   "block_height":448507,
   "inputs":[
      {
         "sequence":4294967294,
         "witness":"",
         "script":"47304402204fdab6f26efa32f49c79d8c91b5d42ea39760cff5afc34351f8595453bd3c9d102201ff8e25e4ababe3c3515617e90f97516cda50061ad0c02f215e4a008d580ede4012102e801e52ff6e7d1ad0bb46ef6732d8fcfae1e122a47ea5690e084b9fa4a73d106",
         "index":0,
         "prev_out":{
            "spent":true,
            "script":"76a914d7819c081b247a146922b8f90f89181b02a3c66f88ac",
            "spending_outpoints":[
               {
                  "tx_index":7399058499716239,
                  "n":0
               }
            ],
            "tx_index":356328836300976,
            "value":469871307,
            "addr":"1LeVYfpp1LQQUBqsmruVW6cMbYrZtmunPr",
            "n":1,
            "type":0
         }
      }
   ],
   "out":[
      {
         "type":0,
         "spent":true,
         "value":469352594,
         "spending_outpoints":[
            {
               "tx_index":5608049158171792,
               "n":0
            }
         ],
         "n":0,
         "tx_index":7399058499716239,
         "script":"76a9147adfb2779ee7710b0dffeff8fb77c82867ed43e588ac",
         "addr":"1CChR9sShAc61MNLhMoLzy87w5DwP6jRvv"
      },
      {
         "type":0,
         "spent":true,
         "value":500000,
         "spending_outpoints":[
            {
               "tx_index":8253272257190039,
               "n":0
            }
         ],
         "n":1,
         "tx_index":7399058499716239,
         "script":"76a914a53e0c670a2836baef1ea93de125f1fdd77370dd88ac",
         "addr":"1G4iprWu7Q8tNbQLA8UBM2GearcnzwFrxM"
      }
   ]
}

您的地址1G4iprWu7Q8tNbQLA8UBM2GearcnzwFrxM显示为第二个输出(index 1)。
这个地址的总金额是500000 satoshis

因此,让我们创建我们的事务

var txb = new bitcoin.TransactionBuilder()
txb.addInput('4303caa91ca5a2236396af3bfae26b70a223a2bcee2fe8d23a7b24626c3c4bd2', 1)

现在我们将发送100000聪

txb.addOutput('1cMh228HTCiwS8ZsaakH8A8wze1JR5ZsP', 100000)

我们需要把零钱寄到你的地址

txb.addOutput('1cMh228HTCiwS8ZsaakH8A8wze1JR5ZsP', 398130)

剩下的就是矿工费了。您可以使用online services来估计理想的费用。
(in)500000 Satoshis - (out)100000 - (out)398130 = (fee)1870
现在我们需要对交易进行签名,以确认您拥有输入地址

var yourAddressPrivateKeyWIF = 'L1uyy5qTuGrVXrmrsvHWHgVzW9kKdrp27wBC7Vs6nZDTF2BRUVwy'
var yourAddresskeyPair = bitcoin.ECPair.fromWIF(yourAddressPrivateKeyWIF)
txb.sign(0, yourAddresskeyPair)

如果你运行yourAddresskeyPair.getAdress(),输出应该是你的地址1G4iprWu7Q8tNbQLA8UBM2GearcnzwFrxM
现在您可以将您的交易发送到网络。获取十六进制格式的原始交易:

txb.build().toHex()

将结果粘贴在这里https://blockchain.info/pushtx或在这里检查其他解决方案:https://github.com/bitcoinjs/bitcoinjs-lib/issues/839

ygya80vv

ygya80vv4#

妻子

首先了解什么是wif格式。

输入

从github我们有:
Transaction.prototype.addInput = function (hash, index, sequence, scriptSig)
所以你必须传递交易的哈希和索引(输出将是你的输入),你应该检查什么是比特币tx

密钥对

没有验证,但可能keyPair是你的Pk和pk。

签名

也请验证,因为我没有,但逻辑上tx.sign(index, keyPair)应该签署的tx(SIGHASH_ALL)的输入index与私钥在keyPair。如果您有多个输入,当然您必须为每个输入提供一个签名。看看掌握比特币

相关问题