Bitcoin est décentralisé et théoriquement incensurable, mais en laissant ses bitcoins sur un exchange on en perd tout l’interet et on prend de multiple risques.

On va voir ici comment les gérer de la manière la plus sécurisé possible. Ca sera également l’occasion de mieux comprendre le fonctionnement de Bitcoin.

Si vous démarrez de zéro, un très bon documentaire a été fait par Rémi Forte pour la chaine Arte : Le mystère Satoshi.


SOMMAIRE:

Acheter du bitcoin sur un exchange

Pour obtenir ses premiers satoshis (1 sat = 1 cent millionième de bitcoin), le moyen le plus simple est de les acheter sur ce que l’on appelle un exchange. Il y a en a beaucoup, Binance, Kraken, Coinbase, Crypto.com etc.

Ce sont des entreprises qui se placent en tant que marché boursier pour les cryptomonnaies. Elles fixent un prix pour une paire de monnaies et vont nous permettre ainsi de passer de l’une a l’autre. On va donc y déposer des euros puis les échanger contre du bitcoin.

Avant de pouvoir acheter sur l’exchange de notre choix, il va falloir montrer patte blanche en se soumettant au protocol KYC (Know Your Customer). Vous devrez fournir un certain nombre de choses permmetant de vous identifier : pièce d’identité, selfie vidéo, facture EDF…

Vous pourrez ensuite faire un virement en euros, ou un dépot par carte bancaire sur la plateforme. Une fois vos euros déposés, vous pourrez facilement les convertirs en bitcoin, ether ou tout autre cryptomonnaie listée sur la plateforme.

A partir de là, vous pourrez les laisser reposer sur la plateforme en lui faisant confiance. Ou les sortir sur des clés Bitcoin que seul vous connaitrez. Vous passerez donc du statut de client d’une banque a votre propre banque en quelque sorte.

Transfère en dehors d’un exchange

La façon la plus simple d’obtenir une clé privé et son adresse publique correspondante est de le faire via ce site : https://www.bitaddress.org

Il s’agit d’une simple page html contenant le code javascript necessaire a la création d’une clé privé. Une fois la page chargée, vous pouvez couper internet, tout se fait sur votre poste de travail et aucune communication n’est faite avec l’extérieur.

Il va d’abord falloir bouger aléatoirement votre souris un certain temps. Cela va permettre de créer l’entropie necessaire pour choisir un nombre aléatoire correctement. A partir de là, le code javascript sera en mesure de passer d’un nombre aléatoire a une clé privé Bitcoin. Puis de cette clé a une adresse communiquable sans problème à n’importe qui.

Pour faire simple, la cryptographie utilisée par Bitcoin, permet de passer d’un nombre aléatoire choisi entre 0 et 2 puissance 256 (10 puissance 77) a une clé privé. D’une clé privé a une clé publique et de cette clé publique a une adresse Bitcoin.

Le système est fait de sorte qu’il soit impossible de passer d’une adresse a une clé publique, ainsi que d’une clé publique a une clé privée.

Des outils que l’on verra plus tard dans l’article existe pour faire ou re-faire ce cheminement, mais retenez bien que :

  • Quiconque met la main sur votre nombre aléatoire (appelé seed) ou sur votre clé privé pourra vous prendre votre argent.
  • Si vous perdez votre seed + votre clé privé et que personne d’autre n’a les informations, l’argent est perdu pour toujours.
  • Si vous perdez la seed mais avez encore la clé privé ou inversement, tout va bien.

Maintenant que tout est dit, passons au transfert de l’argent sur votre exchange a votre adresse :

  • Aller sur bitaddress.org
  • Générer une paire clé privé/adresse
  • Notez cette paire dans un fichier texte pour la retenir et fermez la page bitaddress.org
  • Sur l’exchange, trouvez comment envoyer vos bitcoins a une adresse et renseignez l’adresse de l’étape précédente
  • Allez régulièrement sur blockchain.com/btc/address/VOTRE_ADRESSE pour constater que vos bitcoins y sont

