Partage
  • Partager sur Facebook
  • Partager sur Twitter

Je ne comprends pas ce bout de code

Sujet résolu
    18 mai 2014 à 13:36:47

    Bonjour,

    Je n'ai jamais fait de python et après quelque recherche qui mon plus ou moins éclaircie je fais appel à vous.
    import hashlib, struct
     
    ver = 2
    prev_block = "000000000000000117c80378b8da0e33559b5997f2ad55e2f7d18ec1975b9717"
    mrkl_root = "871714dcbae6c8193a2bb9b2a69fe1c0440399f38d94b3a0f1b447275a29978a"
    time_ = 0x53058b35 # 2014-02-20 04:57:25
    bits = 0x19015f53
     
    # https://en.bitcoin.it/wiki/Difficulty
    exp = bits >> 24 // Que signifie ">>" ? Strictement supérieur ?
    mant = bits & 0xffffff // Que signifie "&" ? Une concaténation ? 
    target_hexstr = '%064x' % (mant * (1<<(8*(exp - 3)))) // Le "%" est le modulo mathématique ? target_str = target_hexstr.decode('hex') nonce = 0 while nonce < 0x100000000: header = ( struct.pack("<L", ver) + prev_block.decode('hex')[::-1] + // Que signifie [::-1] ? J'ai vue quelque chose de similaire pour sélectionner des lettres dans une chaines de caractères mais la je n'arrive pas à faire le rapprochement.
    mrkl_root.decode('hex')[::-1] + struct.pack("<LLL", time_, bits, nonce)) hash = hashlib.sha256(hashlib.sha256(header).digest()).digest() print nonce, hash[::-1].encode('hex') if hash[::-1] < target_str: // toujours ce fameux [::-1]
    print 'success' break nonce += 1

     J'espère être au plus clair et je vous prie d'excuser mon noobisme

    -
    Edité par Subtill 18 mai 2014 à 13:38:21

    • Partager sur Facebook
    • Partager sur Twitter
      18 mai 2014 à 17:48:19

      Pour ce a qui ça intéresse, voici ma version pour mieux comprendre :

      import hashlib, struct, binascii
       
      ver = 2
      prev_block = "000000000000000117c80378b8da0e33559b5997f2ad55e2f7d18ec1975b9717"
      mrkl_root = "871714dcbae6c8193a2bb9b2a69fe1c0440399f38d94b3a0f1b447275a29978a"
      time_ = 0x53058b35 # 2014-02-20 04:57:25
      bits = 0x19015f53
       
      # https://en.bitcoin.it/wiki/Difficulty
      exp = bits >> 24
      mant = bits & 0xffffff
      target_hexstr = '%064x' % (mant * (1<<(8*(exp - 3))))
      target_str = target_hexstr.decode('hex')
       
      nonce = 856192328
      
      pack1 = struct.pack("<L", ver)
      pack2 = struct.pack("<LLL", time_, bits, nonce)
      
      print 'Le bloc 286819 a ete mine avec les parametres suivant :'
      print 'Version :', binascii.hexlify(pack1)
      print 'Hash du bloc precedent :', prev_block
      print 'Hash de la racine de Merkle du bloc', mrkl_root
      print 'Le timestamp', '1392872245 secondes, correspondant a la duree en seconde depuis le 1er janvier 1970 00:00'
      print 'Le bits', '419520339'
      print 'Le nonce \"gagnant\"', '856192328'
      
      header = ( struct.pack("<L", ver) + prev_block.decode('hex')[::-1] +
      mrkl_root.decode('hex')[::-1] + struct.pack("<LLL", time_, bits, nonce))
      print 'Voici l\'en tete CORRECT du bloc lisible en hexa', binascii.hexlify(pack1), binascii.hexlify(prev_block.decode('hex')[::-1]), binascii.hexlify(mrkl_root.decode('hex')[::-1]),binascii.hexlify(pack2)
      hash = hashlib.sha256(hashlib.sha256(header).digest()).digest()
      print 'Si le hash est inferieur a cette difficulte', target_hexstr
      if hash[::-1] < target_str:
      	print nonce, hash[::-1].encode('hex')
      
      """print 'struct.pack(\"<L\", ver)', binascii.hexlify(pack1)
      print 'prev_block', prev_block
      print 'mrkl_root', mrkl_root
      print 'struct.pack(\"<LLL\", time_, bits, nonce)', binascii.hexlify(pack2), struct.unpack("<LLL", pack2)"""

       Du coup j'ai quasiment tout compris il me manque plus que sa x)

      exp = bits >> 24 // Que signifie ">>" ? Strictement supérieur ?
      mant = bits & 0xffffff // Que signifie "&" ? Une concaténation ? <br>
      target_hexstr = '%064x' % (mant * (1<<(8*(exp - 3)))) // Le "%" est le modulo mathématique ?
      Si une âme charitable voudrais bien passer par là ... ;)
      • Partager sur Facebook
      • Partager sur Twitter
        19 mai 2014 à 9:07:02

        bits >> 24
        

        Le nombre entier contenu dans la variable bits est décalé de 24 bits vers la droite. En gros, il est divisé par 2^24.

        bits & 0xffffff
        

        On applique le masque 0xffffff à la variable bits avec l'operateur ET bit à bit. 0xffffff est un nombre entier de 3 octets dont tous les bits sont à 1. Cela aura pour effet de limiter mant à 3 octets : on ne garde que les 24 premiers bits de la variable bits.

        Enfin, l'operateur % sur une chaîne de caractères est un operateur de formatage. Ici, il sert à dire que l'on veut que la valeur (à droite) soit convertie en une chaîne de caractères qui la représente comme un nombre hexadécimal de 64 chiffres, quitte à le compléter en ajoutant des 0 à gauche.

        -
        Edité par nohar 19 mai 2014 à 9:12:00

        • Partager sur Facebook
        • Partager sur Twitter
        Zeste de Savoir, le site qui en a dans le citron !
          19 mai 2014 à 12:40:15

          nohar a écrit:

          bits >> 24 

          Le nombre entier contenu dans la variable bits est décalé de 24 bits vers la droite. En gros, il est divisé par 224.

          bits & 0xffffff 

          On applique le masque 0xffffff à la variable bits avec l'operateur ET bit à bit. 0xffffff est un nombre entier de 3 octets dont tous les bits sont à 1. Cela aura pour effet de limiter mant à 3 octets : on ne garde que les 24 premiers bits de la variable bits.

          Enfin, l'operateur % sur une chaîne de caractères est un operateur de formatage. Ici, il sert à dire que l'on veut que la valeur (à droite) soit convertie en une chaîne de caractères qui la représente comme un nombre hexadécimal de 64 chiffres, quitte à le compléter en ajoutant des 0 à gauche.

          -
          Edité par nohar il y a environ 3 heures

          Super explication ! Je te remercie :)

          • Partager sur Facebook
          • Partager sur Twitter

          Je ne comprends pas ce bout de code

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown