Comment enregistrer un message éternel dans la Blockchain

 

Cette page explique comment laisser un court texte personnel dans la Blockchain, un message qui y restera tant que le Bitcoin existera, qu’il ne sera jamais possible de modifier, et qui sera lisible par quiconque connaît une des adresses Bitcoin qui a été utilisée dans la transaction.

À quoi cela sert-il et pourquoi ? Ceci est expliqué à la fin de cette page.

Ce chapitre n’est pas vraiment adaptée pour les débutants qui débutent à partir du commencement. Pour le néophyte, il est conseillé de s’habituer d’abord au Bitcoin, les autres chapitres de ce tutoriel sont fait pour ça.

Brève explication technique

Le mieux c’est d’aller observer le contenu de la Blockchain, en particulier cette transaction : 996b4.......feb15f

On voit au milieu de la page le texte bitcoin.wikeo.net ! Là, comme par hasard, c’est l’URL de ce tutoriel. Mais cela aurait pu être n’importe quel texte, une date de naissance, le prénom de son amant, un code secret, etc. Ce texte, limité à 80 caractères, est contenu dans un champ optionnel de la transaction nommé OP_RETURN. Voici la procédure à suivre pour obtenir ce genre d’inscription dans la Blockchain Bitcoin.

Conditions préalables

Bien sûr il faut savoir ce qu’est le Bitcoin et avoir fait quelques manipulations de base, en particulier créer un nouveau porte-monnaie papier. Ici, on va créer une transaction bitcoin, c’est-à-dire un transfert de bitcoins d’un portefeuille à un autre. Il faut donc un porte-monnaie expéditeur approvisionné dont on connaît la clé privée, l’idéal c’est donc un porte-monnaie papier. Il faut un porte monnaie destinataire, il suffit de connaître son adresse publique.

Du point de vu matériel il faut 2 ordinateurs, ou tablette (ergonomiquement c’est plus compliqué avec un smartphone). L’un est connecté à internet, et il contient au moins un antivirus. L’autre n’est pas connecté, il va temporairement manipuler la clé privée. Et il faut une clé USB vierge pour transporter, entre autre, des transactions codées d’un ordinateur à l’autre.

On peut faire cette manipulation avec un seul ordinateur connecté à internet. Il faudra le déconnecter au moment opportun. Mais là le risque est de se faire subtiliser sa clé privée par un malware machiavélique, et donc de perdre tout ses bitcoins contenus dans le porte-monnaie expéditeur.

Comment ça va se passer

Résumé en 5 étapes

0 - On prépare l’ordinateur déconnecté avec une page web hors ligne et la clé privée. Cette opération n’est à effectuer qu’une seule fois si on veut répéter l’opération.

1 - Avec l’ordinateur connecté on génère manuellement une transaction de transfert de bitcoins. Cela va produire un BLOB non crypté.

2 - Avec l’ordinateur déconnecté on va signer la transaction avec la clé privée. Cela va produire un BLOB crypté.

3 - Ce BLOB crypté va être envoyé sur le réseau Bitcoin depuis l’ordinateur connecté.

4 - Le résultat est finalement vérifié dans la Blockchain.

Pour les padawans :    BLOB = Binary Large OBject = grand objet binaire = agrégat de données spécifiquement assemblées pour un usage particulier par un système informatique. Ici en particulier un BLOB est une Transaction Bitcoin. On va voir visuellement à quoi ça ressemble un peu plus loin.

Il n’y a pas de danger de risque à faire les manipulations suivantes jusqu’à une phase irréversible qui sera signalée en rouge dans le texte. Même si on pense avoir fait une bêtise, tant que cette étape irrévocable n’est pas atteinte, il est toujours temps d’arrêter.

Voici donc en détail les 5 étapes.


Préparation de l’ordinateur déconnecté

Ce PC, même s’il n’est pas connecté au web, doit quand même avoir un navigateur internet comme par exemple Edge, IE, Chrome, Firefox, Safari ou Opéra, car il va ouvrir une page web. Cette page va d’abord être téléchargée depuis l’ordinateur connecté. Il faut aussi que ce PC soit capable d’extraire le contenu d’un fichier ZIP.