Pour l’exemple, j’ai créé l’adresse 19WpbUqfW7CpA1p8RmiaoR7jn4EfFXT921 a laquel est associé la clé privé L1wyq8LhuWEua11ZayDE8Qp26pgrMmNdM2EHG3riqm7hqZfmGKkE

Depuis mon exchange, j’y ai transféré l’équivalent d’une trentaine d’euro.

Payer avec le client Electrum

Vous êtes maintenant propriètaire de vos bitcoins pour de vrai, félicitation. On va maintenant envoyer la moitié de notre fortune sur une autre adresse grace au logiciel open source Electrum.

Vous pouvez le télécharger ici : https://electrum.org/#download Une fois téléchargé, ouvrez Electrum et créez votre portefeuille :

  • nom : default_wallet
  • Importer des adresses Bitcoin ou clés privés
  • copiez-coller votre clé privé
  • mettez un mot de passe si vous le souhaitez, ça n’est pas obligatoire, si vous le perdez vous perdrez votre argent :)

Voila, le portefeuille est créé et je peux voir dans l’onglet “Adresse” que j’ai une adresse dont le solde est de 0.00070386 BTC.

Pour vous envoyer de l’argent, allez sur bitadress.org et générez une nouvelle paire clé/adresse a retenir tout autant que la première. Dans mon cas : clé privé : KwQUNfYPeokjkZJuGKMB6LNcZJbNdf6SBtsWdqPkkBuv8j92CE5 adresse : 1Q1sB3ZL6tS8DaxRWkQ3x6KK4phpdbXqob

Pour envoyer de l’argent a notre nouvelle adresse, rendez-vous dans l’onglet “Envoyer” d’Electrum.

  • Payer a : 1Q1sB3ZL6tS8DaxRWkQ3x6KK4phpdbXqob
  • Description: vide
  • Montant : 0.00070386 / 2 soit 0.00035193
  • Cliquez sur Envoyer, une récapitulation de la transaction vous est proposez
  • Cliquez successivement sur Finalize, Signer, Diffuser

On peut maintenant aller voir sur blockchain.com/btc/address/1Q1sB3ZL6tS8DaxRWkQ3x6KK4phpdbXqob que le montant est bien arrivé. Cela peut prendre du temps puisqu’il faut que notre transaction soit embarquée dans un block par un mineur puis validée par les autres mineurs.

En allant directement sur blockchain.com après avoir validé la transaction dans Electrum, on peut voir qu’elle a le statut UNCONFIRMED. Cela changera dans la prochaine demi-heure.

En attendant, le solde de notre porte-monnaie Electrum a été divisé par deux. Electrum ne sait pas qu’on s’est envoyé de l’argent a nous même.

Pour régler ça, allez dans Portefeuille / Clés privés / Importer, puis saisissez la nouvelle clé privé a savoir KwQUNfYPeokjkZJuGKMB6LNcZJbNdf6SBtsWdqPkkBuv8j92CE5

On voit maintenant que le solde de notre porte-monnaie est de 0.0007016. J’ai perdu 0.00000226 BTC (8 cts d’euros au moment d’écrire ces lignes) en faisant cette transaction, cela est du a la taxe que les mineurs prennent. Elle permet de les motiver a prendre ma transaction dans un bloc plutôt qu’une autre.

En gros, moins on donne de fee, plus la transaction sera longue a etre validée.

Gérer son portefeuille soi-même

Générer une nouvelle adresse pour chaque transaction est fastidieux. On pourrait décider de n’avoir qu’une seule adresse bitcoin, mais cela pose des problèmes de confidentialité. Quiconque connait votre adresse peut suivre l’évolution de votre épargne dans le temps, pas top.

La bonne pratique consiste entre autre a utiliser une nouvelle adresse pour chaque transaction. Et rien de mieux qu’un portefeuille hiérarchique détermiste pour ça.

Un portefeuille hiérarchique déterministe (ou hd-wallet) va nous permettre de générer une infinité d’adresse a partir d’une clé privé maitre dont on ne retiendra que la seed. La seed étant exprimé a l’aide d’un mnémonique beaucoup plus facile a retenir.

