C # BC, création et signature réussies de la transaction brute
Première fois sur stackexchange pour demander de l’aide, désolé si je fais des erreurs (l’anglais n’est pas ma langue maternelle).
J’essaie de créer une transaction brute valide sur C # avec bouncycastle et je semble coincé, incapable de trouver où est mon erreur.
Je teste sur le réseau testnet et j’ai utilisé de nombreuses sources pour m’aider, principalement celle-ci.
Pour commencer, j’ai la prochaine adresse et la clé privée
Adresse :
Clé publique hexagonale :
Wif :
Clé privée hexagonale :
je veux utiliser le 6.49689241 btc de la transaction précédente (testnet)
et renvoyez (comme test) quelques-uns au robinet
Tout d’abord, pour créer la transaction brute non signée, j’ajoute ces octets:
01000000 (numéro de version)
01 (nombre d’entrées)
(hachage tx précédent inversé)
01000000 (indice de sortie)
(script tx précédent avec sa longueur au début)
ffffffff (séquence)
02 (nombre de sorties)
496ff50200000000 (premier montant de sortie petit boutiste. Le robinet)
(premier script de sortie avec sa longueur au début)
0046c32300000000 (deuxième sortie petit montant endian. Mon adresse, pour changement)
(deuxième script avec sa longueur au début)
00000000 (heure de verrouillage)
01000000 (type de code de hachage)
Le résultat est
Je récupère ensuite le hachage de la transaction en poussant la transaction brute dans une double fonction SHA256 qui me renvoie
Ensuite, je signe avec la clé privée hexadécimale (prvkeyHex) le hachage de transaction (txHash) avec cette fonction :
Courbe X9ECParameters = SecNamedCurves.GetByName (« secp256k1 »);
ECDomainParameters dom = new ECDomainParameters (courbe.Courbe, courbe.G, courbe.N, courbe.H)
ECKeyParameters params = new (new BigInteger (1, prvkeyHex), dom);
Signataire ECDsaSigner = nouveau ECDsaSigner ();
signer.Init (vrai, paramètres);
BigInteger sig = signer.GenerateSignature (txHash);
MemoryStream ms = nouveau MemoryStream (72);
DerSequenceGenerator seq = nouveau DerSequenceGenerator (ms);
seq.AddObject (nouveau DerInteger (sig));
seq.AddObject (nouveau DerInteger (sig));
seq.Close ();
octet signature = ms.ToArray ();
Ce qui me renvoie un tableau d’octets d’une longueur maximale de 72 octets commençant par 30. Dans mon dernier test:
Je construis ensuite mon scriptSig final avec la clé publique hexadécimale et leurs longueurs qui se traduisent par
J’ai finalement construit ma transaction brute signée :
01000000 (numéro de version)
01 (nombre d’entrées)
(hachage tx précédent inversé)
01000000 (indice de sortie)
8b (longueur de scriptSig)
(scriptSig)
ffffffff (séquence)
02 (nombre de sorties)
496ff50200000000 (premier montant de sortie petit boutiste. Le robinet)
(premier script de sortie avec sa longueur au début)
0046c32300000000 (deuxième sortie petit montant endian. Mon adresse, pour changement)
(deuxième script avec sa longueur au début)
00000000 (heure de verrouillage)
Le résultat final me donne cette transaction brute signée
Mais maintenant, lorsque j’essaie d’envoyer cette transaction brute signée sur le réseau testnet par un service Web, chaque fois que j’obtiens une erreur.
au/txs/pushtx me renvoyer
« ERREUR PUSH TRANSACTION : 16 : OBLIGATOIRE-SCRIPT-VERIFY-FLAG-FAILED (SCRIPT ÉVALUÉ SANS ERREUR MAIS FINI AVEC UN ÉLÉMENT SUPÉRIEUR FAUX / VIDE) »
« Erreur lors de l’envoi de la transaction : erreur lors de l’exécution du script pour l’entrée 0 faisant référence à à 1 : le script n’a PAS été vérifié avec succès. »
idem avec tbtc.blockr.io/tx/push
Je suis loin de maîtriser le bitcoin ou le c #, j’apprends (et je veux savoir comment cela fonctionne). Est-ce que quelqu’un voit où est mon erreur?
Merci