Donc sur l’ordinateur connecté on branche la clé USB. L’idéal c’est de la formater, puis de vérifier ensuite avec l’antivirus qu’elle ne contient pas un malware ou autres virus.

Ensuite il faut se rendre sur ce site : https://coinb.in/

En bas de la page il y a ce texte :

Traduction : Cette page utilise le langage javascript pour générer vos adresses et signer vos transactions dans le navigateur internet, cela signifie que nous ne recevons jamais vos clés privées. Cela peut être vérifié dans le code source disponible sur github. Vous pouvez aussi télécharger cette page pour l’héberger vous même, ou bien l’exécuter hors ligne !

Dans ce texte, on clique sur le mot download en bleu, ce qui déclenche immédiatement le téléchargement du fichier nommé  coinbin-master.zip . Il faut copier ce fichier dans la clé USB.

Il faut penser aussi à récupérer, depuis un endroit sécurisé, la Clé Privée du porte-monnaie papier d’où vont être expédiés les bitcoins. À moins qu’elle ne soit déjà stockée dans l’ordinateur hors ligne. Il faut que cette clé privée soit au format texte, ça ne marchera pas avec son QR Code. Et il faudra utiliser la clé privée WIF, de 58 caractères, qui commence par un ‘5

Après une 2ème vérification à l’antivirus de la clé USB, celle ci doit être déconnectée puis branchée sur l’ordinateur hors-ligne. Le, ou les, fichiers sont transférés de la clé USB vers un répertoire au choix de l’utilisateur, par exemple sur le Bureau si c’est un ordinateur Windows. On efface le contenu de la clé USB et on la débranche.

Le fichier coinbin-master.zip , disponible donc sur le Bureau par exemple, doit être dézippé. On devrait obtenir un dossier qui ressemble à ceci :

On double-clique sur le fichier index. Cela devrait lancer le navigateur et afficher exactement la même page web que celle du site coinb.in affichée sur l’ordinateur connecté.

Il faut aussi préparer l’édition de la Clé Privée pour un prochain Copier / Coller, c’est-à-dire l’afficher par exemple dans un simple éditeur de texte du genre Notepad.

L’ordinateur hors-ligne est prêt.


1 - Génération de la transaction

Sur l’ordinateur connecté au web on branche la clé USB et on affiche son contenu vide. Il faut créer dans la clé un nouveau fichier texte (blob.txt, par exemple, son nom n’a pas d’importance) et ouvrir ce fichier prêt à être édité. Il contiendra un BLOB.

Cet ordinateur affiche toujours en principe la page du site coinb.in dans un onglet du navigateur. Il faut d’abord préparer le texte qui va être introduit dans le champ OP_RETURN de la transaction. Ce texte doit y être introduit en hexadécimal. Pour cela on se rend sur un site qui fait la conversion, il y en a des dizaines sur le net, il suffit de chercher “conversion ascii hexa”. Par exemple celui ci convient :  convertisseur. Il faut l’ouvrir dans un autre onglet du navigateur.

Le texte en clair est saisie dans la première zone, par exemple bitcoin.wikeo.net. Pas plus de 80 caractères. On clique sur Convert, on sélectionne la case à cocher Remove Ox, et on a le résultat dans la 2ème zone Hex. On devrait voir quelque chose comme ça :

Les données hexadécimales 626974….6e6574 sont la conversion du texte bitcoin.wikeo.net, on va les copier / coller dans quelques minutes, donc on ne ferme pas cet onglet.

Il faut avoir maintenant sous le coude les adresses publiques des porte-monnaies expéditeur et destinataire. On peut les afficher dans l’explorateur de Blockchain dans 2 autres onglets. Par exemples :

Porte monnaie papier débité = 1threeMZBY54gAvwNZff3Bkkhh3F8EHLN