On va tout d’abord installer l’outil bx (bitcoin explorer). Vous pouvez le télécharger ici

On déplace le binaire a l’endroit voulu et on met cet endroit dans notre path :

export bx=/Users/TOTO/Desktop/bx/bx-osx-x64-qrcode
alias bx='bx-osx-x64-qrcode'
bx help

Pour générer une seed, plus besoin de faire bouger la souris en attendant d’avoir suffisamment d’entropie, notre ordinateur en possède normalement suffisamment.

Voyons déjà comment générer une simple paire clé privé/adresse avec l’outil bx :

bx seed > seed
cat seed | bx ec-new | bx ec-to-wif > private_key
cat seed | bx ec-new | bx ec-to-public | bx ec-to-address > address

C’est déjà plus rapide et confidentiel que la méthode précédente.

On passe maintenant a un hd-wallet en commençant par une seed mais au format mnémonique :

bx seed | bx mnemonic-new -l fr > mnemonic
cat mnemonic

sécréter climat recycler dégager toucher copie gicler étourdir lettre garrigue effectif minute pleurer symbole binaire revivre paisible viande

Grace a cet équivalent de seed, que l’on conservera jalousement, on va pouvoir générer une clé privé maitre :

bx hd-new $(cat mnemonic | bx mnemonic-to-seed) > m
cat m

xprv9s21ZrQH143K2jA3yisxyMDB7UtqkZftx6KFtvPjitHGhKsboA8oownjywQwn1xsQYiBSNqXYYi8V3dMJgsxJTSbwcgdGnurvasxqwAt55h

A partir de la, on va pouvoir générer autant de clé que l’on veut grâce au systéme d’arborescence de notre portefeuille :

Voici la première clé privé de notre portefeuille par exemple :

cat m | bx hd-private --index 44 --hard | bx hd-private --index 0 --hard | bx hd-private --index 0 --hard \
 | bx hd-private --index 0 | bx hd-private --index 0  | bx hd-to-ec | bx ec-to-wif > private_key_0

Et son adresse associée :

cat private_key_0 | bx wif-to-ec | bx ec-to-public | bx ec-to-address > address_0 

On vient ici de générer la paire correspondant a l’index 44/0/0/0/0 :

  • m = clé privé maitre et 44 par défaut
  • 0 pour bitcoin (1 = testnet, 2 = litecoin), on restera sur du 0
  • 0 pour le premier compte (0 = epargne, 1 = entreprise, …)
  • 0 pour reception, 1 pour les adresses de change
  • 0 pour la 1ère addresse de cette branche de l’arbre

Pour vérifier qu’une clé privé et son adresse sont bonne, vous pouvez importer la clé privé dans Electrum et vérifier qu’il vous affiche la meme adresse que vous.

Avec le script suivant, on voit qu’on peut facilement générer des milliers d’adresses :

for i in $(seq 0 10);do
    private=$(cat m | bx hd-private --index 44 --hard | bx hd-private --index 0 --hard | bx hd-private --index 0 --hard \
     | bx hd-private --index 0 | bx hd-private --index $i  | bx hd-to-ec | bx ec-to-wif);

    address=$(cat m | bx hd-private --index 44 --hard | bx hd-private --index 0 --hard | bx hd-private --index 0 --hard \
     | bx hd-private --index 0 | bx hd-private --index $i  | bx hd-to-ec | bx ec-to-public | bx ec-to-address);
    
    echo "${private};${address}" >> keys;
