bitcoinjs-lib 哈希交易之多笔交易合并。

  • 转账的时候需要手动寻找每一笔未花费记录实在太费时。

  • 比特币转账需要提取或合并所有未花费的交易中的比特币,才能实现交易。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113

import * as bitcoin from 'bitcoinjs-lib';

import fetch, { Response } from 'node-fetch';



const quantitySat = 0.0001 * 1e8;

const feeSat = 0.0001 * 1e8;



(async () => {

try {

let NETWORK = bitcoin.networks.testnet;

const keyPair = bitcoin.ECPair.fromWIF(from_pvtkey, NETWORK);

const p2pkh = bitcoin.payments.p2pkh({ pubkey: keyPair.publicKey, network: NETWORK });

let from = p2pkh.address;

const utxoResponse: Response = await fetch(`https://api.blockcypher.com/v1/btc/test3/addrs/${from}`);

const json = await utxoResponse.json();

console.log(json);

let balance = json.balance;

let unspentList: Array<any> = [];

// 过滤掉已经被花费了的交易和未确认的交易,以及自己不在接收列表的交易

const txrefs = json.txrefs;

const unconfirmed_txrefs = json.unconfirmed_txrefs;

if (unconfirmed_txrefs && unconfirmed_txrefs.length > 0) {

// 要把未确认的余额给去掉

balance += json.unconfirmed_balance;

unspentList = unspentList.concat(unconfirmed_txrefs.filter((item: any) => !item.spent_by && item.tx_output_n !== -1));

}

if (txrefs.length > 0) {

unspentList = unspentList.concat(txrefs.filter((item: any) => !item.spent_by && item.tx_output_n !== -1));

}



// 构建交易对象

let txb = new bitcoin.TransactionBuilder(NETWORK);



// 批量插入未花费交易

unspentList.forEach((item: any) => txb.addInput(item.tx_hash, item.tx_output_n));

// 转出账户

txb.addOutput(to, quantitySat);

// 预留手续费

txb.addOutput(from, balance - quantitySat - feeSat);

// 批量签名,根据索引即可

unspentList.forEach((item: any, index: any) => { txb.sign(index, keyPair) });

// 序列化交易

let tx = txb.build();

console.log(tx.getHash().toString('hex'));



// 在一个测试链的节点把交易广布出去

const result = await fetch('https://api.blockcypher.com/v1/btc/test3/txs/push',{

method:'post',

headers:{'Content-Type':'application/json'},

body:JSON.stringify({tx: tx.toHex()})

});





} catch (error) {

console.error(error);

}

})();