Bitcoin Core : Vérification manuelle d'un P2WSH
- Pour sécuriser les transactions en Bitcoin, il est possible de vérifier manuellement un type particulier de transaction appelé P2WSH.
- Cette vérification permet de s'assurer que l'adresse de destination d'une transaction est bien celle à laquelle on souhaite envoyer des bitcoins.
- Cela peut sembler complexe mais c'est une étape importante pour garantir la sécurité et la fiabilité des transactions en Bitcoin.
Pour tester ma compréhension du processus de signature et de vérification, j'ai essayé de vérifier manuellement certaines transactions Bitcoin aléatoires. Malheureusement, je suis resté coincé avec une transaction P2WSH, je choisis la transaction suivante avec Hash c53b99c9fdba60fd47c6026177d3f6e1ed6d3abde8f433364619aa7d437dad26
Avec la transaction brute :
010000000001012198e5bc0860a4fcf420e2b909fce47e746357457b060c63571e12bd84fec4a70100000000ffffffff0220120a000000000017a91417b9a9afddaae527d25788bce2202563d4ab0d058784ea110000000000220020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d0400473044022014cd600863ad3c9f6802383fe814a693a77144117cf7694f63b558b8c02d801c02201c3ad9901f659742668caf770f3d7f89a3633f9ccd2bfdd6a7c6f7529fe7b43101473044022047e4ad9788da6b764e723dd71d9fe07a217e48871129a672ef2788eb0d331a7a02206107b10c23e8720df9f1e5f609c471726066c5b72c56ee774615498f8fe62e8d016952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae00000000
Je peux désérialiser ceci en :
Numéro de version TX = 00000001
Nombre d'entrées = 01
TX à partir du hachage = a7c4fe84bd121e57630c067b455763747ee4fc09b9e220f4fca46008bce59821
Index du point de sortie TX = 00000001
Script d'entrée =
Numéro de séquence = ffffffff
Nombre de sorties = 02
Valeur (base 10) = 660000
Script de sortie = a91417b9a9afddaae527d25788bce2202563d4ab0d0587
Valeur (base 10) = 1174148
Script de sortie = 0020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d
Témoin 0 0 = 00
Témoin 0 1 = 473044022014cd600863ad3c9f6802383fe814a693a77144117cf7694f63b558b8c02d801c02201c3ad9901f659742668caf770f3d7f89a3633f9ccd2 bfdd6a7c6f7529fe7b43101
Témoin 0 2 = 473044022047e4ad9788da6b764e723dd71d9fe07a217e48871129a672ef2788eb0d331a7a02206107b10c23e8720df9f1e5f609c471726066c5b72c 56ee774615498f8fe62e8d01
Témoin 0 3 = 6952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d 70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae
Temps de verrouillage = 00000000
Maintenant, j'essaie de calculer le MessageHash qui est signé :
avec:
hashPrevouts = sha256²(2198e5bc0860a4fcf420e2b909fce47e746357457b060c63571e12bd84fec4a701000000)
hashSequence = sha256²(ffffffff)
hashOutputs = sha256² (20120a0000000000a91417b9a9afddaae527d25788bce2202563d4ab0d058784ea11000000000000020701a8d401c84fb13e6baf169d59684e17 abd9fa216c8cc5b9fc63d622ff8c58d)
Version : 01000000
hashPrevouts : 65aa319c96c046e8589c758adf7441d335682d3fc76df649180c4f94a1c4a731
Séquence de hachage : 3bb13029ce7b1f559ef5e747fcac439f1455a2ec7c5f09b72290795e70665044
point de sortie : 2198e5bc0860a4fcf420e2b909fce47e746357457b060c63571e12bd84fec4a701000000
Code de script : 6952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff 01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae
valeur : 345c1d0000000000
nSéquence : ffffffff
Sorties de hachage : 58d6a86eb99a911735d2f262a9fc13fcf0f8422d75e25ba04db120f65cf573d6
nTemps de verrouillage : 00000000
soupir : 01000000
Cela me donnera le MessageHash = 8560e61d0167f784d0cdaf9d45ba0e1be752e94d30a34339d976b01e50f0e366
Mais si j'essaie de vérifier ce MessageHash avec la première signature (473044022014cd600863ad3c9f6802383fe814a693a77144117cf7694f63b558b8c02d801c02201c3ad9901f659742668caf770f3d7f89a3 633f9ccd2bfdd6a7c6f7529fe7b43101), qui a R = 14cd600863ad3c9f6802383fe814a693a77144117cf7694f63b558b8c02d801c et S = 1c3ad9901f659742668caf770f3 d7f89a3633f9ccd2bfdd6a7c6f7529fe7b431 contre l'une des 3 PubKeys du témoin 0 3, j'obtiens toujours le message « La signature n'est pas valide ».
Quelqu'un peut-il me dire où je me suis trompé ?