私が犯した間違いを犯さずにイーサリアムノードを同期する方法

私が最初にイーサリアムプラットフォームで開発を始めたとき、ノードの同期は私が最初にした数少ないことの1つでした。手を握る人がいなくて、遭遇したすべての一般的なエラーを統合する場所がないので、ノードを同期するだけで数週間を無駄にしました。それは私がほとんどあきらめたほどの頭痛でした。

用語を知らないことはそれを難し​​くしただけでした。

そのため、この記事では、直面する可能性のあるすべての一般的なエラーを統合し、ノードを同期するときの各ステップの背後にある理由を説明したいと思います。うまくいけば、あなたは私がしたような厄介な初期の経験をしないでしょう。

簡単な紹介

イーサリアムでは、開発者はネットワーク上で実行されるアプリケーションの一部を作成します。これらはスマートコントラクトと呼ばれます。イーサリアムノードに同期せずに手動でデプロイすることもできますが、長期的には、開発プロセスを同期する方が便利です(特に、Truffleなどの開発フレームワークを使用する場合)。

イーサリアムノードを同期するには、次のソフトウェアが必要です。

  • Geth —イーサリアムノードのクライアント。
  • イーサリアムウォレット—イーサリアムノードのユーザーインターフェイス。

始めましょう。

Gethをインストールする

Gethをダウンロードするには、Windowsユーザーの方はこちらにアクセスしてください。次に、「GethforWindows」ボタンをクリックします。

MacOSユーザーの場合、自作を使用してダウンロードすることをお勧めします。次のコマンドでこれを行うことができます。

brew tap ethereum/ethereumbrew install ethereum

詳細については、ゲスの指示を参照してください。

geth versionターミナル(MacOS)またはPowerShell(Windows)を入力して、Gethが正しくインストールされていることを確認します。

イーサリアムウォレットをインストールする

ネットワークと相互作用するGUIを「ウォレット」と呼びます。Googleですばやく検索すると、イーサリアム用のさまざまなウォレットを見つけることができます(Parity、Jaxx、MyEtherWalletなど)。私は個人的にイーサリアムウォレットを使うのが好きです。それはユーザーフレンドリーなインターフェースを持っています、そしてそれはイーサリアム自身によって開発されているので私も少し偏見があります。

インストーラーはここにあります。

注:私は好むイーサリアムウォレットミスト。Mistは基本的に、分散型アプリケーション(dApps)とWebサイトをレンダリングするブラウザーです。

スマートコントラクトの開発には、イーサリアムウォレットのみが必要です。

メインネットとテストネット

イーサリアムには、メインネットとテストネットの2つの主要なネットワークがあります。

メインネットは、実際のEtherを処理するために使用されます。Etherの価値は、暗号通貨交換を介して実際の法定通貨に関連付けられています。

開発者として、私たちは実際のお金でアプリケーションテストを実行したくありません。それがテストネットの目的です。

テストネットをRopstenと呼びます。

ゲスとイーサリアムウォレットを実行する

スマートコントラクトを開発するときは、最初にテストネットを同期する必要があります。デプロイする準備ができたときにのみ、メインネットを同期する必要があります。

テストネットを同期するには、約30GBのストレージスペースが必要です。メインネットにはより多くのトランザクションがあるため、メインネットを同期するには約100GBが必要になります。

注:同期が最新のブロックに追いつくことができるように、高速書き込みにはSSDストレージが必要であると言う人もいます。個人的には、HDDストレージは大丈夫だと思います。ただし、選択肢があれば、SSDストレージを使用することは間違いありません。

Windowsユーザーの場合

簡単にアクセスできるように、ブロックチェーンを保存するフォルダーを作成することをお勧めします。たとえば、「C:\ EthereumTestnet」です。

フォルダを作成したら、次のコマンドを実行してみてください。

geth — testnet — data-dir=”C:\EthereumTestnet” — rpc — rpcapi eth,web3,net,personal

編集:いくつかの議論が変わったようです。「フラグが提供されましたが定義されていません:-data-dir」というエラーが発生した場合は、引数名をdata-dirではなく—datadirに変更してみてください。

引数--testnetは、Ropstenネットワークに同期することを指定します。したがって、メインネットを同期するには、引数を取り出し--testnetてデータディレクトリを変更するだけです。例えば:

geth — data-dir=”C:\EthereumMainnet” — rpc — rpcapi eth,web3,net,personal

--rpc引数は、HTTP-RPCサーバーを可能にします。これにより、に記載されているような特定のサービスを使用できるようになります--rpcapi eth,web3,net,personal

コマンドを入力すると、次のように表示されます。

ブロックチェーンを破損しないようにするために、特に何時間も同期した後は、コマンドプロンプトを突然閉じないでください。Ctrl + Cを押して同期を常に停止し、Gethがプログラムをシャットダウンするまで待ちます。

ただし、必要なすべてのコマンドおよびrpcサービスを覚えておくのは困難です。そのため、ショートカットまたはバッチファイルを作成することをお勧めします。

お持ちのテキストエディタを使用してファイルを作成し、.batファイルとして保存するだけです。たとえば、RunGethTestnet.bat(名前は重要ではありません)。コマンドをコピーしてファイルに貼り付け、保存します。次回Gethfor Ropstenを実行する必要があるときは、ファイルをダブルクリックするだけです。

Gethを実行した後、EthereumWalletを実行する必要があります。Gethを使用してファイルを同期した正確な場所をインターフェイスで特定する必要があるため、コンソールから実行します。

Gethと同様に、次のようなコマンドの例を使用して、バッチファイルも保存しました。

アプリケーションを別のディレクトリに保存する可能性があるため、コマンドは私のコマンドとは少し異なる場合があることに注意してください。

または、アプリケーションをパスに追加することもできます。

引数--node-datadir="C:\EthereumTestnet"は、チェーンデータをどこに保存したかを示しています。これは、Gethに指定したものとまったく同じです。

Macユーザーの場合

チェーンデータはライブラリに自動的にダウンロードされ、私たちから隠されていないため、MacOSの方が少し簡単です。したがって、データディレクトリを指定する必要はありません。

それでも、GethとEthereumWalletの実行を簡単にするためにスクリプトファイルを作成することをお勧めします。

注:GethはEthereumWalletの前に実行する必要があります

Ethereum Walletを単独で実行すると、Gethクライアントがバックグラウンドで自動的に実行されるため、同期プロセスが自動的に開始されます。これはユーザーフレンドリーですが、使用したいRPCサービスを有効にしません。したがって、GethとEthereumWalletの両方の実行でRPCが有効になっていることを確認する必要があります。

いくつかのメモ

  1. 同期プロセスは非常に長く、最大2〜3日かかる場合があります。しばらくお待ちください。コンピュータの電源を一晩置いたままにすることを検討してください。
  2. 同期速度は、インターネット速度、ピア数、およびストレージドライブの書き込み速度によって異なります。
  3. データはブロックに保存されてリンクされているため、1つのブロックで破損すると、チェーンデータ全体が破損する可能性があります。これにより、ノードが同期するのを待つ時間の無駄になる可能性があります。したがって、Gethを適切にシャットダウンすることが非常に重要です。場合によっては、ロールバックすることをお勧めします。しかし、ここでの治療よりも予防​​の方が優れています。
  4. イーサリアムウォレットのプログレスバーは正確ではありません。それを頼りにすることはあなたに多くの不安と欲求不満を与えるでしょう。
  5. Gethは、外部リスニングのためにポート30303で実行されます。
  6. ウォレットとゲスの間などの内部通信に使用されるデフォルトのポートは8545です。

Gethクライアントへのポートが開いていることを確認してください

Gethクライアントへの接続が制限されていないことを確認することが非常に重要です。私が遭遇した大きな頭痛の種の1つは、ファイアウォールでGethクライアントを介して接続できる接続数を制限することでした。

ピア数を調べることで、この問題を見つけることができます。約1〜3ピア(少なくとも30分)で一貫して低いままである場合は、接続が制限されている可能性があります。正常な範囲は5ピアを超えています。

MacOSユーザー

Gethを実行すると、接続を許可するように通知されるはずです。もちろん、「許可」をクリックします。

確認するには、[システム環境設定]> [システムとプライバシー]に移動します。

下にファイアウォール]タブ、をクリックしてファイアウォールオプション

Windowsユーザー

ポートを開くには、[コントロールパネル]> [システムとセキュリティ]> [Windows防御ファイアウォール]に移動します。

[詳細設定]をクリックします。サイドパネルで、[インバウンドルール]をクリックします。

開きたいインバウンドポートはTCPとUDP30303です。そこで、TCP 30303用に1つのルールを作成し、UDP30303用に別のルールを作成しました。

TCP30303のアウトバウンドポートも開く必要がある場合があります。

サードパーティのファイアウォール/アンチウイルスも接続を制限する可能性があるため、それに応じて構成するようにしてください。

ゲスに添付

ノードに関する詳細情報を取得するには、Gethクライアントに接続し、RPCサービスを使用してノードでコマンドを実行します。

同期ステータスを確認する簡単な方法は次のとおりです。別のターミナル/コンソールで次のコマンドを入力して、クライアントに接続します。

geth attach //127.0.0.1:8545

繰り返しになりますが、自分の便宜のためにバッチ/スクリプトファイルに保存することをお勧めします。

コマンドを実行すると、次のように表示されます。

入力するweb3.ethと、多くの情報が表示されます。同期に関する特定の情報を取得するには、web3.eth.syncing代わりに入力します。

ご覧のとおり、イーサリアムウォレットの上部にあるプログレスバーは、highestBlockcurrentBlockの比較にすぎませ。コンピューターに認識されているhighestBlockは実際の最高ブロックではない可能性があるため、プログレスバーは実際の進行状況を反映していない可能性があります。

実際、ノードを同期すると、highestBlockknownStatesは増加し続けます。

最後のポイント

テクノロジーは急速に変化しているため、頭痛の種が増えるのを避けるために、常に安定したバージョンのクライアントとウォレットを使用してください。

また、直面する問題には常に回避策があることに注意してください。同期の問題に直面した場合、同じ問題に最初に直面したのはあなたではない可能性が高いため、解決策を探すことができます。

また、スマートコントラクトを開発するためにノードを同期する必要はないことを常に忘れないでください。そうすることは、環境と開発プロセスの理解を促進するのに役立つだけです。したがって、開発プロセスの非常に早い段階で問題が発生した場合でも、それを打ち負かさないでください。

そのような記事の詳細については、私をフォローするか、私のサイトにアクセスしてください—開発者の視点。