Skip to content

Commit d4e6f6e

Browse files
committed
feature: encode & decode example
1 parent 7f4352f commit d4e6f6e

File tree

1 file changed

+109
-0
lines changed

1 file changed

+109
-0
lines changed

BTC/Psbt/encode.md

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,112 @@ PSBT的编码过程包括将交易的各个部分转换成可序列化的格式
2727
2. **反序列化数据**:解析字节流,根据PSBT的键值对结构恢复出每个部分的数据。
2828
3. **重建交易信息**:使用解码的数据重建完整的交易视图,包括所有输入和输出的详细信息。
2929
4. **验证和签名**:在交易数据完全恢复后,参与者可以验证交易的有效性,并在必要时添加自己的签名。
30+
31+
## PSBT 创建
32+
以下是一个使用JavaScript和`bitcoinjs-lib`库来处理PSBT(Partially Signed Bitcoin Transaction)的基本示例。这个例子展示了如何创建一个PSBT,添加输入和输出,进行签名,并最终导出为可以广播的比特币交易。
33+
34+
### 环境设置
35+
36+
首先,你需要确保已经安装了`bitcoinjs-lib`。如果尚未安装,可以通过npm进行安装:
37+
38+
```bash
39+
npm install bitcoinjs-lib
40+
```
41+
42+
### 创建和签名PSBT的案例
43+
44+
```javascript
45+
const bitcoin = require('bitcoinjs-lib');
46+
47+
// 设置网络,这里以比特币测试网为例
48+
const network = bitcoin.networks.testnet;
49+
50+
// 创建一个新的比特币密钥对
51+
const keyPair = bitcoin.ECPair.makeRandom({ network: network });
52+
const { address } = bitcoin.payments.p2pkh({ pubkey: keyPair.publicKey, network: network });
53+
54+
console.log(`New address: ${address}`);
55+
56+
// 创建一个新的PSBT
57+
let psbt = new bitcoin.Psbt({ network: network });
58+
59+
// 假设这是UTXO的详细信息,你需要从区块链或钱包获取这些信息
60+
const utxo = {
61+
hash: 'transaction-hash-of-utxo-here', // 事务哈希
62+
index: 0, // 输出索引
63+
value: 100000 // Satoshis
64+
};
65+
66+
// 添加输入,这里假设UTXO已经知道
67+
psbt.addInput({
68+
hash: utxo.hash,
69+
index: utxo.index,
70+
nonWitnessUtxo: Buffer.from('raw-transaction-hex-here', 'hex')
71+
});
72+
73+
// 添加输出,指定接收地址和金额(satoshis)
74+
psbt.addOutput({
75+
address: 'recipient-address-here',
76+
value: 90000 // 减去手续费
77+
});
78+
79+
// 对PSBT进行签名
80+
psbt.signInput(0, keyPair);
81+
82+
// 验证签名是否正确
83+
psbt.validateSignaturesOfInput(0);
84+
85+
// 最终确认PSBT
86+
psbt.finalizeAllInputs();
87+
88+
// 导出可以广播的交易
89+
const tx = psbt.extractTransaction().toHex();
90+
91+
console.log(`Transaction ready to be broadcasted: ${tx}`);
92+
```
93+
94+
### 解释
95+
96+
1. **初始化**:首先创建一个比特币网络的环境,并生成一个新的密钥对和地址。
97+
2. **创建PSBT**:实例化一个PSBT对象,为添加输入和输出做准备。
98+
3. **添加输入**:添加一个UTXO作为输入。这通常需要事务的原始数据,这里使用`nonWitnessUtxo`字段传入原始交易的hex字符串。
99+
4. **添加输出**:添加一个输出,指定收款地址和金额。
100+
5. **签名**:使用私钥对输入进行签名。
101+
6. **验证签名**:验证输入的签名是否有效。
102+
7. **完成PSBT**:完成所有输入,锁定PSBT,使之准备好转换为最终的交易格式。
103+
8. **导出交易**:将PSBT转换为一个标准的比特币交易,并将其转换为hex格式,准备广播到网络。
104+
105+
106+
## PSBT 解析
107+
要解析PSBT(Partially Signed Bitcoin Transaction)并查看其详细内容,你可以使用`bitcoinjs-lib`库在JavaScript环境中执行这一任务。下面的示例将展示如何读取一个PSBT,解析其内容,以及如何查看关键信息,如输入和输出详情。
108+
109+
### 示例:解析PSBT
110+
111+
```javascript
112+
const bitcoin = require('bitcoinjs-lib');
113+
114+
// 假设这是一个已经存在的PSBT的Base64编码字符串
115+
const psbtBase64 = 'cHNidP8BAHECAAAAAZtuEiavDmeZR6WUjIhjFbkFh7m+yywCfHlni6uTrgH/////AZD+GwAAAAAAF6kU9BeD5tGIzjL0VzU3+kEUNw+HME3/////8C0wbdQAAAAAAF6kUAAAAAAAAiACATWsYQSE/C85hv5jZVDezl0l4AAAAAAAEBKxAnAAAAAAAAFgAUjVv8Fy0Qdk84W/oBhiMllC+HIHg=';
116+
117+
// 将Base64编码的PSBT解码
118+
const psbt = bitcoin.Psbt.fromBase64(psbtBase64);
119+
120+
// 遍历PSBT的输入和输出
121+
psbt.data.inputs.forEach((input, index) => {
122+
console.log(`Input ${index}:`);
123+
console.log(input);
124+
});
125+
126+
psbt.data.outputs.forEach((output, index) => {
127+
console.log(`Output ${index}:`);
128+
console.log(output);
129+
});
130+
131+
// 如果需要更详细地查看某个特定的输入或输出,可以根据实际需要提取更多信息
132+
```
133+
134+
### 解释
135+
136+
1. **解码PSBT**:首先使用`bitcoinjs-lib``Psbt.fromBase64`方法将Base64编码的PSBT字符串解码成一个PSBT对象。
137+
2. **遍历输入和输出**:通过访问`psbt.data.inputs``psbt.data.outputs`数组,可以查看每个输入和输出的详细信息。这包括UTXO信息、脚本、签名等。
138+
3. **打印信息**:在控制台打印每个输入和输出的详细信息,这有助于开发者理解和调试PSBT。

0 commit comments

Comments
 (0)