第174页
A 类 BIP174 投资促进局 兼容部分交易编码库.
比特币用户,使用比特币js-lib的Psbt类.
这个库是分开的,试图将比特币特定逻辑与编码格式区分开来.
如果图书馆很难使用,我道歉。 从“ 部分签名的 BITCOIN 交易” 格式中删除比特币特定逻辑有点困难 .
涵盖的责任
- 创建者:您可以创建一个新的 psbt 并添加输入和输出,然后使用每个单个方法在输入中添加额外信息. (注: Psbt. from Transaction 可以从序列化交易中创建一个PSBT,但所有的脚本Sigs和目击Stacks必须是空的, 交易中不应有鼠标和旗字节。)
- 更新器:您可以添加所有类型的输入和输出信息之一. 每个功能在运行时都有严格的类型检查.
- 组合器:使用 Psbt.combine(. Psbt[]),它会做一个愚蠢的合并,从后续的PSBT中将所有新的密钥值对集合到自己中去. 电话打来
combine拥有最高优先权.
未涵盖的责任
为了尽可能地将这个图书馆与比特币逻辑区分开来,这个图书馆不会执行以下职责. 但是,在这条路上,比特币(Bitcoinjs-lib)将采用这一类,并在内部扩展,以允许以下内容:
- 签名人:这门课没有办法签字. 您可以添加部分西格对象 .
- 提取器 : 这个类对比特币交易知之甚少,所以从一个PSBT创建一个完整的交易必须用比特币意识扩展类来完成.
- 输入定稿 : 这个类,同样地,对一个输入是否完成一无所知.
静态方法和添加输入/ 添加输出需要一个抽象的交易对象
- 静态方法: 必须通过
TransactionFromBuffer键入函数。 见ts_src/lib/interfaces.ts用于信息Transaction接口和TransactionFromBuffer函数. - 添加输入/输出方法: 构造器需要一个
Transaction抽象界面, 将使用添加输入/ 添加输出方法.
示例
const { Psbt } = require('bip174')
const { PsbtTransaction , pTxFromBuffer } = require('./someImplementation')
// Psbt requires a Transaction interface to create an instance, as well as
// A function that turns a buffer into that interface. See Transaction and TransactionFromBuffer
// in ts_src/lib/interfaces.ts ...
// See tests/utils/txTools file for an example of a simple Bitcoin Transaction.
// Also see BitcoinJS-lib for an extended class that uses the Transaction class internally.
// Anyone using this library for Bitcoin specifically should use bitcoinjs-lib
// Your PsbtTransaction will have a toBuffer function to allow for serialization
const tx = pTxFromBuffer(someTransactionBuffer);
const psbt = new Psbt(tx)
// OR
// This will parse the PSBT, and use the function you pass to parse the Transaction part
// the function should throw if the scriptSig section is not empty
const psbt = Psbt.fromBuffer(somePsbtBuffer, pTxFromBuffer)
psbt.addInput({
hash: '865dce988413971fd812d0e81a3395ed916a87ea533e1a16c0f4e15df96fa7d4',
index: 3,
})
psbt.addInput({
hash: 'ff5dce988413971fd812d0e81a3395ed916a87ea533e1a16c0f4e15df96fa7d4',
index: 1,
})
psbt.addOutput({
script: Buffer.from(
'a914e18870f2c297fbfca54c5c6f645c7745a5b66eda87',
'hex',
),
value: 1234567890,
})
psbt.addOutput({
script: Buffer.from(
'a914e18870f2c297fbfca54c5c6f645c7745a5b66eda87',
'hex',
),
value: 987654321,
})
psbt.addRedeemScriptToInput(0, Buffer.from(
'00208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903',
'hex',
))
psbt.addWitnessScriptToInput(0, Buffer.from(
'522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b9903' +
'0b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e861519268' +
'60221f0e7352ae',
'hex',
))
psbt.addBip32DerivationToInput(0, {
masterFingerprint: Buffer.from('d90c6a4f', 'hex'),
pubkey: Buffer.from(
'023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e73',
'hex',
),
path: "m/0'/0'/3'",
})
psbt.addBip32DerivationToInput(0, {
masterFingerprint: Buffer.from('d90c6a4f', 'hex'),
pubkey: Buffer.from(
'03089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc',
'hex',
),
path: "m/0'/0'/2'",
})
const b64 = psbt.toBase64();
