Create a virtual machine

Fortschritt prüfen

/ 10

Install the EOSIO platform on the virtual machine

Fortschritt prüfen

/ 10

Create a default wallet

Fortschritt prüfen

/ 10

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

Fortschritt prüfen

/ 10

Install the EOSIO Contract Development Toolkit

Fortschritt prüfen

/ 10

Build the system contracts and eosio.boot

Fortschritt prüfen

/ 10

Start boot node and create system accounts

Fortschritt prüfen

/ 10

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

Fortschritt prüfen

/ 10

Deploy eosio.boot and eosio.system contracts

Fortschritt prüfen

/ 10

Create the block producer accounts

Fortschritt prüfen

/ 5

Transition from single node producer to multi node producers

Fortschritt prüfen

/ 5

Dieses Lab kann KI-Tools enthalten, die den Lernprozess unterstützen.

Dieses Lab wurde mit unserem Partner Block.one entwickelt. Ihre personenbezogenen Daten werden möglicherweise an Block.one, den Lab-Sponsor, weitergegeben, wenn Sie zugestimmt haben, Produktupdates, Mitteilungen und Angebote in Ihrem Kontoprofil zu erhalten.

GSP991

Google Cloud-Labs zum selbstbestimmten Lernen

Übersicht

In diesem Lab erweitern Sie die EOSIO-Blockchain mit einem einzelnen Knoten, sodass mehrere Knoten verwendet werden. Sie installieren verschiedene EOSIO-Softwarekomponenten, um eine EOSIO-Blockchain mit mehreren Knoten einzurichten. Abschließend führen Sie einige Knotenoperatoraufgaben in Ihrer neuen EOSIO-Blockchain aus.

Ziele

Aufgaben in diesem Lab:

  • Eine vorhandene Compute Engine-VM laden
  • EOSIO-Systemverträge installieren und erstellen
  • Eine Blockchain mit mehreren Knoten und vier (4) EOSIO-Knoten bereitstellen
  • Nutzerkonten in der EOSIO-Blockchain mit mehreren Knoten erstellen
  • Eine Aktion aufrufen, um Tokens zwischen Nutzerkonten zu übertragen

Vorbereitung

Bevor Sie mit diesem Lab beginnen, sollten Sie das Lab Block.one: Erste Schritte mit der EOSIO-Blockchain abgeschlossen haben.

Außerdem sollten Sie mit den folgenden Konzepten vertraut sein:

Einrichtung und Anforderungen

Vor dem Klick auf „Start Lab“ (Lab starten)

Lesen Sie diese Anleitung. Labs sind zeitlich begrenzt und können nicht pausiert werden. Der Timer beginnt zu laufen, wenn Sie auf Lab starten klicken, und zeigt Ihnen, wie lange Google Cloud-Ressourcen für das Lab verfügbar sind.

In diesem praxisorientierten Lab können Sie die Lab-Aktivitäten in einer echten Cloud-Umgebung durchführen – nicht in einer Simulations- oder Demo-Umgebung. Dazu erhalten Sie neue, temporäre Anmeldedaten, mit denen Sie für die Dauer des Labs auf Google Cloud zugreifen können.

Für dieses Lab benötigen Sie Folgendes:

  • Einen Standardbrowser (empfohlen wird Chrome)
Hinweis: Nutzen Sie den privaten oder Inkognitomodus (empfohlen), um dieses Lab durchzuführen. So wird verhindert, dass es zu Konflikten zwischen Ihrem persönlichen Konto und dem Teilnehmerkonto kommt und zusätzliche Gebühren für Ihr persönliches Konto erhoben werden.
  • Zeit für die Durchführung des Labs – denken Sie daran, dass Sie ein begonnenes Lab nicht unterbrechen können.
Hinweis: Verwenden Sie für dieses Lab nur das Teilnehmerkonto. Wenn Sie ein anderes Google Cloud-Konto verwenden, fallen dafür möglicherweise Kosten an.

Lab starten und bei der Google Cloud Console anmelden

  1. Klicken Sie auf Lab starten. Wenn Sie für das Lab bezahlen müssen, wird ein Dialogfeld geöffnet, in dem Sie Ihre Zahlungsmethode auswählen können. Auf der rechten Seite befindet sich der Bereich Lab-Einrichtung und ‑Zugriff:

    • Button Google Cloud Console öffnen
    • Die temporären Anmeldedaten (Nutzername und Passwort), die Sie für dieses Lab verwenden müssen
    • Gegebenenfalls weitere Informationen für dieses Lab

    Der Lab-Timer befindet sich oben auf der Seite und zeigt die verbleibende Zeit an.

  2. Klicken Sie auf Google Cloud Console öffnen. Wenn Sie Chrome verwenden, können Sie auch rechtsklicken und Link in Inkognitofenster öffnen auswählen.

    Im Lab werden Ressourcen aktiviert. Anschließend wird ein weiterer Tab mit der Seite „Anmelden“ geöffnet.

    Tipp: Ordnen Sie die Tabs nebeneinander in separaten Fenstern an.

    Hinweis: Wird das Dialogfeld Konto auswählen angezeigt, klicken Sie auf Anderes Konto verwenden.
  3. Kopieren Sie bei Bedarf den folgenden Nutzernamen und fügen Sie ihn in das Dialogfeld Anmelden ein.

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

    Sie finden den Nutzernamen auch im Bereich Lab-Einrichtung und ‑Zugriff.

  4. Klicken Sie auf Weiter.

  5. Kopieren Sie das folgende Passwort und fügen Sie es in das Dialogfeld Willkommen ein.

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

    Sie finden das Passwort auch im Bereich Lab-Einrichtung und ‑Zugriff.

  6. Klicken Sie auf Weiter.

    Wichtig: Sie müssen die für das Lab bereitgestellten Anmeldedaten verwenden. Nutzen Sie nicht die Anmeldedaten Ihres Google Cloud-Kontos. Hinweis: Wenn Sie Ihr eigenes Google Cloud-Konto für dieses Lab nutzen, können zusätzliche Kosten anfallen.
  7. Klicken Sie sich durch die nachfolgenden Seiten:

    • Akzeptieren Sie die Nutzungsbedingungen.
    • Fügen Sie keine Wiederherstellungsoptionen oder 2-Faktor-Authentifizierung hinzu, da dies nur ein temporäres Konto ist.
    • Melden Sie sich nicht für kostenlose Testversionen an.

Nach wenigen Augenblicken wird die Google Cloud Console in diesem Tab geöffnet.

