コントラクトデプロイメントを使用したAWSでのプライベートイーサリアムの2ノードセットアップ(パート1)

時々、Ethereum環境をエミュレートする予定です。背後にある考え方は、イーサリアムノードが相互にどのように機能するか、およびトランザクションとコントラクトの展開でさまざまなアカウントがどのように相互作用するかを観察することです。テストの場合、最近のほとんどのコントラクトデプロイメントの例は主にtestrpcまたはtestnetですが、ノード間でコントラクトがどのように機能するかは私にはまだ新しいです.

この2ノードセットアップをAWSにデプロイします。 AWSで特別な機能を使用していないため、別のクラウド環境に適用できるはずです.

私のセットアップは、JJの世界からの作品に触発されています(リンク)、そしてこれを変更して数回テストした後、私が行ったプロセス全体を文書化し、プロセス全体についてここでいくつかの経験を共有します.

マヘシュ・マーシーが開発した投票契約も使用しています(リンク)。これは、契約がチェーン内でどのように機能するかを最もよく示す単純な契約です。.

これは決して詳細なステップバイステップガイドではありません。特定の手順を省略し、他の人が行った作業について言及します。たとえば、アクセスキー、セキュリティグループなどの設定で新しいインスタンスを起動するなど、AWS EC2の詳細な操作はここにあります(リンク).

ここでパート2を読む

このセットアップには2つの部分があります.

パート1:プライベートブロックチェーンを使用して2ノードのイーサリアムネットワークを作成し、2つのノードのアカウントが互いにイーサリアムを送信できる.

パート2:1つのノードからコントラクトをデプロイすると、両方のアカウントがこのコントラクトの機能にアクセスして実行できます.

ステップ1:2つのEC2インスタンスを起動する.

デフォルトの8GSSDでt2.medium(2 vCPU、4 GB RAM)を使用します。 UbuntuOSを選択します。 2つのノードが同じセキュリティグループに属していることを確認してください。これにより、TCP 30303(または、この範囲でより多くのポートを使用する可能性があるため、30000-30999)が許可されます。デフォルトのポート30303は、ノード間のピアリング用です.

経験の共有

  • 私は最初にt2.microを試しました。これは無料枠のオファーだからです。ただし、マイニングは成功しませんでした(エーテル報酬のない「DAG」ループ)。次にt2.smallを試しましたが、マイニングは機能しました。ただし、コントラクトをデプロイしたとき(パート2を参照)、rpcは不安定でした。最後に、t2.mediumがセットアップに十分であることがわかりました.

  • 私は通常、テスト後にインスタンスを停止します(お金を節約するため)。 EC2インスタンスのパブリックIPアドレスは、起動後に変更されることに注意してください。これらのインスタンスのプライベートIPアドレスをピアリングに使用しているため、これはここでのセットアップには影響しません。インスタンスを停止/開始した後もプライベートIPアドレスは残ります。いずれの場合も、パブリックIPアドレスが必要な場合でも、ピアリングは機能しますが、毎回ピアリングアドレスを変更する必要がある場合があります。.

ステップ2:ノード1にgethクライアントをインストールする

sshと適切なキーを使用してノード1にアクセスします。推奨されるプロセスに従います(リンク)gethインストール用。 PPAからのインストールで十分です.

ノード1

$ sudo apt-get install software-properties-common

$ sudo add-apt-repository -y ppa:ethereum / ethereum

$ sudo apt-get update

$ sudo apt-get install ethereum

$ which gethで確認すると、gethが正しくインストールされていることがわかります。.

ステップ3:Genesis.jsonを準備する

この同じGenesis.jsonが両方のノードに適用されます。これは、両方のノードが同じジェネシスブロックを持つようにするためです。これが私が使用したGenesis.jsonで、ここから採用されています(リンク)。新しいセットアップのたびにこのファイルのアドレスを変更する必要がないため、初期割り当てを削除します。マイニングを開始すると、各アカウントはいくつかのエーテルを獲得します.

Genesis.json

{{

"設定":{

"chainId":15,

"homesteadBlock":0,

"eip155Block":0,

"eip158Block":0

},

"ノンス": "0x0000000000000042",

"ミックスハッシュ": "0x0000000000000000000000000000000000000000000000000000000000000000",

"困難": "0x200",

"alloc":{},

"コインベース": "0x0000000000000000000000000000000000000000",

"タイムスタンプ": "0x00",

"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",

"gasLimit": "0xffffffff",

"alloc":{

}

}

このファイルをどこかに保存し、後でノードにscpするか、両方のノードのエディターでコピーして貼り付けます.

ステップ4:Genesis.jsonでゲスを初期化する

ノード1

$ geth init Genesis.json

ステップ5:今すぐgethを起動する

2つの画面を並列(または分割端末)にすることをお勧めします。 1つの画面はコンソールで、別の画面にはログが表示されます。新しいターミナルを開き、ノード1にSSHで接続し、ログを読み続けます.

ノード1 $ geth –nodiscover console 2>> eth.log

別の端末$ tail -F eth.log

コントラクトデプロイを使用したAWSでのプライベートイーサリアムの2ノードセットアップ

経験の共有

  • 多くの例では、–datadirを使用してプライベートイーサリアムブロックチェーンのディレクトリを指定することをお勧めします。これは、さまざまなチェーンとやり取りする場合に適しています。私の例は孤立した環境です。したがって、このオプションを省略し、プライベートチェーンはディレクトリ〜/ .ethereum /に保存されます。.

ステップ6:ノード1でアカウントを作成する

ノード1ゲス

> personal.newAccount()

> eth.getBalance(eth.accounts [0])または > web3.fromWei(eth.getBalance(eth.accounts [0])、“ ether”)

これで、このノードにアカウントができました(常にチェックしてください) > eth.accounts [0]または > eth.coinbase)。そして現在、Genesis.jsonに割り当てていないため、アカウント残高にエーテルはありません。.

ステップ7:マイニングを開始する

マイニングプロセスを開始できます.

  1. ログターミナルから、「DAGの生成が進行中です」と表示され、エポックの後、ブロックがマイニングされています.
  2. ブロックがマイニングされると、5つのエーテルがアカウントの残高に追加されます。これは、マイニングが成功したかどうかの良い指標です.
  3. マイニングを続けると、新しいブロックがマイニングされるにつれて、アカウントの残高が増え続けます.

ノード1ゲス

> miner.start()

> eth.getBalance(eth.accounts [0])

気軽にマイニングを続けるか、次の方法でオフにすることができます > miner.stop().

これでノード1の準備が整いました。ノード2で作業しましょう.

ステップ8:ノード2でステップ2-6を繰り返します

ノード2でブロックチェーンを初期化するときに同じGenesis.jsonが使用されていることを確認してください.

ノード1と同じブロックチェーン上にノード2が必要なため(ピアリングを介して)マイニングを開始しないでください.

ステップ9:ピアリング

次に、2つのノードのピアリングを開始します。ピアリングする方法はいくつかあります。ここでは、「admin addPeer」を使用してピアリングを行っています。ノード2で、ピアリング用のノード1のenode情報を追加します。.

まず、ピアリングがないことを両方のノードに確認します.

ノード1 > admin.peers

ノード2 > admin.peers

ノード1からenode情報を取得します

ノード1 > admin.nodeInfo.enode

次のようなものが得られます。

"enode:// c667fdf1f6846af74ed14070ef9ffeee33e98ff8ab0dd43f67415868974d8205e0fb7f55f6f37e9e1ebb112adfc0b88755714c7bc83a7ac47d30f8eb53118687 @ [::]:30303?discport = 0"

この情報をノード2に追加します。[::]をノード1のプライベートアドレスに変更します.

ノード2

> admin.addPeer("enode://c667fdf1f6846af74ed14070ef9ffeee33e98ff8ab0dd43f67415868974d8205e[email protected]172.31.62.34:30303?discport = 0")

そのチェックの後、両方のノードとそれらは互いにピアリングしています.

ノード1 > admin.peers

ノード2 > admin.peers

左側はノード1、右側はノード2です。 > ノード2のaddPeer()は、2つのノードがピアリングされます。ノード1で同じことをする必要はありません.

また、ログから、ピアリング後、ノード2ログ(右下のターミナル)に「ブロック同期が開始されました」と「インポートされた新しいチェーンセグメント」が表示されていることがわかります。.

経験の共有

  • 同じGenesis.jsonを使用してブロックチェーンを開始してください。ある試行では、ステップを開始するのを忘れ、ピアリングが失敗しました.
  • AWS EC2インスタンスには、プライベートIPアドレスとパブリックIPアドレスが付属しています。どちらもピアリングの追加では正常に機能しますが、プライベートIPアドレスを使用すると、インスタンスのSTOP / START後に変更されないため、より便利です。.

ステップ10:アカウント間でEtherを送信する

両方のノードが同じイーサリアムブロックチェーンにあるため、アカウント間でいくつかのイーサリアムを送信します。この例では、10個のエーテルがノード1のアカウントからノード2のアカウントに送信されます。これは、セットアップが成功したかどうかを確認するための最良の方法の1つです。.

ノード1

> web3.fromWei(eth.getBalance(eth.coinbase)、“ ether”)

> personal.unlockAccount(eth.coinbase)

> eth.sendTransaction({from:eth.coinbase、to: "0xabc65de992289401dcff3a70d4fcfe643f7d2271", 値:web3.toWei(10、“ ether”)})

> miner.start()

ノード2 > web3.fromWei(eth.getBalance(eth.coinbase)、“ ether”)

コントラクトデプロイを使用したAWSでのプライベートイーサリアムの2ノードセットアップ

このトランザクションはまだマイニングされていないため、「保留中のトランザクション」が表示されることに注意してください。ノード1でマイニングを開始すると、トランザクションが完了し、ノード2のアカウント残高は10エーテルになります。.

また、ノード1には45個のエーテルがあります(予想される20-10 = 10個のエーテルではありません)。これは、ノード1がマイニング報酬(ブロックあたり5エーテル)を受け取り続けるためです。採掘をやめるまでバランスは増え続けます.

閉鎖

これで最初の部分が完了しました。AWS上に2ノードのプライベートイーサリアムブロックチェーンを構築します。次の部分に直接移動してコントラクトをデプロイし、プロセスとEC2インスタンスを停止して将来使用することができます。何らかの理由でピアリングが変更された場合は、上記の手順9でノードを再ピアリングできます。.

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me