Create a virtual machine

Vérifier ma progression

/ 10

Install the EOSIO platform on the virtual machine

Vérifier ma progression

/ 10

Create a default wallet

Vérifier ma progression

/ 10

Add the private key of the eosio system account to the wallet

Vérifier ma progression

/ 10

Install the EOSIO Contract Development Toolkit

Vérifier ma progression

/ 10

Build the system contracts and eosio.boot

Vérifier ma progression

/ 10

Start boot node and create system accounts

Vérifier ma progression

/ 10

Create and deploy the eosio.token, eosio.msig contracts, and SYS token

Vérifier ma progression

/ 10

Deploy eosio.boot and eosio.system contracts

Vérifier ma progression

/ 10

Create the block producer accounts

Vérifier ma progression

/ 5

Transition from single node producer to multi node producers

Vérifier ma progression

/ 5

Cet atelier peut intégrer des outils d'IA pour vous accompagner dans votre apprentissage.

Nous avons développé cet atelier avec notre partenaire Block.one. Vos informations personnelles pourront être partagées avec Block.one, le collaborateur d'atelier, si vous avez accepté de recevoir des actualités sur les produits, des annonces et des offres sur la page de profil de votre compte.

GSP991

Google Cloud – Ateliers d'auto-formation

Présentation

Dans cet atelier, vous allez étendre la blockchain EOSIO à nœud unique pour utiliser plusieurs nœuds. Vous allez installer différents composants logiciels EOSIO pour configurer votre blockchain EOSIO multinœuds. Enfin, vous effectuerez certaines tâches d'opérateur de nœud sur votre nouvelle blockchain EOSIO.

Objectifs

Dans cet atelier, vous apprendrez à effectuer les tâches suivantes :

  • Charger une machine virtuelle Compute Engine existante
  • Installer et compiler les contrats système EOSIO
  • Déployer une blockchain multinœuds avec quatre (4) nœuds EOSIO
  • Créer des comptes utilisateur sur la blockchain EOSIO multinœuds
  • Appeler une action pour transférer des jetons entre des comptes utilisateur

Prérequis

Avant de commencer cet atelier, nous vous suggérons de suivre l'atelier intitulé Block.one : premiers pas avec la blockchain EOSIO.

Il est également recommandé de se familiariser avec les concepts suivants :

Préparation

Avant de cliquer sur le bouton "Démarrer l'atelier"

Lisez ces instructions. Les ateliers sont minutés, et vous ne pouvez pas les mettre en pause. Le minuteur, qui démarre lorsque vous cliquez sur Démarrer l'atelier, indique combien de temps les ressources Google Cloud resteront accessibles.

Cet atelier pratique vous permet de suivre les activités dans un véritable environnement cloud, et non dans un environnement de simulation ou de démonstration. Des identifiants temporaires vous sont fournis pour vous permettre de vous connecter à Google Cloud le temps de l'atelier.

Pour réaliser cet atelier :

  • Vous devez avoir accès à un navigateur Internet standard (nous vous recommandons d'utiliser Chrome).
Remarque : Ouvrez une fenêtre de navigateur en mode incognito (recommandé) ou de navigation privée pour effectuer cet atelier. Vous éviterez ainsi les conflits entre votre compte personnel et le compte temporaire de participant, qui pourraient entraîner des frais supplémentaires facturés sur votre compte personnel.
  • Vous disposez d'un temps limité. N'oubliez pas qu'une fois l'atelier commencé, vous ne pouvez pas le mettre en pause.
Remarque : Utilisez uniquement le compte de participant pour cet atelier. Si vous utilisez un autre compte Google Cloud, des frais peuvent être facturés à ce compte.

Démarrer l'atelier et se connecter à la console Google Cloud

  1. Cliquez sur le bouton Démarrer l'atelier. Si l'atelier est payant, une boîte de dialogue s'affiche pour vous permettre de sélectionner un mode de paiement. Sur la droite, vous trouverez le panneau Préparation et accès à l'atelier, qui contient les éléments suivants :

    • Le bouton Ouvrir la console Google Cloud
    • Les identifiants temporaires (nom d'utilisateur et mot de passe) que vous devez utiliser pour cet atelier
    • Des informations complémentaires vous permettant d'effectuer l'atelier, si nécessaire

    Notez que le minuteur de l'atelier se trouve en haut de la page et indique le temps restant.

  2. Cliquez sur Ouvrir la console Google Cloud (ou effectuez un clic droit et sélectionnez Ouvrir le lien dans une fenêtre en navigation privée si vous utilisez Chrome).

    L'atelier lance les ressources, puis ouvre la page "Se connecter" dans un nouvel onglet.

    Conseil : Réorganisez les onglets dans des fenêtres distinctes, placées côte à côte.

    Remarque : Si la boîte de dialogue Sélectionner un compte s'affiche, cliquez sur Utiliser un autre compte.
  3. Si nécessaire, copiez le nom d'utilisateur ci-dessous et collez-le dans la boîte de dialogue Se connecter.

    {{{user_0.username | "Username"}}}

    Vous trouverez également le nom d'utilisateur dans le panneau Préparation et accès à l'atelier.

  4. Cliquez sur Suivant.

  5. Copiez le mot de passe ci-dessous et collez-le dans la boîte de dialogue Bienvenue.

    {{{user_0.password | "Password"}}}

    Vous trouverez également le mot de passe dans le panneau Préparation et accès à l'atelier.

  6. Cliquez sur Suivant.

    Important : Vous devez utiliser les identifiants fournis pour l'atelier. N'utilisez pas les identifiants de votre compte Google Cloud. Remarque : Si vous utilisez votre propre compte Google Cloud pour cet atelier, des frais supplémentaires pourront vous être facturés.
  7. Accédez aux pages suivantes :

    • Acceptez les conditions d'utilisation.
    • N'ajoutez pas d'options de récupération ni d'authentification à deux facteurs (ce compte est temporaire).
    • Ne vous inscrivez pas à des essais sans frais.

Après quelques instants, la console Cloud s'ouvre dans cet onglet.

Remarque : Pour accéder aux produits et services Google Cloud, cliquez sur le menu de navigation ou saisissez le nom du service ou du produit dans le champ Recherche. Icône du menu de navigation et champ de recherche

Contexte

Cette section présente les concepts abordés dans cet atelier.

Blockchain EOSIO

Une blockchain EOSIO est une machine à états distribuée, déterministe et très efficace, qui peut fonctionner de manière décentralisée. La blockchain assure le suivi des transactions dans une séquence de blocs interdépendants. Chaque bloc s'engage de manière cryptographique envers les blocs précédents de la même chaîne. Il est par conséquent impossible de modifier une transaction enregistrée dans un bloc donné sans compromettre les contrôles cryptographiques de la suite de blocs. Ce simple fait rend les transactions de blockchain immuables et sécurisées. La production et la validation des blocs sont effectuées par des nœuds spéciaux appelés "producteurs de blocs".

Consensus EOSIO

La validation des blocs constitue un défi pour tout groupe de nœuds distribués. Un modèle de consensus doit être en place pour que ces blocs puissent être validés avec prise en charge de la tolérance aux pannes dans le système décentralisé. Le consensus est la façon dont ces nœuds et utilisateurs distribués s'accordent sur l'état actuel de la blockchain. Deux des modèles de consensus les plus courants utilisés dans les blockchains sont la preuve de travail (PoW) et la preuve d'enjeu (PoS). Dans la preuve d'enjeu, les nœuds qui détiennent la plus grande part ou le plus grand pourcentage d'un asset ont un pouvoir de décision équivalent. Une variante intéressante est la preuve d'enjeu déléguée (DPoS, Delegated Proof-of-Stake), dans laquelle un grand nombre de participants ou de parties prenantes élisent un nombre restreint de délégués, lesquels sont chargés de prendre des décisions pour le groupe. EOSIO utilise le mécanisme de preuve d'enjeu déléguée (DPoS) pour élire les producteurs actifs qui seront ensuite autorisés à produire des blocs, à les valider et à les signer pour qu'ils soient in fine ajoutés à la blockchain.

Comptes, clés et autorisations EOSIO

Un compte identifie un participant dans une blockchain EOSIO. Un participant peut être une personne ou un groupe, selon les autorisations attribuées dans le compte. Les comptes représentent également les acteurs en charge des contrats intelligents, qui envoient et reçoivent des actions vers et depuis d'autres comptes de la blockchain. Dans EOSIO, les clés sont des chaînes binaires représentées en Base58 qui sont utilisées pour signer et valider les transactions, les blocs et d'autres messages. Les clés sont créées dans un portefeuille numérique associé à un compte. Comme la propriété d'un compte est définie uniquement par le nom du compte, les clés associées à un compte peuvent être mises à jour sans que la sécurité soit compromise. Un nouveau mécanisme d'autorisation impliquant des comptes, des autorisations et des tables d'autorité détermine ce que les comptes peuvent faire et comment les actions constituant une transaction sont autorisées. Pour cela, chaque compte se voit attribuer une structure d'autorisations hiérarchique, et chaque autorisation est associée à une paire de clés (publique/privée) utilisée pour la signature et la validation.

Contrats intelligents EOSIO

Un contrat intelligent est une bibliothèque logicielle de bas niveau qui contient l'implémentation des actions qui constituent une transaction. Il définit également la manière dont sont stockées les données auxquelles les actions accèdent et qu'elles traitent. Dans EOSIO, un contrat intelligent est implémenté dans un langage de haut niveau tel que C++, et compilé dans un binaire WebAssembly (WASM). Ensuite, les contrats intelligents peuvent être déployés et exécutés dans le bac à sable d'un compte sur la blockchain.

Tâche 1 : Créer une machine virtuelle

  1. Dans le menu de navigation (Icône du menu de navigation), cliquez sur Compute Engine > Instances de VM.

  2. Pour créer une instance, cliquez sur Créer une instance.

  3. Accédez à la section Configuration de la machine.

    Sélectionnez les valeurs suivantes :

    • Nom : instance-1
    • Région :
    • Zone :
    • Famille de machines : Usage général (par défaut)
    • Série : E2
    • Type de machine : e2-standard-2 (2 vCPU, 8 Go de mémoire)
  4. Cliquez sur OS et stockage.

    Cliquez sur Modifier pour commencer à configurer le disque de démarrage et sélectionnez les valeurs suivantes :

    • Système d'exploitation : Ubuntu
    • Version : Ubuntu 22.04 LTS
    • Architecture : x86/64

    Cliquez sur Sélectionner.

  5. Pour créer et démarrer la VM, cliquez sur Créer.

Remarque : Il faut environ deux minutes pour que la VM démarre et que vous puissiez l'utiliser.

Cliquez sur Vérifier ma progression pour valider l'objectif. Créer une machine virtuelle

Tâche 2 : Installer la plate-forme EOSIO

  1. Dans le menu de navigation (Icône du menu de navigation), cliquez sur Compute Engine > Instances de VM.

L'instance de VM que vous avez créée s'affiche.

  1. Pour ouvrir une fenêtre de ligne de commande pour l'instance de VM instance-1, repérez la ligne correspondante dans la liste Instances de VM et cliquez sur SSH. Une fenêtre de terminal shell s'ouvre.

  2. Tout d'abord, mettez à jour la liste des packages logiciels dans votre VM :

sudo apt update
  1. Installez la dépendance libssl1.1. Elle est requise pour EOSIO 2.1.0, mais n'est pas incluse dans Ubuntu 22.04+ par défaut :
wget http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.24_amd64.deb sudo apt install ./libssl1.1_1.1.1f-1ubuntu2.24_amd64.deb
  1. Obtenez les binaires logiciels EOSIO. Cette liste inclut nodeos, le logiciel de nœud P2P, cleos, le client CLI, keosd, le gestionnaire de portefeuille, ainsi que d'autres outils :
curl -LO https://github.com/eosio/eos/releases/download/v2.1.0/eosio_2.1.0-1-ubuntu-20.04_amd64.deb
  1. Installez les binaires logiciels EOSIO. Appuyez sur Entrée si nécessaire pour installer les dépendances logicielles requises :
sudo apt install ./eosio_2.1.0-1-ubuntu-20.04_amd64.deb
  1. Vérifiez que nodeos est installé :
nodeos --version

La réponse renvoyée indique la version de nodeos :

v2.1.0
  1. Vérifiez que cleos est installé :
cleos version client

La réponse renvoyée indique la version de cleos :

v2.1.0
  1. Vérifiez que keosd est installé :
keosd -v

La réponse renvoyée indique la version de keosd :

v2.1.0

Cliquez sur Vérifier ma progression pour valider l'objectif. Installer la plate-forme EOSIO

Tâche 3 : Créer un portefeuille par défaut

Les portefeuilles stockent les clés cryptographiques utilisées par les comptes et les producteurs pour signer respectivement les transactions et les blocs. Ils fournissent également une enclave sécurisée pour effectuer la signature, de sorte que les clés privées ne quittent jamais le portefeuille. Pour modifier l'état sur la blockchain, vous avez besoin d'un portefeuille pour stocker les clés cryptographiques et effectuer la signature numérique.

  1. Commencez par définir un délai d'expiration du déverrouillage important pour tout portefeuille géré par keosd, le gestionnaire de portefeuille EOSIO :
keosd --unlock-timeout 999999999 &

Cela vous évitera d'avoir à déverrouiller le portefeuille toutes les 15 minutes (délai d'expiration par défaut). Cette action démarre également le service du daemon keosd. La réponse devrait ressembler à ceci :

info thread-0 wallet_plugin.cpp:38 plugin_initialize ] initializing wallet plugin info thread-0 wallet_api_plugin.cpp:84 plugin_startup ] starting wallet_api_plugin info thread-0 http_plugin.cpp:983 add_handler ] add api url: /v1/wallet/create ... info thread-0 http_plugin.cpp:983 add_handler ] add api url: /v1/wallet/unlock info thread-0 http_plugin.cpp:983 add_handler ] add api url: /v1/node/get_supported_apis

Si nécessaire, appuyez sur Entrée pour revenir à l'invite shell.

  1. Créez un portefeuille par défaut et enregistrez le mot de passe du portefeuille dans un fichier nommé my_wallet_password :
cleos wallet create --file my_wallet_password

Cette commande crée un portefeuille nommé default. La réponse doit ressembler à ceci :

Creating wallet: default Save password to use in the future to unlock this wallet. Without password imported keys will not be retrievable. saving password to my_wallet_password

Une fois le portefeuille créé, keosd l'ouvre et le déverrouille par défaut.

  1. Pour afficher tous les portefeuilles gérés, exécutez la commande suivante :
cleos wallet list

La réponse doit ressembler à ceci :

Wallets: [ "default *" ]

L'astérisque à côté du nom du portefeuille indique qu'il est déverrouillé.

Cliquez sur Vérifier ma progression pour valider l'objectif. Créer un portefeuille par défaut

Tâche 4 : Ajouter la clé privée du compte système EOSIO au portefeuille

Chaque nouvelle blockchain EOSIO possède un compte système par défaut appelé eosio. Ce compte est utilisé pour la configuration initiale de la blockchain. Par défaut, il est associé à la clé privée suivante : 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3.

Importez cette clé privée dans votre portefeuille pour signer des transactions au nom du compte eosio.

  1. Utilisez la commande cleos wallet open pour ouvrir le portefeuille default. Notez que le portefeuille est déjà ouvert et déverrouillé. Dans le cas où le portefeuille est à nouveau verrouillé, vous devez effectuer la procédure suivante :
cleos wallet open

La réponse doit ressembler à ceci :

Opened: default
  1. Pour déverrouiller le portefeuille default, utilisez la commande cleos wallet unlock en transmettant le mot de passe du portefeuille stocké dans le fichier my_wallet_password :
cleos wallet unlock <my_wallet_password

La réponse doit ressembler à ceci :

password: Unlocked: default
  1. Utilisez la commande cleos wallet import pour importer la clé privée eosio, 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 dans le portefeuille default :
cleos wallet import --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

La réponse doit ressembler à ceci :

imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV

Il s'agit de la clé publique correspondant à la clé privée importée. Ignorez les avertissements concernant l'utilisation d'un portefeuille par défaut. Dans les déploiements de production, vous pouvez choisir d'attribuer un nom à votre portefeuille au lieu d'utiliser le nom default.

Cliquez sur Vérifier ma progression pour valider l'objectif. Ajouter la clé privée du compte système eosio au portefeuille

Tâche 5 : Installer le kit d'outils de développement de contrats EOSIO (CDT)

Le kit d'outils EOSIO CDT inclut le compilateur CDT C++, que vous pouvez utiliser pour créer les contrats système et, dans un second temps, vos propres contrats intelligents C++. Les contrats système sont très importants, car ils activent la fonctionnalité logicielle de deuxième couche, laquelle permet l'ajout et la prise en charge de fonctionnalités supplémentaires.

  1. Commencez par installer le package build-essential. Ce package contient divers outils nécessaires à la compilation de logiciels C/C++ sur votre machine Linux.
sudo apt install build-essential
  1. Obtenez les binaires EOSIO CDT :
curl -LO https://github.com/eosio/eosio.cdt/releases/download/v1.8.1/eosio.cdt_1.8.1-1-ubuntu-18.04_amd64.deb
  1. Installez les binaires EOSIO CDT :
sudo apt install ./eosio.cdt_1.8.1-1-ubuntu-18.04_amd64.deb
  1. Vérifiez que le compilateur EOSIO CDT est installé :
eosio-cpp --version

La réponse renvoyée doit correspondre à la version du compilateur EOSIO CDT :

eosio-cpp version 1.8.1

Cliquez sur Vérifier ma progression pour valider l'objectif. Installer le kit de développement de contrats EOSIO

Tâche 6 : Compiler les contrats système et eosio.boot

Pour disposer d'une blockchain EOSIO multinœuds fonctionnelle, vous devez déployer les contrats système EOSIO. Entre autres, les contrats système fournissent la fonctionnalité de couche 2 requise pour le consensus EOSIO, la possibilité de mettre en jeu (staking) des jetons, de voter, de créer vos propres jetons, etc. Ils permettent également la prise en charge de nouvelles fonctionnalités.

  1. Installez CMake, une dépendance logicielle utilisée par le script de compilation eosio.contracts :
sudo apt install cmake
  1. Téléchargez le dernier système eosio.contracts :
git clone https://github.com/EOSIO/eosio.contracts.git \ --branch release/1.9.x --single-branch
  1. Compilez le système eosio.contracts. Lors de cette étape, vous devez également transmettre les répertoires d'installation d'eosio et d'eosio.cdt.
cd eosio.contracts ./build.sh -e /usr/opt/eosio/2.1.0 -c /usr/opt/eosio.cdt/1.8.1 cd ~