done
cat keys
KyrNPXFPtw4JXuyC9nkvCb1GFCW1onk8zSM31t6bucN6nZ1aqWRH;1BDEMbf8DC8GPwToy1Dd55XfWpcewvbo6b
L3Y8QXzkUqCRAECPegYti4YYfeY1K6pCjzAiVLr1diFnL32vjTym;11225LoRXJaA4hgpCXzhSMFZGm7ZdTNHBC
L43K4AEv9C56Y5RYZuDJTgRuwBgYy6sjy33YCCw4oeonMAY4idPD;1AMCBNc3urR9cS2YCKFNaaTf3ecC2boxHh
L5RcHZXLCDYsxcNiCGYiyvvDXd3YDUmKtJyvveASz9exNUgphvr7;1EdmsquCf9DiqbKzunyNkBmLTgjW2HwRPn
KyuecmtWGKn4NWD3JSJb6yyWqTxFxXLTuNvixUZhZA6QjVaZajoK;17bBhXju9NypzQgKdYA4c5HoSDCjx1NcqC
L3qXPAVRxT22uwarV6HCB5375bBwfMHUdb3VNpcCFPz5b11A3QSV;135Gh1jwCNzmACXhuMsufzLrzw1KZoqvMS
L5HwKREik1sVwSbHEtGF7r6pxgXM7yZsTvnmqiWr8VXkAYBbfSP1;1WkzTM2up61dAFPqwfkqVJqR4d655e9o9
L3ZTjmwZqH4Kx2EFfPUbJtL71sZePh3is73LeT5B3d5e8ESpk4EN;1KtCqijFyw24CyHGnr35h8QJfzX7M7JdW7
L5o88jRqhk5m7DSHGGAahEtq4rttva3vWk96DfptSowLNZdZC4fW;1EZ4mCFqe4Ew4Frz6Tp7mwqG8zB6VXz4F5
Kx7sK1UwLNC11hnmeo8B2yzCQnXVVt7tagY3hU93tkz9au43fc8n;15YqtcU5ayXSGhExCKVM5pfF9j2G3ReMZF
L4jGmZspMFPwcqYFjHMtDGmuNRimDBFWJvsyyYpYpCaayMeLCMbq;138aiC25yBtUQ4Z9GsntvLmcMJwygNeKip

Testons maintenant que nous pouvons nous permettre de tout perdre sauf notre mnémonique. On supprime notre clé privé maitre m, les fichiers private_key_0, address_0 et le fichier keys.

rm -f m private_key_0 address_0 keys

L’objectif pour nous maintenant est d’etre capable de créer a nouveaux notre fichier keys a l’identique :

bx hd-new $(cat mnemonic | bx mnemonic-to-seed) > m

On peut ensuite rejouer la boucle bash précédente et s’assurer que le contenu est strictement identique.

for i in $(seq 0 10);do
    private=$(cat m | bx hd-private --index 44 --hard | bx hd-private --index 0 --hard | bx hd-private --index 0 --hard \
     | bx hd-private --index 0 | bx hd-private --index $i  | bx hd-to-ec | bx ec-to-wif);

    address=$(cat m | bx hd-private --index 44 --hard | bx hd-private --index 0 --hard | bx hd-private --index 0 --hard \
     | bx hd-private --index 0 | bx hd-private --index $i  | bx hd-to-ec | bx ec-to-public | bx ec-to-address);
    
    echo "${private};${address}" >> keys;
done
cat keys
KyrNPXFPtw4JXuyC9nkvCb1GFCW1onk8zSM31t6bucN6nZ1aqWRH;1BDEMbf8DC8GPwToy1Dd55XfWpcewvbo6b
L3Y8QXzkUqCRAECPegYti4YYfeY1K6pCjzAiVLr1diFnL32vjTym;11225LoRXJaA4hgpCXzhSMFZGm7ZdTNHBC
L43K4AEv9C56Y5RYZuDJTgRuwBgYy6sjy33YCCw4oeonMAY4idPD;1AMCBNc3urR9cS2YCKFNaaTf3ecC2boxHh
L5RcHZXLCDYsxcNiCGYiyvvDXd3YDUmKtJyvveASz9exNUgphvr7;1EdmsquCf9DiqbKzunyNkBmLTgjW2HwRPn
KyuecmtWGKn4NWD3JSJb6yyWqTxFxXLTuNvixUZhZA6QjVaZajoK;17bBhXju9NypzQgKdYA4c5HoSDCjx1NcqC
L3qXPAVRxT22uwarV6HCB5375bBwfMHUdb3VNpcCFPz5b11A3QSV;135Gh1jwCNzmACXhuMsufzLrzw1KZoqvMS
L5HwKREik1sVwSbHEtGF7r6pxgXM7yZsTvnmqiWr8VXkAYBbfSP1;1WkzTM2up61dAFPqwfkqVJqR4d655e9o9
L3ZTjmwZqH4Kx2EFfPUbJtL71sZePh3is73LeT5B3d5e8ESpk4EN;1KtCqijFyw24CyHGnr35h8QJfzX7M7JdW7
L5o88jRqhk5m7DSHGGAahEtq4rttva3vWk96DfptSowLNZdZC4fW;1EZ4mCFqe4Ew4Frz6Tp7mwqG8zB6VXz4F5
Kx7sK1UwLNC11hnmeo8B2yzCQnXVVt7tagY3hU93tkz9au43fc8n;15YqtcU5ayXSGhExCKVM5pfF9j2G3ReMZF
L4jGmZspMFPwcqYFjHMtDGmuNRimDBFWJvsyyYpYpCaayMeLCMbq;138aiC25yBtUQ4Z9GsntvLmcMJwygNeKip

