【完全保存版】SubstrateのQuick Startを実行しよう!
この記事は、こちらの公式の文書を翻訳・編集したものです。
1 Substrateとは
1 Substrateの概要
本記事では、アプリケーションに最適化されたブロックチェーンを構築するためのSubstrateフレームワークの概要について説明します。
ここに記載されているトピックはすべて、ドキュメントの他の部分でより詳しく説明されています。
2 Substrateとは?
Substrateはソフトウェア開発キット(SDK)で、Rustベースのライブラリやツールを使って、モジュール化された拡張可能なコンポーネントからアプリケーション固有のブロックチェーンを構築することができます。
Substrateを使って構築されたアプリケーション固有のブロックチェーンは、スタンドアロンのサービスとして、または他のチェーンと並行して実行することができ、Polkadotエコシステムが提供する共有セキュリティを活用することができます。
Substrateにはブロックチェーンインフラストラクチャのコアコンポーネントのデフォルト実装が含まれているため、アプリケーションロジックに集中することができます。
3 FRAMEとは何ですか?
FRAMEは、Substrateソフトウェア開発キットを柔軟で様々なユースケースに適応できるようにする、モジュール式で拡張可能なコアのコンポーネントを提供します。
FRAMEには、アプリケーション固有のロジックの開発を簡素化および効率化する、Rustベースのプログラムとライブラリが含まれています。
FRAMEが提供する機能のほとんどは、パレットと呼ばれるプラグインモジュールの形で提供されます。
4 なぜSubstrateとFRAMEを使うのですか?
SubstrateとFRAMEを利用することで、ブロックチェーンをゼロから構築する複雑さや、汎用ブロックチェーンで構築する制限を受けることなく、概念実証済みのアプリケーション特化型ブロックチェーンを構築することができます。
SubstrateとFRAMEを利用すれば、柔軟性、アップグレード可能性、オープンソースライセンス、クロスコンセンサス相互運用性といった追加的なメリットとともに、あなたのチェーンをユニークで革新的なものにするビジネスロジックの構築に集中することができます。
5 サブストレートノードとは?
すべてのブロックチェーンプラットフォームは、取引やブロックについて相互に通信するノードと呼ばれるコンピュータの分散型ネットワークに依存しています。
一般的に、この文脈におけるノードとは、ネットワーク内の物理的または仮想的なマシンではなく、接続されたデバイス上で実行されるソフトウェアを指します。
ソフトウェアとしてのSubstrateノードは、別々の責任を持つ2つの主要部分で構成されています。
1 ネットワークとブロックチェーンインフラストラクチャのアクティビティを処理する外部ノードサービスを備えたコアクライアント。
2 状態遷移とブロックチェーンの現在の状態のためのビジネスロジックを持つランタイム。
6 なぜカスタムランタイムを構築するのか?
クライアント主導のアクティビティとランタイム主導のアクティビティに責任を分離することが、Substrateノードをアップグレード可能にする重要な部分です。
アプリケーションロジックは、あなたのチェーンをユニークなものにするものであり、WebAssemblyバイナリの形でチェーン上に保存されます。
アプリケーションロジックに変更を加える場合は、新しいWebAssemblyバイナリをコンパイルするだけです。
その後、トランザクションを送信して、現在チェーン上に保存されているWebAssemblyバイナリを更新したバイナリで更新することができます。
カスタムランタイムはチェーンの状態の一部として保存される自己完結型のオブジェクトであるため、簡単にアプリケーション設計を反復し、コミュニティの発展に合わせてプロジェクトを進化させることができます。
2 ノードを始める
1 ノードを起動する
Substrateのチュートリアルやハウツーガイドを読むには、開発環境にSubstrateノードを構築し、実行する必要があります。
作業環境を素早くセットアップできるように、Substrate Developer Hub にはテンプレートが用意されています。
例えば、substrate-node-template は、Substrate node-template バイナリのスナップショットです。
ノードを起動した後、ウェブブラウザと、事前定義されたアカウントのバランスを調べるためのシンプルなアプリケーションを使用して、それに接続できます。
2 始める前に
始める前に以下を確認してください。
インターネットに接続し、ローカルコンピュータの対話型シェル端末にアクセスできる。
ソフトウェア開発とコマンドラインインターフェイスの使用に慣れている。
Rustコンパイラとツールチェーンがインストールされている。
Rustがインストールされているかどうかは、rustup showコマンドを実行することで確認できます。
Rustがインストールされている場合、このコマンドはツールチェーンとコンパイラのバージョン情報を表示します。
Rustがインストールされていない場合、このコマンドは何も出力を返しません。
Rustのインストールについては、「インストール」を参照してください。
3 ノードテンプレートのビルド
以下のコマンドを実行して、ノードテンプレートリポジトリをクローンします。
git clone https://github.com/substrate-developer-hub/substrate-node-template
このコマンドはメインブランチをクローンします。
オプションで、-branchコマンドラインオプションとタグを使って、ノードの互換性を保ちたいPolkadotのバージョンを指定することができます。
クローンしたディレクトリのルートに移動します。
cd substrate-node-template
以下のようなコマンドを実行して、作業を保存するための新しいブランチを作成します。
git switch -c my-learning-branch-yyyy-mm-dd
ノード・テンプレートをコンパイルする
cargo build --package node-template --release
初めてノードをコンパイルするときは、完了までに時間がかかることがあります。
コンパイルが完了すると、次のような行が表示されるはずです。
Finished release [optimized] target(s) in 11m 23s
4 ノードの情報を見る
以下のコマンドを実行して、ノードが使用可能であることを確認し、使用可能なコマンドラインオプションの情報を確認します。
./target/release/node-template --help
使用状況情報には、以下のコマンドラインオプションが表示されます。
ノードの起動
アカウントとキーの操作
ノードの操作の変更
以下のコマンドを実行して、定義済みのAlice開発アカウントのアカウント情報を表示します。
./target/release/node-template key inspect //Alice
コマンドは以下のアカウントとアドレス情報を表示します。
Secret Key URI `//Alice` is account:
Network ID: substrate
Secret seed: 0xe5be9a5092b81bca64be81d212e7f2f9eba183bb7a90954f7b76361f6edb5c0a
Public key (hex): 0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d
Account ID: 0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d
Public key (SS58): 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY
SS58 Address: 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY
せっかくなので、何をやっているのかを見てみましょう。
下のように、公開鍵やSS58アドレスを取得する旨が書かれています。
./target/release/node-template key -h
AliceやBobのような定義済みの開発アカウントはチェーン仕様ファイルで設定します。
(ちなみに下のように見ることができます。翻訳者追記)
ノード・テンプレート・ファイルについては「コードを探る」で、チェーン仕様ファイルについては「チェーン仕様」で詳しく説明します。
今のところ、開発用アカウントは残高移動のような単純なトランザクションのテストを可能にするために存在すると認識しておけば十分です。
5 ブロックチェーンを開始する
以下のコマンドを実行して、ノードを開発モードで起動します。
開発モードでは、チェーンはブロックを確定するためにピアコンピュータを必要としません。
ノードが起動すると、ターミナルに実行された操作に関する出力が表示されます。
ブロックが提案され、確定されたというメッセージが表示されれば、ノードが起動していることになります。
... Idle (0 peers), best: #3 (0xcc78…5cb1), finalized #1 ...
... Starting consensus session on top of parent ...
... Prepared block for proposing at 4 (0 ms) ...
6 ノードに接続する
7 ノードの停止
ブロックチェーン操作を表示するターミナルに移動します。
ローカルブロックチェーンを停止し、control-cキーを押して全ての状態をクリアします。
3 コードを探る
0 はじめに
第2章では、ローカルのSubstrateノードをコンパイルし、開発モードで起動しました。
この特定のノード(substrate-node-template)は、使い始めるためのいくつかの共通モジュールだけを備えた簡素化された環境を提供します。
詳細は省きますが、ノードテンプレートコードの基本的な構成要素を調べることで学べることはたくさんあります。
1 ノードテンプレートについて
ノード・テンプレートには、ピアツーピア・ネットワーキング、シンプルなコンセンサス・メカニズム、トランザクション処理など、デフォルトのブロックチェーンの必需品がいくつか含まれています。
ノードテンプレートには、アカウント、残高、取引手数料を操作し、管理アクションを実行するための基本的な機能も含まれています。
このコア機能セットは、特定の機能を実装するパレットと呼ばれるいくつかの定義済みモジュールを通じて提供されます。
例えば、ノードテンプレートには以下のコアモジュールが定義済みです。
1 pallet_balances
口座資産と口座間の送金を管理します。
2 pallet_transaction_payment
実行された取引の取引手数料を管理します。
3 pallet_sudo
管理者権限を必要とする操作を実行します。
ノードテンプレートは、カスタムパレットに機能を実装する方法を示すスターターパレットテンプレートも提供します。
ノードテンプレートに含まれる機能の概要が分かったところで、substrate-node-template ディレクトリとそのサブディレクトリにあるコードを詳しく見てみましょう。
2 マニフェストファイル
Substrate は Rust ベースのフレームワークであるため、各パッケージにはマニフェストファイル(Cargo.toml ファイル)があり、パッケージのコンパイルに必要な情報が含まれています。
substrate-node-template のルートディレクトリにある Cargo.toml ファイルを開くと、ノードテンプレートのワークスペースを構成するメンバーパッケージが記述されていることがわかります。
例えば、下のようになっています。
このマニフェストから、nodeテンプレート・ワークスペースには3つのパッケージが含まれていることがわかります:
node パッケージは、ピアツーピアネットワーキング、ブロックオーサリング、ブロックファイナライゼーション、トランザクションプール管理など、多くのコアブロックチェーンサービス用の Rust モジュールを提供します。
palletsサブディレクトリにあるtemplateパッケージは、独自のカスタムモジュールを構築する際の機能の実装方法を示すスターターテンプレートです。
ランタイム・パッケージは、アカウント、残高、取引手数料、およびノード・テンプレートに含まれているその他の機能を処理するためのすべてのアプリケーション・ロジックを提供します。
また、各メンバー・パッケージには独自のマニフェスト(Cargo.toml ファイル)があり、そのメンバー・パッケージのコンパイルに必要な依存関係や構成設定など、パッケージ固有の情報が含まれています。
例えば、ワークスペースのノード・メンバーの Cargo.toml ファイルは、パッケージ名を node-template と指定し、ノード・テンプレートが重要なブロックチェーン・サービスを提供できるようにするコア・ライブラリとプリミティブをリストしています。
ライブラリとプリミティブについては、「アーキテクチャとRustライブラリ」で詳しく説明します。
今のところ、各パッケージの依存関係やその他の重要な情報を記述するマニフェストの重要性を理解するだけで十分です。
runtime/Cargo.tomlファイルとpallets/template/Cargo.tomlファイルを開くと、依存関係として異なるライブラリとプリミティブが表示されますが、これらのパッケージをコンパイルするために必要なものの一般的な感覚を得ることができます。
たとえば、ランタイムのマニフェストには、frame_system、frame_support、および前述の pallet_balances、pallet_transaction_payment、pallet_sudo モジュールを含む、ノードテンプレートのデフォルトのランタイムを構成するすべてのパレットがリストされています。
3 コアクライアントソースコード
Substrateの最も重要な点の1つは、ノードがコアクライアントとランタイムの2つの主要部分で構成されていることです。
また、ノードテンプレートは、node/src ディレクトリにあるコアクライアントサービスのパッケージと、runtime/src ディレクトリにあるランタイムから構成されます。
デフォルトでは、node/src ディレクトリには以下の Rust モジュールが含まれています。
ほとんどのコアクライアントサービスは node/src/service.rs Rust モジュールにカプセル化されています。
このファイルやnode/srcディレクトリ内の他のRustモジュールを修正する必要はほとんどありません。
修正する可能性が高いファイルは chain_spec.rs ファイルです。
chain_spec.rsファイルには、デフォルトのDevelopmentチェーンとLocal Testnetチェーンの構成が記述されており、デフォルトで事前に資金が提供されている開発アカウントや、ブロックを生成する権限が事前に設定されているノードの情報が含まれています。
カスタム・チェーンを作成する場合は、このファイルを使用して、ノードが接続するネットワークと、ローカル・ノードが通信する他のノードを特定します。
4 デフォルトのノードテンプレートランタイム
Substrateはブロックチェーンを構築するためのモジュール式で柔軟なフレームワークを提供しているため、ワークスペース内のどのパッケージにも変更を加えることができます。
しかし、アプリケーション開発のほとんどはランタイムと、ランタイムを構築するためのモジュール(パレット)で行われます。
自分のプロジェクト用にランタイムのカスタマイズを始める前に、デフォルトのノード・テンプレートに何が含まれているかを少し調べてみましょう。
5 デフォルト・マニフェスト
ランタイムのデフォルト・マニフェストが以下のような行で、ランタイムのデフォルトの依存関係と機能をどのようにリストしているかは既に見たとおりです。
frame-system、frame-support、frame-executiveといったコアパッケージへの依存もあります。
これらのコアサービスについては、コアFRAMEサービスを参照してください。
今のところは、ノードテンプレートのランタイムをコンパイルするために、これらのモジュールやその他のモジュールが必要であることに注意してください。
6 デフォルトのソースコード
ランタイムのメイン・ソース・コードはruntime/src/lib.rsファイルにあります。このファイルをコード・エディターで開くと、最初は複雑に見えるかもしれません。
ドキュメントの他の部分でカバーされているニュアンスもありますが、要するに、ソースコードは次のようなことをしています。
framesystemとframesupportのコアサービスをインポートする。
ランタイムのバージョン情報を指定する。
インクルードするパレットを宣言する。
インクルードする各パレットの型とパラメータを宣言します。
インクルードする各パレットの定数と変数の値を設定します。
含まれる各パレットの Config 特性を実装します。
インクルードされたパレットからランタイムを構築します。
パレットの性能を評価するためのベンチマークフレームワークを準備します。
コアクライアントがランタイムを呼び出すためのインターフェースを実装します。
ランタイムの構築、ベンチマークの定義、ランタイム・インターフェースの使用については、ビルドとテストのセクションで詳しく説明します。
今のところ、ランタイムがどのように構成され、Config traitを使用してデフォルトのパレットがどのように実装されるかについて、一般的な感覚を持っていれば十分です。
4 ランタイムの変更
第3章では、デフォルトのノードテンプレートを構成するマニフェストファイルと Rust モジュールについて学びました。
ランタイムソースコードがどのように見えるかについての一般的な考えを得たので、ランタイムをカスタマイズするためにいくつかの簡単な変更を加えることがいかに簡単であるかを見てみましょう。
この簡単なデモンストレーションでは、次のことを行います。
1 使いたい機能を持つパレットを追加する。
2 いくつかの定数値を変更する。
3 ランタイムのバージョンを更新する。
4 ランタイムを再コンパイルし、変更を含めます。
5 トランザクションを送信して、オンチェーンに保存されているランタイムを更新する。
また、Polkadot-JS APIを使用する別のアプリケーションと、そのアプリケーションのホストされたバージョンを使用してチェーンの状態を表示し、トランザクションを送信する方法も紹介します。
1 始める前に
devコマンドラインオプションを使用して開発モードでノードを実行すると、最初のブロックからクリーンな状態で始まります。
ランタイムの変更と更新の方法を最もよく説明するために、デフォルトのランタイムでデフォルトのノード・テンプレートを再起動し、ブロックを生成し始めるようにします。
デフォルトのランタイムでノードを再起動するには
1 コンピュータでターミナル・シェルを開きます。
2 Substrate ノードテンプレートをコンパイルしたルートディレクトリに移動します。
3 以下のコマンドを実行して、ローカルノードを開発モードで起動します。
cargo run --release -- --dev
ノードを起動した後、Polkadot-JS APIを使用して構築されたブラウザベースのアプリケーションを使用して、ノードに接続することができます。
実行中のノードに接続するには
ChromeまたはChromiumベースのブラウザでPolkadot/Substrateポータルを開きます。
Firefoxのような制限の多いブラウザを使用すると、Polkadot/Substrateポータルとノード間の接続がブロックされることがあります。
必要に応じて、開発ネットワークとデフォルトのローカルノードエンドポイント127.0.0.1:9944に接続します。
ほとんどの場合、Polkadot/Substrateポータルは実行中のローカルノードへの接続を自動的に初期化します。
必要であれば、Unknownをクリックしてネットワーク選択メニューを表示し、DevelopmentとLocal Nodeを選択し、Switchをクリックします。
Developmentの下で、ノードテンプレートのバージョンがデフォルトのバージョン100になっていることに注意してください。
2 パレットの追加
SubstrateとFRAMEを使ってビルドを開始する最も一般的な方法は、既存のライブラリからパレットをインポートするか、独自のパレットを作成するかして、パレットを追加することです。
独自のパレットをゼロから作成することは難しくありませんが、アプリケーションロジック、ストレージ要件、エラー処理などを設計する作業が必要になります。
シンプルにするために、既存のライブラリからパレットをインポートして追加してみましょう。
デフォルトでは、ノード・テンプレートにはユーティリティ・パレットが含まれていません。
このパレットに使いたい関数が含まれている場合は、デフォルトのランタイムに追加することができます。
ユーティリティ・パレットを追加するには
1 コンピュータで 2 番目のターミナル・シェルを開き、ノード・テンプレートのルート・ディレクトリに移動します。
2 ランタイムのマニフェストのruntime/Cargo.toml をコードエディタで開きます。
3 [dependencies] セクションを探し、依存関係として Utility パレットを追加します。
例えば、以下のような1行を追加します。
pallet-utility = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v1.0.0" }
※原本が誤っていたため、修正しています。
必ず branch = "polkadot-vX.Y.Z" を他のパレットに使用する Polkadot branch に置き換えてください。
既存のパレット依存関係をモデルとしてコピーして、パレット-ユーティリティ依存関係のブランチ設定が他のすべてのパレットのブランチ設定と同じになるようにすることができます。
4 [features] セクションを探し、標準バイナリのデフォルト機能のリストに Utility パレットを追加します。
例えば
[features]
default = ["std"]
std = [
...
"pallet-utility/std",
...
]
標準バイナリとWebAssemblyバイナリの機能構築については、RustとWebAssemblyで詳しく学べます。
5 変更を保存して、Cargo.tomlファイルを閉じます。
6 runtime/src/lib.rsファイルをコードエディタで開きます。
7 Utility パレットの Config 特性の実装を追加します。
例えば
impl pallet_utility::Config for Runtime {
type RuntimeEvent = RuntimeEvent;
type RuntimeCall = RuntimeCall;
type PalletsOrigin = OriginCaller;
type WeightInfo = pallet_utility::weights::SubstrateWeight<Runtime>;
}
すべてのパレットは、それが必要とする特定のパラメータと型のための Config 特性を持ちます。
パレットの設定要件については、パレットの Rust ドキュメントを参照してください。
例えば、pallet-utility の Rust ドキュメントを見ることができます。
construct_runtime! マクロ内に Utility パレットを追加します。
例えば
construct_runtime!(
pub struct Runtime
where
Block = Block,
NodeBlock = opaque::Block,
UncheckedExtrinsic = UncheckedExtrinsic
{
System: frame_system,
RandomnessCollectiveFlip: pallet_randomness_collective_flip,
Timestamp: pallet_timestamp,
Aura: pallet_aura,
...
Utility: pallet_utility, // Add this line
...
}
construct_runtimeマクロの動作については、FRAMEマクロとランタイム構築マクロを参照してください。
3 定数値の変更
デフォルトでは、ノード・テンプレートの残高パレットは EXISTENTIAL_DEPOSIT 定数を定義します。
EXISTENTIAL_DEPOSITは、アカウントが有効なアクティブ・アカウントとみなされるために必要な最小残高を表します。
デフォルトでは、この定数は128ビットの符号なし整数型として定義され、値は500です。
シンプルにするために、この定数の値を500から1000に変更します。
定数の値を更新するには
1 runtime/src/lib.rsファイルをコードエディターで開く。
2 BalancesパレットのEXISTENTIAL_DEPOSITを探します。
/// Existential deposit.
pub const EXISTENTIAL_DEPOSIT: u128 = 500;
3 EXISTENTIAL_DEPOSITの値を更新する。
pub const EXISTENTIAL_DEPOSIT: u128 = 1000 // Update this value.
4 ランタイム・バージョンの更新
デフォルトでは、ノード・テンプレートは spec_version と値 100 を使用して、VERSION 定数でデフォルトのランタイム・バージョンを識別します。
デフォルトのランタイムに変更を加えたことを示すために、spec_version を 100 から 101 に変更します。
クイック・スタートでデフォルト・ランタイムに加えた変更については、spec_versionの更新は厳密には必須ではありません。
しかし、バージョンを更新することで、フォークレス・アップグレードの基本的な手順を確認することができます。
ランタイムのバージョンを更新するには
1 runtime/src/lib.rsファイルをコードエディターで開きます。
2 runtime_versionマクロを見つけます。
spec_versionを更新し、新しいランタイム・バージョンを指定します。
spec_version: 101, // Change the spec_version from 100 to 101
4 変更を保存し、runtime/src/lib.rsファイルを閉じる。
この時点で、ランタイム・コードを修正し、バージョン情報を変更したことになります。
しかし、実行中のノードはまだ以前にコンパイルされたバージョンのランタイムを使用しています。
Polkadot/Substrate Portalを使用して実行中のノードに接続している場合、ノード・テンプレートのバージョンはデフォルトのバージョン100のままであり、バランシング定数existentialDepositのチェーン状態は500のままであることがわかります。
5 ランタイムの再コンパイル
変更したランタイムを使用するようにノード・テンプレートを更新する前に、ランタイムを再コンパイルする必要があります。
ランタイム・パッケージを再コンパイルするには
1 2番目のターミナル・シェルを開き、ノード・テンプレートをコンパイルしたルート・ディレクトリに移動します。
2 以下のコマンドを実行して、ランタイムを再コンパイルします。
cargo build --release --package node-template-runtime
releaseコマンドラインオプションを使うと、コンパイル時間が長くなります。
しかし、ブロックチェーン・ネットワークに提出するのに適した、より小さなビルド・アーティファクトが生成されます。
ストレージの最適化はどのブロックチェーンにとっても重要です。
このコマンドでは、ビルド成果物はtarget/releaseディレクトリに出力されます。
WebAssemblyのビルド成果物はtarget/release/wbuild/node-template-runtimeディレクトリにあります。
例えば、target/release/wbuild/node-template-runtime ディレクトリの内容をリストアップすると、以下の WebAssembly アーティファクトが表示されるはずです。
6 トランザクションを送信する
これで、変更されたランタイムを記述する更新されたWebAssemblyオブジェクトが得られました。
しかし、実行中のノードはまだアップグレードされたランタイムを使用していません。
オンチェーンに保存されているランタイムを更新するには、使用するWebAssemblyオブジェクトを変更するトランザクションを送信する必要があります。
ランタイムを更新するには
1 Polkadot/Substrate Portalで、Developerをクリックし、Extrinsicsを選択します。
2 管理用アリスアカウントを選択します。
3 sudoパレットとsudoUncheckedWeight(call, weight)関数を選択します。
4 アリスアカウントを使って行う呼び出しとして system と setCode(code) を選択します。
5 ファイルアップロードをクリックし、更新されたランタイムのために生成したコンパクトに圧縮されたWebAssemblyファイル-node_template_runtime.compact.compressed.wasm-を選択するか、ドラッグ&ドロップします。
例えば、target/release/wbuild/node-template-runtime ディレクトリに移動し、アップロードするファイルとして node_template_runtime.compact.compressed.wasm を選択します。
6 weight パラメータは両方ともデフォルト値の 0 のままにしておきます。
7 Submit Transactionをクリックします。
8 承認を確認し、Sign and Submitをクリックします。
このようになりました。
7 変更されたランタイムの検証
トランザクションがブロックに含まれた後、変更されたランタイムを使用していることを確認できます。
変更を検証するには
1 Polkadot/Substrateポータルで、Networkをクリックし、Explorerを選択して、成功したsudo.Sudidイベントがあったことを確認します。
2 ノードテンプレートのバージョンが101になっていることを確認します。
3 Developer をクリックし、Extrinsics を選択します。
4 次のエクストレリニクスの送信をクリックし、リストの一番下までスクロールして、ユーティリティ・パレットがオプションとして利用可能であることを確認します。
5 Developer をクリックし、Chain state を選択し、Constants をクリックします。
6 バランス・パレットを選択し、existentialDeposit を選択して + をクリックし、定数値をクエリします。
7 次のステップ
変更を確認した後、カスタマイズされたバージョンのノード・テンプレートを実行し、変更したランタイムを使用するようにローカル・ノードをアップグレードすることに成功しました。
これはかなりの成果ですが、他にもできることはたくさんあります。
コンセプトやコア・コンポーネントをより深く学ぶには、「学習」セクションのトピックを確認するか、「ビルド」セクションのトピックを調べてこれまでに学んだことを基に作業を開始してください。
以上です。
サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