Bitcoin-Core-Development
如何使用 bitcore-lib(或任何其他 js lib)將地址添加到 CheckLockTimeValue (CLTV) 事務輸出
我正在使用bitcore-lib創建事務。我可以將帶有 CLTV 的輸出添加到交易中,但無法為其添加輸出地址。這是我的程式碼(打字稿/節點):
const lockScript = Script.empty() .add(blockAsBuffer) .add(177) // OP_CLTV .add(117) // OP_DROP .add(Script.buildPublicKeyHashOut(this.privateKeyAddress)); const transaction = new Transaction(); transaction.from(unspentOutputs); // Following is where I'm adding the CLTV but can't add an output address transaction.addOutput(new Transaction.Output({ script: lockScript, satoshis: satoshisToLock })); transaction.change(this.privateKeyAddress); transaction.fee(feeInSatoshis); transaction.sign(this.privateKey);
使用上面的程式碼,交易輸出如下所示。請注意,CLTV 輸出沒有附加地址。有沒有辦法使用 bitcore-lib(或任何其他 javascript lib)向該輸出添加地址?
... { "value": 0.00001, "n": 2, "scriptPubKey": { "asm": "1658883 OP_CHECKLOCKTIMEVERIFY OP_DROP OP_DUP OP_HASH160 89605b86b7ad185ebc10fe457b98776838972cf0 OP_EQUALVERIFY OP_CHECKSIG", "hex": "0403501900b17576a91489605b86b7ad185ebc10fe457b98776838972cf088ac", "type": "nonstandard" } }, ...
如果您對我為什麼要這樣做感到好奇,請參閱我之前提出的問題:使用 CLTV 是否可以在一次交易中凍結錢包中的一些資金並使其可用?
您將腳本直接放在 scriptPubKey 中。這既不鼓勵、不標準且難以使用,因為您已經註意到沒有相應的地址。
比特幣中只定義了三種類型的地址(普遍接受):base58 編碼的 P2PKH 地址(1…)、base58 編碼的 P2SH 地址(3…)和 bech32 編碼的本機 segwit 地址(bc1. ..)。除非您要建構的輸出具有與其中之一相對應的結構,否則根本不存在任何地址。
這是有充分理由的:當你給別人一個地址來付錢給你時,他們不知道你想如何保護你的硬幣。隨著您要使用的策略變得越來越複雜,發送到越來越複雜的腳本也需要他們支付越來越多的費用。這很奇怪:是您關心該政策,因此您應該為此付費。
使用 P2SH(以及後來的 P2WSH),腳本不再放在輸出本身中。相反,腳本的散列被放入輸出中,並且接收者在花費輸出時會顯示實際腳本是什麼並滿足它。
因此,您可能希望通過閱讀如何建構 P2SH/P2WSH 輸出(分別參見 BIP16 和 BIP141)手動執行此操作,或者弄清楚您使用的庫如何讓您自動建構此類輸出。