Porte monnaie destinataire crédité = 1DidierzaS6T8Jsy398PpE2QXffd4LStyP

Les deux adresses ne vont pas tarder également à être copiées / collées. On peut en profiter pour vérifier le montant disponible dans le porte-monnaie débité.

Nota : le porte-monnaie destinataire peut ne pas être présent dans la Blockchain, dans ce cas il y sera rajouté. L’utilisateur sait ce qu’il fait !

Maintenant on revient à l’onglet du site coinb.in. En haut de la page il y a un menu :

On va se servir des 4 options New, Verify, Sign et Broadcast dans les deux ordinateurs, à différentes étapes. Maintenant il faut sélectionner le menu New puis Transaction.

On affiche un formulaire. Dans la zone Address, WIF key or Redeem Script coller l’adresse publique du porte-monnaie papier débiteur. Cliquer sur Load à droite de l'adresse.

Cliquer sur Advanced Options, puis sélectionner la case à cocher

Allow data to be sent….. by using OP_RETURN.

Le haut de la page devrait afficher quelque chose comme ça.

Le texte Retrieved unspent inputs…. signifie que le porte-monnaie expéditeur a été trouvé dans la Blockchain et que des bitcoins sont disponibles.

Plus bas dans la page cliquez 2 fois sur le signe + (coté droite, en dessous de Donate!).

Trois champs Address sont alors disponibles.

Dans le 1er coller à nouveau l’adresse publique du porte-monnaie papier débiteur.

Dans le 2ème coller l’adresse publique du porte-monnaie destinataire.

Dans le 3ème coller les données hexadécimales du texte converti en hexadécimal, il faut faire un copier / coller à partir du site de conversion ascii/hexa.

En bas de la page on voit ceci :

Maintenant il faut faire un peu de calcul pour remplir les zone Amount et Transaction Fee (Montant et frais). Saisir des valeurs faibles dans les 2 zones Amount, par exemple 0.1 et 0.1

La 3ème zone en face du texte hexadécimal restera toujours à 0.00.

Pour les frais en cliquant sur le ? on a la valeur de ce qu’il faudrait saisir :

Cliquer sur Page Précédente [  ] du navigateur.

Là le montant des frais proposé 0,00001122 BTC est vraiment très faible ! Cela correspondait à 0,06 € en septembre 2018. Avec ce montant il a fallu attendre plusieurs jours pour avoir la confirmation de cette transaction.

Le site Bitcoin Fee Calculator & Estimator , en anglais, donne une approximation des frais plus proche de la réalité. Il ne faut pas hésiter à en rajouter. Par exemple un montant de 0,5 €, converti en bitcoin, est une valeur très élevée qui permettra d’avoir une confirmation rapidement.

Ensuite il faut se décider sur le montant qui va être envoyé à l’un des portes-monnaie, 0.00024718 BTC dans l’exemple. Puis remplir le montant adéquat du 2ème porte-monnaie jusqu’à l’obtention des frais choisis, le champ Transaction Fee va se remplir automatiquement.

Et finalement il faut que le montant initial, visible entre parenthèses sur l’onglet Inputs, soit égal à la somme Adresse nr1 + Adresse nr2 + Fees, dans l’exemple ça donne ceci :

 0,4882584 = 0,4880 + 0,00024718 + 0,00001122

SURTOUT la grosse erreur à éviter c’est quelque chose comme ça :

On rempli l’adresse expéditeur en haut, destinataire en-dessous, et montant à droite. Le programme a rempli automatiquement la zone Transaction Fee. Dans ce cas la monnaie rendue va partir dans les frais, et le portefeuille papier expéditeur va se retrouver vide !  Il ne faut pas supposer que la monnaie va être remise automatiquement au débiteur. Il faut bien rajouter une zone Address qui permet de spécifier où va la monnaie, là elle retourne dans le porte-monnaie expéditeur. Pour bien comprendre on peut lire, ou mieux exécuter, un paiement avec Mycelium à partir d’un porte-monnaie papier.