On a donc bien validé que tant que nous sommes en mesure de retenir notre mnémonique, nous pouvons récupérer nos clés. Bien sûr, quiconque accéde a notre mnémonique pourra faire de meme.

On verra dans la suite de l’article comment protéger cette information correctement.

Jusqu’a présent, notre argent se trouve sur deux adresses, on va envoyer l’argent des 2 adresses sur la première adresse de notre nouveau portefeuille, soit m/44/0/0/0/0 :

  1. on trouve notre adresse :
    cat m | bx hd-private --index 44 --hard | bx hd-private --index 0 --hard | bx hd-private --index 0 --hard \
    | bx hd-private --index 0 | bx hd-private --index 0  | bx hd-to-ec | bx ec-to-public | bx ec-to-address
    

1BDEMbf8DC8GPwToy1Dd55XfWpcewvbo6b

  1. on importe nos 2 clés privés dans Electrum si besoin et on lui demande d’envoyer la totalité sur l’adresse précédente

  2. on vérifie régulièrement sur blockchain.com si notre transaction est confirmée ou non https://blockchain.com/btc/address/1BDEMbf8DC8GPwToy1Dd55XfWpcewvbo6b

Signer et diffuser une transaction

On va maintenant faire en sorte de ne plus faire confiance au client Electrum en lui fournissant nos clés privés. On va donc construire nos transactions nous meme et les transmettre a Electrum une fois signées. Electrum diffusera pour nous la transaction sur le réseau sans jamais avoir eu connaissance de notre clé privé.

Notre argent se trouve actuellement sur l’adresse a l’index 0 de notre portefeuille, soit /44/0/0/0/0 et nous aimerions transférer l’ensemble sur notre seconde adresse m/44/0/0/0/1. On va d’abord récupérer la clé privé et l’adresse :

44-0-0-0_private=$(cat m | bx hd-private --index 44 --hard | bx hd-private --index 0 --hard | \
  bx hd-private --index 0 --hard | bx hd-private --index 0)
private=$(cat 44-0-0-0_private | bx hd-private --index 0  | bx hd-to-ec | bx ec-to-wif)

KyrNPXFPtw4JXuyC9nkvCb1GFCW1onk8zSM31t6bucN6nZ1aqWRH

address=$(cat 44-0-0-0_private | bx hd-private --index 0  | bx hd-to-ec | bx ec-to-public | bx ec-to-address)

1BDEMbf8DC8GPwToy1Dd55XfWpcewvbo6b

Aller voir sur blockchain.info les infos de la transaction dans laquelle notre adresse se trouve : https://blockchain.info/rawaddr/1BDEMbf8DC8GPwToy1Dd55XfWpcewvbo6b.

L’adresse 1BDEMbf8DC8GPwToy1Dd55XfWpcewvbo6b est appelée une UTXO (unspended transaction output) et a forcément était créé a partir d’une ou plusieurs autres UTXO qui ont du être totalement dépensé pour l’occasion.