Hinweis: Wenn Sie auf Google Cloud-Produkte und ‑Dienste zugreifen möchten, klicken Sie auf das Navigationsmenü oder geben Sie den Namen des Produkts oder Dienstes in das Feld Suchen ein. Symbol für das Navigationsmenü und Suchfeld

Hintergrund

In diesem Abschnitt erhalten Sie einen Überblick über die in diesem Lab behandelten Konzepte.

EOSIO-Blockchain

Eine EOSIO-Blockchain ist eine hocheffiziente, deterministische Maschine mit verteiltem Zustand, die dezentral betrieben werden kann. In der Blockchain werden Transaktionen in einer Sequenz ausgetauschter Blöcke erfasst. Jeder Block ist kryptografisch mit den vorherigen Blöcken in derselben Kette verbunden. Es ist daher unmöglich, eine in einem bestimmten Block aufgezeichnete Transaktion zu ändern, ohne die kryptografischen Prüfungen nachfolgender Blöcke zu unterbrechen. Genau deswegen sind Blockchain-Transaktionen unveränderlich und sicher. Die Blockproduktion und -validierung werden von speziellen Knoten, sogenannten Block Producers, durchgeführt.

EOSIO-Konsens

Die Blockvalidierung ist für alle Gruppen von verteilten Knoten eine Herausforderung. Um die Blöcke im dezentralen System fehlertolerant zu validieren, muss ein Konsensmodell vorhanden sein. Mithilfe von Konsens können sich verteilte Knoten sowie Nutzerinnen und Nutzer auf den aktuellen Zustand der Blockchain einigen. Zwei der häufigsten Konsensmodelle in Blockchains sind Proof of Work (PoW) und Proof of Stake (PoS). Beim Proof of Stake haben Knoten, die den größten Anteil oder Prozentsatz eines Assets besitzen, eine gleichwertige Entscheidungsmacht. Eine interessante Variante ist Delegated Proof of Stake (DPoS), bei dem eine große Anzahl von Teilnehmenden oder Stakeholdern eine kleinere Anzahl von Delegierten wählt, die wiederum Entscheidungen für sie treffen. EOSIO verwendet Delegated Proof of Stake (DPoS), um die aktiven Producer zu wählen, die dann berechtigt sind, Blöcke zu produzieren, zu validieren und zu signieren, damit sie schließlich der Blockchain hinzugefügt werden können.

EOSIO-Konten, ‑Schlüssel und ‑Berechtigungen

Ein Konto identifiziert Teilnehmende in einer EOSIO-Blockchain. Teilnehmende können je nach den zugewiesenen Berechtigungen im Konto Einzelpersonen oder eine Gruppe sein. Konten stellen auch die Smart Contract-Agierenden dar, die Aktionen an andere Konten in der Blockchain senden und von diesen empfangen. Schlüssel in EOSIO sind binäre Strings, die in Base58 dargestellt werden und zum Signieren und Überprüfen von Transaktionen, Blöcken und anderen Nachrichten verwendet werden. Schlüssel werden in einem digitalen Wallet erstellt, das mit einem Konto verbunden ist. Da die Kontoinhaberschaft ausschließlich durch den Kontonamen definiert wird, können die mit einem Konto verbundenen Schlüssel aktualisiert werden, ohne die Sicherheit zu beeinträchtigen. Ein neuartiges Berechtigungsschema mit Konten, Berechtigungen und Autorisierungstabellen bestimmt, was Konten tun können und wie die Aktionen, aus denen eine Transaktion besteht, autorisiert werden. Dazu wird jedem Konto eine hierarchische Berechtigungsstruktur zugewiesen und jeder Berechtigung ein Paar aus öffentlichen und privaten Schlüsseln, die zum Signieren und Verifizieren verwendet werden.

EOSIO-Smart Contracts

Ein Smart Contract ist eine Low-Level-Softwarebibliothek, die die Implementierung der Aktionen enthält, aus denen eine Transaktion besteht. Er definiert auch, wie die Daten gespeichert werden, auf die Aktionen zugreifen und die sie verarbeiten. In EOSIO wird ein Smart Contract in einer allgemeinen Programmiersprache wie C++ implementiert und in ein WebAssembly-Binärformat (WASM) kompiliert. Danach können Smart Contracts in der Sandbox eines Kontos in der Blockchain bereitgestellt und ausgeführt werden.

Aufgabe 1: Virtuelle Maschine erstellen

  1. Klicken Sie im Navigationsmenü (Symbol für Navigationsmenü) auf Compute Engine > VM-Instanzen.

  2. Klicken Sie auf Instanz erstellen, um eine neue Instanz zu erstellen.

  3. Wählen Sie unter Maschinenkonfiguration

    die folgenden Werte aus:

    • Name: instance-1
    • Region:
    • Zone:
    • Maschinenfamilie: Allgemein (Standard)
    • Reihe: E2
    • Maschinentyp: e2-standard-2 (2 vCPUs, 8 GB Arbeitsspeicher)
  4. Klicken Sie auf Betriebssystem und Speicher.

    Klicken Sie auf Ändern, um mit der Konfiguration des Bootlaufwerks zu beginnen, und wählen Sie die folgenden Werte aus:

    • Betriebssystem: Ubuntu
    • Version: Ubuntu 22.04 LTS
    • Architektur: x86/64

    Klicken Sie auf Auswählen.

  5. Klicken Sie zum Erstellen und Starten der VM auf Erstellen.

Hinweis: Es kann etwa zwei Minuten dauern, bis die VM gestartet wird und verfügbar ist.

Klicken Sie auf Fortschritt prüfen. Virtuelle Maschine erstellen

Aufgabe 2: EOSIO-Plattform installieren

  1. Klicken Sie im Navigationsmenü (Symbol für Navigationsmenü) auf Compute Engine > VM-Instanzen.

Sie sehen die VM-Instanz, die Sie erstellt haben.

  1. Um eine Eingabeaufforderung in der VM-Instanz instance-1 zu öffnen, klicken Sie in der entsprechenden Zeile der Liste VM-Instanzen auf SSH. Dadurch wird ein Shell-Terminalfenster geöffnet.

  2. Aktualisieren Sie zuerst die Liste der Softwarepakete in der VM:

