Comment l'escrow de Bitcoin non dépositaire de LocalCryptos marche

LocalCryptos a lancé — un nouveau marché de crypto de pair à pair.

En novembre 2019, LocalCryptos a lancé les escrows Bitcoin. Nous avons copié notre concept basé sur Ethereum et traduit le code en un script compatible Bitcoin.

Dans cet article, nous allons vous expliquer comment ça marche.

Cet article suppose que vous comprenez Bitcoin à un degré technique. Nous allons essayer de décomposer des concepts simples, mais si vous ne savez pas ce que le terme “UTXO” signifie, cela pourrait être difficile à suivre.

Cette configuration est non dépositaire du début à la fin. Les serveurs de LocalCryptos ne stockent que des messages cryptés qu’il ne peut pas différencier du charabia. Nos serveurs ne génèrent aucune transaction décrite ici—c’est tout le JavaScript de votre navigateur.

Nos racines dans Ethereum

Nous étions LocalEthereum avant que nous ne renommions la plateforme en LocalCryptos. LocalEthereum a été la première plateforme de trading de pair à pair au monde pour Ethereum. C’était aussi la passerelle P2P fiat-à-crypto la plus populaire derrière PaxFul et LocalBitcoins.

LocalEthereum n’était pas un simple clone de LocalBitcoins. Bien que le parcours de l’utilisateur ait été similaire, LocalEthereum était une bénédiction quand vous avez éclaté le capot. C’était la seule plateforme avec des messages cryptés de bout en bout et un portefeuille web non dépositaire. C’était aussi la première à introduire un “escrow non dépositaire”, qui sonne comme un oxymore. Expliquons ce que cela signifie :

Au lieu de conserver le crypto en garantie dans un portefeuille sur son serveur, il a utilisé un contrat Ethereum smart. Ether (ETH) passerait du vendeur au contrat intelligent, et du contrat intelligent à l’acheteur. Le contrat intelligent a fixé les règles de l’escrow dans la pierre en avant dans une manière décentralisée. En utilisant un contrat intelligent plutôt qu’un dépositaire, l’escrow était sans intermédiaire.

Maintenant nous avons construit la même chose pour Bitcoin. Sauf que Bitcoin n’a pas de contrats intelligents—il a des scripts. Les scripts sont comme des contrats intelligents à certains égards, mais très différents dans d’autres.

Qu’y a-t-il dans une transaction Bitcoin ?

Les transactions Bitcoin contiennent des entrées et des sorties. Chaque sortie contient une adresse de destinataire - où vous envoyez le Bitcoin—et combien l’adresse va recevoir. Les entrées pointent vers les sorties précédentes—les pièces qui vous ont été envoyées et que vous n’avez pas encore dépensées.

Les “adresses” Bitcoin sont un concept étrange à déballer. D’une certaine façon, ils ne font pas partie du protocole - ils ne sont pas mentionnés dans le livre blanc de Satoshi Nakamoto.

1MoNS93aYgeuCcojcYbAJpKxqDN9UuJa9C

Il y a différents types d’adresses Bitcoin. Une adresse Bitcoin, une fois décodée, contient deux parties : une version identificateur, et une charge utile. Le champ de la version est au début et indique à votre portefeuille Bitcoin le type d’adresse dont il s’agit. L’utilisation de la charge utile dépend de la version.

Une adresse qui commence par un 1 est une adresse Pay-to-Public-Key-Hash (P2PKH), la plus grande adresse de la version. Une adresse qui commence par un 3 est une adresse Pay-to-Script-Hash (P2SH). Vous pouvez aussi voir d’autres préfixes d’adresse, comme une adresse native SegWit. Pour le bien de cet article, seules les adresses P2SH et P2PKH sont pertinentes pour comprendre.

Les normes d’adresse décrivent comment créer des puzzles et comment créer des solutions pour les déverrouiller. La solution du puzzle permet au destinataire d’utiliser une sortie comme entrée pour une autre transaction.

Alice envoie de l’argent à Bob à l’ancienne façon

