@@ -27,3 +27,112 @@ PSBT的编码过程包括将交易的各个部分转换成可序列化的格式
27272 . ** 反序列化数据** :解析字节流,根据PSBT的键值对结构恢复出每个部分的数据。
28283 . ** 重建交易信息** :使用解码的数据重建完整的交易视图,包括所有输入和输出的详细信息。
29294 . ** 验证和签名** :在交易数据完全恢复后,参与者可以验证交易的有效性,并在必要时添加自己的签名。
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