Author

Topic: Signer une transaction (Read 3097 times)

legendary
Activity: 1372
Merit: 1008
1davout
August 11, 2011, 05:42:09 PM
#15
Quote
Je comprends pas vraiment votre problème mais je comprends votre douleur
Lol oui, c'est douloureux de l'hexa et de relire le code de bitcoin pendant des heures et des heures.
Mais, c'est aussi un grand plaisir de réussir à vérifier sa première transaction.
C'est clair. J'ai failli me m'évanouir de bonheur ce matin en réussissant à faire un script qui me permettait de convertir un .pem généré par openssl en clef privée checksummée importable directement par le client bitcoin Cheesy

Le coup de travailler sans s'en rendre compte sur une chaine en hexa au lieu de données binaires c'est un grand classique... Sinon y a aussi le coup du little/big endian qui m'a bien torturé Smiley

legendary
Activity: 1176
Merit: 1280
May Bitcoin be touched by his Noodly Appendage
August 11, 2011, 04:04:06 PM
#14
C'est bon! Grin
En fait dans mes fonctions de signature/vérification je Hashais les paramètres, donc quand je passais le Hash de la tx en arguement, je Hashais 2 fois (donc sha256^4)
Voilà, maintenant il suffit de nettoyer le bordel dans mon code et c'est bon

Quote
Dernière question, pourquoi tu as enlevé l'octet final de la signature? Le 01?
Un octet contenant le hashtype est concaténé à la fin de la signature.
(c.f. script.cpp:943 et https://en.bitcoin.it/wiki/OP_CHECKSIG règle 4)
Ah oui merci, promis je relirai dix fois le wiki ce soir pour retenir ces petits détails Wink

Je comprends pas vraiment votre problème mais je comprends votre douleur Cheesy
Je confirme ce que dit sirk390, c'est horrible mais quel bonheur de voir cette couleur verte synonyme de signature valide!


Un grand merci à toi sirk390! Tu apparaîtras dans les remerciements, promis!
Et dès que j'aurais implémenté tout ça tu verras que j'en ai fait bon usage Smiley
full member
Activity: 153
Merit: 100
August 11, 2011, 03:48:42 PM
#13
Quote
Dernière question, pourquoi tu as enlevé l'octet final de la signature? Le 01?
Un octet contenant le hashtype est concaténé à la fin de la signature.
(c.f. script.cpp:943 et https://en.bitcoin.it/wiki/OP_CHECKSIG règle 4)
full member
Activity: 153
Merit: 100
August 11, 2011, 03:43:48 PM
#12
Quote
Je comprends pas vraiment votre problème mais je comprends votre douleur
Lol oui, c'est douloureux de l'hexa et de relire le code de bitcoin pendant des heures et des heures.
Mais, c'est aussi un grand plaisir de réussir à vérifier sa première transaction.
legendary
Activity: 1176
Merit: 1280
May Bitcoin be touched by his Noodly Appendage
August 11, 2011, 03:38:36 PM
#11
Ah mon péché mignon, oublier de repasser d'une chaîne de caractères hexa à la valeur hexa...
Du coup j'ai le bon hash

Mais la vérification ne marche pas, bizarre
De toute façon si chez toi ça marche c'est que c'est bon, c'est juste ma fonction de vérification qui déconne

Dernière question, pourquoi tu as enlevé l'octet final de la signature? Le 01?
legendary
Activity: 1372
Merit: 1008
1davout
August 11, 2011, 03:29:42 PM
#10
Je comprends pas vraiment votre problème mais je comprends votre douleur Cheesy
full member
Activity: 153
Merit: 100
August 11, 2011, 03:25:53 PM
#9
oui oui, c'est bien sha256^2.
Pour info, le premier hash vaut 50ddacb3456b7d5eb4a9fe5954f022bfd280ac6d8f33e3c32a0a5bef32991514
legendary
Activity: 1176
Merit: 1280
May Bitcoin be touched by his Noodly Appendage
August 11, 2011, 03:22:29 PM
#8
C'est bizarre
La fonction Hash c'est bien sha256^2 non? Je viens d'essayer sha256 quand même mais ça ne marche pas non plus
full member
Activity: 153
Merit: 100
August 11, 2011, 03:17:49 PM
#7
La validation fonctionne pour moi, mais mon hash n'est pas le même:

Code:
tx: 0100000001177a1f8fdfe69a2ad022f056bf45ef8162c7c8a1672919b885308b3b16162307000000001976a9145f10ada9157add69864482ef8c99ef8787943f0488acffffffff0130c11d00000000001976a9145c3f294acb5059a968c4a35700b5432a7397002b88ac0000000001000000
Code:
hash: 17f9b587ac131d7d9a2a2f7ebd274b184eca4abc48a129e7e1411b97042ad7fd
Code:
pubkey: 04bb50e2d89a4ed70663d080659fe0ad4b9bc3e06c17a227433966cb59ceee020decddbf6e00192011648d13b1c00af770c0c1bb609d4d3a5c98a43772e0e18ef4
Code:
sig:3044022044d64dd439555d659ec6d3a530a2eb2a5747e8f29522aa87636acc33bc1a54d40220720f8f8d776b4aba6916892bd5994d0a71436d738cd106907ecec57182ee8eb1
legendary
Activity: 1176
Merit: 1280
May Bitcoin be touched by his Noodly Appendage
August 11, 2011, 03:05:48 PM
#6
Je m'étais trompé dans le montant, après correction j'ai le même message que toi

Mais la vérification fonctionne chez toi? Et tu as le même hash que moi?
Mon vérifieur me dit que
Code:
3044022044d64dd439555d659ec6d3a530a2eb2a5747e8f29522aa87636acc33bc1a54d40220720f8f8d776b4aba6916892bd5994d0a71436d738cd106907ecec57182ee8eb101
n'est pas une signature de
Code:
Hash("0100000001177a1f8fdfe69a2ad022f056bf45ef8162c7c8a1672919b885308b3b16162307000000001976a9145f10ada9157add69864482ef8c99ef8787943f0488acffffffff0130c11d00000000001976a9145c3f294acb5059a968c4a35700b5432a7397002b88ac0000000001000000")
=
14e230ca4b3d2963630bb186dee8146fcf401d0de03eccc9926cf33944ce216c
par l'adresse 19ff...
full member
Activity: 153
Merit: 100
August 11, 2011, 02:55:21 PM
#5
Pour ta transaction "a467d767729385c191d3e463ceb8a436a1c0dda9d362955909c64196db86e573" je trouve ceci:

01 00 00 00 01 17 7a 1f 8f df e6 9a 2a d0 22 f0
56 bf 45 ef 81 62 c7 c8 a1 67 29 19 b8 85 30 8b
3b 16 16 23 07 00 00 00 00 19 76 a9 14 5f 10 ad
a9 15 7a dd 69 86 44 82 ef 8c 99 ef 87 87 94 3f
04 88 ac ff ff ff ff 01 30 c1 1d 00 00 00 00 00
19 76 a9 14 5c 3f 29 4a cb 50 59 a9 68 c4 a3 57
00 b5 43 2a 73 97 00 2b 88 ac 00 00 00 00 01 00
00 00

J'ai l'impression que c'est ta "value" qui n'est pas bonne.
legendary
Activity: 1176
Merit: 1280
May Bitcoin be touched by his Noodly Appendage
August 11, 2011, 02:30:31 PM
#4
Je viens de comparer les deux scripts, je ne vois pas la différence en dehors du fait que le wiki utilise comme scriptPubkey "Pubkey OP_CHECKSIG" et la transaction que j'utilise "OP_DUP OP_HASH160 OP_VERIFY OP_CHECKSIG"
legendary
Activity: 1176
Merit: 1280
May Bitcoin be touched by his Noodly Appendage
August 11, 2011, 02:21:59 PM
#3
Ah je croyais que c'était une transaction ce code-là...
Je vais pouvoir creuser de ce côté-là
Merci pour tes infos et ta propostion, effectivement je veux bien ton code ça m'aiderait je pense
full member
Activity: 153
Merit: 100
August 11, 2011, 02:06:36 PM
#2
Salut jackjack,

Je te conseille la page du wiki sur OP_CHECKSIG: https://en.bitcoin.it/wiki/OP_CHECKSIG

Le raw dump dans la section "Code samples and raw dumps" est correct.
Il donne le raw dump de la première transaction de bitcoin.
Attention, car à l'époque on ne pushait pas encore le hash160 de la clef publique mais directement la clef publique dans le TxIn .
(e.g. "PUSH_DATA(pubkey), OP_CHECKSIG" au lieu d'aujourd'hui "OP_DUP OP_HASH160 PUSH_DATA(pubKeyHash) OP_EQUALVERIFY OP_CHECKSIG")

Il n'y a pas besoin de rajouter 0400000000000000 au début de ta transaction.
Ton début est correct mais il te manque des choses par la suite.

Si tu veux j'ai une version de vérification qui fonctionne en python.
Je peux te la fournir si tu en as besoin.

Chris
legendary
Activity: 1176
Merit: 1280
May Bitcoin be touched by his Noodly Appendage
August 11, 2011, 12:06:50 PM
#1
Bonjour
Je pense être à deux doigts de résoudre mon problème mais j'y suis pas encore et comme il est assez pointu (en tout cas pour moi) je comprendrais peut-être mieux une explication venant d'un francophone

Ce que je veux c'est signer une transaction
Je sais signer un message, je connais la syntaxe d'une transaction, ce qu'il me manque c'est le message à signer

Je sais que c'est un Hash, donc un sha256^2
Je sais que l'argument de ce Hash est la transaction modifiée, en fonction de SIGHASH

Voici la partie non sûre :
Si j'utilise SIGHASH_ALL, le message est la transaction où :
  tous les scriptSig(non encore connu encore puisque justement je les veux) sont supprimés
  à l'emplacement du scriptSig à la position n, je mets le scriptPubKey de l'input correspondant (une fois signé, j'obtiendrais alors le scriptSig pour l'input n)
  j'ajoute à la fin 01000000 car j'utilise SIGHASH_ALL

De plus, suite à une réponse de Mike sur le forum dev, j'ai lu la fonction SignatureHash qui initialise le message comme ceci : "CDataStream ss(SER_GETHASH);"
Sachant que SER_GETHASH = 4, il faudrait donc que je rajoute au début de ma transaction modifiée 0400000000000000, soit 4 en int64


Donc finalement, j'arrive à ça (j'ai pris une vraie tx pour pouvoir comparer : http://blockexplorer.com/rawtx/a467d767729385c191d3e463ceb8a436a1c0dda9d362955909c64196db86e573 ) :
Code:
04000000 or 0400000000000000 or nothing
01000000                            #version
01                                                        #1 input
177a1f8fdfe69a2ad022f056bf45ef8162c7c8a1672919b885308b3b16162307   #inverted hash of the tx
00000000                                                        #index

#old scriptpubkey instead of scriptsig
__________________________________________________________
19                                                        #length of scriptPubKey
76                                                        #OP_DUP
a9                                                        #OP_HASH160
14                                                        #length of hash
5f10ada9157add69864482ef8c99ef8787943f04    #    NOT inverted hash160 of my pubkey
88                                                        #OP_VERIFY
ac                                                        #OP_CHECKSIG
__________________________________________________________
ffffffff                                                        #sequence
01                                                        #1 output
80841e0000000000                            #value
19                                                        #length of scriptPubKey
76                                                        #OP_DUP
a9                                                        #OP_HASH160
14                                                        #length of hash
5c3f294acb5059a968c4a35700b5432a7397002b    #    NOT inverted hash160 of pubkey to which I send money
88                                                        #OP_VERIFY
ac                                                        #OP_CHECKSIG
00000000                                                        #locktime
01000000                                                        #hashtype = SIGHASH_ALL


Je sais qu'il y a des développeurs dans le coin, si vous êtes occupés postez même un mini message si ça prendrait trop de temps, j'approfondirai de mon côté
Jump to: