Acquérir les compétences nécessaires pour comprendre et utiliser RGB
rgb développé par l'association LNP/BP. L’objectif est de montrer comment installer et utiliser la CLI, compiler un Schéma, importer l’Interface et son Implementation, puis émettre un actif RGB. Nous verrons également la logique sous-jacente, notamment la compilation et la validation de l’état. À l’issue de ce tutoriel, vous serez en mesure de reproduire la démarche et de créer vos propres contrats RGB.Rappels sur le protocole RGB
rgb constitue donc pour l’instant la référence officielle, même si elle demeure relativement brute de décoffrage.Installation et présentation de l’outil rgb en CLI
rgb. Elle est conçue pour rappeler l’usage de git, avec un ensemble de sous-commandes permettant de manipuler les contrats, les invoquer, émettre des assets, etc. Pour l’instant, la partie Bitcoin Wallet n’est pas encore intégrée, mais elle le sera dans la prochaine version (0.11). Cette mise à jour permettra de créer et gérer ses wallets (via des descriptors) directement depuis rgb, y compris de générer des PSBT, d’utiliser un matériel externe (comme un hardware wallet) pour la signature, et d’assurer l’interopérabilité avec des logiciels tels que Sparrow. L’ensemble du processus d’émission et de transfert d’actif deviendra grandement simplifié.Installation via Cargo
cargo install rgb-contracts --all-features
rgb-contracts, et la commande installée sera nommée rgb. S’il existait déjà un crate nommé rgb, il aurait pu y avoir collision, ce qui explique ce choix de dénomination.)rgb
rgb (sans argument) affiche la liste des sous-commandes disponibles, comme interfaces, schema, import, export, issue, invoice, transfer, etc. Il est possible de modifier le répertoire de stockage local (un stash contenant les consignments, schémas et implémentations), de choisir le réseau (testnet, mainnet) ou de configurer un server Electrum.Premier aperçu des commandes
RGB20 est déjà intégrée par défaut :rgb interfaces
git clone https://github.com/RGB-WG/rgb-interfaces
cargo run
rgb import interfaces/RGB20.rgb
rgb schemata
git clone https://github.com/RGB-WG/rgb-schemata
src/, plusieurs fichiers Rust (par exemple nia.rs) qui définissent des schémas (NIA pour "Non Inflatable Asset", UDA pour "Unique Digital Asset", etc.). On peut alors exécuter pour compiler :cd rgb-schemata cargo run
.rgb et .rgba qui correspondent aux schémas compilés. Par exemple, on peut y trouver NonInflatableAsset.rgb.Import du Schema et de l’Interface Implementation
rgb :rgb import schemata/NonInflatableAssets.rgb
rgb schemata
Création d’un contrat (issuing)
- Soit on utilise un script ou code en Rust qui construit un Contract en alimentant les champs du schéma (global state, Owned States, etc.) et produit un fichier
.rgbou.rgba; - Soit on utilise directement la sous-commande
issue, avec un fichier YAML (ou TOML) décrivant les propriétés du token.
examples qui illustrent comment on construit un ContractBuilder, on renseigne le global state (nom de l’actif, ticker, supply, date, etc.), on définit l’Owned State (à quel UTXO il est assigné), puis on compile tout cela en un contract consignment qu’on peut exporter, valider et importer dans un stash.ticker, le name, la supply, etc. Supposons que le fichier s’appelle RGB20-demo.yaml. On peut y spécifier :spec: ticker, nom, precision ;terms: un champ de mentions légales ;issuedSupply: le montant de token émis ;assignments: indique le Single-use Seal (seal definition) et la quantité débloquée.
interface: RGB20Fixed globals: spec: ticker: Plan ₿ Academy name: Plan ₿ Academy details: "Pay attention: the asset has no value" precision: 2 terms: text: > SUBJECT TO, AND WITHOUT IN ANY WAY LIMITING, THE REPRESENTATIONS AND WARRANTIES OF ANY SELLER. PROPERTY IS BEING SOLD “AS IS”... media: ~ issuedSupply: 100000000 assignments: assetOwner: seal: tapret1st:b449f7eaa3f98c145b27ad0eeb7b5679ceb567faef7a52479bc995792b65f804:1 amount: 100000000 # this is 1 million (we have two digits for cents)
rgb issue '<SchemaID>' ssi:<Issuer> rgb20-demo.yaml
RDYhMTR!9gv8Y2GLv9UNBEK1hcrCmdLDFk9Qd5fnO8k et je n'ai spécifié aucun issuer. Ma commande est donc :rgb issue 'RDYhMTR!9gv8Y2GLv9UNBEK1hcrCmdLDFk9Qd5fnO8k' ssi:anonymous rgb20-demo.yaml
rgb schemata
rgb contracts
Plan ₿ Academy définis dans l'UTXO b449f7eaa3f98c145b27ad0eeb7b5679ceb567faef7a52479bc995792b65f804:1).rgb state '<ContractId>'
Export, import et validation
rgb export '<ContractId>' myContractPBN.rgb
myContractPBN.rgb peut être transmis à un autre utilisateur, qui pourra l’ajouter à son stash avec la commande :rgb import myContractPBN.rgb
Importing consignment rgb". S’il s’agit d’un state transition consignment plus volumineux, la commande sera différente (rgb accept).rgb validate myContract.rgb
Utilisation du stash, vérification et affichage
import", on ajoute un élément au stash. On peut visualiser ce stash en détail avec la commande :rgb dump
Transfert et PSBT
Tapret ou Opret.Générer une invoice
- Alice (l'émettrice de l’invoice) ;
- Bob (qui reçoit et exécute l’invoice).
$ rgb invoice $CONTRACT -i $INTERFACE $ACTION $STATE $SEAL
$CONTRACT: l’identifiant du contrat (ContractId) ;$INTERFACE: l’interface à utiliser (par exempleRGB20) ;$ACTION: le nom de l’opération prévue dans l’interface (pour un simple transfert de token fongible, cela peut être "Transfer"). Si l'interface prévoit déjà une action par défaut, vous n'avez pas besoin de la renseigner de nouveau ici ;$STATE: la donnée d’état à transférer (par exemple un montant de tokens si on fait un transfert de token fongible) ;$SEAL: le Single-use Seal du bénéficiaire (Alice), c'est-à-dire une référence explicite vers un UTXO. Bob utilisera cette info pour construire la witness transaction, et l’output correspondant appartiendra ensuite à Alice (sous forme blinded UTXO ou en clair).
alice$ CONTRACT='iZgIN9EL-2H21UgQ-x!A3uJc-WwXhCSm-$9Lwcc1-v!mUkKY' alice$ MY_UTXO=4960acc21c175c551af84114541eace09c14d3a1bb184809f7b80916f57f9ef8:1 alice$ rgb invoice $CONTRACT -i RGB20 --amount 100 $MY_UTXO
rgb:iZgIN9EL-2H21UgQ-x!A3uJc-WwXhCSm-$9Lwcc1-v!mUkKY/RGB20/100+utxob:zlVS28Rb-...
Effectuer un transfert
- Bob, qui détient les tokens dans son stash, doit préparer une transaction Bitcoin (sous forme de PSBT, par ex.
tx.psbt) qui dépense les UTXOs contenant les tokens RGB nécessaires, ainsi qu’un UTXO destiné à la monnaie (change) ; - Bob exécute la commande suivante :
bob$ rgb transfer tx.psbt $INVOICE consignment.rgb
-
Cela génère un fichier
consignment.rgbcontenant :- L’historique des transitions prouvant à Alice que les tokens sont authentiques ;
- La nouvelle transition qui transfère les tokens vers le Single-use Seal d’Alice ;
- Une witness transaction (non signée).
-
Bob envoie ensuite ce fichier
consignment.rgbà Alice (par e-mail, serveur de partage, ou via un protocole RGB-RPC comme Storm, etc.) ; -
Alice reçoit
consignment.rgbet l’accepte dans son propre stash :
alice$ rgb accept consignment.rgb
- La CLI vérifie la validité de la transition et l’ajoute au stash d’Alice. En cas d’invalidité, la commande échoue avec des messages d’erreur détaillés. Sinon, elle réussit, et signale que la transaction témoin n’est pas encore diffusée sur le réseau Bitcoin (Bob attend le feu vert d’Alice) ;
- En confirmation, la commande
acceptrenvoie une signature (payslip) qu’Alice peut retourner à Bob pour lui prouver qu’elle a bien validé le consignment ; - Bob peut alors signer et publier (
--publish) sa transaction Bitcoin :
bob$ rgb check <sig> && wallet sign --publish tx.psbt
- Une fois la transaction confirmée on-chain, la propriété de l’actif est officiellement considérée comme transférée à Alice. Le wallet d’Alice, en surveillant le minage de la transaction, voit apparaître la nouvelle Owned State dans son stash.
Auteur
Ce tutoriel a été écrit par Loïc Morel
Vous pouvez dire merci en donnant un pourboire au professeur.
J'écris des contenus pédagogiques sur Bitcoin.
Crédits
Ce tutoriel a été relu par LoicPandul
Même si cette page est dans sa langue d'origine, une relecture humaine est toujours nécessaire pour garantir son exactitude.
LoicPandul1 479 sats740 satsChaque élément de contenu sur la plateforme est le produit d'un effort collaboratif : chaque leçon, traduction et révision est rendue possible grâce au travail des contributeurs. C'est pour cette raison que nous sommes toujours à la recherche de correcteurs qui peuvent examiner notre contenu dans un grand nombre de langues. Si vous souhaitez participer au processus de relecture, veuillez nous rejoindre dans notre groupe Telegram et consulter notre tutoriel. Nous vous rappelons que ce contenu est open-source - sous licence CC BY-SA - et peut donc être partagé et utilisé librement, à condition que la source originale soit reconnue.


