Dans le protocole Bitcoin, 2016 est un numéro très spécial. La «difficulté» de trouver un hachage pour créer un nouveau bloc est ajustée tous les 2 016 blocs pour changer approximativement une fois toutes les deux semaines.
Ce nombre a été choisi parce que la difficulté s'ajuste pour que chaque bloc prenne environ 10 minutes à trouver, et en deux semaines, il y a 2 × 7 × 24 × 6 = 2 016 périodes de dix minutes.
Pour commémorer cette coïncidence numérique, le problème du Nouvel An de cette année concerne le Bitcoin - en particulier, l'algorithme de hachage qu'il utilise pour signer les blocs, SHA-256.
Votre tâche consiste à créer un programme qui prendra des octets en entrée (au moins en ASCII) et produira un nonce en octets (au format de votre choix) qui produira un hachage SHA-256 contenant 2016
dans sa représentation base64 lorsqu'il sera ajouté à l'original entrée octet.
Voici quelques exemples de solutions valables, gracieuseté des moteurs que les gens ont déjà générés, ainsi que des hachages qu'ils ont produits:
> foo
Nonce: 196870
SHA256 hash: OCUdDDtQ42wUlKz2016x+NROo8P2lbJf8F4yCKedTLE=
> bar
Nonce: 48230
SHA256 hash: CNcaOCQgT7bnlQzQPXNwuBu8/LYEdk2016khRaROyZk=
> happynewyear
Nonce: 1740131
SHA256 hash: XsKke6z2016BzB+wRNCm53LKJ6TW6ir66GwuC8oz1nQ=
> 2016
Nonce: 494069
SHA256 hash: rWAHW2YFhHCr22016zw+Sog6aW76eImgO5Lh72u6o5s=
(note: the nonces don't actually have to be ASCII numbers; you can do
any byte input you find convenient.)
La seule bibliothèque prédéfinie (autre que les fonctions d'entrée et de sortie standard) que votre programme peut utiliser est une SHA256(bytes)
fonction qui accepte des octets et renvoie un hachage SHA256, dans n'importe quel format, y compris base64.
Le programme pour ce faire dans le moins d'octets de code source gagne.