Ignorez les avertissements concernant les contrats de type ricardian manquants, le cas échéant. La réponse devrait ressembler à ceci (sans les avertissements) :

Using EOSIO.CDT installation at: /usr/opt/eosio.cdt/1.8.1 =========== Building eosio.contracts =========== ... -- Building eosio.contracts v1.9.2 ... -- Unit tests will not be built. To build tests, set BUILD_TESTS to true. -- Configuring done -- Generating done -- Build files have been written to: ./eosio.contracts/build [ 11%] Performing build step for 'contracts_project' [ 18%] Built target eosio.bios [ 18%] Built target eosio.msig [ 36%] Built target powup.results [ 36%] Built target rex.results [ 54%] Built target eosio.token [ 90%] Built target eosio.system [100%] Built target eosio.wrap [ 22%] No install step for 'contracts_project' [ 33%] No test step for 'contracts_project' [ 44%] Completed 'contracts_project' [100%] Built target contracts_project`

Notez l'emplacement où les contrats système EOSIO sont créés. Vous en aurez besoin plus tard lors du déploiement de contrats système spécifiques : ~/eosio.contracts/build/contracts.

  1. Compilez le contrat système eosio.boot :
git clone https://github.com/EOSIO/eos.git \ --branch release/2.1.x --single-branch cd eos/contracts/contracts/eosio.boot cmake . make cd ~

Ignorez les avertissements. La réponse doit ressembler à ceci :

-- Configuring done -- Generating done -- Build files have been written to: ~/eos/contracts/contracts/eosio.boot
  1. Notez l'emplacement où le contrat eosio.boot est créé. Vous devrez le déployer ultérieurement : ~/eos/contracts/contracts/eosio.boot.

Cliquez sur Vérifier ma progression pour valider l'objectif. Compiler les contrats système et eosio.boot

Tâche 7 : Lancer le nœud de démarrage et créer des comptes système

Dans cette tâche, vous allez lancer le nœud "Genesis" de démarrage et créer les comptes système. Contrairement à la création d'un portefeuille, la création d'un compte nécessite d'envoyer une transaction à la blockchain.

Par conséquent, il est nécessaire qu'au moins le nœud de démarrage soit en cours d'exécution. À cette fin, vous devez d'abord créer le répertoire de données et le fichier genesis qui seront utilisés par tous les nœuds. Dans un environnement de production, chaque nœud est hébergé sur son propre serveur et utilise ses propres ressources. Ici, vous allez déployer tous les nœuds dans la même machine.

  1. Créez des nœuds de répertoire. C'est là que seront stockés la base de données blockchain, le fichier journal et le fichier de configuration de chaque nœud.
mkdir nodes
  1. Créez le fichier genesis.json par défaut dans le répertoire nodes :
cat >nodes/genesis.json
  1. Copiez le contenu JSON suivant, collez-le dans le terminal, appuyez sur Entrée, puis sur Ctrl+D pour enregistrer le fichier genesis.json :
{ "initial_timestamp": "2018-06-01T12:00:00.000", "initial_key": "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV", "initial_configuration": { "max_block_net_usage": 1048576, "target_block_net_usage_pct": 1000, "max_transaction_net_usage": 524288, "base_per_transaction_net_usage": 12, "net_usage_leeway": 500, "context_free_discount_net_usage_num": 20, "context_free_discount_net_usage_den": 100, "max_block_cpu_usage": 200000, "target_block_cpu_usage_pct": 1000, "max_transaction_cpu_usage": 150000, "min_transaction_cpu_usage": 100, "max_transaction_lifetime": 3600, "deferred_trx_expiration_window": 600, "max_transaction_delay": 3888000, "max_inline_action_size": 524288, "max_inline_action_depth": 4, "max_authority_depth": 6 }, "initial_chain_id": "0000000000000000000000000000000000000000000000000000000000000000" }

La valeur "initial_key" correspond à la clé publique de développement initiale utilisée par le compte eosio. Si nécessaire, vous pouvez remplacer la clé de développement par votre propre clé. Cette approche est recommandée pour les déploiements de production. Une telle clé doit exister dans le portefeuille utilisé par le compte eosio. Vous avez importé cette clé dans une section précédente.

  1. Vérifiez que le fichier genesis.json a bien été créé et rempli :
cat nodes/genesis.json

Vous devriez voir le même contenu qu'à l'étape précédente.

  1. Créez le répertoire de nœud de démarrage nodes/00-boot pour stocker toutes les données de blockchain associées au nœud de démarrage :
mkdir nodes/00-boot
  1. Pour lancer le nœud de démarrage, démarrez le daemon du service nodeos en tant que tâche d'arrière-plan, en redirigeant stdout/stderr vers le fichier 00-boot/00.log :
nodeos \ --plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::chain_plugin --plugin eosio::producer_api_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::net_api_plugin \ --contracts-console \ --max-transaction-time=200 \ --chain-state-db-size-mb 1024 \ --enable-stale-production \ --producer-name eosio \ --genesis-json ~/nodes/genesis.json \ --blocks-dir ~/nodes/00-boot/blocks \ --config-dir ~/nodes/00-boot \ --data-dir ~/nodes/00-boot \ --http-server-address 127.0.0.1:8888 \ --p2p-listen-endpoint 127.0.0.1:9876 \ --signature-provider EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 \ >>~/nodes/00-boot/00.log 2>&1 &

Le nœud de démarrage est alors lancé avec certains plug-ins, le nom de producteur eosio, une écoute sur le port HTTP 8888, le port P2P 9876, à l'aide des clés de développement par défaut EOS6MRy.... 5KQwrP... pour la signature de blocs. Si elles ne sont pas remplacées par une autre valeur --signature-provider, les clés de développement eosio par défaut sont utilisées.

  1. Vérifiez que le nœud de démarrage est en cours d'exécution et produit des blocs :
tail -f nodes/00-boot/00.log

Le résultat doit être semblable à ce qui suit.

Résultat :

... info 2021-03-08T02:44:11.900 nodeos producer_plugin.cpp:2333 produce_block ] Produced block e0dc6324ce3c8f35... #588 @ 2021-03-08T02:44:12.000 signed by eosio [trxs: 0, lib: 587, confirmed: 0]

La dernière ligne indique le numéro du dernier bloc généré ainsi que le dernier bloc irréversible (lib) actuel, qui marque le bloc final et la fin de la blockchain.

  1. Appuyez sur Ctrl+C pour quitter le programme tail.

  2. Maintenant que le nœud de démarrage est en cours d'exécution, vous pouvez obtenir des informations sur le compte eosio stocké dans la base de données de la chaîne :

cleos get account eosio

La réponse doit ressembler à ceci :

created: 2018-06-01T12:00:00.000 privileged: true permissions: owner 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV active 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV memory: quota: unlimited used: 2.66 KiB net bandwidth: used: unlimited available: unlimited limit: unlimited cpu bandwidth: used: unlimited available: unlimited limit: unlimited

Notez que le compte eosio est bien un compte privilégié, et que les clés associées aux autorisations owner (propriétaire) et active (actif) sont les clés de développement par défaut qui ont été importées dans le portefeuille. Cela permet au compte eosio d'autoriser les transactions lors de la configuration de la blockchain multinœuds.

  1. Créez des comptes système supplémentaires. Ces comptes seront également stockés dans la base de données de la blockchain.
cleos create account eosio eosio.bpay EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV cleos create account eosio eosio.msig EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV cleos create account eosio eosio.names EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV cleos create account eosio eosio.ram EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV cleos create account eosio eosio.ramfee EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV cleos create account eosio eosio.saving EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV cleos create account eosio eosio.stake EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV cleos create account eosio eosio.token EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV cleos create account eosio eosio.vpay EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV cleos create account eosio eosio.rex EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV

Vous attribuez la même paire de clés de développement à tous les comptes système, ainsi qu'aux autorisations owner et active. Dans les déploiements de production, vous devez attribuer une paire de clés différente à chaque autorisation pour renforcer la sécurité. Vous pouvez également utiliser des clés différentes pour chaque compte système.

La réponse aux commandes ci-dessus doit ressembler à ceci :

executed transaction: 98f22027c6703e554042b1d4a93beb70b1dc30be0fe65267932155c9d70e6493 200 bytes 153 us # eosio &lt;= eosio::newaccount {"creator":"eosio","name":"eosio.bpay","owner":{"threshold":1,"keys":[{"key":"EOS6MRyAjQq8ud7hVNYcfn... warning: transaction executed locally, but may not be confirmed by the network yet ] ... executed transaction: 2f0cb00110374976f3cd9195bccac81fe0ee330c515b4a656d6d41f6181f636d 200 bytes 189 us # eosio &lt;= eosio::newaccount {"creator":"eosio","name":"eosio.rex","owner":{"threshold":1,"keys":[{"key":"EOS6MRyAjQq8ud7hVNYcfnV... warning: transaction executed locally, but may not be confirmed by the network yet ]

Ignorez les avertissements. Vous utiliserez ces comptes dans les prochaines tâches.

Cliquez sur Vérifier ma progression pour valider l'objectif. Compiler les contrats système et eosio.boot

Tâche 8 : Déployer les contrats eosio.token et eosio.msig, et créer/mettre en circulation le jeton SYS

Dans cette tâche, vous allez créer et émettre un jeton SYS fictif. À cette fin, vous devrez également déployer les contrats système eosio.token et eosio.msig créés précédemment.

  1. Déployez le contrat eosio.token. Ce contrat vous permet de créer des jetons, d'en émettre et de transférer des jetons nouveaux ou existants.
cleos set contract eosio.token ~/eosio.contracts/build/contracts/eosio.token/

La réponse doit ressembler à ceci :

Reading WASM from ~/eosio.contracts/build/contracts/eosio.token/eosio.token.wasm... Publishing contract... executed transaction: 11aca7fb68e0821cf8f74be0188741964787f830d0918abdfccae4a54c25e291 19360 bytes 4445 us # eosio &lt;= eosio::setcode {"account":"eosio.token","vmtype":0,"vmversion":0,"code":"0061736d010000000180022860000060037f7f7f01... # eosio &lt;= eosio::setabi {"account":"eosio.token","abi":"0e656f73696f3a3a6162692f312e320008076163636f756e7400010762616c616e63...
  1. Déployez le contrat eosio.msig. Ce contrat active le processus de signature multiple entre les comptes et simplifie la gestion des autorisations.
cleos set contract eosio.msig ~/eosio.contracts/build/contracts/eosio.msig/

La réponse doit ressembler à ceci :

Reading WASM from ~/eosio.contracts/build/contracts/eosio.msig/eosio.msig.wasm... Publishing contract... executed transaction: c2260b7d05bb38d2df097799baedd890ce7560bedbd1b79e7d07e4f6a5b25238 23256 bytes 3684 us # eosio &lt;= eosio::setcode {"account":"eosio.msig","vmtype":0,"vmversion":0,"code":"0061736d0100000001b8022f60000060037f7f7f017... # eosio &lt;= eosio::setabi {"account":"eosio.msig","abi":"0e656f73696f3a3a6162692f312e32001006616374696f6e0004076163636f756e740...
  1. Créez le jeton SYS avec une distribution totale de 10 milliards de jetons :
cleos push action eosio.token create '["eosio", "10000000000.0000 SYS"]' -p eosio.token

La commande ci-dessus transfère une transaction avec l'action create du contrat eosio.token, autorisée via l'autorisation active du compte eosio.token. La réponse doit ressembler à ceci :

executed transaction: 6a4766a00c8fe26343d5eb6c1ad5e53b35064dc6f3a5f55908eff2edba30efca 120 bytes 603 us # eosio.token &lt;= eosio.token::create {"issuer":"eosio","maximum_supply":"10000000000.0000 SYS"}
  1. Mettez en circulation 1 milliard de jetons SYS provenant de la réserve :
cleos push action eosio.token issue '["eosio", "1000000000.0000 SYS", "memo"]' -p eosio

La commande ci-dessus transfère une transaction avec l'action issue du contrat eosio.token, autorisée via l'autorisation active du compte eosio.

La réponse doit ressembler à ceci :

executed transaction: 4613fcff26bc6f96010273b475e839018f0afe2ef2af840d481070c9c54e36f1 128 bytes 405 us # eosio.token &lt;= eosio.token::issue {"to":"eosio","quantity":"1000000000.0000 SYS","memo":"memo"}

Cliquez sur Vérifier ma progression pour valider l'objectif. Créer et déployer les contrats eosio.token et eosio.msig, ainsi que le jeton SYS

Tâche 9 : Activer les fonctionnalités de protocole et déployer les contrats eosio.boot et eosio.system

Les fonctionnalités de protocole apportent des capacités optionnelles supplémentaires aux blockchains EOSIO. Dans cette tâche, vous allez activer certaines fonctionnalités de protocole vivement recommandées pour les blockchains EOSIO. À cette fin, vous allez d'abord déployer le contrat eosio.boot, puis activer ces fonctionnalités. Enfin, vous allez déployer le contrat eosio.system pour compléter la deuxième couche de la blockchain EOSIO.

Cela permet d'activer les ressources système (CPU, RAM, RÉSEAU), de mettre en jeu et de retirer des jetons, d'acheter des ressources, d'enregistrer des producteurs potentiels et de les soumettre ensuite au vote, de réclamer les récompenses des producteurs, de définir des privilèges et des limites, etc. Les fonctionnalités de protocole doivent être activées par le biais du consensus EOSIO, à la majorité qualifiée des producteurs. Dans ce cas, tout ce dont vous avez besoin est que le nœud de démarrage soit en cours d'exécution.

  1. Commencez par installer l'outil jq qui présente les chaînes JSON sous une forme plus lisible pour en faciliter l'analyse :
sudo apt install jq
  1. Vérifions maintenant les fonctionnalités de protocole disponibles :
curl -X POST http://127.0.0.1:8888/v1/producer/get_supported_protocol_features -d '{"exclude_disabled": false, "exclude_unactivatable": false}' | jq | more

La commande ci-dessus envoie une requête HTTP POST au point de terminaison get_supported_protocol_features fourni par le plug-in de l'API Producer.

La réponse listera toutes les fonctionnalités de protocole compatibles avec le réseau EOSIO actuel, lequel se compose du seul nœud de démarrage pour le moment.

Vérifiez le résultat, en appuyant plusieurs fois sur la barre d'espace jusqu'à ce que l'invite shell réapparaisse.

Résultat :

[{"feature_digest": "0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd", "subjective_restrictions": {"enabled": true, "preactivation_required": false, "earliest_allowed_activation_time": "1970-01-01T00:00:00.000"}, "description_digest": "64fe7df32e9b86be2b296b3f81dfd527f84e82b98e363bc97e40bc7a83733310", "dependencies": [], "protocol_feature_type": "builtin", "specification": [{"name": "builtin_feature_codename", "value": "PREACTIVATE_FEATURE"}]}, ... {"feature_digest": "ded2e25adcd78cbb94fa7f63a8f80a9af2b1a905e551a6e124e7d7829da1ea02", "subjective_restrictions": {"enabled": true, "preactivation_required": true, "earliest_allowed_activation_time": "1970-01-01T00:00:00.000"}, "description_digest": "72ec6337e369cbb33ef7716d3267db9d5678fe54555c25ca4c9f5b9dfb7739f3", "dependencies": [], "protocol_feature_type": "builtin", "specification": [{"name": "builtin_feature_codename", "value": "SECURITY_GROUP"}]}, ... {"feature_digest": "f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d", "subjective_restrictions": {"enabled": true, "preactivation_required": true, "earliest_allowed_activation_time": "1970-01-01T00:00:00.000"}, "description_digest": "1eab748b95a2e6f4d7cb42065bdee5566af8efddf01a55a0a8d831b823f8828a", "dependencies": [], "protocol_feature_type": "builtin", "specification": [{"name": "builtin_feature_codename", "value": "GET_SENDER"}]}]
  1. Activez la fonctionnalité PREACTIVATE_FEATURE. Elle permet d'activer d'autres fonctionnalités, y compris les potentielles mises à niveau du contrat eosio.system qui pourraient implémenter de nouvelles fonctionnalités. Notez également que pour activer une fonctionnalité de protocole, il est nécessaire de transmettre un condensé ou un code de hachage correspondant à cette fonctionnalité spécifique.
curl -X POST http://127.0.0.1:8888/v1/producer/schedule_protocol_feature_activations -d '{"protocol_features_to_activate": ["0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd"]}'

Notez que le code de hachage du condensé de fonctionnalité 0ec7e... peut être obtenu à partir du champ feature_digest renvoyé par le point de terminaison get_supported_protocol_features à l'étape précédente. Si l'activation réussit, la réponse doit correspondre à celle indiquée.

Résultat :

{"result": "ok"}

Si la fonctionnalité a déjà été activée, la réponse suivante s'affiche à la place. Vous pouvez l'ignorer sans risque.

Résultat :

{"code": 500, "message": "Internal Service Error", "error": {"code": 3250000, "name": "protocol_feature_exception", "what": "Protocol feature exception", "details": [{"message": "protocol feature with digest '<hex-value>' has already been activated", "file": "controller.cpp", "line_number": 1650, "method": "check_protocol_features"}]}}
  1. Déployez le contrat eosio.boot :
cleos set contract eosio ~/eos/contracts/contracts/eosio.boot/

La réponse doit ressembler à ceci :

Reading WASM from ~/eos/contracts/contracts/eosio.boot/eosio.boot.wasm... Publishing contract... executed transaction: a029c644104da357a201f75058fc6772cf63f5fdfa9135be2c3b7c498d81d46d 2752 bytes 852 us # eosio &lt;= eosio::setcode {"account":"eosio","vmtype":0,"vmversion":0,"code":"0061736d01000000013e0c60000060027f7f0060017e0060... # eosio &lt;= eosio::setabi {"account":"eosio","abi":"0e656f73696f3a3a6162692f312e32001008616374697661746500010e666561747572655f...
  1. Activez des fonctionnalités de protocole supplémentaires, telles que KV_DATABASE, ACTION_RETURN_VALUE, etc. Vous pouvez effectuer cette opération après avoir déployé le contrat eosio.boot.
# KV_DATABASE cleos push action eosio activate '["825ee6288fb1373eab1b5187ec2f04f6eacb39cb3a97f356a07c91622dd61d16"]' -p eosio # ACTION_RETURN_VALUE cleos push action eosio activate '["c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071"]' -p eosio # CONFIGURABLE_WASM_LIMITS cleos push action eosio activate '["bf61537fd21c61a60e542a5d66c3f6a78da0589336868307f94a82bccea84e88"]' -p eosio # BLOCKCHAIN_PARAMETERS cleos push action eosio activate '["5443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4"]' -p eosio # GET_SENDER cleos push action eosio activate '["f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d"]' -p eosio # FORWARD_SETCODE cleos push action eosio activate '["2652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25"]' -p eosio # ONLY_BILL_FIRST_AUTHORIZER cleos push action eosio activate '["8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a405"]' -p eosio # RESTRICT_ACTION_TO_SELF cleos push action eosio activate '["ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43"]' -p eosio # DISALLOW_EMPTY_PRODUCER_SCHEDULE cleos push action eosio activate '["68dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428"]' -p eosio # FIX_LINKAUTH_RESTRICTION cleos push action eosio activate '["e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526"]' -p eosio # REPLACE_DEFERRED cleos push action eosio activate '["ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99"]' -p eosio # NO_DUPLICATE_DEFERRED_ID cleos push action eosio activate '["4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f"]' -p eosio # ONLY_LINK_TO_EXISTING_PERMISSION cleos push action eosio activate '["1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241"]' -p eosio # RAM_RESTRICTIONS cleos push action eosio activate '["4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d67"]' -p eosio # WEBAUTHN_KEY cleos push action eosio activate '["4fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2"]' -p eosio # WTMSIG_BLOCK_SIGNATURES cleos push action eosio activate '["299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707"]' -p eosio
  1. Déployez le contrat eosio.system. Cela permet d'activer les fonctionnalités de deuxième couche et de passer d'une blockchain à un seul nœud à une blockchain multinœuds.
cleos set contract eosio ~/eosio.contracts/build/contracts/eosio.system/

Cliquez sur Vérifier ma progression pour valider l'objectif. Déployer les contrats eosio.boot et eosio.system

Tâche 10 : Créer les comptes de producteur de blocs

Dans cette tâche, vous allez créer les comptes de producteur qui, à terme, prendront le contrôle de la blockchain EOSIO et produiront des blocs. La première étape consiste à désigner eosio.msig comme compte privilégié. Celui-ci pourra ainsi effectuer des autorisations au nom du compte eosio, lequel renoncera ensuite à son autorité et laissera le compte eosio.prods, représentant le groupe de producteurs élus, prendre le relais pour la production et la validation des blocs.

  1. Définissez eosio.msig comme compte privilégié :
cleos push action eosio setpriv '["eosio.msig", 1]' -p eosio

La réponse doit ressembler à ceci :

executed transaction: 385f0eb3c169898cc7faae46bb4371dbbfc46c5d482249c9933c4f8627fb271c 104 bytes 208 us # eosio &lt;= eosio::setpriv {"account":"eosio.msig","is_priv":1}
  1. Initialisez le jeton SYS à la version 0 et attribuez-lui une précision de quatre décimales :
cleos push action eosio init '["0", "4,SYS"]' -p eosio

La réponse doit ressembler à ceci :

executed transaction: c537fbd77983104d8dcb1c58b09b433f68a2dd12c876a27b7556d4a722d42939 104 bytes 3467 us # eosio &lt;= eosio::init {"version":0,"core":"4,SYS"} # eosio.token &lt;= eosio.token::open {"owner":"eosio.rex","symbol":"4,SYS","ram_payer":"eosio"}
  1. Importez les clés que les producteurs utiliseront pour signer les blocs. Dans les déploiements de production, ces clés doivent d'abord être créées, puis importées.
cleos wallet import --private-key 5KLGj1HGRWbk5xNmoKfrcrQHXvcVJBPdAckoiJgFftXSJjLPp7b cleos wallet import --private-key 5K6qk1KaCYYWX86UhAfUsbMwhGPUqrqHrZEQDjs9ekP5j6LgHUu cleos wallet import --private-key 5JCStvbRgUZ6hjyfUiUaxt5iU3HP6zC1kwx3W7SweaEGvs4EPfQ cleos wallet import --private-key 5JJjaKnAb9KM2vkkJDgrYXoeUEdGgWtB5WK1a38wrmKnS3KtkS6

L'importation de ces clés préexistantes simplifie la gestion des ressources pour cet atelier. Toutefois, pour les déploiements en production, de nouvelles clés doivent être créées.

La réponse pour chaque commande doit correspondre à ceci :

imported private key for: EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz imported private key for: EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC imported private key for: EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 imported private key for: EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d

Si les nœuds sont distribués, chaque paire de clés sera stockée indépendamment dans le portefeuille de chaque serveur. Dans cet atelier, vous allez tout stocker dans le même portefeuille pour plus de simplicité.

  1. Créez les comptes de producteurs de blocs avec les ressources initiales et la clé publique associée :
cleos system newaccount --transfer eosio producer.one EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz --stake-net "50000000.0000 SYS" --stake-cpu "50000000.0000 SYS" --buy-ram-kbytes 8192 cleos system newaccount --transfer eosio producer.two EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC --stake-net "50000000.0000 SYS" --stake-cpu "50000000.0000 SYS" --buy-ram-kbytes 8192 cleos system newaccount --transfer eosio produc.three EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 --stake-net "50000000.0000 SYS" --stake-cpu "50000000.0000 SYS" --buy-ram-kbytes 8192 cleos system newaccount --transfer eosio produce.four EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d --stake-net "50000000.0000 SYS" --stake-cpu "50000000.0000 SYS" --buy-ram-kbytes 8192

La commande ci-dessus crée les comptes producer.one, producer.two, produc.three et produce.four, et associe chaque clé importée à l'étape précédente à l'un de ces comptes. Elle attribue et met en jeu également 50 millions de SYS pour le réseau et le processeur, et 8 000 pour la RAM.

La réponse doit ressembler à ceci (pour chaque nouveau compte) :

executed transaction: 6164d2741433c68edf426d430cb0986b198a6f4c63e7f7a46bcf8343562eacc0 336 bytes 1029 us # eosio &lt;= eosio::newaccount {"creator":"eosio","name":"producer.one","owner":{"threshold":1,"keys":[{"key":"EOS8imf2TDq6FKtLZ8mv... # eosio &lt;= eosio::buyrambytes {"payer":"eosio","receiver":"producer.one","bytes":8388608} # eosio &lt;= eosio::delegatebw {"from":"eosio","receiver":"producer.one","stake_net_quantity":"50000000.0000 SYS","stake_cpu_quantity... # eosio.token &lt;= eosio.token::transfer {"from":"eosio","to":"eosio.ram","quantity":"122.0851 SYS","memo":"buy ram"} # eosio.token &lt;= eosio.token::transfer {"from":"eosio","to":"eosio.ramfee","quantity":"0.6135 SYS","memo":"ram fee"} # eosio &lt;= eosio.token::transfer {"from":"eosio","to":"eosio.ram","quantity":"122.0851 SYS","memo":"buy ram"} # eosio.ram &lt;= eosio.token::transfer {"from":"eosio","to":"eosio.ram","quantity":"122.0851 SYS","memo":"buy ram"} # eosio &lt;= eosio.token::transfer {"from":"eosio","to":"eosio.ramfee","quantity":"0.6135 SYS","memo":"ram fee"} # eosio.ramfee &lt;= eosio.token::transfer {"from":"eosio","to":"eosio.ramfee","quantity":"0.6135 SYS","memo":"ram fee"} # eosio.token &lt;= eosio.token::transfer {"from":"eosio","to":"eosio.stake","quantity":"100000000.0000 SYS","memo":"stake bandwidth"} # eosio &lt;= eosio.token::transfer {"from":"eosio","to":"eosio.stake","quantity":"100000000.0000 SYS","memo":"stake bandwidth"} # eosio.stake &lt;= eosio.token::transfer {"from":"eosio","to":"eosio.stake","quantity":"100000000.0000 SYS","memo":"stake bandwidth"}
  1. Enregistrez les nouveaux comptes en tant que producteurs. Notez que chaque commande attend également l'URL Web du producteur. Des URL fictives sont utilisées à des fins d'illustration.
cleos system regproducer producer.one EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz https://producer.one.com/EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz cleos system regproducer producer.two EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC https://producer.two.com/EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC cleos system regproducer produc.three EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 https://produc.three.com/EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 cleos system regproducer produce.four EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d https://produce.four.com/EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d

La réponse aux commandes ci-dessus doit ressembler à ceci :

executed transaction: 28ced4a34abd64fb2fc11fbb51d3e4e18d2933a9ab2560fc1c6fb80b0cfc336d 216 bytes 753 us # eosio &lt;= eosio::regproducer {"producer":"producer.one","producer_key":"EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz","u... executed transaction: 06b8be4187c5fbabc3197064ae4c6d55ba553fdbcc8a560f060078e59d5dfc5e 216 bytes 306 us # eosio &lt;= eosio::regproducer {"producer":"producer.two","producer_key":"EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC","u... executed transaction: c23a5164bf0cc1e35dfa3e55fed56e935ceb7d764dbe2e7a3bf4aee446e7d88d 216 bytes 270 us # eosio &lt;= eosio::regproducer {"producer":"produc.three","producer_key":"EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6","u... executed transaction: 081aa8aca08b6d4e8e6bf576b2882f578faa7148e7c550196ff256ab0a9dcca3 216 bytes 224 us # eosio &lt;= eosio::regproducer {"producer":"produce.four","producer_key":"EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d","u...
  1. Listez les comptes de producteur actuels. Il doit y en avoir quatre au total.
cleos system listproducers

La réponse doit ressembler à ceci :

Producer Producer key Url Scaled votes` **`produc.three`** `EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 https://produc.three.com/EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNj` **`0.0000`** **`produce.four`** `EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d https://produce.four.com/EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8` **`0.0000`** **`producer.one`** `EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz https://producer.one.com/EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8` **`0.0000`** **`producer.two`** `EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC https://producer.two.com/EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuE` **`0.0000`**

Notez que le nombre de votes pour chaque producteur est toujours nul, car aucun producteur n'a reçu de vote pour le moment.

Cliquez sur Vérifier ma progression pour valider l'objectif. Créer les comptes de producteur de blocs

Tâche 11 : Passer d'un producteur à nœud unique à des producteurs multinœuds

Dans cette tâche, vous effectuez la transition finale d'une blockchain à un seul nœud à une blockchain multinœuds. Actuellement, seul le compte eosio dispose de privilèges et peut signer des blocs. L'objectif est de créer une blockchain EOSIO gérée par un ensemble de producteurs élus, où le consensus est atteint dès qu'une majorité qualifiée de 2/3 des producteurs + 1 ont confirmé un bloc. Toutes les transactions de ce bloc seront alors réputées définitives.

  1. Créez les répertoires de nœuds restants nodes/01-node, nodes/02-node, nodes/03-node et nodes/04-node pour stocker toutes les données de blockchain liées aux nouveaux nœuds de production 1, 2, 3 et 4 :
mkdir nodes/01-node nodes/02-node nodes/03-node nodes/04-node
  1. Lancez le nœud 1, en démarrant le daemon du service nodeos en tant que tâche d'arrière-plan, en redirigeant stdout/stderr vers le fichier 01-node/01.log :
nodeos \ --plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::chain_plugin --plugin eosio::producer_api_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::net_api_plugin \ --contracts-console \ --max-transaction-time=200 \ --chain-state-db-size-mb 1024 \ --enable-stale-production \ --producer-name producer.one \ --genesis-json ~/nodes/genesis.json \ --blocks-dir ~/nodes/01-node/blocks \ --config-dir ~/nodes/01-node \ --data-dir ~/nodes/01-node \ --http-server-address 127.0.0.1:8889 \ --p2p-listen-endpoint 127.0.0.1:9877 \ --signature-provider EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz=KEY:5KLGj1HGRWbk5xNmoKfrcrQHXvcVJBPdAckoiJgFftXSJjLPp7b \ --p2p-peer-address 127.0.0.1:9876 \ >>~/nodes/01-node/01.log 2>&1 &

Le nœud 1 est alors lancé avec certains plug-ins, le nom de producteur producer.one, une écoute sur le port HTTP 8889, le port P2P 9877, les clés de développement par défaut étant remplacées par ses propres clés EOS8imf..., 5KLGj1..., et se connecte au nœud P2P 9876 (nœud de démarrage).

  1. Vous pouvez inspecter le journal du nœud 1 pour rechercher les messages échangés avec le nœud de démarrage (nœud P2P 9876) en exécutant la commande suivante :
cat nodes/01-node/01.log | grep :9876 -C 3

Le résultat doit ressembler à ce qui suit :

Résultat :

info 2021-10-22T21:56:43.161 nodeos producer_plugin.cpp:421 on_incoming_block ] Received block e79c2cc7df2bd7bc... #3040 @ 2021-10-22T21:56:41.500 signed by eosio [trxs: 0, lib: 3039, conf: 0, latency: 1661 ms] ... info 2021-10-22T21:56:43.162 net-1 net_plugin.cpp:1604 set_state ] old state lib catchup becoming in sync info 2021-10-22T21:56:43.162 net-1 net_plugin.cpp:1132 operator() ] Sending handshake generation 2 to 127.0.0.1:9876- 446609d, lib 3040, head 3041, id 5d69f1fa874933cf info 2021-10-22T21:56:43.163 net-0 net_plugin.cpp:1947 sync_recv_notice ] notice_message, pending 3043, blk_num 3043, id b8f3389c52ff416c... info 2021-10-22T21:56:43.163 net-0 net_plugin.cpp:1908 verify_catchup ] catch_up while in in sync, fork head num = 3043 target LIB = 3041 next_expected = 3042, id b8f3389c52ff416c..., peer 127.0.0.1:9876 - 446609d info 2021-10-22T21:56:43.163 net-0 net_plugin.cpp:1604 set_state ] old state in sync becoming head catchup info 2021-10-22T21:56:43.164 nodeos producer_plugin.cpp:421 on_incoming_block ] Received block 917275dee8c12e57... #3042 @ 2021-10-22T21:56:42.500 signed by eosio [trxs: 0, lib: 3041, conf: 0, latency: 664 ms] ...

Notez que le nœud 1 ne produit pas encore de blocs, mais qu'il en reçoit et assure la synchronisation avec d'autres nœuds, tels que le nœud de démarrage, pour le moment.

  1. Lancez le nœud 2, en démarrant le daemon du service nodeos en tant que tâche d'arrière-plan, en redirigeant stdout/stderr vers le fichier 02-node/02.log :
nodeos \ --plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::chain_plugin --plugin eosio::producer_api_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::net_api_plugin \ --contracts-console \ --max-transaction-time=200 \ --chain-state-db-size-mb 1024 \ --enable-stale-production \ --producer-name producer.two \ --genesis-json ~/nodes/genesis.json \ --blocks-dir ~/nodes/02-node/blocks \ --config-dir ~/nodes/02-node \ --data-dir ~/nodes/02-node \ --http-server-address 127.0.0.1:8890 \ --p2p-listen-endpoint 127.0.0.1:9878 \ --signature-provider EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC=KEY:5K6qk1KaCYYWX86UhAfUsbMwhGPUqrqHrZEQDjs9ekP5j6LgHUu \ --p2p-peer-address 127.0.0.1:9876 \ --p2p-peer-address 127.0.0.1:9877 \ >>~/nodes/02-node/02.log 2>&1 &

Le nœud 2 est alors lancé avec certains plug-ins, le nom de producteur producer.two, une écoute sur le port HTTP 8890, le port P2P 9878, les clés de développement par défaut étant remplacées par ses propres clés EOS8imf..., 5KLGj1..., et se connecte au nœud P2P 9876 (nœud de démarrage) et au nœud P2P 9877 (nœud 1).

  1. Vous pouvez inspecter le journal du nœud 2 pour rechercher les messages échangés avec, par exemple, le nœud 1 (nœud P2P 9877), en exécutant la commande suivante :
cat nodes/02-node/02.log | grep :9877 -C 3

Le résultat doit ressembler à ce qui suit :

Résultat :

info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1771 start_sync ] Catching up with chain, our last req is 6852, theirs is 6859 peer 127.0.0.1:9877 - 1a245d2 info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1717 operator() ] requesting range 6853 to 6859, from 127.0.0.1:9877- 1a245d2 info 2021-10-22T22:28:31.497 nodeos producer_plugin.cpp:421 on_incoming_block ] Received block 3073fa4230d8d232... #6853 @ 2021-10-22T22:28:28.000 signed by eosio [trxs: 0, lib: 6852, conf: 0, latency: 3497 ms] ... info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1604 set_state ] old state lib catchup becoming in sync info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1132 operator() ] Sending handshake generation 3 to 127.0.0.1:9877- 1a245d2, lib 6858, head 6859, id 9a791a880b9b875e info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1947 sync_recv_notice ] notice_message, pending 6860, blk_num 6860, id 4dd2c7c8ae5301ed... info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1908 verify_catchup ] catch_up while in in sync, fork head num = 6860 target LIB = 6859 next_expected = 6860, id 4dd2c7c8ae5301ed..., peer 127.0.0.1:9877 - 1a245d2 info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1604 set_state ] old state in sync becoming head catchup ...

Notez que le nœud 2 ne produit pas encore de blocs, mais qu'il en reçoit et assure la synchronisation avec d'autres nœuds, tels que le nœud de démarrage et le nœud 1, pour le moment.

  1. Lancez le nœud 3, en démarrant le daemon du service nodeos en tant que tâche d'arrière-plan, en redirigeant stdout/stderr vers le fichier 03-node/03.log :
nodeos \ --plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::chain_plugin --plugin eosio::producer_api_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::net_api_plugin \ --contracts-console \ --max-transaction-time=200 \ --chain-state-db-size-mb 1024 \ --enable-stale-production \ --producer-name produc.three \ --genesis-json ~/nodes/genesis.json \ --blocks-dir ~/nodes/03-node/blocks \ --config-dir ~/nodes/03-node \ --data-dir ~/nodes/03-node \ --http-server-address 127.0.0.1:8891 \ --p2p-listen-endpoint 127.0.0.1:9879 \ --signature-provider EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6=KEY:5JCStvbRgUZ6hjyfUiUaxt5iU3HP6zC1kwx3W7SweaEGvs4EPfQ \ --p2p-peer-address 127.0.0.1:9876 \ --p2p-peer-address 127.0.0.1:9877 \ --p2p-peer-address 127.0.0.1:9878 \ >>~/nodes/03-node/03.log 2>&1 &

Le nœud 3 est alors lancé avec certains plug-ins, le nom de producteur produc.three, une écoute sur le port HTTP 8891, le port P2P 9879, les clés de développement par défaut étant remplacées par ses propres clés EOS5n44..., 5JCStv..., et se connecte au nœud P2P 9876 (nœud de démarrage), au nœud P2P 9877 (nœud 1) et au nœud P2P 9878 (nœud 2).

  1. Vous pouvez inspecter le journal du nœud 3 pour rechercher les messages échangés avec, par exemple, le nœud 2 (nœud P2P 9878), en exécutant la commande suivante :
cat nodes/03-node/03.log | grep :9878 -C 3

Le résultat doit ressembler à ce qui suit :

Résultat :

info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1771 start_sync ] Catching up with chain, our last req is 6852, theirs is 6859 peer 127.0.0.1:`**`9878`** `- 1a245d2` info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1717 operator() ] requesting range 6853 to 6859, from 127.0.0.1:`**`9878`** `- 1a245d2` info 2021-10-22T22:28:31.497 nodeos producer_plugin.cpp:421 on_incoming_block ] Received block 3073fa4230d8d232... #6853 @ 2021-10-22T22:28:28.000 signed by eosio [trxs: 0, lib: 6852, conf: 0, latency: 3497 ms] ... info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1604 set_state ] old state lib catchup becoming in sync info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1132 operator() ] Sending handshake generation 3 to 127.0.0.1:`**`9878`** `- 1a245d2, lib 6858, head 6859, id 9a791a880b9b875e info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1947 sync_recv_notice ] notice_message, pending 6860, blk_num 6860, id 4dd2c7c8ae5301ed... info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1908 verify_catchup ] catch_up while in in sync, fork head num = 6860 target LIB = 6859 next_expected = 6860, id 4dd2c7c8ae5301ed..., peer 127.0.0.1:`**`9878`** `- 1a245d2 info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1604 set_state ] old state in sync becoming head catchup ...

Notez que le nœud 3 ne produit pas encore de blocs, mais qu'il en reçoit et assure la synchronisation avec d'autres nœuds, tels que le nœud de démarrage et les nœuds 1 et 2, pour le moment.

  1. Lancez le nœud 4, en démarrant le daemon du service nodeos en tant que tâche d'arrière-plan, en redirigeant stdout/stderr vers le fichier 04-node/04.log :
nodeos \ --plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::chain_plugin --plugin eosio::producer_api_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::net_api_plugin \ --contracts-console \ --max-transaction-time=200 \ --chain-state-db-size-mb 1024 \ --enable-stale-production \ --producer-name produce.four \ --genesis-json ~/nodes/genesis.json \ --blocks-dir ~/nodes/04-node/blocks \ --config-dir ~/nodes/04-node \ --data-dir ~/nodes/04-node \ --http-server-address 127.0.0.1:8892 \ --p2p-listen-endpoint 127.0.0.1:9880 \ --signature-provider EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d=KEY:5JJjaKnAb9KM2vkkJDgrYXoeUEdGgWtB5WK1a38wrmKnS3KtkS6 \ --p2p-peer-address 127.0.0.1:9876 \ --p2p-peer-address 127.0.0.1:9877 \ --p2p-peer-address 127.0.0.1:9878 \ --p2p-peer-address 127.0.0.1:9879 \ >>~/nodes/04-node/04.log 2>&1 &

Le nœud 4 est alors lancé avec certains plug-ins, le nom de producteur produce.four, une écoute sur le port HTTP 8892, le port P2P 9880, les clés de développement par défaut étant remplacées par ses propres clés EOS5y3T..., 5JJjaK..., et se connecte au nœud P2P 9876 (nœud de démarrage), au nœud P2P 9877 (nœud 1), au nœud P2P 9878 (nœud 2) et au nœud P2P 9879 (nœud 3).

  1. Vous pouvez inspecter le journal du nœud 2 pour rechercher les messages échangés avec, par exemple, le nœud 3 (nœud P2P 9879), en exécutant la commande suivante :
cat nodes/04-node/04.log | grep :9879 -C 3

La réponse doit ressembler à ceci :

info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1771 start_sync ] Catching up with chain, our last req is 6852, theirs is 6859 peer 127.0.0.1:9879 - 1a245d2 info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1717 operator() ] requesting range 6853 to 6859, from 127.0.0.1:9879 - 1a245d2 info 2021-10-22T22:28:31.497 nodeos producer_plugin.cpp:421 on_incoming_block ] Received block 3073fa4230d8d232... #6853 @ 2021-10-22T22:28:28.000 signed by eosio [trxs: 0, lib: 6852, conf: 0, latency: 3497 ms] ... info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1604 set_state ] old state lib catchup becoming in sync info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1132 operator() ] Sending handshake generation 3 to 127.0.0.1:9879 - 1a245d2, lib 6858, head 6859, id 9a791a880b9b875e info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1947 sync_recv_notice ] notice_message, pending 6860, blk_num 6860, id 4dd2c7c8ae5301ed... info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1908 verify_catchup ] catch_up while in in sync, fork head num = 6860 target LIB = 6859 next_expected = 6860, id 4dd2c7c8ae5301ed..., peer 127.0.0.1:9879 - 1a245d2 info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1604 set_state ] old state in sync becoming head catchup ...

Notez que le nœud 4 ne produit pas encore de blocs, mais qu'il en reçoit et assure la synchronisation avec d'autres nœuds, tels que le nœud de démarrage et les nœuds 1, 2 et 3, pour le moment.

À ce stade, tous les nouveaux nœuds 1, 2, 3 et 4 sont lancés et connectés. Ils reçoivent les blocs produits par le nœud de démarrage et en assurent la synchronisation, mais ils n'en produisent pas encore. Pour cela, il est nécessaire d'élire les nouveaux producteurs. Dans un déploiement en production, les utilisateurs élisent généralement un maximum de 30 producteurs parmi un pool de producteurs potentiels dans la commande de vote. Les 21 principaux producteurs sont élus en tant que producteurs de blocs.

Ici, vous utiliserez les comptes de producteurs existants pour élire uniquement les quatre producteurs disponibles. Une fois que 15 % de l'offre de jetons SYS ont été mis en jeu, les principaux producteurs élus sont proposés pour la production. Une fois que le bloc contenant la liste des producteurs est confirmé et devient définitif, les nouveaux producteurs peuvent commencer à produire des blocs dès que le prochain cycle planifié débute.

  1. Utilisez la commande cleos system voteproducer prods pour voter pour des producteurs spécifiques. Le compte producer.one vote pour lui-même et pour les producteurs 2, 3 et 4. Le compte producer.two vote pour lui-même, pour produc.three et produce.four. Ensuite, produc.three vote pour lui-même et pour produce.four, et enfin, produce.four vote pour lui-même.
cleos system voteproducer prods producer.one producer.one producer.two produc.three produce.four cleos system voteproducer prods producer.two producer.two produc.three produce.four cleos system voteproducer prods produc.three produc.three produce.four cleos system voteproducer prods produce.four produce.four

La réponse doit ressembler à ceci :

executed transaction: 833178bdc9d5b8c86778fa2b2c0f20e976f4c253cb6ebcaa6ade8eb8bf3d0a4f 144 bytes 861 us # eosio &lt;= eosio::voteproducer {"voter":"producer.one","proxy":"","producers":["produc.three","produce.four","producer.one","produc... executed transaction: 9c4961678017bfc2a7fd1398a2e4b33e472a6cadc0340400ebe9207e188d7692 136 bytes 379 us # eosio &lt;= eosio::voteproducer {"voter":"producer.two","proxy":"","producers":["produc.three","produce.four","producer.two"]} executed transaction: d3d23bae8730f18e82da53defaff7184c49b83181bb9b6fa32096684e61ed74d 128 bytes 371 us` # eosio &lt;= eosio::voteproducer {"voter":"produc.three","proxy":"","producers":["produc.three","produce.four"]} executed transaction: 95f63d46554dd436388e36b017b8e350514ef5b407b1c33c5779dc29c862cdb6 120 bytes 304 us` # eosio &lt;= eosio::voteproducer {"voter":"produce.four","proxy":"","producers":["produce.four"]}
  1. Vérifiez le pourcentage de votes pour chaque producteur :
cleos system listproducers

La réponse aux commandes ci-dessus doit être la suivante :

Producer Producer key Url Scaled votes produce.four EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d https://produce.four.com/EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8 0.4000 produc.three EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 https://produc.three.com/EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNj 0.3000 producer.two EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC https://producer.two.com/EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuE 0.2000 producer.one EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz https://producer.one.com/EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8 0.1000

Notez que le producteur 1 a obtenu 10 % des votes, le producteur 2 a suivi avec 20 %, puis le producteur 3 avec 30 % et enfin le producteur 4 avec 40 %. Comme le nombre total de jetons SYS mis en jeu par tous les producteurs représente plus de 15 % de l'offre de jetons, les 21 premiers producteurs (par défaut) seront proposés pour la production de blocs.

La production elle-même commencera une fois que le bloc contenant la liste des producteurs de blocs sera confirmé comme étant définitif. Comme il n'y a que quatre producteurs, ils produiront tous, et une majorité absolue sera atteinte avec trois d'entre eux.

  1. Vérifiez que les nouveaux producteurs génèrent bien des blocs :
tail -f nodes/01-node/01.log | grep Produced

La commande ci-dessus devrait afficher les derniers blocs produits par le producteur 1. Si aucun résultat ne s'affiche pour le moment, veuillez patienter quelques secondes. Il y a quatre producteurs qui produisent chacun 12 blocs toutes les six secondes. On doit donc constater un intervalle de 18 secondes entre le dernier bloc généré et le premier bloc du cycle suivant.

La réponse doit ressembler à ceci :

info 2021-10-28T15:31:47.904 nodeos producer_plugin.cpp:2333 produce_block ] Produced block adeb43a9249e0ef8...` **`#7035`** `@ 2021-10-28T15:31:48.000 signed by` **`producer.one`** `[trxs: 0, lib: 6998, confirmed: 36] info 2021-10-28T15:31:48.400 nodeos producer_plugin.cpp:2333 produce_block ] Produced block 991c7f7addb6006e...` **`#7036`** `@ 2021-10-28T15:31:48.500 signed by` **`producer.one`** `[trxs: 0, lib: 6998, confirmed: 0] ... info 2021-10-28T15:31:52.901 nodeos producer_plugin.cpp:2333 produce_block ] Produced block c947dfab144600f7...` **`#7045`** `@ 2021-10-28T15:31:53.000 signed by` **`producer.one`** `[trxs: 0, lib: 6998, confirmed: 0] info 2021-10-28T15:31:53.300 nodeos producer_plugin.cpp:2333 produce_block ] Produced block c871f71b3ebe9151...` **`#7046`** `@ 2021-10-28T15:31:53.500 signed by` **`producer.one`** `[trxs: 0, lib: 6998, confirmed: 0]`

Si vous patientez encore 18 secondes, vous devriez voir la série suivante de 12 blocs produits, et ainsi de suite. Vous pouvez également vérifier que les trois autres nœuds produisent bien des blocs en remplaçant les 01 de la commande ci-dessus par 02, 03 et 04.

  1. Appuyez sur Ctrl + C pour quitter la commande tail.

  2. Vérifiez que le nœud de démarrage ne produit plus de blocs :

tail -f nodes/00-boot/00.log | grep Produced

Notez que la commande ci-dessus ne doit générer aucune sortie, ce qui prouve que le nœud de démarrage a cédé la production de blocs aux nouveaux producteurs qui ont été élus.

Maintenant que vous disposez d'une blockchain entièrement fonctionnelle avec quatre producteurs, vous devez supprimer tous les pouvoirs de signature de transactions et de modification de l'état sur la blockchain détenus par le compte eosio par défaut et les comptes eosio.* associés. Pour ce faire, vous devez désactiver les clés utilisées par les comptes eosio et eosio.* en les réinitialisant à la valeur null.

  1. Obtenez les informations du compte eosio. Notez les clés associées aux autorisations owner (propriétaire) et active (actif) :
cleos get account eosio

La réponse doit ressembler à ceci :

created: 2018-06-01T12:00:00.000 privileged: true permissions: owner 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV active 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV memory: quota: unlimited used: 2.989 MiB net bandwidth: used: unlimited available: unlimited limit: unlimited cpu bandwidth: used: unlimited available: unlimited limit: unlimited SYS balances: liquid: 599999509.0258 SYS staked: 0.0000 SYS unstaking: 0.0000 SYS total: 599999509.0258 SYS
  1. Désactivez les clés utilisées par le compte eosio et associez les autorisations de ce compte au compte eosio.prods :
cleos push action eosio updateauth '{"account": "eosio", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio.prods", "permission": "active"}}]}}' -p eosio@owner cleos push action eosio updateauth '{"account": "eosio", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio.prods", "permission": "active"}}]}}' -p eosio@active cleos get account eosio

La réponse doit ressembler à ceci :

created: 2018-06-01T12:00:00.000 privileged: true permissions: owner 1: 1 eosio.prods@active active 1: 1 eosio.prods@active `memory: quota: unlimited used: 2.989 MiB net bandwidth: used: unlimited available: unlimited limit: unlimited cpu bandwidth: used: unlimited available: unlimited limit: unlimited SYS balances: liquid: 599999509.0258 SYS staked: 0.0000 SYS unstaking: 0.0000 SYS total: 599999509.0258 SYS

Notez que le compte eosio ne dispose plus des clés de développement par défaut associées aux autorisations owner et active. Ces autorisations sont désormais des autorisations enfants de l'autorisation parente eosio.prods@active. Il s'agit du groupe de comptes qui représente tous les producteurs de blocs actifs.

Par conséquent, le compte eosio est désormais contrôlé pour l'essentiel par le compte eosio.prods.

  1. Désactivez les clés utilisées par les comptes eosio.* et associez leurs autorisations au compte eosio :
cleos push action eosio updateauth '{"account": "eosio.bpay", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.bpay@owner cleos push action eosio updateauth '{"account": "eosio.bpay", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.bpay@active cleos push action eosio updateauth '{"account": "eosio.msig", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.msig@owner cleos push action eosio updateauth '{"account": "eosio.msig", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.msig@active cleos push action eosio updateauth '{"account": "eosio.names", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.names@owner cleos push action eosio updateauth '{"account": "eosio.names", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.names@active cleos push action eosio updateauth '{"account": "eosio.ram", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.ram@owner cleos push action eosio updateauth '{"account": "eosio.ram", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.ram@active cleos push action eosio updateauth '{"account": "eosio.ramfee", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.ramfee@owner cleos push action eosio updateauth '{"account": "eosio.ramfee", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.ramfee@active cleos push action eosio updateauth '{"account": "eosio.saving", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.saving@owner cleos push action eosio updateauth '{"account": "eosio.saving", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.saving@active cleos push action eosio updateauth '{"account": "eosio.stake", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.stake@owner cleos push action eosio updateauth '{"account": "eosio.stake", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.stake@active cleos push action eosio updateauth '{"account": "eosio.token", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.token@owner cleos push action eosio updateauth '{"account": "eosio.token", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.token@active cleos push action eosio updateauth '{"account": "eosio.vpay", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.vpay@owner cleos push action eosio updateauth '{"account": "eosio.vpay", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.vpay@active cleos push action eosio updateauth '{"account": "eosio.rex", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.rex@owner cleos push action eosio updateauth '{"account": "eosio.rex", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.rex@active

Les comptes eosio.* ne sont plus associés aux clés de développement par défaut liées aux autorisations owner et active. Au lieu de cela, les autorisations sont désormais des autorisations enfants de l'autorisation parente eosio@active, qui elle-même est une autorisation enfant liée au compte eosio.prods@active.

Par conséquent, tous les comptes système, y compris eosio, sont désormais contrôlés pour l'essentiel par le compte eosio.prods, qui représente le groupe des comptes de tous les producteurs de blocs actifs. Vous avez enfin obtenu une blockchain EOSIO multinœuds entièrement opérationnelle.

Cliquez sur Vérifier ma progression pour valider l'objectif. Passer d'un producteur à nœud unique à des producteurs multinœuds

Félicitations !

Dans cet atelier, vous avez étendu la blockchain EOSIO à nœud unique déployée précédemment pour en faire un réseau composé de plusieurs blockchains. Vous avez également installé divers composants logiciels EOSIO pour configurer votre blockchain EOSIO multinœuds. Enfin, vous avez effectué certaines tâches d'opérateur de nœud sur votre nouvelle blockchain EOSIO.

Étapes suivantes et informations supplémentaires

Formations et certifications Google Cloud

Les formations et certifications Google Cloud vous aident à tirer pleinement parti des technologies Google Cloud. Nos cours portent sur les compétences techniques et les bonnes pratiques à suivre pour être rapidement opérationnel et poursuivre votre apprentissage. Nous proposons des formations pour tous les niveaux, à la demande, en salle et à distance, pour nous adapter aux emplois du temps de chacun. Les certifications vous permettent de valider et de démontrer vos compétences et votre expérience en matière de technologies Google Cloud.

Dernière mise à jour du manuel : 12 décembre 2024

Dernier test de l'atelier : 22 octobre 2024

Copyright 2026 Google LLC. Tous droits réservés. Google et le logo Google sont des marques de Google LLC. Tous les autres noms d'entreprises et de produits peuvent être des marques des entreprises auxquelles ils sont associés.

Avant de commencer

  1. Les ateliers créent un projet Google Cloud et des ressources pour une durée déterminée.
  2. Les ateliers doivent être effectués dans le délai imparti et ne peuvent pas être mis en pause. Si vous quittez l'atelier, vous devrez le recommencer depuis le début.
  3. En haut à gauche de l'écran, cliquez sur Démarrer l'atelier pour commencer.

Utilisez la navigation privée

  1. Copiez le nom d'utilisateur et le mot de passe fournis pour l'atelier
  2. Cliquez sur Ouvrir la console en navigation privée

Connectez-vous à la console

  1. Connectez-vous à l'aide des identifiants qui vous ont été attribués pour l'atelier. L'utilisation d'autres identifiants peut entraîner des erreurs ou des frais.
  2. Acceptez les conditions d'utilisation et ignorez la page concernant les ressources de récupération des données.
  3. Ne cliquez pas sur Terminer l'atelier, à moins que vous n'ayez terminé l'atelier ou que vous ne vouliez le recommencer, car cela effacera votre travail et supprimera le projet.

Ce contenu n'est pas disponible pour le moment

Nous vous préviendrons par e-mail lorsqu'il sera disponible

Parfait !

Nous vous contacterons par e-mail s'il devient disponible

Un atelier à la fois

Confirmez pour mettre fin à tous les ateliers existants et démarrer celui-ci

Utilisez la navigation privée pour effectuer l'atelier

Le meilleur moyen d'exécuter cet atelier consiste à utiliser une fenêtre de navigation privée. Vous éviterez ainsi les conflits entre votre compte personnel et le compte temporaire de participant, qui pourraient entraîner des frais supplémentaires facturés sur votre compte personnel.

Effectuez cette étape rapide pour démarrer votre atelier.