このラボは Google のパートナーである Block.one と共同開発されました。アカウント プロフィールでサービスの最新情報、お知らせ、特典の受け取りをご希望になった場合、お客様の個人情報がラボのスポンサーである Block.one と共有される場合があります。
GSP991
概要
このラボでは、単一ノードの EOSIO ブロックチェーンを拡張して、複数のノードを使用します。さまざまな EOSIO ソフトウェア コンポーネントをインストールして、マルチノード EOSIO ブロックチェーンを設定します。最後に、新しい EOSIO ブロックチェーンでノード オペレーター タスクを実行します。
目標
このラボでは、次のタスクの実行方法について学びます。
- 既存の Compute Engine 仮想マシンを読み込みます。
- EOSIO システム コントラクトをインストールしてビルドします。
- 4 つの EOSIO ノードを使用してマルチノード ブロックチェーンをデプロイします。
- EOSIO マルチノード ブロックチェーンにユーザー アカウントを作成します。
- ユーザー アカウント間でトークンを転送するアクションを呼び出します。
前提条件
このラボを開始する前に、Block.one: EOSIO ブロックチェーンのスタートガイドというラボを完了しておくことをおすすめします。
次のコンセプトについても理解しておくことをおすすめします。
設定と要件
[ラボを開始] ボタンをクリックする前に
こちらの説明をお読みください。ラボには時間制限があり、一時停止することはできません。タイマーは、Google Cloud のリソースを利用できる時間を示しており、[ラボを開始] をクリックするとスタートします。
このハンズオンラボでは、シミュレーションやデモ環境ではなく実際のクラウド環境を使って、ラボのアクティビティを行います。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。
このラボを完了するためには、下記が必要です。
- 標準的なインターネット ブラウザ(Chrome を推奨)
注: このラボの実行には、シークレット モード(推奨)またはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウント間の競合を防ぎ、個人アカウントに追加料金が発生しないようにすることができます。
- ラボを完了するための時間(開始後は一時停止できません)
注: このラボでは、受講者アカウントのみを使用してください。別の Google Cloud アカウントを使用すると、そのアカウントに料金が発生する可能性があります。
ラボを開始して Google Cloud コンソールにログインする方法
-
[ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるダイアログでお支払い方法を選択してください。
右側の [ラボの設定とアクセス] パネルには、以下が表示されます。
- [Google Cloud コンソールを開く] ボタン
- このラボで使用する一時的な認証情報(ユーザー名とパスワード)
- このラボを行うために必要なその他の情報(ある場合)
ラボのタイマーはページの上部に表示され、残り時間が示されます。
-
[Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウで開く] を選択します)。
ラボでリソースがスピンアップし、別のタブで [ログイン] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
注: [アカウントの選択] ダイアログが表示された場合は、[別のアカウントを使用] をクリックします。
-
必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。
{{{user_0.username | "Username"}}}
[ラボの設定とアクセス] パネルでもユーザー名を確認できます。
-
[次へ] をクリックします。
-
以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。
{{{user_0.password | "Password"}}}
[ラボの設定とアクセス] パネルでもパスワードを確認できます。
-
[次へ] をクリックします。
重要: ラボで指定された認証情報を使用する必要があります。ご自身の Google Cloud アカウントの認証情報は使用しないでください。
注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
-
その後のページはクリックして先に進みます。
- 利用規約に同意します。
- 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
- 無料トライアルには登録しないでください。
しばらくすると、このタブで Google Cloud コンソールが開きます。
注: Google Cloud のプロダクトやサービスにアクセスするには、ナビゲーション メニューをクリックするか、[検索] フィールドにサービス名またはプロダクト名を入力します。
背景
このセクションでは、このラボで取り上げるコンセプトの概要について説明します。
EOSIO ブロックチェーン
EOSIO ブロックチェーンは、分散型で動作できる、効率的で決定的な分散ステートマシンです。ブロックチェーンは、交換されたブロックのシーケンス内のトランザクションを追跡します。各ブロックは、同じチェーン内の前のブロックに暗号的にコミットします。したがって、後続のブロックの暗号チェックを壊すことなく、特定のブロックに記録されたトランザクションを変更することは困難です。この単純な事実により、ブロックチェーン トランザクションは不変で安全になります。ブロックの生成とブロックの検証は、ブロック プロデューサーと呼ばれる特別なノードによって行われます。
EOSIO コンセンサス
ブロックの検証は、分散ノードのグループ間で課題となります。分散システム内でフォールト トレラントな方法でこのようなブロックを検証するには、コンセンサス モデルが必要です。コンセンサスは、このような分散ノードとユーザーがブロックチェーンの現在の状態に同意する方法です。ブロックチェーンで使用される最も一般的なコンセンサス モデルは、Proof of Work(PoW)と Proof of Stake(PoS)です。Proof of Stake では、最も多くの資産を保有しているノードが同等の決定権を持ちます。興味深いバリエーションの 1 つに、Delegated Proof-of-Stake(DPoS)があります。これは、多数の参加者またはステークホルダーが少数の代表者を選出し、その代表者が参加者またはステークホルダーに代わって意思決定を行うというものです。EOSIO は、Delegated Proof of Stake(DPoS)を使用してアクティブなプロデューサーを選出します。選出されたプロデューサーは、ブロックの生成、検証、署名を行い、最終的にブロックチェーンに追加する権限を付与されます。
EOSIO アカウント、鍵、権限
アカウントは、EOSIO ブロックチェーンの参加者を識別します。参加者は、アカウント内で割り当てられた権限に応じて、個人またはグループになります。アカウントは、ブロックチェーン内の他のアカウントとの間でのアクションのプッシュや受信を行うスマート コントラクト アクターも表します。EOSIO の鍵は、トランザクション、ブロック、その他のメッセージの署名と検証に使用される Base58 で表されるバイナリ文字列です。鍵は、アカウントに関連付けられたデジタル ウォレット内に作成されます。アカウントの所有権はアカウント名のみで定義されるため、セキュリティを損なうことなくアカウントに関連付けられた鍵を更新できます。アカウント、権限、権限テーブルを含む新しい権限スキームにより、アカウントで実行できることと、トランザクションを構成するアクションが承認される方法が規定されます。そのため、各アカウントには階層型の権限構造が割り当てられ、各権限には署名と検証に使用される公開鍵と秘密鍵のペアが割り当てられます。
EOSIO スマート コントラクト
スマート コントラクトは、トランザクションを構成するアクションの実装を含む低レベルのソフトウェア ライブラリです。また、アクションによってアクセスおよび処理されるデータの保存方法も定義します。EOSIO では、スマート コントラクトは C++ などの高水準言語で実装され、WebAssembly(WASM)バイナリにコンパイルされます。その後、スマート コントラクトをデプロイして、ブロックチェーン上のアカウントのサンドボックス内で実行できます。
タスク 1. 仮想マシンを作成する
-
ナビゲーション メニュー(
)で、[Compute Engine] > [VM インスタンス] をクリックします。
-
新しいインスタンスを作成するには、[インスタンスを作成] をクリックします。
-
[マシンの構成] を参照します。
以下の値を選択します。
-
名前:
instance-1
-
リージョン:
-
ゾーン:
-
マシン ファミリー -
汎用(デフォルト)
-
シリーズ -
E2
-
マシンタイプ -
e2-standard-2(2 vCPU、8 GB メモリ)
-
[OS とストレージ] をクリックします。
[変更] をクリックしてブートディスクの構成を開始し、次の値を選択します。
-
オペレーティング システム:
Ubuntu
-
バージョン:
Ubuntu 22.04 LTS
-
アーキテクチャ:
x86/64
[選択] をクリックします。
-
VM を作成して起動するには、[作成] をクリックします。
注: VM が起動して完全に使用可能になるには、約 2 分かかる場合があります。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
仮想マシンを作成する
タスク 2. EOSIO プラットフォームをインストールする
-
ナビゲーション メニュー(
)で、[Compute Engine] > [VM インスタンス] をクリックします。
作成した VM インスタンスが表示されます。
-
VM instance-1 インスタンスでコマンド プロンプトを開くには、VM インスタンス リストのその行で [SSH] をクリックします。シェル ターミナル ウィンドウが開きます。
-
まず、VM ボックスのソフトウェア パッケージのリストを必ず更新します。
sudo apt update
- EOSIO 2.1.0 に必要ですが、Ubuntu 22.04 以降にはデフォルトで含まれていない
libssl1.1 依存関係をインストールします。
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
- EOSIO ソフトウェア バイナリを取得します。これには、ノード p2p ソフトウェアの nodeos、CLI クライアントの cleos、ウォレット マネージャーの keosd などのツールが含まれます。
curl -LO https://github.com/eosio/eos/releases/download/v2.1.0/eosio_2.1.0-1-ubuntu-20.04_amd64.deb
- EOSIO ソフトウェア バイナリをインストールします。必要なソフトウェアの依存関係をインストールする必要がある場合は、Enter キーを押します。
sudo apt install ./eosio_2.1.0-1-ubuntu-20.04_amd64.deb
- nodeos がインストールされていることを確認します。
nodeos --version
レスポンスは nodeos のバージョンになります。
v2.1.0
- cleos がインストールされていることを確認します。
cleos version client
レスポンスは cleos のバージョンになります。
v2.1.0
- keosd がインストールされていることを確認します。
keosd -v
レスポンスは keosd のバージョンになります。
v2.1.0
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
EOSIO プラットフォームをインストールする
タスク 3. デフォルトのウォレットを作成する
ウォレットには、アカウントとプロデューサーがそれぞれトランザクションとブロックに署名するために使用する暗号鍵が保存されます。また、署名を行うための安全なエンクレーブも提供するため、秘密鍵がウォレットから漏洩することはありません。ブロックチェーンの状態を変更するには、暗号鍵を保存してデジタル署名を行うウォレットが必要です。
- まず、EOSIO ウォレット マネージャーである keosd によって管理されるウォレットのロック解除タイムアウトを大きく設定します。
keosd --unlock-timeout 999999999 &
これにより、デフォルトのタイムアウトである 15 分ごとにウォレットのロックを解除する必要がなくなります。また、keosd デーモン サービスも起動します。レスポンスは次のようになります。
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
必要に応じて Enter キーを押して、シェル プロンプトに戻ります。
- デフォルトのウォレットを作成し、ウォレットのパスワードを my_wallet_password という名前のファイルに出力します。
cleos wallet create --file my_wallet_password
これにより、default という名前のウォレットが作成されます。レスポンスは次のようになります。
ウォレット default を作成中
このウォレットのロック解除に今後使用するパスワードを保存します。パスワードがないと、インポートした鍵を取り出すことができなくなります。
パスワードを my_wallet_password に保存します
ウォレットが作成されると、keosd がデフォルトでウォレットを開いてロックを解除します。
- すべての管理対象ウォレットを表示するには、次のコマンドを実行します。
cleos wallet list
レスポンスは次のようになります。
Wallets:
[
"default *"
]
ウォレット名の横にあるアスタリスクは、ウォレットがロック解除されていることを示します。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
デフォルトのウォレットを作成する
タスク 4. EOSIO システム アカウントの秘密鍵をウォレットに追加する
新しい EOSIO ブロックチェーンには、eosio というデフォルトのシステム アカウントがあります。このアカウントは、ブロックチェーンの初期設定に使用されます。デフォルトでは、次の秘密鍵に関連付けられています: 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3。
この秘密鍵をウォレットにインポートして、eosio アカウントの代わりにトランザクションに署名します。
-
cleos wallet open コマンドを使用して、default ウォレットを開きます。このウォレットはすでに開いていて、ロックが解除されていることに注意してください。ただし、ウォレットが再度ロックされた場合は、次の手順を実行する必要があります。
cleos wallet open
レスポンスは次のようになります。
Opened: default
-
cleos wallet unlock コマンドを使用して、my_wallet_password ファイルに保存されているウォレットのパスワードを渡すことで、default ウォレットのロックを解除します。
cleos wallet unlock <my_wallet_password
レスポンスは次のようになります。
password: Unlocked: default
-
cleos wallet import コマンドを使用して、eosio 秘密鍵
5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 を default ウォレットにインポートします。
cleos wallet import --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
レスポンスは次のようになります。
imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
これは、インポートされた秘密鍵に対応する公開鍵です。デフォルトのウォレットの使用に関する警告は無視してください。本番環境のデプロイでは、default 以外の名前をウォレットに付けることをおすすめします。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
eosio システム アカウントの秘密鍵をウォレットに追加する
タスク 5. EOSIO Contract Development Toolkit(CDT)をインストールする
EOSIO CDT ツールキットには CDT C++ コンパイラが含まれています。これを使用して、システム コントラクトをビルドし、後で独自の C++ スマート コントラクトをビルドできます。システム コントラクトは、さらなる機能の追加とサポートを可能にする第 2 レイヤ ソフトウェア機能を有効にするため、非常に重要です。
- まず、build-essential パッケージをインストールします。このパッケージには、Linux ボックスで C/C++ ソフトウェアをビルドするために必要なさまざまなツールが含まれています。
sudo apt install build-essential
- 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
- EOSIO CDT バイナリをインストールします。
sudo apt install ./eosio.cdt_1.8.1-1-ubuntu-18.04_amd64.deb
- EOSIO CDT コンパイラがインストールされていることを確認します。
eosio-cpp --version
レスポンスは EOSIO CDT コンパイラのバージョンになります。
eosio-cpp version 1.8.1
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
EOSIO Contract Development Toolkit をインストールする
タスク 6. システム コントラクトと eosio.boot をビルドする
機能するマルチノード EOSIO ブロックチェーンを構築するには、EOSIO システム コントラクトをデプロイする必要があります。システム コントラクトは、EOSIO コンセンサスに必要なレイヤ 2 の機能、トークンのステーキング、投票、独自のトークンの作成などを提供します。また、新機能のサポートも可能にします。
-
eosio.contracts ビルド スクリプトで使用されるソフトウェア依存関係である CMake をインストールします。
sudo apt install cmake
- 最新のシステム eosio.contracts をダウンロードします。
git clone https://github.com/EOSIO/eosio.contracts.git \
--branch release/1.9.x --single-branch
- システム eosio.contracts をビルドします。このステップでは、eosio と eosio.cdt のインストール ディレクトリも渡す必要があります。
cd eosio.contracts
./build.sh -e /usr/opt/eosio/2.1.0 -c /usr/opt/eosio.cdt/1.8.1
cd ~
ricardian 契約がないという警告が表示された場合は、無視してください。レスポンスは次のようになります(警告は表示されません)。
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. テストをビルドするには、BUILD_TESTS を 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`
EOSIO システム コントラクトがビルドされる場所をメモします。これは、後で特定のシステム コントラクト ~/eosio.contracts/build/contracts をデプロイするときに必要になります。
-
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 ~
警告は無視してください。レスポンスは次のようになります。
-- Configuring done
-- Generating done
-- Build files have been written to: ~/eos/contracts/contracts/eosio.boot
-
eosio.boot コントラクトがビルドされる場所をメモします。後で
~/eos/contracts/contracts/eosio.boot をデプロイする際に必要になります:
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
システム コントラクトと eosio.boot をビルドする
タスク 7. ブートノードを起動してシステム アカウントを作成する
このタスクでは、ブート ジェネシス ノードを起動してシステム アカウントを作成します。ウォレットの作成とは異なり、アカウントを作成するには、ブロックチェーンにトランザクションを送信する必要があります。
したがって、少なくともブートノードは実行されている必要があります。そのためには、まずすべてのノードで使用されるデータ ディレクトリとジェネシス ファイルを作成する必要があります。本番環境では、各ノードは独自のサーバーでホストされ、独自のリソースを使用します。ここでは、すべてのノードを同じボックスにデプロイします。
- 新しいディレクトリ nodes を作成します。ここには、ブロックチェーン データベース、ログファイル、各ノードの構成ファイルが保存されます。
mkdir nodes
-
nodes ディレクトリにデフォルトの genesis.json ファイルを作成します。
cat >nodes/genesis.json
- 次の JSON の内容をコピーしてターミナルに貼り付け、Enter キーを押してから Ctrl+D キーを押して 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"
}
「initial_key」は、eosio アカウントで使用される初期開発公開鍵を示します。必要に応じて、独自の開発用の鍵でオーバーライドできます。これは本番環境デプロイにおすすめです。このような鍵は、eosio アカウントで使用されるウォレットに存在する必要があります。この鍵は前のセクションでインポートしました。
-
genesis.json ファイルが実際に作成され、データが入力されたことを確認します。
cat nodes/genesis.json
前の手順と同じ内容が表示されます。
- ブートノードに関連するすべてのブロックチェーン データを保存するブートノード ディレクトリ nodes/00-boot を作成します。
mkdir nodes/00-boot
- ブートノードを起動し、nodeos サービス デーモンをバックグラウンド タスクとして起動し、stdout/stderr を 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 &
これにより、いくつかのプラグイン、プロデューサー名 eosio でブートノードが起動し、http ポート 8888、p2p ポート 9876 でリッスンし、デフォルトの開発用の鍵 EOS6MRy...、5KQwrP... を使用してブロック署名を行います。--signature-provider でオーバーライドしない場合、デフォルトの eosio 開発用の鍵が使用されます。
- ブートノードが実行され、ブロックを生成していることを確認します。
tail -f nodes/00-boot/00.log
出力は次のようになります。
出力:
...
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]
最後の行には、生成された最後のブロック番号と、最後のブロックとブロックチェーンの終わりを示す現在の「最後の不可逆ブロック」(lib)が表示されます。
-
Ctrl+C キーを押して tail プログラムを終了します。
-
ブートノードが実行されたので、チェーン データベースに保存されている eosio アカウントに関する情報を取得できます。
cleos get account eosio
レスポンスは次のようになります。
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
eosio アカウントがたしかに特権アカウントであり、owner 権限と active 権限の両方に関連付けられている鍵が、ウォレットにインポートされたデフォルトの開発用の鍵と同じものであることを確認してください。これにより、マルチノード ブロックチェーンの設定時に eosio アカウントがトランザクションを承認できるようになります。
- 追加のシステム アカウントを作成します。これらのアカウントもブロックチェーン データベースに保存されます。
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
すべてのシステム アカウントと、owner 権限と active 権限の両方に同じ開発用の鍵ペアを割り当てます。本番環境のデプロイでは、セキュリティを強化するために、権限ごとに異なる鍵ペアを割り当てることをおすすめします。システム アカウントごとに異なる鍵を使用することもできます。
上記のコマンドに対するレスポンスは次のようになります。
executed transaction: 98f22027c6703e554042b1d4a93beb70b1dc30be0fe65267932155c9d70e6493 200 bytes 153 us
# eosio <= 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 <= 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 ]
警告は無視してください。これらのアカウントは次のタスクで使用します。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
システム コントラクトと eosio.boot をビルドする
タスク 8. eosio.token コントラクトと eosio.msig コントラクトをデプロイし、SYS トークンを作成して発行する
このタスクでは、架空の SYS トークンを作成して発行します。そのためには、以前に構築した eosio.token と eosio.msig のシステム コントラクトもデプロイする必要があります。
-
eosio.token コントラクトをデプロイします。このコントラクトを使用すると、新規または既存のトークンを作成、発行、転送できます。
cleos set contract eosio.token ~/eosio.contracts/build/contracts/eosio.token/
レスポンスは次のようになります。
Reading WASM from ~/eosio.contracts/build/contracts/eosio.token/eosio.token.wasm...
Publishing contract...
executed transaction: 11aca7fb68e0821cf8f74be0188741964787f830d0918abdfccae4a54c25e291 19360 bytes 4445 us
# eosio <= eosio::setcode {"account":"eosio.token","vmtype":0,"vmversion":0,"code":"0061736d010000000180022860000060037f7f7f01...
# eosio <= eosio::setabi {"account":"eosio.token","abi":"0e656f73696f3a3a6162692f312e320008076163636f756e7400010762616c616e63...
-
eosio.msig コントラクトをデプロイします。このコントラクトにより、アカウント間のマルチシグネチャ プロセスが可能になり、権限の管理が簡素化されます。
cleos set contract eosio.msig ~/eosio.contracts/build/contracts/eosio.msig/
レスポンスは次のようになります。
Reading WASM from ~/eosio.contracts/build/contracts/eosio.msig/eosio.msig.wasm...
Publishing contract...
executed transaction: c2260b7d05bb38d2df097799baedd890ce7560bedbd1b79e7d07e4f6a5b25238 23256 bytes 3684 us
# eosio <= eosio::setcode {"account":"eosio.msig","vmtype":0,"vmversion":0,"code":"0061736d0100000001b8022f60000060037f7f7f017...
# eosio <= eosio::setabi {"account":"eosio.msig","abi":"0e656f73696f3a3a6162692f312e32001006616374696f6e0004076163636f756e740...
- 合計 100 億個のトークンを配布する SYS トークンを作成します。
cleos push action eosio.token create '["eosio", "10000000000.0000 SYS"]' -p eosio.token
上記のコマンドは、eosio.token アカウントのアクティブ権限によって承認された、eosio.token コントラクトの create アクションを含むトランザクションをプッシュします。レスポンスは次のようになります。
executed transaction: 6a4766a00c8fe26343d5eb6c1ad5e53b35064dc6f3a5f55908eff2edba30efca 120 bytes 603 us
# eosio.token <= eosio.token::create {"issuer":"eosio","maximum_supply":"10000000000.0000 SYS"}
- 準備金から 10 億個の SYS トークンを発行して、流通させます。
cleos push action eosio.token issue '["eosio", "1000000000.0000 SYS", "memo"]' -p eosio
上記のコマンドは、eosio アカウントのアクティブ権限によって承認された eosio.token コントラクトから issue アクションを含むトランザクションをプッシュします。
レスポンスは次のようになります。
executed transaction: 4613fcff26bc6f96010273b475e839018f0afe2ef2af840d481070c9c54e36f1 128 bytes 405 us
# eosio.token <= eosio.token::issue {"to":"eosio","quantity":"1000000000.0000 SYS","memo":"memo"}
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
eosio.token、eosio.msig コントラクト、SYS トークンを作成してデプロイする
タスク 9. プロトコル機能を有効にして、eosio.boot コントラクトと eosio.system コントラクトをデプロイする
プロトコル機能により、EOSIO ブロックチェーンにオプションの機能が追加されます。このタスクでは、EOSIO ブロックチェーンに強く推奨されるプロトコル機能を有効にします。そのため、まず eosio.boot コントラクトをデプロイし、これらの機能を有効にします。最後に、eosio.system コントラクトをデプロイして、EOSIO ブロックチェーンの第 2 レイヤを完成させます。
これにより、システム リソース(CPU、RAM、NET)が有効になり、トークンのステーキングとアンステーキング、リソースの購入、プロデューサー候補の登録とそれに対する投票、プロデューサー報酬の請求、権限と上限の設定などが可能になります。プロトコル機能は、プロデューサーの過半数による EOSIO コンセンサスを通じて有効にする必要があります。この場合、実行中のブートノードのみが必要です。
- まず、jq ツールをインストールして、JSON 文字列を読みやすい形式で解析します。
sudo apt install jq
- 次に、サポートされているプロトコル機能を確認します。
curl -X POST http://127.0.0.1:8888/v1/producer/get_supported_protocol_features -d '{"exclude_disabled": false, "exclude_unactivatable": false}' | jq | more
上記のコマンドは、Producer API プラグインによって提供される get_supported_protocol_features エンドポイントに HTTP POST リクエストを送信します。
レスポンスには、現在の EOSIO ネットワーク(これまでのところブートノードで構成)でサポートされているすべてのプロトコル機能が表示されます。
シェル プロンプトが戻るまで、出力を確認します(Space キーを複数回押します)。
出力:
[{"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"}]}]
-
PREACTIVATE_FEATURE 機能を有効にします。これにより、eosio.system コントラクトのアップグレードなど、他の機能を有効にできます。このコントラクトでは、新機能が実装される可能性があります。また、プロトコル機能は、特定の機能の機能ダイジェストまたはハッシュコードを渡すことで有効にする必要があります。
curl -X POST http://127.0.0.1:8888/v1/producer/schedule_protocol_feature_activations -d '{"protocol_features_to_activate": ["0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd"]}'
機能ダイジェスト ハッシュコード 0ec7e... は、前のステップの get_supported_protocol_features エンドポイントから返された feature_digest フィールドから取得できます。有効化が成功すると、レスポンスは次のようになります。
出力:
{"result": "ok"}
機能がすでに有効になっている場合は、代わりに次のレスポンスが返されますが、無視しても問題ありません。
出力:
{"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"}]}}
-
eosio.boot コントラクトをデプロイします。
cleos set contract eosio ~/eos/contracts/contracts/eosio.boot/
レスポンスは次のようになります。
Reading WASM from ~/eos/contracts/contracts/eosio.boot/eosio.boot.wasm...
Publishing contract...
executed transaction: a029c644104da357a201f75058fc6772cf63f5fdfa9135be2c3b7c498d81d46d 2752 bytes 852 us
# eosio <= eosio::setcode {"account":"eosio","vmtype":0,"vmversion":0,"code":"0061736d01000000013e0c60000060027f7f0060017e0060...
# eosio <= eosio::setabi {"account":"eosio","abi":"0e656f73696f3a3a6162692f312e32001008616374697661746500010e666561747572655f...
-
KV_DATABASE、ACTION_RETURN_VALUE などの追加のプロトコル機能を有効にします。これは、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
-
eosio.system コントラクトをデプロイします。これにより、第 2 レイヤの機能が有効になり、単一ノードからマルチノード ブロックチェーンへの移行が可能になります。
cleos set contract eosio ~/eosio.contracts/build/contracts/eosio.system/
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
eosio.boot コントラクトと eosio.system コントラクトをデプロイする
タスク 10. ブロック プロデューサー アカウントを作成する
このタスクでは、最終的に EOSIO ブロックチェーンを引き継いでブロックを生成するプロデューサー アカウントを作成します。最初の手順では、eosio.msig を特権アカウントとして指定します。これにより、このアカウントは、eosio アカウントに代わって承認を行うことができます。その後、eosio アカウントはその権限を放棄し、選出されたプロデューサーのグループを表す eosio.prods アカウントがブロックの生成と検証の責任を引き継ぎます。
-
eosio.msig を特権アカウントとして設定します。
cleos push action eosio setpriv '["eosio.msig", 1]' -p eosio
レスポンスは次のようになります。
executed transaction: 385f0eb3c169898cc7faae46bb4371dbbfc46c5d482249c9933c4f8627fb271c 104 bytes 208 us
# eosio <= eosio::setpriv {"account":"eosio.msig","is_priv":1}
- SYS トークンをバージョン 0 として初期化し、精度として小数点以下 4 桁を割り当てます。
cleos push action eosio init '["0", "4,SYS"]' -p eosio
レスポンスは次のようになります。
executed transaction: c537fbd77983104d8dcb1c58b09b433f68a2dd12c876a27b7556d4a722d42939 104 bytes 3467 us
# eosio <= eosio::init {"version":0,"core":"4,SYS"}
# eosio.token <= eosio.token::open {"owner":"eosio.rex","symbol":"4,SYS","ram_payer":"eosio"}
- プロデューサーがブロック署名に使用する鍵をインポートします。本番環境のデプロイでは、これらの鍵を最初に作成してからインポートする必要があります。
cleos wallet import --private-key 5KLGj1HGRWbk5xNmoKfrcrQHXvcVJBPdAckoiJgFftXSJjLPp7b
cleos wallet import --private-key 5K6qk1KaCYYWX86UhAfUsbMwhGPUqrqHrZEQDjs9ekP5j6LgHUu
cleos wallet import --private-key 5JCStvbRgUZ6hjyfUiUaxt5iU3HP6zC1kwx3W7SweaEGvs4EPfQ
cleos wallet import --private-key 5JJjaKnAb9KM2vkkJDgrYXoeUEdGgWtB5WK1a38wrmKnS3KtkS6
これらの既存の鍵をインポートすると、このラボのリソース管理が簡素化されます。ただし、本番環境のデプロイでは、新しい鍵を作成する必要があります。
各コマンドのレスポンスは次のようになります。
imported private key for: EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz
imported private key for: EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC
imported private key for: EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6
imported private key for: EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d
ノードが分散されている場合、各鍵ペアは各サーバーのウォレットに個別に保存されます。このラボでは、わかりやすくするために同じウォレットに保存します。
- 初期リソースと公開鍵を使用してブロック プロデューサー アカウントを作成します。
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
上記のコマンドを実行すると、新しいアカウント producer.one、producer.two、produc.three、produce.four が作成され、前の手順でインポートした各鍵が各アカウントに関連付けられます。また、NET と CPU に 5,000 万 SYS、RAM に 8,000 SYS を割り当ててステークします。
レスポンスは次のようになります(新しいアカウントごと)。
executed transaction: 6164d2741433c68edf426d430cb0986b198a6f4c63e7f7a46bcf8343562eacc0 336 bytes 1029 us
# eosio <= eosio::newaccount {"creator":"eosio","name":"producer.one","owner":{"threshold":1,"keys":[{"key":"EOS8imf2TDq6FKtLZ8mv...
# eosio <= eosio::buyrambytes {"payer":"eosio","receiver":"producer.one","bytes":8388608}
# eosio <= eosio::delegatebw {"from":"eosio","receiver":"producer.one","stake_net_quantity":"50000000.0000 SYS","stake_cpu_quantity...
# eosio.token <= eosio.token::transfer {"from":"eosio","to":"eosio.ram","quantity":"122.0851 SYS","memo":"buy ram"}
# eosio.token <= eosio.token::transfer {"from":"eosio","to":"eosio.ramfee","quantity":"0.6135 SYS","memo":"ram fee"}
# eosio <= eosio.token::transfer {"from":"eosio","to":"eosio.ram","quantity":"122.0851 SYS","memo":"buy ram"}
# eosio.ram <= eosio.token::transfer {"from":"eosio","to":"eosio.ram","quantity":"122.0851 SYS","memo":"buy ram"}
# eosio <= eosio.token::transfer {"from":"eosio","to":"eosio.ramfee","quantity":"0.6135 SYS","memo":"ram fee"}
# eosio.ramfee <= eosio.token::transfer {"from":"eosio","to":"eosio.ramfee","quantity":"0.6135 SYS","memo":"ram fee"}
# eosio.token <= eosio.token::transfer {"from":"eosio","to":"eosio.stake","quantity":"100000000.0000 SYS","memo":"stake bandwidth"}
# eosio <= eosio.token::transfer {"from":"eosio","to":"eosio.stake","quantity":"100000000.0000 SYS","memo":"stake bandwidth"}
# eosio.stake <= eosio.token::transfer {"from":"eosio","to":"eosio.stake","quantity":"100000000.0000 SYS","memo":"stake bandwidth"}
- 新しいアカウントをプロデューサーとして登録します。各コマンドは、プロデューサーのウェブ URL も想定しています。説明のために架空の URL を使用しています。
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
上記のコマンドに対するレスポンスは次のようになります。
executed transaction: 28ced4a34abd64fb2fc11fbb51d3e4e18d2933a9ab2560fc1c6fb80b0cfc336d 216 bytes 753 us
# eosio <= eosio::regproducer {"producer":"producer.one","producer_key":"EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz","u...
executed transaction: 06b8be4187c5fbabc3197064ae4c6d55ba553fdbcc8a560f060078e59d5dfc5e 216 bytes 306 us
# eosio <= eosio::regproducer {"producer":"producer.two","producer_key":"EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC","u...
executed transaction: c23a5164bf0cc1e35dfa3e55fed56e935ceb7d764dbe2e7a3bf4aee446e7d88d 216 bytes 270 us
# eosio <= eosio::regproducer {"producer":"produc.three","producer_key":"EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6","u...
executed transaction: 081aa8aca08b6d4e8e6bf576b2882f578faa7148e7c550196ff256ab0a9dcca3 216 bytes 224 us
# eosio <= eosio::regproducer {"producer":"produce.four","producer_key":"EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d","u...
- 現在のプロデューサー アカウントの一覧を表示します。合計 4 つ必要です。
cleos system listproducers
レスポンスは次のようになります。
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`**
まだプロデューサーが投票されていないため、各プロデューサーの投票数はゼロのままです。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
ブロック プロデューサー アカウントを作成する
タスク 11. 単一ノード プロデューサーからマルチノード プロデューサーに移行する
このタスクでは、単一ノードのブロックチェーンからマルチノードのブロックチェーンに移行します。現在、eosio アカウントのみが特権を持ち、ブロックに署名できます。目標は、選出されたプロデューサーのコレクションによって管理される EOSIO ブロックチェーンを作成することです。このブロックチェーンでは、2/3 + 1 のプロデューサーの過半数がブロックを確認した後にコンセンサスが達成されます。そのブロック内のすべてのトランザクションが確定します。
- 新しいプロデューサー ノード 1、2、3、4 に関連するすべてのブロックチェーン データを保存するために、残りのノード ディレクトリ nodes/01-node、nodes/02-node、nodes/03-node、nodes/04-node を作成します。
mkdir nodes/01-node nodes/02-node nodes/03-node nodes/04-node
- ノード 1 を起動し、nodeos サービス デーモンをバックグラウンド タスクとして起動し、stdout/stderr を 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 &
これにより、いくつかのプラグイン、プロデューサー名 producer.one でブートノード 1 が起動し、http ポート 8889、p2p ポート 9877 でリッスンし、独自の鍵 EOS8imf...、5KLGj1... でデフォルトの開発用の鍵をオーバーライドして、p2p ノード 9876(ブートノード)に接続します。
- 次のコマンドを実行すると、ノード 1 のログでブートノード(p2p ノード 9876)と交換されたメッセージを確認できます。
cat nodes/01-node/01.log | grep :9876 -C 3
出力は次のようになります。
出力:
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]
...
ノード 1 はまだブロックを生成していませんが、当面はブートノードなどの他のノードからブロックを受信して同期しています。
- ノード 2 を起動し、nodeos サービス デーモンをバックグラウンド タスクとして起動し、stdout/stderr を 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 &
これにより、いくつかのプラグイン、プロデューサー名 producer.two でブートノード 2 が起動し、http ポート 8890、p2p ポート 9878 でリッスンし、独自の鍵 EOS8imf...、5KLGj1... でデフォルトの開発用の鍵をオーバーライドして、p2p ノード 9876(ブートノード)と p2p ノード 9877(ノード 1)に接続します。
- 次のコマンドを実行すると、ノード 2 のログでノード 1(p2p ノード 9877)と交換されたメッセージを確認できます。
cat nodes/02-node/02.log | grep :9877 -C 3
出力は次のようになります。
出力:
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
...
ノード 2 はまだブロックを生成していませんが、当面はブートノードやノード 1 などの他のノードからブロックを受信して同期しています。
- ノード 3 を起動し、nodeos サービス デーモンをバックグラウンド タスクとして起動し、stdout/stderr を 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 &
これにより、いくつかのプラグイン、プロデューサー名 produc.three でノード 3 が起動し、http ポート 8891、p2p ポート 9879 でリッスンし、独自の鍵 EOS5n44...、5JCStv... でデフォルトの開発用の鍵がオーバーライドして、p2p ノード 9876(ブートノード)、p2p ノード 9877(ノード 1)、p2p ノード 9878(ノード 2)に接続します。
- 次のコマンドを実行すると、ノード 3 のログでノード 2(p2p ノード 9878)と交換されたメッセージを確認できます。
cat nodes/03-node/03.log | grep :9878 -C 3
出力は次のようになります。
出力:
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
...
ノード 3 はまだブロックを生成していませんが、当面はブートノード、ノード 1 やノード 2 などの他のノードからブロックを受信して同期しています。
- ノード 4 を起動し、nodeos サービス デーモンをバックグラウンド タスクとして起動し、stdout/stderr を 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 &
これにより、いくつかのプラグイン、プロデューサー名 produce.four でノード 4 が起動し、http ポート 8892、p2p ポート 9880 でリッスンし、独自の鍵 EOS5y3T...、5JJjaK... でデフォルトの開発用の鍵をオーバーライドして、p2p ノード 9876(ブートノード)、p2p ノード 9877(ノード 1)、p2p ノード 9878(ノード 2)、p2p ノード 9879(ノード 3)に接続します。
- 次のコマンドを実行すると、ノード 4 のログでノード 3(p2p ノード 9879)と交換されたメッセージを確認できます。
cat nodes/04-node/04.log | grep :9879 -C 3
レスポンスは次のようになります。
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
...
ノード 4 はまだブロックを生成していませんが、当面はブートノードやノード 1、2、3 などの他のノードからブロックを受信して同期しています。
この時点で、新しいノード 1、2、3、4 がすべて起動して接続されます。ブートノードによって生成されたブロックを受信して同期しますが、まだ生成は行いません。そのため、新しいプロデューサーを選出する必要があります。本番環境のデプロイでは、通常、ユーザーは投票コマンドで候補プロデューサーのプールから最大 30 人のプロデューサーに投票します。上位 21 人のプロデューサーがブロック プロデューサーとして選出されます。
ここでは、既存のプロデューサー アカウントを使用して、利用可能な 4 つのプロデューサーのみを選出します。SYS トークンの供給量の 15% がステークされると、選出された上位のプロデューサーがプロック生成の候補として提案されます。プロデューサーのリストを含むブロックが確認されて確定すると、新しいプロデューサーは次のスケジュールされたラウンドでブロックの生成を開始します。
-
cleos system voteproducer prods コマンドを使用して、特定のプロデューサーに投票します。アカウント producer.one は、自身とプロデューサー 2、3、4 に投票します。producer.two は、自身とプロデューサー 3、4 に投票します。produc.three と produce.four は、produc.three が自身と produce.four に投票し、produce.four が自身に投票します。
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
レスポンスは次のようになります。
executed transaction: 833178bdc9d5b8c86778fa2b2c0f20e976f4c253cb6ebcaa6ade8eb8bf3d0a4f 144 bytes 861 us
# eosio <= eosio::voteproducer {"voter":"producer.one","proxy":"","producers":["produc.three","produce.four","producer.one","produc...
executed transaction: 9c4961678017bfc2a7fd1398a2e4b33e472a6cadc0340400ebe9207e188d7692 136 bytes 379 us
# eosio <= eosio::voteproducer {"voter":"producer.two","proxy":"","producers":["produc.three","produce.four","producer.two"]}
executed transaction: d3d23bae8730f18e82da53defaff7184c49b83181bb9b6fa32096684e61ed74d 128 bytes 371 us`
# eosio <= eosio::voteproducer {"voter":"produc.three","proxy":"","producers":["produc.three","produce.four"]}
executed transaction: 95f63d46554dd436388e36b017b8e350514ef5b407b1c33c5779dc29c862cdb6 120 bytes 304 us`
# eosio <= eosio::voteproducer {"voter":"produce.four","proxy":"","producers":["produce.four"]}
- 各プロデューサーに投票された割合を確認します。
cleos system listproducers
上記のコマンドに対するレスポンスは次のようになります。
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
プロデューサー 1 が 10%、プロデューサー 2 が 20%、プロデューサー 3 が 30%、プロデューサー 4 が 40% の票を獲得したことがわかります。すべてのプロデューサーがステークした SYS トークンの合計数がトークン供給量の 15% を超えているため、上位 21 人のプロデューサー(デフォルト)がブロック生成の候補として提案されます。
ブロック プロデューサーのリストを含むブロックが最終確認された後に、実際のブロック生成が開始されます。プロデューサーは 4 人しかいないため、全員がブロック生成を行い、そのうちの 3 人で過半数に達します。
- 新しいプロデューサーが実際にブロックを生成していることを確認します。
tail -f nodes/01-node/01.log | grep Produced
上記のコマンドは、プロデューサー 1 によって生成された最後のブロックを表示します。まだ出力が表示されない場合は、数秒お待ちください。4 つのプロデューサーが、それぞれ 6 秒ごとに 12 個のブロックを生成します。したがって、最後のブロックが生成されてから次のラウンドの最初のブロックが生成されるまで 18 秒間隔を空ける必要があります。
レスポンスは次のようになります。
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]`
さらに 18 秒待つと、次のラウンドの 12 個のブロックが生成される様子を確認できます。以降も同様に続いていきます。上記のコマンドの 01 を 02、03、04 に置き換えることで、他の 3 つのノードが実際にブロックを生成していることを確認することもできます。
-
Ctrl+C キーを押して tail コマンドを終了します。
-
ブートノードがブロックを生成していないことを確認します。
tail -f nodes/00-boot/00.log | grep Produced
上記のコマンドでは出力が生成されません。これは、ブートノードがブロック生成を新しく選出されたプロデューサーに譲渡したことを示しています。
4 つのプロデューサーで完全に機能するブロックチェーンができたので、デフォルトの eosio アカウントと関連する eosio.* アカウントから、トランザクションに署名してブロックチェーンの状態を変更する権限をすべて削除する必要があります。そのためには、eosio アカウントと eosio.* アカウントで使用されている鍵を null にリセットして再署名する必要があります。
-
eosio アカウント情報を取得します。owner 権限と active 権限に関連付けられている鍵を確認します。
cleos get account eosio
レスポンスは次のようになります。
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
-
eosio アカウントで使用される鍵を再署名し、その権限を 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
レスポンスは次のようになります。
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
eosio アカウントには、owner 権限と active 権限に関連付けられたデフォルトの開発用の鍵がなくなっています。代わりに、権限は親の eosio.prods@active 権限の子権限になりました。これは、すべてのアクティブなブロック プロデューサーを表す同じアカウント グループです。
そのため、現在では eosio アカウントは基本的に eosio.prods アカウントによって制御されています。
-
eosio.* アカウントで使用される鍵を再署名し、その権限を 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
eosio.* アカウントには、owner 権限と active 権限に関連付けられたデフォルトの開発用の鍵がなくなりました。代わりに、権限は親の eosio@active 権限の子権限になり、その権限は eosio.prods@active アカウントの子権限になります。
そのため、eosio を含むすべてのシステム アカウントは、アクティブなすべてのブロック プロデューサーのアカウント グループを表す eosio.prods アカウントによって制御されます。これで、完全に動作するマルチノード EOSIO ブロックチェーンが構築されました。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
単一ノード プロデューサーからマルチノード プロデューサーに移行する
お疲れさまでした
このラボでは、以前にデプロイした単一ノードの EOSIO ブロックチェーンを複数のブロックチェーン ネットワークに拡張しました。また、さまざまな EOSIO ソフトウェア コンポーネントをインストールして、マルチノード EOSIO ブロックチェーンを設定しました。最後に、新しい EOSIO ブロックチェーンでノード オペレーターのタスクを実行しました。
次のステップと詳細情報
Google Cloud トレーニングと認定資格
Google Cloud トレーニングと認定資格を通して、Google Cloud 技術を最大限に活用できるようになります。必要な技術スキルとベスト プラクティスについて取り扱うクラスでは、学習を継続的に進めることができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、バーチャル参加など、多忙なスケジュールにも対応できるオプションが用意されています。認定資格を取得することで、Google Cloud テクノロジーに関するスキルと知識を証明できます。
マニュアルの最終更新日: 2024 年 12 月 12 日
ラボの最終テスト日: 2024 年 10 月 22 日
Copyright 2026 Google LLC. All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。