Une dernière chose avant l’étape suivante : la monnaie de 0,488 BTC dans l’exemple n’est pas obligatoirement renvoyée dans le porte-monnaie expéditeur. Ça peut être un autre porte-monnaie indépendant.

Là on re-vérifie tout, les adresses, les montants, le texte converti en hexa. Il ne faut pas qu’il y ait de texte ou de zone en rouge dans le formulaire, c’est signe d’une erreur. Par exemple on a mis une virgule au lieu du point comme séparateur décimal, ou bien un espace s’est rajouté à la fin d’une adresse après un copier /coller.

Bien re-vérifier que l’addition des 3 montants

1ère Adresse  +  2ème Adresse  +  Fee

correspond au montant de l’adresse du porte-monnaie expéditeur

Vérifier aussi que le montant des Fees, converti en €, soit raisonnable, par exemple entre 0,01 et 1 € en fonction de ses moyens.

Cliquer en bas sur Submit, on voit apparaître un BLOB :

Voilà ce que c’est un BLOB, ici  ce sont des données codées en hexadécimal.

Une re-vérification est nécessaire, il n’y a pas de pilote automatique dans cet exercice de haut vol, on est en mode manuel !

Sélectionner le BLOB ( 0100000….7400000000 dans l’exemple ) avec la souris et faire un Copier (Ctrl + C). Dans le menu en haut cliquer Verify. Coller le BLOB dans la zone éditable, et cliquer sur Submit. En haut de la page on doit voir quelque chose comme cela :

Traduction : Le script ci-dessus a été décodé. C’est-à-dire que le contenu du BLOB incompréhensible par le commun des mortels a été re-traduit en valeurs “claires” que l’on peut visualiser

Si il y a quelque chose qui cloche on aura un avertissement du genre :

Impossible à décoder, il faut revenir en arrière, re-vérifier, recommencer.

En bas de la page on devrait donc revoir des données en clair comme ceci :

On doit reconnaître les adresses expéditeur, destinataire, les montants et le texte OP_RETURN.

Si tout va bien, c’est le moment de Coller (Ctrl + V) de nouveau ce BLOB dans le fichier texte blob.txt qu’on a préparé au début de cette étape.

Sauvegarder le fichier blob.txt dans la clé USB. Puis débrancher celle-ci.


2 - Signer la transaction

On a donc une transaction Bitcoin sous forme d’un BLOB stockée dans un fichier texte, celui ci est contenu dans une clé USB.

Signer une transaction c’est comme signer un chèque : la signature prouve que c’est bien le titulaire du compte qui a rempli le chèque, et qui valide le paiement. De façon analogue, on va crypter le BLOB au moyen de la Clé Privée qui appartient au propriétaire des fonds.

Maintenant  on se sert de l’ordinateur hors ligne. Dans les copies d’écran suivantes j’ai rajouté le texte PC Hors Ligne en rouge. Brancher la clé USB. Il faut éditer le fichier blob.txt qui s’y trouve et qui contient donc le BLOB non crypté, on sélectionne le texte avec la souris et on Copie (Ctrl + C).

On a également en édition la Clé Privée prête à être Copiée.

En principe la page web du clone du site coinb.in est toujours ouverte dans le navigateur. Dans le menu en haut cliquer Verify, Coller le BLOB et cliquer sur Submit. Là on devrait voir pile poil la même page avec les mêmes données que la dernière page de l’étape précédente.

On continu en sélectionnant Sign dans le menu en haut. Dans la zone la plus grande on Colle de nouveau le BLOB. Puis on va chercher la clé privée en cours d’édition pour la Copier, et la Coller ensuite dans la zone Private key. Si on est pas espionné par un agent de la NSA on peut voir la clé en clair en cliquant sur Show à droite. On devrait voir un écran comme ceci :

Cliquer sur Submit. Un nouveau BLOB, plus gros que le précédent apparaît en dessous :

Dans la zone verte c’est un BLOB crypté, c’est-à-dire une transaction signée.