Dans une adresse P2PKH , la charge utile qui suit la version est un condensé de la clé publique du destinataire. La fonction de hash utilisée est “hash160”, qui se traduit au RIPEMD160(SHA256(thing)).

Quand Alice veut envoyer un paiement à Bob, elle crée un puzzle appelé ScriptPubKey que seul Bob peut résoudre. Le puzzle devient une sortie de sa transaction Bitcoin.

Pour que Bob puisse dépenser cette sortie, il doit l’utiliser comme une entrée dans une autre transaction Bitcoin. Pour faire cela, il doit créer un code valide ScriptSig correspondant au ScriptPubClé.

Tout P2PKH ScriptPubClé suit toujours ce modèle :

OP_DUP OP_HASH160 <PubKeyHash> OP_EQUAL OP_CHECKSIG

Et une correspondance P2PKH ScriptSig est dans le format du :

<Signature> <PubKey>

OP_Huh?

Une sortie ScriptPubKey est un élément de code. C’est dans un langage de programmation basé sur une séquence restreinte unique à Bitcoin, nommé “Script”.

Un ScriptSig est aussi un élément de code, mais selon les règles de consensus de Bitcoin cela peut seulement contenir des “données push”. En d’autres termes, il ne peut rien faire d’autre que d’ajouter des données arbitraires à la séquence.

Dans ce P2PKH exemple, le ScriptSig de Bob ajoute deux choses dans la séquence :

Vérifier que ScriptSig est correct

Avant qu’un mineur puisse inclure cette transaction dans un bloc, il confirmera que ScriptSig est correct pour le ScriptPubKey.

Le mineur ajoute ScriptPubKey à la fin de ScriptSig et exécute le code. Après que la dernière ligne de code soit lancée, la séquence doit se terminer avec l’élément supérieur vrai (non-zéro). Ceci est tout ce qu’il faut pour vérifier un ScriptSig.

<Signature> <PubKey> OP_DUP OP_HASH160 <PubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

Comme vous pouvez le voir, la séquence se termine par “vrai”. Si vous voulez en savoir plus sur P2PKH et pourquoi il est populaire, il y a une tonne de ressources sur le web. Recherchez Google pour “P2PKH” pour en savoir plus.

Qu’est-ce qu’une adresse P2SH ?

Les adresses Pay-to-Script-Hash transfèrent la responsabilité de fournir les conditions de paiement à l’acheteur.

Rappelez-vous quand j’ai dit tout à l’heure que le ScriptSig du dépensier ne peut pas inclure de code de non-données ? Oubliez cela pour un instant—P2SH change tout.

Au lieu d’écrire les conditions de dépenses dans ScriptPubKey, ce code va dans un RedeemScript. Oui, c’est un nouveau terme—avec des mots non techniques en vrac, il fait référence au “vrai” puzzle pour la sortie. Lorsque vous envoyez des pièces à une adresse P2SH, le ScriptPubKey contient un hachage du code des conditions de dépense. Ça a l’air comme :

OP_HASH160 <RedeemScriptHash> OP_EQUAL

Un dépensier d’une sortie P2SH fournit deux choses dans leur ScriptSig :

Les mineurs vérifieront d’abord que le hachage de RedeemScript correspond au hachage de ScriptPubKey. Si tel est le cas, il décompactera le RedeemScript, mettra Signature au-dessus, et exécute.

Qu’est-ce qu’une adresse P2WSH ?

LocalCryptos utilise les adresses Pay-to-Witness-Script-Hash (P2WSH) pour les escrows au lieu de P2SH. Pour être précis, nous utilisons un P2WSH placé dans un P2SH (c’est-à-dire P2SH-P2WSH).

La différence entre un P2WSH et un P2SH est que dans un P2WSH, l’ancien RedeemScript entre dans un nouveau champ “Witness Script” field.

Si vous n’avez pas entendu parler de SegWit, veuillez prétendre que l’escrow de LocalCryptos utilise la norme P2SH. Cela aura autant de sens. L’utilisation du Témoin Séparé améliore l’efficacité et le coût de l’escrow, et rien de plus.