sudo apt update
  1. Installieren Sie die Abhängigkeit libssl1.1, die für EOSIO 2.1.0 erforderlich ist, aber ab Ubuntu 22.04 nicht standardmäßig enthalten ist:
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. EOSIO-Software-Binärdateien abrufen Dazu gehören nodeos, die P2P-Software für den Knoten, cleos, der CLI-Client, keosd, der Wallet-Manager, und andere Tools:
curl -LO https://github.com/eosio/eos/releases/download/v2.1.0/eosio_2.1.0-1-ubuntu-20.04_amd64.deb
  1. Installieren Sie die EOSIO-Softwarebinärdateien. Drücken Sie bei Bedarf die Eingabetaste, um erforderliche Softwareabhängigkeiten zu installieren:
sudo apt install ./eosio_2.1.0-1-ubuntu-20.04_amd64.deb
  1. Prüfen Sie, ob nodeos installiert ist:
nodeos --version

Die Antwort ist die nodeos-Version:

v2.1.0
  1. Prüfen Sie, ob cleos installiert ist:
cleos version client

Die Antwort ist die cleos-Version:

v2.1.0
  1. Prüfen Sie, ob keosd installiert ist:
keosd -v

Die Antwort ist die keosd-Version:

v2.1.0

Klicken Sie auf Fortschritt prüfen. EOSIO-Plattform installieren

Aufgabe 3: Standard-Wallet erstellen

In Wallets werden die kryptografischen Schlüssel gespeichert, die von Konten und Producern zum Signieren von Transaktionen bzw. Blöcken verwendet werden. Sie bieten auch eine sichere Enklave für die Signierung, sodass die privaten Schlüssel das Wallet nie verlassen. Um den Status in der Blockchain zu ändern, benötigen Sie ein Wallet, in dem kryptografische Schlüssel gespeichert werden und mit dem die digitale Signierung erfolgt.

  1. Legen Sie zuerst ein langes Zeitlimit für das Entsperren für alle Wallets fest, die von keosd, dem EOSIO-Wallet-Manager, verwaltet werden:
keosd --unlock-timeout 999999999 &

Dadurch wird verhindert, dass das Wallet alle 15 Minuten (dem Standardzeitlimit) entsperrt werden muss. Außerdem wird der Daemon-Dienst keosd gestartet. Die Antwort sollte in etwa so aussehen:

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

Drücken Sie bei Bedarf die Eingabetaste, um den Shell-Prompt zurückzuerhalten.

  1. Erstellen Sie ein Standard-Wallet und geben Sie das Wallet-Passwort in eine Datei mit dem Namen my_wallet_password aus:
cleos wallet create --file my_wallet_password

Dadurch wird ein Wallet mit dem Namen default erstellt. Die Antwort sollte so aussehen:

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

Nachdem das Wallet erstellt wurde, wird es von keosd geöffnet und standardmäßig entsperrt.

  1. Führen Sie diesen Befehl aus, um alle verwalteten Wallets aufzurufen:
cleos wallet list

Die Antwort sollte so aussehen:

Wallets: [ "default *" ]

Das Sternchen neben dem Walletnamen gibt an, dass es entsperrt ist.

Klicken Sie auf Fortschritt prüfen. Standard-Wallet erstellen

Aufgabe 4: Fügen Sie dem Wallet den privaten Schlüssel des EOSIO-Systemkontos hinzu.

Jede neue EOSIO-Blockchain hat ein Standard-Systemkonto namens eosio. Dieses Konto wird anfangs zum Einrichten der Blockchain verwendet. Er ist standardmäßig mit dem folgenden privaten Schlüssel verknüpft: 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3.

Importieren Sie diesen privaten Schlüssel in Ihr Wallet, um Transaktionen im Namen des eosio-Kontos zu signieren.

  1. Verwenden Sie den Befehl cleos wallet open, um das Standard-Wallet zu öffnen. Das Wallet ist bereits geöffnet und entsperrt. Wenn es jedoch wieder gesperrt wird, müssen Sie so vorgehen:
cleos wallet open

Die Antwort sollte so aussehen:

Opened: default
  1. Entsperren Sie das Standard-Wallet mit dem Befehl cleos wallet unlock und übergeben Sie das Wallet-Passwort, das in der Datei my_wallet_password gespeichert ist:
cleos wallet unlock <my_wallet_password

Die Antwort sollte so aussehen:

password: Unlocked: default
  1. Verwenden Sie den Befehl cleos wallet import, um den privaten eosio-Schlüssel 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 in das Standard-Wallet zu importieren:
cleos wallet import --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

Die Antwort sollte so aussehen:

imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV

Dies ist der entsprechende öffentliche Schlüssel für den importierten privaten Schlüssel. Ignorieren Sie alle Warnungen zur Verwendung eines Standard-Wallets. In Produktionsbereitstellungen sollten Sie Ihrem Wallet einen anderen Namen als den Standardnamen geben.

Klicken Sie auf Fortschritt prüfen. Dem Wallet den privaten Schlüssel des eosio-Systemkontos hinzufügen

Aufgabe 5: EOSIO Contract Development Toolkit (CDT) installieren

Das EOSIO CDT-Toolkit enthält den CDT C++-Compiler, mit dem Sie die Systemverträge und später Ihre eigenen C++-Smart Contracts erstellen können. Die Systemverträge sind sehr wichtig, da sie die Softwarefunktionen der zweiten Ebene ermöglichen, mit denen zusätzliche Funktionen hinzugefügt und unterstützt werden können.

  1. Installieren Sie zuerst das Paket build-essential. Dieses Paket enthält verschiedene Tools, die zum Erstellen von C/C++-Software auf Ihrem Linux-Rechner benötigt werden.
sudo apt install build-essential
  1. Rufen Sie die EOSIO CDT-Binärdateien ab:
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. Installieren Sie die EOSIO CDT-Binärdateien:
sudo apt install ./eosio.cdt_1.8.1-1-ubuntu-18.04_amd64.deb
  1. Prüfen Sie, ob der EOSIO CDT-Compiler installiert ist:
eosio-cpp --version

Die Antwort sollte die EOSIO CDT-Compilerversion sein:

eosio-cpp version 1.8.1

Klicken Sie auf Fortschritt prüfen. EOSIO Contract Development Toolkit installieren

Aufgabe 6: Systemverträge und eosio.boot erstellen

Damit eine EOSIO-Blockchain mit mehreren Knoten funktioniert, müssen Sie die EOSIO-Systemverträge bereitstellen. Die Systemverträge bieten unter anderem die Layer-2-Funktionalität, die für den EOSIO-Konsens erforderlich ist, sowie die Möglichkeit, Tokens zu staken, abzustimmen und eigene Tokens zu erstellen. Außerdem können neue Funktionen unterstützt werden.

  1. Installieren Sie CMake, eine Softwareabhängigkeit, die vom Build-Script eosio.contracts verwendet wird:
sudo apt install cmake
  1. Laden Sie die neuesten eosio.contracts-Systemverträge herunter:
git clone https://github.com/EOSIO/eosio.contracts.git \ --branch release/1.9.x --single-branch
  1. Erstellen Sie die eosio.contracts des Systems. In diesem Schritt müssen Sie auch die Installationsverzeichnisse von eosio und eosio.cdt übergeben.
cd eosio.contracts ./build.sh -e /usr/opt/eosio/2.1.0 -c /usr/opt/eosio.cdt/1.8.1 cd ~

Ignorieren Sie alle Warnungen zu fehlenden ricardianischen Verträgen. Die Antwort sollte in etwa so aussehen (ohne die Warnungen):

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. Wenn Sie Tests erstellen möchten, setzen Sie BUILD_TESTS auf „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`

Notieren Sie sich den Speicherort, an dem die EOSIO-Systemverträge erstellt werden. Sie benötigen sie später beim Bereitstellen bestimmter Systemverträge: ~/eosio.contracts/build/contracts.

  1. Erstellen Sie den eosio.boot-Systemvertrag:
git clone https://github.com/EOSIO/eos.git \ --branch release/2.1.x --single-branch cd eos/contracts/contracts/eosio.boot cmake . make cd ~

Ignorieren Sie die Warnungen. Die Antwort sollte in etwa so aussehen:

-- Configuring done -- Generating done -- Build files have been written to: ~/eos/contracts/contracts/eosio.boot
  1. Notieren Sie sich den Speicherort, an dem der eosio.boot-Vertrag erstellt wird. Sie müssen ihn später bereitstellen: ~/eos/contracts/contracts/eosio.boot.

Klicken Sie auf Fortschritt prüfen. Systemverträge und eosio.boot erstellen

Aufgabe 7: Bootknoten starten und Systemkonten erstellen

In dieser Aufgabe starten Sie den Boot-Genesis-Knoten und erstellen die Systemkonten. Im Gegensatz zur Wallet-Erstellung müssen Sie eine Transaktion an die Blockchain senden, um ein Konto zu erstellen.

Daher muss mindestens der Bootknoten ausgeführt werden. Dazu müssen Sie zuerst das Datenverzeichnis und die Genesis-Datei erstellen, die von allen Knoten verwendet werden. In einer Produktionsumgebung wird jeder Knoten auf einem eigenen Server gehostet und verwendet eigene Ressourcen. Hier stellen Sie alle Knoten auf demselben Rechner bereit.

  1. Erstellen Sie das neue Verzeichnis nodes. Hier werden die Blockchain-Datenbank, die Logdatei und die Konfigurationsdatei für jeden Knoten gespeichert.
mkdir nodes
  1. Erstellen Sie die Standarddatei genesis.json im Verzeichnis nodes:
cat >nodes/genesis.json
  1. Kopieren Sie den folgenden JSON-Inhalt und fügen Sie ihn in das Terminal ein. Drücken Sie die Eingabetaste und dann Strg + D, um die Datei genesis.json zu speichern:
{ "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" }

„initial_key“ gibt den ursprünglichen öffentlichen Entwicklungsschlüssel an, der vom eosio-Konto verwendet wird. Bei Bedarf können Sie ihn hier mit Ihrem eigenen Entwicklungsschlüssel überschreiben. Das wird für Produktionsbereitstellungen empfohlen. Ein solcher Schlüssel muss im Wallet vorhanden sein, das vom eosio-Konto verwendet wird. Sie haben diesen Schlüssel in einem vorherigen Abschnitt importiert.

  1. Prüfen Sie, ob die Datei genesis.json tatsächlich erstellt und mit Daten befüllt wurde:
cat nodes/genesis.json

Sie sollten dieselben Inhalte wie im vorherigen Schritt sehen.

  1. Erstellen Sie das Bootknotenverzeichnis nodes/00-boot, um alle Blockchain-Daten im Zusammenhang mit dem Bootknoten zu speichern:
mkdir nodes/00-boot
  1. Starten Sie den Bootknoten, indem Sie den nodeos-Dienst-Daemon als Hintergrundaufgabe starten und stdout/stderr in die Datei 00-boot/00.log umleiten:
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 &

Dadurch wird der Bootknoten mit einigen Plug-ins, dem Producer-Namen eosio, dem HTTP-Port 8888, dem P2P-Port 9876 und den Standardentwicklungsschlüsseln EOS6MRy... gestartet. 5KQwrP... für die Blocksignierung. Wenn er nicht mit --signature-provider überschrieben wurde, werden die standardmäßigen EOSIO-Entwicklungsschlüssel verwendet.

  1. Prüfen Sie, ob der Bootknoten ausgeführt wird und Blöcke produziert:
tail -f nodes/00-boot/00.log

Die Ausgabe sieht so aus:

Ausgabe:

... 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]

In der letzten Zeile werden die letzte erstellte Blocknummer und der aktuelle letzte irreversible Block (Last Irreversible Block, LIB) angezeigt, der den letzten Block und das Ende der Blockchain markiert.

  1. Drücken Sie Strg + C, um das tail-Programm zu beenden.

  2. Nachdem der Bootknoten nun ausgeführt wird, können Sie Informationen zum eosio-Konto abrufen, das in der Chain-Datenbank gespeichert ist:

cleos get account eosio

Die Antwort sollte so aussehen:

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

Das eosio-Konto ist ein privilegiertes Konto. Die Schlüssel, die mit den Berechtigungen owner und active verknüpft sind, sind dieselben Standardentwicklungsschlüssel, die in das Wallet importiert wurden. So kann das eosio-Konto Transaktionen autorisieren, während die Blockchain mit mehreren Knoten eingerichtet wird.

  1. Erstellen Sie zusätzliche Systemkonten. Diese Konten werden ebenfalls in der Blockchain-Datenbank gespeichert.
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

Sie weisen allen Systemkonten und sowohl der Berechtigung owner als auch der Berechtigung active dasselbe Entwicklungsschlüsselpaar zu. In Produktionsbereitstellungen sollten Sie jeder Berechtigung ein anderes Schlüsselpaar zuweisen, um die Sicherheit zu erhöhen. Sie können auch für jedes Systemkonto unterschiedliche Schlüssel verwenden.

Die Antwort auf die oben genannten Befehle sollte in etwa so aussehen:

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 ]

Ignorieren Sie die Warnungen. Sie verwenden diese Konten in den nächsten Aufgaben.

Klicken Sie auf Fortschritt prüfen. Systemverträge und eosio.boot erstellen

Aufgabe 8: eosio.token- und eosio.msig-Verträge bereitstellen und das SYS-Token erstellen/ausgeben

In dieser Aufgabe erstellen Sie ein fiktives SYS-Token und stellen es aus. Dazu müssen Sie auch die zuvor erstellten Systemverträge eosio.token und eosio.msig bereitstellen.

  1. Stellen Sie den eosio.token-Vertrag bereit. Mit diesem Vertrag können Sie neue oder vorhandene Tokens erstellen, ausstellen und übertragen.
cleos set contract eosio.token ~/eosio.contracts/build/contracts/eosio.token/

Die Antwort sollte in etwa so aussehen:

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. Stellen Sie den eosio.msig-Vertrag bereit. Mit diesem Vertrag sind mehrere Signaturen zwischen Konten möglich. Außerdem wird die Verwaltung von Berechtigungen vereinfacht.
cleos set contract eosio.msig ~/eosio.contracts/build/contracts/eosio.msig/

Die Antwort sieht in etwa so aus:

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. Erstellen Sie das SYS-Token mit einer Gesamtverteilung von 10 Milliarden Token:
cleos push action eosio.token create '["eosio", "10000000000.0000 SYS"]' -p eosio.token

Mit dem oben genannten Befehl wird eine Transaktion mit der Aktion create aus dem eosio.token-Vertrag übertragen, die durch die aktive Berechtigung des eosio.token-Kontos autorisiert wird. Die Antwort sollte in etwa so aussehen:

executed transaction: 6a4766a00c8fe26343d5eb6c1ad5e53b35064dc6f3a5f55908eff2edba30efca 120 bytes 603 us # eosio.token &lt;= eosio.token::create {"issuer":"eosio","maximum_supply":"10000000000.0000 SYS"}
  1. Bringen Sie 1 Milliarde SYS-Tokens aus der Reserve in den Umlauf:
cleos push action eosio.token issue '["eosio", "1000000000.0000 SYS", "memo"]' -p eosio

Mit dem oben genannten Befehl wird eine Transaktion mit der Aktion issue aus dem eosio.token-Vertrag übertragen, die durch die aktive Berechtigung des eosio-Kontos autorisiert wird.

Die Antwort sieht in etwa so aus:

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

Klicken Sie auf Fortschritt prüfen. eosio.token- und eosio.msig-Verträge sowie SYS-Token erstellen und bereitstellen

Aufgabe 9: Protokollfunktionen aktivieren und eosio.boot- und eosio.system-Verträge bereitstellen

Protokollfunktionen bieten zusätzliche optionale Funktionen für EOSIO-Blockchains. In dieser Aufgabe aktivieren Sie einige Protokollfunktionen, die für EOSIO-Blockchains dringend empfohlen werden. Dazu stellen Sie zuerst den eosio.boot-Vertrag bereit und aktivieren dann diese Funktionen. Schließlich stellen Sie den eosio.system-Vertrag bereit, um die zweite Ebene der EOSIO-Blockchain abzuschließen.

Dies ermöglicht die Nutzung von Systemressourcen (CPU, RAM, NET), das Staking und Unstaking von Tokens, den Kauf von Ressourcen, die Registrierung potenzieller Producer und die anschließende Abstimmung über sie, die Inanspruchnahme von Producer-Rewards, die Festlegung von Berechtigungen und Limits usw. Protokollfunktionen müssen durch den EOSIO-Konsens durch einen Großteil der Producer aktiviert werden. In diesem Fall benötigen Sie nur den laufenden Bootknoten.

  1. Installieren Sie zuerst das Tool jq, um JSON-Strings in einer besser lesbaren Form zu parsen:
sudo apt install jq
  1. Sehen wir uns nun an, welche Protokollfunktionen unterstützt werden:
curl -X POST http://127.0.0.1:8888/v1/producer/get_supported_protocol_features -d '{"exclude_disabled": false, "exclude_unactivatable": false}' | jq | more

Mit dem oben genannten Befehl wird eine HTTP POST-Anfrage an den Endpunkt get_supported_protocol_features gesendet, der vom Producer API-Plug-in bereitgestellt wird.

In der Antwort werden alle Protokollfunktionen angezeigt, die vom aktuellen EOSIO-Netzwerk, das bisher aus dem Bootknoten besteht, unterstützt werden.

Prüfen Sie die Ausgabe durch mehrfaches Drücken der Leertaste, bis Sie die Shell-Eingabeaufforderung wieder sehen.

Ausgabe:

[{"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. Aktivieren Sie die Funktion PREACTIVATE_FEATURE. Dadurch können andere Funktionen aktiviert werden, einschließlich potenzieller Upgrades des eosio.system-Vertrags, die neue Funktionen implementieren könnten. Beachten Sie außerdem, dass eine Protokollfunktion aktiviert werden muss, indem ein Funktions-Digest oder Hashcode für die jeweilige Funktion übergeben wird.
curl -X POST http://127.0.0.1:8888/v1/producer/schedule_protocol_feature_activations -d '{"protocol_features_to_activate": ["0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd"]}'

Der Hashcode für den Funktions-Digest 0ec7e... kann aus dem Feld feature_digest abgerufen werden, das im vorherigen Schritt vom Endpunkt get_supported_protocol_features zurückgegeben wurde. War die Aktivierung erfolgreich, sollte die Antwort wie angegeben aussehen.

Ausgabe:

{"result": "ok"}

Wurde die Funktion bereits aktiviert, wird stattdessen die folgende Antwort zurückgegeben, die Sie ignorieren können.

Ausgabe:

{"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. Stellen Sie den eosio.boot-Vertrag bereit:
cleos set contract eosio ~/eos/contracts/contracts/eosio.boot/

Die Antwort sollte in etwa so aussehen:

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. Aktivieren Sie zusätzliche Protokollfunktionen wie KV_DATABASE, ACTION_RETURN_VALUE usw. Dies kann nach der Bereitstellung des eosio.boot-Vertrags erfolgen.
# 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. Stellen Sie den eosio.system-Vertrag bereit. Dadurch werden Funktionen der zweiten Ebene aktiviert und der Übergang von einer Blockchain mit einem einzelnen Knoten zu einer Blockchain mit mehreren Knoten wird ermöglicht.
cleos set contract eosio ~/eosio.contracts/build/contracts/eosio.system/

Klicken Sie auf Fortschritt prüfen. eosio.boot- und eosio.system-Verträge bereitstellen

Aufgabe 10: Konten für Block-Producer erstellen

In dieser Aufgabe erstellen Sie die Producer-Konten, die schließlich die EOSIO-Blockchain übernehmen und Blöcke erstellen. Im ersten Schritt wird eosio.msig als privilegiertes Konto festgelegt, damit es für das eosio-Konto Autorisierungen vornehmen kann. Dieses Konto gibt später seine Berechtigung ab und überlässt dem eosio.prods-Konto, das die Gruppe der gewählten Producer repräsentiert, die Verantwortung für die Blockproduktion und ‑validierung.

  1. eosio.msig als privilegiertes Konto festlegen:
cleos push action eosio setpriv '["eosio.msig", 1]' -p eosio

Die Antwort sollte in etwa so aussehen:

executed transaction: 385f0eb3c169898cc7faae46bb4371dbbfc46c5d482249c9933c4f8627fb271c 104 bytes 208 us # eosio &lt;= eosio::setpriv {"account":"eosio.msig","is_priv":1}
  1. Initialisieren Sie das SYS-Token auf Version 0 und weisen Sie ihm eine Precision von 4 Dezimalstellen zu:
cleos push action eosio init '["0", "4,SYS"]' -p eosio

Die Antwort sollte in etwa so aussehen:

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. Importieren Sie Schlüssel, die von Producern für die Blocksignierung verwendet werden sollen. In Produktionsbereitstellungen sollten diese Schlüssel zuerst erstellt und dann importiert werden.
cleos wallet import --private-key 5KLGj1HGRWbk5xNmoKfrcrQHXvcVJBPdAckoiJgFftXSJjLPp7b cleos wallet import --private-key 5K6qk1KaCYYWX86UhAfUsbMwhGPUqrqHrZEQDjs9ekP5j6LgHUu cleos wallet import --private-key 5JCStvbRgUZ6hjyfUiUaxt5iU3HP6zC1kwx3W7SweaEGvs4EPfQ cleos wallet import --private-key 5JJjaKnAb9KM2vkkJDgrYXoeUEdGgWtB5WK1a38wrmKnS3KtkS6

Durch den Import der vorhandenen Schlüssel wird die Ressourcenverwaltung für dieses Lab vereinfacht. Für Produktionsbereitstellungen sollten jedoch neue Schlüssel erstellt werden.

Die Antwort für jeden Befehl sollte so aussehen:

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

Wenn die Knoten verteilt sind, wird jedes Schlüsselpaar unabhängig voneinander in den Wallets der einzelnen Server gespeichert. Der Einfachheit halber speichern Sie sie in diesem Lab im selben Wallet.

  1. Erstellen Sie die Block-Producer-Konten mit den ersten Ressourcen und dem öffentlichen Schlüssel:
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

Mit dem oben genannten Befehl werden die neuen Konten producer.one, producer.two, produc.three und produce.four erstellt. Jeder im vorherigen Schritt importierte Schlüssel wird dem entsprechenden Konto zugeordnet. Außerdem werden 50 Millionen SYS für NET und CPU sowie 8.000 für RAM zugewiesen und eingesetzt.

Die Antwort sollte in etwa so aussehen (für jedes neue Konto):

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. Registrieren Sie die neuen Konten als Producer. Für jeden Befehl ist auch die Web-URL des Producers erforderlich. Die URLs sind fiktiv und dienen nur zur Veranschaulichung.
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

Die Antwort auf die oben genannten Befehle sollte in etwa so aussehen:

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. Aktuelle Producer-Konten auflisten Insgesamt sollten es vier sein.
cleos system listproducers

Die Antwort sollte so aussehen:

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`**

Die Anzahl der Stimmen für die einzelnen Producer ist derzeit null, da noch keine Stimmen abgegeben wurden.

Klicken Sie auf Fortschritt prüfen. Konten für Block-Producer erstellen

Aufgabe 11: Von einem Producer mit einen einzelnen Knoten auf Producer mit mehreren Knoten umstellen

In dieser Aufgabe stellen Sie schließlich von einer Blockchain mit einem einzelnen Knoten zu einer Blockchain mit mehreren Knoten um. Derzeit ist nur das eosio-Konto privilegiert und kann Blöcke signieren. Ziel ist es, eine EOSIO-Blockchain zu erstellen, die von einer Gruppe gewählter Producer verwaltet wird. Der Konsens wird erreicht, nachdem eine Mehrheit von 2/3 + 1 der Producer einen Block bestätigt hat. Danach sind alle Transaktionen in diesem Block endgültig.

  1. Erstellen Sie die verbleibenden Knotenverzeichnisse nodes/01-node, nodes/02-node, nodes/03-node, nodes/04-node, um alle Blockchain-Daten für die neuen Produktionsknoten 1, 2, 3, 4 zu speichern:
mkdir nodes/01-node nodes/02-node nodes/03-node nodes/04-node
  1. Starten Sie Knoten 1, indem Sie den nodeos-Dienst-Daemon als Hintergrundaufgabe starten und stdout/stderr in die Datei 01-node/01.log umleiten:
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 &

Dadurch wird Knoten 1 mit einigen Plug-ins, dem Producer-Namen producer.one, dem HTTP-Port 8889, dem P2P-Port 9877 und eigenen Schlüsseln EOS8imf... 5KLGj1... gestartet, die die Standardentwicklungsschlüssel überschreiben. Außerdem wird eine Verbindung zum P2P-Knoten 9876 (Bootknoten) hergestellt.

  1. Sie können das Log von Knoten 1 auf Nachrichten prüfen, die mit dem Bootknoten (P2P-Knoten 9876) ausgetauscht wurden. Führen Sie dazu den folgenden Befehl aus:
cat nodes/01-node/01.log | grep :9876 -C 3

Die Ausgabe sollte in etwa so aussehen:

Ausgabe:

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] ...

Hinweis: Knoten 1 erstellt noch keine Blöcke, empfängt und synchronisiert sie aber vorerst von anderen Knoten, z. B. dem Bootknoten.

  1. Starten Sie Knoten 2, indem Sie den nodeos-Dienst-Daemon als Hintergrundaufgabe starten und stdout/stderr in die Datei 02-node/02.log umleiten:
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 &

Dadurch wird Knoten 2 mit einigen Plug-ins, dem Producer-Namen producer.two, dem HTTP-Port 8890, dem P2P-Port 9878 und eigenen Schlüsseln EOS8imf..., 5KLGj1... gestartet, die die Standardentwicklungsschlüssel überschreiben. Außerdem wird eine Verbindung zum P2P-Knoten 9876 (Bootknoten) und zum P2P-Knoten 9877 (Knoten 1) hergestellt.

  1. Sie können das Log von Knoten 2 auf Nachrichten prüfen, die beispielsweise mit Knoten 1 (P2P-Knoten 9877) ausgetauscht wurden. Führen Sie dazu den folgenden Befehl aus:
cat nodes/02-node/02.log | grep :9877 -C 3

Die Ausgabe sollte in etwa so aussehen:

Ausgabe:

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 ...

Hinweis: Knoten 2 erstellt noch keine Blöcke, empfängt und synchronisiert sie aber vorerst von anderen Knoten, z. B. dem Bootknoten und Knoten 1.

  1. Starten Sie Knoten 3, indem Sie den nodeos-Dienst-Daemon als Hintergrundaufgabe starten und stdout/stderr in die Datei 03-node/03.log umleiten:
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 &

Dadurch wird Knoten 3 mit einigen Plug-ins, dem Producer-Namen produc.three, dem HTTP-Port 8891 und dem P2P-Port 9879 und eigenen Schlüsseln EOS5n44..., 5JCStv... gestartet, die die Standardentwicklungsschlüssel überschreiben. Außerdem wird eine Verbindung zum P2P-Knoten 9876 (Bootknoten), zum P2P-Knoten 9877 (Knoten 1) und zum P2P-Knoten 9878 (Knoten 2) hergestellt.

  1. Sie können das Log von Knoten 3 auf Nachrichten prüfen, die beispielsweise mit Knoten 2 (P2P-Knoten 9878) ausgetauscht wurden. Führen Sie dazu den folgenden Befehl aus:
cat nodes/03-node/03.log | grep :9878 -C 3

Die Ausgabe sollte in etwa so aussehen:

Ausgabe:

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 ...

Hinweis: Knoten 3 erstellt noch keine Blöcke, empfängt und synchronisiert sie aber vorerst von anderen Knoten wie dem Bootknoten, Knoten 1 und Knoten 2.

  1. Starten Sie Knoten 4, indem Sie den nodeos-Dienst-Daemon als Hintergrundaufgabe starten und stdout/stderr in die Datei 04-node/04.log umleiten:
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 &

Dadurch wird Knoten 4 mit einigen Plug-ins, dem Producer-Namen produce.four, dem HTTP-Port 8892 und dem P2P-Port 9880 und eigenen Schlüsseln EOS5y3T..., 5JJjaK... gestartet, die die Standardentwicklungsschlüssel überschreiben. Außerdem, wird eine Verbindung zum P2P-Knoten 9876 (Bootknoten), zum P2P-Knoten 9877 (Knoten 1), zum P2P-Knoten 9878 (Knoten 2) und zum P2P-Knoten 9879 (Knoten 3) hergestellt.

  1. Sie können das Log von Knoten 4 auf Nachrichten prüfen, die beispielsweise mit Knoten 3 (P2P-Knoten 9879) ausgetauscht wurden. Führen Sie dazu den folgenden Befehl aus:
cat nodes/04-node/04.log | grep :9879 -C 3

Die Antwort sollte in etwa so aussehen:

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 ...

Hinweis: Knoten 4 erstellt noch keine Blöcke, empfängt und synchronisiert sie aber vorerst von anderen Knoten wie dem Bootknoten, Knoten 1, Knoten 2, Knoten 3 usw.

Zu diesem Zeitpunkt werden alle neuen Knoten 1, 2, 3 und 4 gestartet und verbunden. Sie empfangen und synchronisieren Blöcke, die vom Bootknoten erstellt wurden, erstellen aber noch keine eigenen Blöcke. Dazu müssen die neuen Producer gewählt werden. In einer Produktionsbereitstellung würden Nutzerinnen und Nutzer in der Regel für bis zu 30 Producer aus einem Pool potenzieller Producer im Abstimmungsbefehl abstimmen. Die 21 besten Producer werden zum Block-Producer gewählt.

Hier wählen Sie mit den bestehenden Producer-Konten die einzigen vier verfügbaren Producer aus. Nachdem 15 % des SYS-Tokenangebots beansprucht wurden, werden die Producer mit den meisten Stimmen für die Produktion vorgeschlagen. Nachdem dieser Block mit der Liste der Producer bestätigt wurde und endgültig ist, beginnen die neuen Producer in der nächsten geplanten Runde mit der Produktion von Blöcken.

  1. Verwenden Sie den Befehl cleos system voteproducer prods, um für bestimmte Producer zu stimmen. Das Konto producer.one stimmt für sich selbst sowie für die Producer 2, 3 und 4. producer.two stimmt für sich selbst sowie für die Producer 3 und 4. producer.three und producer.four sowie producer.three stimmen für sich selbst sowie für producer.four. producer.four stimmt für sich selbst.
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

Die Antwort sollte in etwa so aussehen:

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. Prüfen Sie den Prozentsatz der Stimmen für jeden Producer:
cleos system listproducers

Die Antwort auf die oben genannten Befehle sollte so aussehen:

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

Hinweis: Producer 1 erhielt 10 % der Stimmen, Producer 2 20 %, Producer 3 30 % und Producer 4 40 %. Da die Gesamtzahl der von allen Producern eingesetzten SYS-Tokens mehr als 15 % des Tokenangebots beträgt, werden die besten 21 Producer standardmäßig für die Blockproduktion vorgeschlagen.

Die Produktion selbst beginnt, nachdem der Block, der die Liste der Blockproducer enthält, als endgültig bestätigt wurde. Da es nur vier Producer gibt, werden alle produzieren. Die absolute Mehrheit wird mit drei von ihnen erreicht.

  1. Prüfen Sie, ob die neuen Producer auch wirklich Blöcke erstellen:
tail -f nodes/01-node/01.log | grep Produced

Mit dem obigen Befehl sollten die letzten Blöcke angezeigt werden, die von Producer 1 erstellt wurden. Wenn noch keine Ausgabe angezeigt wird, warten Sie einige Sekunden. Es gibt vier Producer, die alle 6 Sekunden 12 Blöcke produzieren. Zwischen dem letzten Block der vorherigen Runde und dem ersten Block der nächsten Runde sollten also 18 Sekunden liegen.

