Bitcoin-Core-Development

如何使用 bitcore-lib(或任何其他 js lib)將地址添加到 CheckLockTimeValue (CLTV) 事務輸出

  • January 13, 2020

我正在使用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)手動執行此操作,或者弄清楚您使用的庫如何讓您自動建構此類輸出。

引用自:https://bitcoin.stackexchange.com/questions/92751