Comment créer et dépenser un P2WSH qui verrouille des coins avec OP_CHECKLOCKTIMEVERIFY
Un utilisateur tente de créer une adresse P2WSH avec un script qui verrouille des fonds pendant un certain temps, puis de les dépenser ensuite. Après plusieurs essais en regtest, il se heurte à une erreur de validation lors de la signature de la transaction : "Witness program was passed an empty witness".
Une séquence de commandes qui bloque au moment de la signature
Dans sa démarche, il commence par générer une adresse avec bitcoin-cli -regtest -getnewaddress, puis récupère ses informations avec getaddressinfo. L'adresse obtenue est bcrt1q45rq22tegkfu4sl9tfhty6svvkyaj6q4wu43fs, avec la clé publique 0340469e0bd5cca35c04bcee20e203f8fe601b69d73793b493fe92900e620b67d8.
À partir de cette clé, il calcule le pubkeyhash ad060529794593cac3e55a6eb26a0c6589d96815, puis construit un script utilisant OP_CHECKLOCKTIMEVERIFY avec une date ciblée au 1er mars 2023, soit 1677628800. Le script final devient 048095fe63b17576a914ad060529794593cac3e55a6eb26a0c6589d9681588ac, et son hachage SHA-256 donne 5ef75077ffb6e6d533f4245d1ece3c6034ea315db818906dfb49a643e27068fb.
La commande decodescript retourne alors une sortie segwit de type witness_v0_scripthash, avec l'adresse bcrt1qtmm4qallkmnd2vl5y3w3an3uvq6w5v2ahqvfqm0mfxny8cnsdrashv8fsr. L'utilisateur y envoie ensuite 1.0 BTC sur le réseau de test, puis confirme la transaction avec des blocs générés en plus.
L'erreur renvoyée par bitcoin-cli
Il crée ensuite une nouvelle adresse de destination, définit LOCKTIME=247, OUT_AMNT="0.998", IN_TXID=3259e33b721664a5aadae575a6870d1c26750cad789925f7df0282ac1a76f75c et IN_VOUT=1, puis construit une transaction brute avec createrawtransaction. Il élabore aussi un REDEEMSCRIPT à partir du script de witness et calcule un SCRIPTPUBKEY correspondant au modèle OP_HASH160 hash160(redeemScript) OP_EQUAL.
Mais au moment d'appeler signrawtransactionwithwallet, la commande échoue d'abord avec : "Previous output scriptPubKey mismatch". Le message compare la sortie attendue 0 5ef75077ffb6e6d533f4245d1ece3c6034ea315db818906dfb49a643e27068fb à OP_HASH160 838403567aa049ada65f944d0a2a320d7b93e7ee OP_EQUAL.
En essayant ensuite de fournir scriptPubKey sous la forme du REDEEMSCRIPT, il obtient une transaction incomplète : le champ complete reste à false et l'erreur renvoyée est "Witness program was passed an empty witness". En examinant l'hexadécimal de la transaction inachevée, il remarque qu'aucune donnée de witness n'y figure, et demande s'il doit la fournir lui-même.