Die Antwort sollte in etwa so aussehen:

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]`

Wenn Sie weitere 18 Sekunden warten, sollten die nächsten 12 Blöcke erstellt werden usw. Sie können auch prüfen, ob die anderen drei Knoten Blöcke erstellen, indem Sie die 01 im obigen Befehl durch 02, 03 und 04 ersetzen.

  1. Drücken Sie Strg + C, um den Befehl tail zu beenden.

  2. Prüfen Sie, ob der Bootknoten keine Blöcke mehr erzeugt:

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

Der obige Befehl sollte keine Ausgabe erzeugen. Das zeigt, dass der Bootknoten die Blockproduktion an die neu gewählten Producer abgegeben hat.

Nachdem Sie nun eine voll funktionsfähige Blockchain mit vier Producern haben, sollten Sie den eosio-Standardkonten und den zugehörigen eosio.*-Konten alle Berechtigungen zum Signieren von Transaktionen und zum Ändern des Status in der Blockchain entziehen. Dazu müssen Sie die von den eosio- und eosio.*-Konten verwendeten Schlüssel zurücksetzen, indem Sie sie auf null setzen.

  1. Rufen Sie die eosio-Kontoinformationen ab. Notieren Sie sich die Schlüssel, die mit den Berechtigungen owner und active verknüpft sind:
cleos get account eosio

Die Antwort sollte in etwa so aussehen:

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. Signieren Sie die vom eosio-Konto verwendeten Schlüssel neu und verknüpfen Sie die Berechtigungen mit dem eosio.prods-Konto:
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

Die Antwort sollte in etwa so aussehen:

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

Das eosio-Konto hat nicht mehr die standardmäßigen Entwicklungsschlüssel, die mit den Berechtigungen owner und active verknüpft sind. Stattdessen sind die Berechtigungen jetzt untergeordnete Berechtigungen der übergeordneten Berechtigung eosio.prods@active. Dies ist dieselbe Kontogruppe, die alle aktiven Blockproducer repräsentiert.

Daher wird das eosio-Konto jetzt im Wesentlichen vom eosio.prods-Konto gesteuert.

  1. Signieren Sie die von den eosio.*-Konten verwendeten Schlüssel neu und verknüpfen Sie ihre Berechtigungen mit dem eosio-Konto:
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

Die eosio.*-Konten haben jetzt nicht mehr die standardmäßigen Entwicklungsschlüssel, die mit den Berechtigungen owner und active verknüpft sind. Stattdessen sind die Berechtigungen jetzt untergeordnete Berechtigungen der übergeordneten Berechtigung eosio@active, die wiederum eine untergeordnete Berechtigung des Kontos eosio.prods@active ist.

Daher werden jetzt alle Systemkonten, einschließlich eosio, im Wesentlichen vom Konto eosio.prods gesteuert, das die Kontogruppe aller aktiven Blockproducer darstellt. Sie haben nun eine voll funktionsfähige EOSIO-Blockchain mit mehreren Knoten erstellt.

Klicken Sie auf Fortschritt prüfen. Von einem Producer mit einen einzelnen Knoten auf Producer mit mehreren Knoten umstellen

Glückwunsch!

In diesem Lab haben Sie die zuvor bereitgestellte EOSIO-Blockchain mit einem einzelnen Knoten zu einem Netzwerk mit mehreren Blockchains erweitert. Sie haben auch verschiedene EOSIO-Softwarekomponenten installiert, um eine EOSIO-Blockchain mit mehreren Knoten einzurichten. Außerdem haben Sie einige Knotenoperatoraufgaben in Ihrer neuen EOSIO-Blockchain ausgeführt.

Weitere Informationen

Google Cloud-Schulungen und -Zertifizierungen

In unseren Schulungen erfahren Sie alles zum optimalen Einsatz unserer Google Cloud-Technologien und können sich entsprechend zertifizieren lassen. Unsere Kurse vermitteln technische Fähigkeiten und Best Practices, damit Sie möglichst schnell mit Google Cloud loslegen und Ihr Wissen fortlaufend erweitern können. Wir bieten On-Demand-, Präsenz- und virtuelle Schulungen für Anfänger wie Fortgeschrittene an, die Sie individuell in Ihrem eigenen Zeitplan absolvieren können. Mit unseren Zertifizierungen weisen Sie nach, dass Sie Experte im Bereich Google Cloud-Technologien sind.

Anleitung zuletzt aktualisiert am 12. Dezember 2024

Lab zuletzt am 22. Oktober 2024 getestet

© 2026 Google LLC. Alle Rechte vorbehalten. Google und das Google-Logo sind Marken von Google LLC. Alle anderen Unternehmens- und Produktnamen können Marken der jeweils mit ihnen verbundenen Unternehmen sein.

Vorbereitung

  1. Labs erstellen ein Google Cloud-Projekt und Ressourcen für einen bestimmten Zeitraum
  2. Labs haben ein Zeitlimit und keine Pausenfunktion. Wenn Sie das Lab beenden, müssen Sie von vorne beginnen.
  3. Klicken Sie links oben auf dem Bildschirm auf Lab starten, um zu beginnen

Privates Surfen verwenden

  1. Kopieren Sie den bereitgestellten Nutzernamen und das Passwort für das Lab
  2. Klicken Sie im privaten Modus auf Konsole öffnen

In der Konsole anmelden

  1. Melden Sie sich mit Ihren Lab-Anmeldedaten an. Wenn Sie andere Anmeldedaten verwenden, kann dies zu Fehlern führen oder es fallen Kosten an.
  2. Akzeptieren Sie die Nutzungsbedingungen und überspringen Sie die Seite zur Wiederherstellung der Ressourcen
  3. Klicken Sie erst auf Lab beenden, wenn Sie das Lab abgeschlossen haben oder es neu starten möchten. Andernfalls werden Ihre bisherige Arbeit und das Projekt gelöscht.

Diese Inhalte sind derzeit nicht verfügbar

Bei Verfügbarkeit des Labs benachrichtigen wir Sie per E-Mail

Sehr gut!

Bei Verfügbarkeit kontaktieren wir Sie per E-Mail

Es ist immer nur ein Lab möglich

Bestätigen Sie, dass Sie alle vorhandenen Labs beenden und dieses Lab starten möchten

Privates Surfen für das Lab verwenden

Am besten führen Sie dieses Lab in einem Inkognito- oder privaten Browserfenster aus. So vermeiden Sie Konflikte zwischen Ihrem privaten Konto und dem Teilnehmerkonto, die zusätzliche Kosten für Ihr privates Konto verursachen könnten.

Führen Sie diesen kurzen Schritt aus, um Ihr Lab zu starten.