Pourquoi ne pas utiliser la multi-signature ?

Tout de suite, il y a de fortes chances que vous supposiez que LocalCryptos utilise des adresses multi-signature. Vous ne trouverez pas OP_CHECKMULTISIG dans le code.

Dans un script multi-signature, chaque signataire est partie à la transaction de dépense. Dans notre modèle, LocalCryptos n’a jamais à signer aucune partie de la transaction—même en cas de litige de paiement.

En véritable relation de pair à pair, nous ne sommes jamais un allié à aucune transaction. Parce que nous ne sommes pas un allié, il nous est impossible d’imposer des conditions de dépenses sur les escrows—comme comment et quand la partie qui reçoit peut dépenser de Bitcoin.

Notre mécanisme est particulièrement utile pour les échanges en personne. Les utilisateurs peuvent libérer Bitcoin de l’escrow sans avoir accès à Internet. Il sera possible de déclencher une validation en envoyant un SMS avec un code unique, ou en montrant un QR à l’acheteur. Plus là-dessus plus tard.

Génération et signature de clés en vrac

La première chose que vous faites lorsque vous créez un compte LocalCryptos est de générer beaucoup de clés aléatoires et de les signer. Bien sûr, cela se produit en arrière-plan—les utilisateurs ordinaires ne le remarqueront pas.

Ces clés éphémères se répartissent en trois catégories, dont deux sont pertinentes pour les escrows BTC.

Génération de clés de messagerie de bout en bout

La catégorie non apparentée de clés aléatoires créées lors de l’inscription est celle des clés de chiffrement de bout en bout. Ces clés permettent aux gens d’entamer des conversations cryptées avec vous lorsque vous êtes hors ligne. LocalCryptos emprunte cette idée aux populaires applications de messagerie cryptées secrètes comme Signal. Vous pouvez en apprendre plus à ce sujet dans le livre blanc original de LocalEthereum .

Generating wallet addresses

Lorsque vous générez une adresse Bitcoin dans votre portefeuille LocalCryptos non dépositaire, vous téléchargez également une version signée à LocalCryptos. Lorsque le portefeuille Web se configure lui-même, il crée et signe des centaines d’adresses Bitcoin.

Des copies cryptées de vos clés privées sont également téléchargées pour vous permettre de vous connecter à partir d’un autre appareil.

Le même processus se produit pour nos autres portefeuilles en ligne, y compris Ethereum.

Cela permet à d’autres personnes d’ouvrir des transactions avec vous et de placer des fonds en escrows, même lorsque vous n’êtes pas en ligne. Les utilisateurs vont chercher une de vos adresses chez nous, et vérifient la signature contre votre clé publique. Cela permet d’éviter le risque d’une attaque complexe de l’homme du milieu.

Génération de clés d’escrow

Les clés d’escrow sont uniques aux escrows Bitcoin, car le système d’escrow d’Ethereum est différent.

Les clés d’escrow sont des codes secrets de 32 octets que vous pouvez révéler plus tard. Vous générez un hachage du code secret (en utilisant hash160) et signez le hachage. Ensuite, vous téléchargez le code haché, la signature et un code secret crypté sur LocalCryptos.

Fonds en escrow

Pour mettre le BTC en escrow, le vendeur crée une transaction Bitcoin contenant deux sorties. Une sortie est pour le montant mis en escrow et l’autre pour les frais remboursables de LocalCryptos.

Avant de faire cela, le vendeur doit aller chercher quelques détails auprès de LocalCryptos :

  1. Les codes de clé d’escrow hachés de l’acheteur, de l’arbitre et du vendeur (leurs propres).
  2. Une signature de l’acheteur qu’ils peuvent utiliser pour authentifier le code de la clé d’escrow hachée.
  3. Une clé publique hachée de l’acheteur, ainsi que la leur.
  4. Une signature de l’acheteur pour vérifier que la clé publique appartient à l’acheteur.
  5. L’arbitre a haché la clé publique pour pouvoir envoyer un petit montant.

