Est-il possible d'utiliser Bitcoin Script pour implémenter un script de verrouillage résistant aux quantiques et à partir duquel il serait possible de dépenser en toute sécurité ?

Avec la version actuelle de Bitcoin Script, cela n'est pas possible. Cependant, avec quelques mises à niveau du ScriptVM de Bitcoin, cela deviendrait possible, les conditions préalables sont :

  • Un moyen de s'engager sur les sorties de la transaction (par exemple OP_CHECKTEMPLATEVERIFY ou opcodes d'introspection TX + OP_CAT)
  • Un moyen de diviser et de concaténer des éléments de pile (OP_CAT et OP_SPLIT)
  • Un moyen pour les entrées de se "voir" (opcodes d'introspection)

Avec cela, on pourrait coder un hash-lock mais avec une exigence supplémentaire : une autre entrée doit révéler un ancien engagement envers (prévout + contenu de sortie du TX). C'est quelque chose que seule la personne qui connaît le secret serait capable de produire avant de révéler le secret. Une fois qu'il aura dépensé le contrat, il le révélera, mais il aura déjà l'engagement âgé et d'autres ne pourront pas voler ses fonds. Une fois publiée sur Mempool, la sécurité dépendrait de l'extraction des dépenses TX avant qu'un attaquant puisse vieillir un engagement alternatif et publier une dépense alternative TX.

Une preuve de concept pour un tel contrat existe pour Bitcoin Cash (BCH), un fork blockchain de Bitcoin (BTC) qui a mis à niveau le ScriptVM avec les primitives L1 requises en '18 (OP_CAT & OP_SPLIT) et '22 (opcodes d'introspection) mises à niveau du réseau.

Le script de rachat "lock", placé sur l'UTXO qui détiendrait le solde

(Remarque : il n'y a pas de données de déverrouillage, le script de déverrouillage de l'entrée n'est que le push du script d'échange)

// sha256(one_time_secret + commit_script_tail) // script d'entrée associé à la tranche OP_INPUTINDEX OP_1ADD OP_INPUTBYTECODE OP_SPLIT OP_SWAP OP_ SPLIT OP_SPLIT OP_SPLIT OP_SPLIT OP_SPLIT OP_SPLIT // vérifier sha256 (one_time_secret + commit_script_tail) OP_ROLL OP_SWAP OP_CAT OP_SHA256 OP_ROLL OP_EQUALVERIFY // vérifie le format de la tête du script d'entrée Q a OP_WITHIN OP_VERIFY Q a OP_WITHIN OP_VERIFY OP_SIZE OP_EQUALVERIFY OP_DROP OP_EQUALVERIFY OP_ÉQUAL

Le script de rachat "commit", placé sur l'UTXO qui révélerait l'ancien engagement

(remarque : les données de déverrouillage ne sont que le one_time_secret)

// sha256 (associated_outpoint + one_time_secret + {3 premières sorties}) // age_reveal // age_cleanup OP_DEPTH OP_LESSTHAN // if aucun secret n'est fourni, alors il s'agit d'une dépense de nettoyage OP_IF // une fois que le script de rachat est révélé et que utxo a vieilli au-delà de age_cleanup, // n'importe quel mineur peut réclamer la poussière pour lui-même // vérifie age_cleanup OP_CHECKSEQUENCEVERIFY OP_DROP OP_2DROP // sinon c'est une dépense de révélation OP_ELSE // abandonne age_cleanup, pas nécessaire ici OP_DROP // vérifie age_spend OP_CHECKSEQUENCEVERIFY OP_DROP // récupère le point de sortie associé au sommet de la pile OP_INPUTINDEX OP_1SUB OP_DUP OP_OUTPOINTTXHASH OP_SWAP OP_OUTPOINTINDEX OP_CAT // récupère one_time_secret au sommet de la pile et concatène OP_ROT OP_CAT // concatène les sorties 00 [& 01 [& 02]] OP_OUTPUTVALUE OP_CAT OP_OUTPUTTOKENCATEGORY OP_CAT OP_OUTPUTTOKENCOMMITMENT OP_CAT OP_OUTPUTTOKENAMOUNT OP_CAT OP_OUTPUTBYTECODE OP_CAT OP_TXOUTPUTCOUNT OP_GREATERTHANOREQUAL OP_IF OP_OUTPUTVALUE OP_CAT OP_OUTPUTTOKENC ATEGORY OP_CAT OP_OUTPUTTOKENCOMMITMENT OP_CAT OP_OUTPUTTOKENAMOUNT OP_CAT OP_OUTPUTBYTECODE OP_CAT OP_ENDIF OP_TXOUTPUTCOUNT OP_GREATERTHANOREQUAL OP_IF OP_OUTPUTVALUE OP_CAT OP_OUTPUTTOKENCATEGORY OP_CAT OP_OUTPUTTOKENCOMMITMENT OP_CAT OP_OUTPUTTOKENAMOUNT OP_CAT OP_OUTPUT BYTECODE OP_CAT OP_ENDIF OP_SHA256 // vérification par rapport au pré-engagement intégré OP_EQUALVERIFY OP_ENDIF OP_1

Les contrats peuvent être chargés dans le débogueur BitAuthIDE en utilisant ce lien.

Les contrats ont été dépensés avec succès depuis le réseau principal du BCH :

Cette preuve de concept a été publiée pour la première fois ici