Bitcoin Core - Vérification de P2WPKH à l'aide d'ECDSA
J'essaie de vérifier une entrée P2WPKH d'une transaction. Les étapes que j'ai comprises:
J'en ai fini avec la vérification du PKH avec Public dans le champ Témoin. Je suis coincé avec la vérification de la ou des signature(s) dans le champ Témoin. J'ai écrit un script Python pour vérifier la signature.
Ici, j'ai créé le msg_hash qui n'est que le wTxID, puis je vérifie à l'aide du module ECDSA Python.
Code Python :
importer hashlib depuis ecdsa importer VerifyingKey, SECP256k1, BadSignatureError # Données de transaction txid = "47e49fb45d2940fd9e7a905cb76e42b51ce1e69d7b990ea3807e56d1c4bc8cd5" version = 2 locktime = 0 vin = [
{
"txid": "e221c00ae7e0f281186aba9ba95ba82decf4ed7fb9ca44cfaa55d8a565fa718a",
"vout": 1,
"prevout": {
"scriptpubkey": "001402238ecb0e181baed0630e20c1d7792fec61ac51",
"value": 935635,
},
"sequence": 4294967293,
"witness": [
"3044022060df1324d76ab79f629fefc89649b55ff169dfcf29d14782df6df6b054a6434e022023c1f51d0799b65fea35263f4610f8872449f07a5d14190424ab51fd43e30ade01",
"025a1154b245e08df4b7e17b70a35a79889329b9a296fb26b3b7f69e46998a3e2e",
]} ]vout = [
{"scriptpubkey": "0014b89a44fbd1f9229fb3ff8c4c86d5bd7e77ef9a27", "value": 43000},
{"scriptpubkey": "00142c9bcda388592e4ecae744e326a6c19a6cfca40b", "value": 889533},
]
# Sérialiser la transaction serialized_tx = ( bytes.fromhex(vin["txid"])
+ vin["vout"].to_bytes(4, byteorder="petit") + bytes.fromhex(vin["prevout"]["scriptpubkey"]) + vin["sequence"].to_bytes(4, byteorder="petit") + vout["value"].to_bytes(8, byteorder="petit") + bytes.fromhex(vout["scriptpubkey"]) + vout["value"].to_bytes(8, byteorder="petit") + bytes.fromhex(vout["scriptpubkey"]) + locktime.to_bytes(4, byteorder="little") ) # Calculer le hachage de la transaction (msg_hash) msg_hash = hashlib.sha256(serialized_tx).digest() # Extraire la signature et la clé publique des données du témoin signature_hex = vin["witness"]
clé_publique = octets.fromhex(vin["witness"]) # Extraire les valeurs R et S de la signature r_hex = signature_hex
s_hex = signature_hex
# Créer un objet VerifyingKey verifying_key = VerifyingKey.from_string(public_key, curve=SECP256k1) # Vérifier la signature si verify_key.verify( bytes.fromhex(r_hex + s_hex), msg_hash, hashfunc=hashlib.sha256, sigdecode=bytes.fromhex, ) : print("La signature est valide ! ") else: print("La signature n'est pas valide ! ")
L'erreur qui s'affiche dans l'interpréteur est :
p2wpkh_validation.py", ligne 57, dans if verifying_key.verify( ^^^^^^^^^^^^^^^^^^^^^ File "/Users/yuvraj/python.org/v3 .11.5/lib/python3.11/site-packages/ecdsa/keys.py", ligne 685, dans verify return self.verify_digest(signature, digest, sigdecode,allow_truncate) ^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ Fichier "/Users/yuvraj/python.org/v3.11.5/lib/python3.11/site-packages/ecdsa/keys.py", ligne 735, dans verify_digest r, s = sigdecode(signature, self.pubkey .order) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError : bytes.fromhex() prend exactement un argument (2 donnés)