Le vendeur confirmera que chacune des signatures de l’acheteur est valide avant de procéder. Une signature incorrecte signifie qu’un pirate informatique a tenté de trafiquer l’escrow.

Sortie d’escrow

La sortie d’escrow, qui porte le montant pour l’acheteur, est une adresse P2SH-P2WSH pour le Scripte suivant :

OP_DUP OP_1 OP_EQUAL
OP_IF
  # Release by seller
  OP_DROP
  <BuyerPubKeyHash>
  <ReleaseCodeFromSellerHash>
OP_ELSE
  OP_DUP OP_2 OP_EQUAL
  OP_IF
    # Release by arbitrator
    OP_DROP
    <BuyerPubKeyHash>
    <ReleaseCodeFromArbitratorHash>
  OP_ELSE
    OP_DUP OP_3 OP_EQUAL
    OP_IF
      # Return by buyer
      OP_DROP
      <SellerPubKeyHash>
      <ReturnCodeFromBuyerHash>
    OP_ELSE
      OP_4 OP_EQUALVERIFY
      # Return by arbitrator
      <SellerPubKeyHash>
      <ReturnCodeFromArbitratorHash>
    OP_ENDIF
  OP_ENDIF
OP_ENDIF
OP_ROT
OP_HASH160
OP_EQUALVERIFY
OP_OVER
OP_HASH160
OP_EQUALVERIFY
OP_CHECKSIG

Frais de sortie

Le frais de sortie porte un montant de Bitcoin approximativement 1% de la taille de la transaction. LocalCryptos réclamera les frais si la transaction est réussie. Si il y a une annulation, le vendeur peut déverrouiller la sortie pour demander un remboursement complet.

La sortie des frais est une adresse P2SH-P2WSH pour le Script suivant :

OP_DUP OP_3 OP_EQUAL
OP_IF
  # Return by buyer
  OP_DROP
  OP_HASH160
  <ReturnCodeFromBuyerHash>
  OP_EQUALVERIFY
  OP_DUP
  OP_HASH160
  <SellerPubKeyHash>
  OP_EQUALVERIFY
  OP_CHECKSIG
OP_ELSE
  OP_DUP OP_4 OP_EQUAL
  OP_IF
    # Return by arbitrator
    OP_DROP
    OP_HASH160
    <ReturnCodeFromArbitratorHash>
    OP_EQUALVERIFY
    OP_DUP
    OP_HASH160
    <SellerPubKeyHash>
    OP_EQUALVERIFY
    OP_CHECKSIG
  OP_ELSE
    # Spend by LocalCryptos
    OP_DUP
    OP_HASH160
    <ArbitratorPubKeyHash>
    OP_EQUALVERIFY
    OP_CHECKSIG
  OP_ENDIF
OP_ENDIF

Attente pour les confirmations

LocalCryptos exige que la plupart des escrows Bitcoin aient au moins une confirmation de bloc. Les transactions plus importantes nécessitent jusqu’à six confirmations en fonction de la taille de la bourse.

Révéler un code secret

L’acheteur dispose déjà de l’une des deux entrées nécessaires pour débloquer la transaction d’escrow : leur propre clé publique. La seule pièce manquante est le code secret “releaseBySeller” du vendeur.

De même, le vendeur n’est qu’à une entrée de déverrouiller l’escrow. S’ils mettent la main sur le code secret “returnByBuyer” de l’acheteur, ils peuvent rappeler le montant en escrow.

L’arbitre conserve le code secret pour les clés d’escrow “releaseByArbitrator” et “returnByArbitrator”. En cas de litige de paiement, l’arbitre peut régler le différend en dévoilant l’un des secrets.

Ceci est le cœur du système d’escrow non dépositaire. Le script haché inclut le hachage de chaque code secret, mais pas la vraie chose.

Utiliser un code secret

Pour dépenser une sortie d’escrow, le destinataire doit compiler une signature avec les éléments suivants :

Les deux premiers éléments sont identiques à dépenser une P2PKH entrée, et les deux suivants sont uniques à LocalCryptos.