Le json renvoyé par blockchain.info nous donnes toute les informations contenu sur la blockchain concernant cette UTXO :

  • impliqué dans 1 seule transaction : le champ txs ne contient qu’un objet et n_tx = 1
  • elle a été formé a partir de 2 adresses : txs.inputs[0].prev_out.addr et txs.inputs[1].prev_out.addr soit 19WpbUqfW7CpA1p8RmiaoR7jn4EfFXT921 et 1Q1sB3ZL6tS8DaxRWkQ3x6KK4phpdbXqob
  • une seul UTXO a été créé dans cette transaction : txs.out ne contient qu’un objet
  • la balance de cette UTXO est de txs.out[0].balance = 69480 satoshis

Pour construire notre transaction, nous allons avoir besoin du hash de la transaction ayant servi a créer l’UTXO que nous voulons dépenser. Ici, il n’y a eu qu’une seule transaction pour cette adresse, mais sinon on prendrait la plus récente.

Donc : transaction_hash = txs[0].hash = 7dc9dbd771c43042be536d776c53ee2cc41bd7ccb5939d7928f485c0b31ef4a2

Il va ensuite nous falloir l’index n de notre UTXO dans la transaction. Une UTXO peut etre dépensée vers plusieurs outputs, créant a son tour x UTXO. Dans notre transaction, nous devrons spécifier l’index de l’UTXO que nous voulons dépenser. Ici il n’y a qu’une sortie a notre transaction précédente et l’index vaut donc 0. indexOutput = txs[0].out[0].n

Nous aurons également besoin du script permettant de débloquer notre UTXO, il se trouve dans le meme objet que notre index : scriptOutput = txs[0].out[0].script

Si on résume :

  • transactionHash=7dc9dbd771c43042be536d776c53ee2cc41bd7ccb5939d7928f485c0b31ef4a2
  • indexOutput=0
  • scriptOutput=76a914700165ce610fbe651d37a5617d1da1b6d7836bd388ac