Si il ne se passe rien, c’est que le BLOB initial contient une erreur.

Si on obtient exactement le même BLOB c’est qu’on a utilisé une clé privée qui ne correspond pas à l’adresse publique du porte-monnaie expéditeur.

Maintenant il faut sélectionner le nouveau BLOB crypté et le Copier. Puis sélectionner Verify dans le menu du haut, et Coller dans la zone éditable. On devrait voir ceci :

De nouveau on doit reconnaître les adresses, les montants, le texte hexadécimal.

Il y a une petite case ronde qui doit être cochée à droite :

Si on a un doute, si cette case n’est pas cochée, alors il y a un problème, il faut recommencer… !

Aller dans l’éditeur pour afficher le fichier blob.txt. Coller de nouveau le BLOB crypté à la suite, ou à la place, du BLOB de départ. Sauvegarder le fichier blob.txt et débrancher la clé USB.


3 - Envoyer la transaction sur le réseau

Dans les épisodes précédents : on a généré une transaction Bitcoin, on l’a signé. Maintenant on a une clé USB avec un fichier contenant cette transaction sous forme d’un BLOB crypté.

Retour à l’ordinateur connecté au web. Brancher la clé USB. La page du site coinb.in est toujours ouverte dans le navigateur. Fermer cet onglet et réouvrir la page (https://coinb.in), cela permet d’effacer les données précédentes.

Éditer ensuite le fichier blob.txt se trouvant dans la clé USB, sélectionner et Copier le BLOB crypté venant de l’ordi hors ligne. Dans la page web sélectionnez Verify dans le menu, coller le BLOB et cliquez Submit. De nouveau on doit voir les valeurs adresses / montants / texte hexa, la case cochée.

Dans le menu en haut, cliquer sur Broadcast et dans la zone Enter your hex encoded bitcoin transaction Coller de nouveau le BLOB crypté. On affiche un écran comme ça :  



SÉQUENCE IRRÉVERSIBLE…..

Jusqu’à maintenant rien n’a été modifié dans la Blockchain, ni donc dans les porte-monnaies. Il est toujours possible d’arrêter là si on n’est pas sûr, ou si on change d’avis. À partir du prochain clic c’est irréversible, il va y avoir du changement dans la Blockchain. Et il n’y aura plus de possibilités de revenir en arrière pour retrouver l’état précédent.


Cliquer sur Submit. Immédiatement l’affichage change et montre un numéro de transaction (txid) :

Voilà, c’est expédié  !


4 - Vérification

Normalement on a toujours un onglet qui montre l’adresse publique du porte-monnaie débiteur dans l’explorateur de Blockchain. On y va et on rafraîchit la page (F5). On devrait avoir quelque chose comme ceci :

La transaction non confirmée c’est normal, elle vient d’arriver sur le réseau.

Voici le lien de cet exemple : adresse expéditrice. Maintenant l’affichage est différent puisque depuis la rédaction de ce tuto la transaction est confirmée.

Mais ce qui nous intéresse c’est le texte gravé dans le marbre qu’on a inscrit dans la Blockchain. Il faut cliquer sur le nr de transaction en bleu : 996b414f3.....feb15f.  (Celle qui est datée 2018-08-23). Voici ce que l’on voit en bas de la page :

Le message est là, ad vitam æternam !

Il se peut que la transaction non confirmée n’apparaisse pas immédiatement. Une autre site présente les données plus clairement : https://chain.so. Il faut copier le nr de transaction affiché dans la dernière page du site coinb.in et le coller dans le champ de recherche du site chain.so. On obtient par exemple ceci:

 

Ici la copie d’écran montre que la transaction est confirmée, mais dès qu’elle a été envoyée sur le réseau on devrait voir :

 


Mais à quoi cela peut-il servir ?

Une information de 80 caractères maximum peut donc être stockée dans la Blockchain de façon immuable.

Comment ça marche ? La Blockchain ce sont des millions de transactions qui, une fois confirmées et enregistrées, sont verrouillées de façon définitive.

Dans une transaction il y a une zone, un champ optionnel, qui peut contenir du texte, nommé poétiquement  OP_RETURN.

C’est un peu comme l’histoire des textos, les SMS, en téléphonie. Au début les SMS étaient une simple facilité technique destinée aux techniciens installateurs des réseaux GSM pour des besoins de mise au point. Un commercial a flairé un business et a proposé ce truc au public, à nous utilisateurs, en complément des communications vocales. Les opérateurs téléphonique ont réussi à vendre ce service à des coûts exorbitants par rapport au montant de mise en oeuvre qui est de zéro.

Pour le Bitcoin, les programmeurs ont pensé utile d’introduire cette courte zone de texte OPRETURN dans les transactions. La comparaison avec le SMS s’arrête là. Cette option a un coût supplémentaire très faible, car il y a un peu plus de données dans un BLOB contenant un OPRETURN. Les SMS sont éphémères, mais pas l’OPRETURN. Est ce que à l’avenir son utilisation va se généraliser ?

À quoi ça sert  ? Ce n’est qu’une question d’imagination. On peut naïvement penser à envoyer quelques satoshis à l’amour de sa vie avec un petit I love you….

Ce que l’on ne peut pas stocker c’est un volume important de données, une image ou un document par exemple, dans l’espoir de s’assurer qu’il restera dans la Blockchain éternellement. Par contre on peut y stocker le hash d’un tel document.

Cette technique d’enregistrement de hash a déjà été utilisé dans un cas concret : une école d’ingénieur a enregistré dans la Blockchain le hash d’un texte contenant la liste des étudiants diplômés. Cela permet aux dits étudiants de prouver à quiconque que leur diplôme n’est pas un faux. Voici les détails dans ce blog : Certification des diplômes.

Il y a un site qui affiche en live les transactions dont l’OPRETURN est renseigné : Bloc 538125. On peut mettre le nr du bloc dans l’URL, pour ce lien c’est celui où la transaction ayant servis d’exemple est stockée. Quand on navigue un peu au hasard de ces transactions, on voit que la plupart des OPRETURN sont des chaînes hexadécimales, probablement des hash ou des codes.

Il y a un PDF sorti en 2017 qui analyse les OPRETURN de la Blockchain (https://arxiv.org/pdf/1702.01024.pdf). À la page 7 on a un tableau qui dit que la Blockchain contient environ 1,8 millions de transactions dont l’OPRETURN est renseigné, cela représente environ 1 % des transactions de la Blockchain. Les codes enregistrés servent à : certifier des propriétés d’actifs réels, verrouiller la propriétés et l’horodatage de documents certifiés, sceller les droits d’accès ou les droits d’auteur de documents numériques, enregistrer des messages…. Les liens vers les sites qui gèrent tout cela sont dans le PDF, et ces sites sont adossés à des entreprises privées qui facturent ce service d’enregistrement. Ça ne rappellerait pas les SMS ?

Par exemple celui ci : Proof of Existence permet d’envoyer un fichier original (document scanné, photo, musique) dont le hash est d’abord calculé, puis ensuite enregistré dans la blockchain. Par exemple dans cette transaction 781e8….89b53 le champ OPRETURN contient le hash :

DOCPROOFdØ?1ÌÛo?|à¸.Ý/vp?K?ÉêåÄ¿Ó?yÜ[Q³

Celui ci a probablement une signification importante pour le propriétaire du document !

Finalement ce qu’il faut retenir ici c’est le fait que le point d’entrée pour ce genre de business c’est l’identifiant de la transaction, les adresses publiques et les montants de la transactions sont des données accessoires. Et la données la plus sensible est bien sûr le contenu du champ OPRETURN.

Sinon pour stocker une quantité d’informations plus importante, et plus rapidement, il existe une méthode de mutualisation utilisant l’arbre de Merkle. Les explications sont là : http://nekolab.fr/stockage-blockchain-bitcoin-dab/


++ 13/09/2018 ++