L’octet “action” indique au script quels hachages vérifier. Dans une transaction standard, l’acheteur utilise un code “libéré par le vendeur” (0x01). Si le premier élément est 0x01, le script attendra la clé publique de l’acheteur et le vendeur libère le code.

Il y a quatre actions d’escrow, représentant tous les scénarios d’un escrow :

Action Octet Code attendu PubKey attendu
LibérerParVendeur 0x01 Du vendeur De l’acheteur
LibérerParArbitre 0x02 De l’arbitre De l’acheteur
RembourserParAcheteur 0x03 De l’acheteur Du vendeur
RembourserParArbitre 0x04 De l’arbitre Du vendeur

Rappelant le frais de sortie

Dans le cas d’une annulation d’escrow, LocalCryptos ne facture pas un frais. Nous prenons seulement un frais si le Bitcoin va à l’acheteur.

Avec un code de remboursement d’escrow, la signature ci-dessus est également compatible avec les frais de sortie. Le vendeur peut dépenser le produit des frais de sortie de la même façon qu’il dépense un escrow rappelé UTXO.

Réglez quand vous dépensez

Cliquer sur “Libérer” dans un escrow Bitcoin de LocalCryptos ne change rien sur le blockchain. Il permet au destinataire de dépenser les pièces de l’escrow (c.-à-d. déverrouiller le UTXO).

La partie réceptrice peut choisir de dépenser ces pièces immédiatement ou d’attendre. Dans l’interface utilisateur, un escrow UTXO apparaîtra dans le portefeuille Web dans le portefeuille prochain de vos adresses régulières.

Après avoir dépensé les jetons, l’achèvement de l’escrow est gravé en permanence dans le blockchain.

Libération sans connexion Internet

Tout ce dont l’acheteur a besoin est le code secret du vendeur pour réclamer l’escrow.

Nous pouvons ajouter une méthode permettant à un vendeur de révéler son code sans connexion internet. Le code est trop long à écrire sur papier, mais c’est une longueur parfaite à stocker dans votre téléphone ou dans un code QR.

LocalCryptos va ajouter deux nouvelles façons de révéler un code :

**1. Révélez le code en l’envoyant par SMS à l’un de nos numéros de téléphone. ** Nos serveurs peuvent calculer le hachage du code pour identifier à quel trade il appartient, puis transmettre le code à l’acheteur.

2. Montrer un code QR à l’acheteur. L’acheteur n’a pas besoin d’Internet pour vérifier le code ; il n’a besoin que d’un logiciel qui peut calculer un hachage. Cette méthode permettra des échanges en personne lorsque ni l’un ni l’autre ne dispose d’une connexion Internet stable. Il sera utile au Venezuela, où les coupures de courant nationales sont fréquentes.

Nous travaillons sur la première option aujourd’hui. La deuxième option sera disponible lorsque nous sortirons l’application mobile LocalCryptos.

Comment ceci est sécurisé ?

Le meilleur supercalculateur ne peut pas briser une adresse standard P2PKH, qui utilise un seul hachage. L’espace clé d’un hash160 est de 160 bits. Nous utilisons deux hash160s : un pour la partie P2PKH et un pour le code secret haché. Ceci porte l’espace clé à 320 bits pour les attaques externes. (La mathématique est plus nuancée que ça, mais vous comprenez l’idée.)

Les adresses d’escrow Bitcoin de LocalCryptos sont—pour toutes fins pratiques—impossibles à cracker.

Combien ça coûte ?

Nous avons réduit les frais d’affiliation en passant au statut de témoin distinct. Cependant, le coût d’une transaction Bitcoin est souvent plus élevé que celui d’Ethereum.

Le coût d’un escrow Bitcoin dépend de la congestion du réseau. Pour les petites transactions de moins de 10 $, nous recommandons de choisir un autre crypto.

Est-ce la version finale ?

Ceci n’est probablement pas la version finale de l’escrow Bitcoin non dépositaire du LocalCryptos. Dans le futur, nous prévoyons d’optimiser le système en termes de coût et de rapidité.