Nous allons envoyer l’ensemble de notre argent, actuellement sur la première adresse de notre wallet vers la seconde. Il nous faut donc l’adesse de m/44/0/0/0/1 `

addressOutput=$(cat 44-0-0-0_private | bx hd-private --index 1  | bx hd-to-ec | bx ec-to-public | bx ec-to-address)

On va ensuite utiliser la méthode tx-encode de l’outil bx pour encoder notre transaction. Il faut l’utiliser comme suit :

bx tx-encode -i transaction-hash:transaction-index -o output-addresse:satoshi-amount

Nous avons 69480 satoshis sur notre adresse actuellement (txs[0].out[0].value) et nous allons laisser 15cts d’euros de fees pour que les mineurs prennent notre transaction dans un bloc.

Pour savoir combien de fees laisser aux mineurs, nous devons d’abord connaitre la taille en bytes d’une transaction avec 1 input et 1 output. Prendre ensuite connaissance du montant actuel de satoshi/bytes necessaire pour qu’une transaction soit validée dans un temps acceptable (en nombre de block, 1 block toute les 10mn). Et ensuite multiplier le nombre de bytes de la transaction par le nombre de satoshi/bytes que nous avons décidé de laisser.

On peut voir ça ici : https://bitcoinops.org/en/tools/calc-size. Avec 1 input et 1 output, notre transaction pésera 192 bytes.

Pour ensuite connaitre le nombre de sat/bytes a donner, ce site est pas mal : https://statoshi.info/d/000000017/fee-estimates?orgId=1&from=now-6h&to=now

On peut y voir, au moment ou je le consulte, que lors des 6 dernières heures, un montant de 5 sat/bytes a permis d’etre validé en moins de 20 blocks, soit 200mn.

On va ici choisir un montant de 5 sat/bytes, pour une taille de transaction de 200 bytes, soit 1000 sat a laisser en fees (bx satoshi-to-btc 1000 = 0.00001 = 37cts d’€)

Sur nos 69480, nous allons donc en donner 68480 et laisser le reste s’évaporer.

satoshiAmount=68480

On peut maintenant encoder notre transaction :

encodedTransaction=$(bx tx-encode -i ${transactionHash}:${indexOutput} -o ${addressOutput}:${satoshiAmount})

0100000001a2f41eb3c085f428799d93b5ccd71bc42cee536c776d53be4230c471d7dbc97d0000000000ffffffff01800b0100000000001976a9140031502e0c1173bd38b351ecc613287bc86f805688ac00000000

Il nous faut maintenant signer cette transaction avec la clé privé de l’origine des fonds, soit la clé privé de l’adresse situé en m/44/0/0/0/0. Nous aurons besoins de cette clé privé au format EC (elliptic-curve) et non pas wif :

privateKeyToEC=$(cat m | bx hd-private --index 44 --hard | bx hd-private --index 0 --hard | \
 bx hd-private --index 0 --hard | bx hd-private --index 0 | bx hd-private --index 0  | bx hd-to-ec)

4e888dfa9b7a985c8684cc26f87f76ce7aa934f94c042f6ce5f4075e45163ba2

Nous allons également avoir besoin de la clé publique (et non l’adresse) :

publicKey=$(cat m | bx hd-private --index 44 --hard | bx hd-private --index 0 --hard | \
bx hd-private --index 0 --hard | bx hd-private --index 0 | bx hd-private --index 0  | bx hd-to-ec | bx ec-to-public)

0269de5cd64b73cac686d53e2e9b7efa09c37bcb302aae07fdc69791318c3d7892

On peut maintenant signer la transaction :

signedInput=$(bx input-sign ${privateKeyToEC} "dup hash160 [$(bx bitcoin160 $publicKey)] equalverify checksig" \
 ${encodedTransaction})

3045022100f338aaba2885f680cae7b746777699643122afa490a0108c51c358ff6d94d3e30220596d58455d66b2e32d80c289bfcffb716dcf8a3afa8169af31203fb1b858244601

On va ensuite ajouter la clé publique de notre UTXO d’origine a la transaction :

result=$(bx input-set "[${signedInput}] [${publicKey}]" ${encodedTransaction})

0100000001a2f41eb3c085f428799d93b5ccd71bc42cee536c776d53be4230c471d7dbc97d000000006b483045022100f338aaba2885f680cae7b746777699643122afa490a0108c51c358ff6d94d3e30220596d58455d66b2e32d80c289bfcffb716dcf8a3afa8169af31203fb1b858244601210269de5cd64b73cac686d53e2e9b7efa09c37bcb302aae07fdc69791318c3d7892ffffffff01800b0100000000001976a9140031502e0c1173bd38b351ecc613287bc86f805688ac00000000

Si on soumet le résultat a un wallet comme Electrum, il effectuera la transaction pour nous sur le réseau Bitcoin sans que le wallet n’ai jamais su notre clé privé.

Pour se faire, ouvrez Electrum, puis : Outils -> Charger une transaction depuis un fichier -> Soumettre -> Diffuser

On peut aussi le faire ici : https://www.blockchain.com/btc/pushtx method : POST content-type: application/x-www-form-urlencoded payload form-data : tx: $result

Conserver et proteger son wallet

PGP

PGP clé USB fois 3

3 paires de clés : 1 pgp et 1 liste adresse chiffré

1 pgp différente par clé adresse

personne1 : pgp de 3, chiffré de 2 personne2 : pgp de 1, chiffré de 3 personne3 : pgp de 2, chiffré de 1

Graver sur un morceau de métal que l’on cache, faite preuve d’imagination

Raspberry

Sur raspberry qui n’a jamais vu internet :

1) installer l’os 2) le connecter a internet 3) installer PGP + BX 4) ne plus jamais le connecter a internet sauf si on a pris soin d’effacer toutes les données

Conclusion

problème de fongibilité bitcoin = pseudonyme pas anonyme, kyc exchange permet de nous tracer : ? nom entreprise qui trace

Pour contrer ça : PayJoin ou CoinJoin mixer, samourai wallet -> lien ludovic lars Ou achat non KYC sur Tor : hodl hodl, bisqmq, main a main

Monero ou Zcash

Resource

article de ludovic lars sur son site livre andre antonopoulos, internet of money et mastering bitcoin le mystère satoshi