💰

Ethereum Solo Staking 入門 (前編)

2022/10/16に公開

初めに

2022年9月15日(GMT)に「The Merge」が完了し、Ethereum Mainnetで使われるコンセンサスメカニズムがPoS(Proof of Stake)に変更されました。この変更はMainnetのエネルギー消費量を大きく削減することに成功しましたが、コンセンサスメカニズムの変更がノード運用にどのような影響を与えたのかはあまり知られていません。この記事は、Ethereumに詳しくないITインフラエンジニアが「Solo Staker」としてノード運用を安全に行うためのコツを記載したものです。

Solo Stakingとは

「ノードを実行しつつ、32ETHを良い感じに利用することでValidatorをアクティブにする行為[1]」をSolo Stakingと呼びます。Solo Stakingをすることで、EthereumのPoSネットワークのコンセンサスに直接参加することができます。

Solo Stakingの大きな魅力として、コンセンサス参加のETH報酬を直接受け取れること、Ethereumネットワークの可用性(分散性)に直接貢献できることが挙げられます。しかしながら、家庭用ハードウェアによるノード運用が前提となっている点や、ノード運用のナレッジが完全に確立されていない問題は初心者にとって大きなハードルになっています。

この記事では、Solo Stakingを始めるだけではなく、続けるために必要な知識やノウハウを筆者独自の観点で記載しています。

コミュニティへの参加

まず、ノード運用を考えるのであれば、コミュニティへの参加を検討してください。Besu+Tekuの運用を考えているのであれば、個人的には記載した5つのコミュニティへの参加を強く推奨します。理由としては、Testnetでノードを動作させるための様々なノウハウが各コミュニティのDiscordで議論されているからです。ITインフラエンジニアであれば、Staging環境の知識なしでProduction環境へ飛び込むことの恐ろしさが理解できると思います。Solo Stakingには32ETH必要ですが、これは日本円にして600万円程度(2022年10月現在)の価値があります。大金を抱えた人間は魔界の住人にとって絶好の”カモ”です。十分な知識を蓄えてからMainnetへの移住を検討してください。

ETHStaker

ETHStakerは、その名の通りEthereumでStakingを行うためのコミュニティです。理由は後述しますが、Testnetを利用したStakingの検証にはETHStakerのDiscord参加がほぼ必須となっています。Redditの該当コミュニティがベースであるため、Discord内にとどまらず現在でもReddit上で活発な交流を続けています。雰囲気を知りたい人はr/ethstakerを覗いてみると良いかもしれません。Event活動も精力的に行っているようなので、英語でのコミュニケーションに自信のある方は是非参加してみてください。過去のEventを見たい方はYoutubeチャンネルをチェック。

Go Ethereum

Go Ethereumは、Ethereumプロトコルの公式実装を行なっているチームであり、EthereumクライアントGethを開発しているチームとして知られています。過去現在を含めMainnetで最も多く利用されているクライアントであり、The Mergeが行われる前はGethだけでMainnetへの接続が可能でした。2022年10月現在、Mainnetを含む全てのPoSネットワークへの接続において、Gethクライアント単体では機能しないことが明言[2]されています。

Hyperledger Foundation

ひと言では説明が難しい団体ですが、ブロックチェーン技術に関するオープンソースコミュニティとして知られています。サブプロジェクトとして、EthereumクライアントであるHyperledger Besu (Besu)の開発を行なっています。Besuはエンタープライズフレンドリーに設計されており、Enterprise Ethereum Alliance (EEA)仕様を実装していることが大きな特徴です。

後発のクライアントであるため、Gethに比べてコードが整理されている印象があります。Besuはエンタープライズグレードを目指して開発されており、監視可用性に関する公式ドキュメントが充実していることも個人的には嬉しい点です。

Prysmatic Labs

The MergeによってBeacon ChainがMainnetに統合されました。現在Beacon ChainはMainnetのコンセンサスエンジンとして稼働しています。つまり、トランザクション実行自体を変更せずに、コンセンサスメカニズムだけをPoWからPoSに変更するアップグレードがThe Mergeの正体です。

その結果Mainnetの接続には、既存のチェーンである実行レイヤ(execution layer)と、Beacon Chainであるコンセンサスレイヤ(consensus layer) に対応するそれぞれのクライアント[3]が必要になりました。レイヤと名前を対応させて、それらは「実行クライアント」「コンセンサスクライアント」と呼ばれています。

実行クライアントのGethに相当するものが、Prysmatic Labsが開発しているコンセンサスクライアントのPrysmになります。

Prysmはコンセンサスクライアントの実質的なリファレンス実装であるため、Stakerが知るべき概念が網羅的にドキュメント化されています。他のコンセンサスクライアントを利用する場合でも、Prysmのドキュメントには一度目を通しておくと良いでしょう。

ConsenSys

ConsenSys社はEthereum界隈における裏ボス的な存在で、エンタープライズ用途でのEthereum運用を検討している場合、ほぼ確実にお世話になる会社だと思います。筆者は仕事でConsensys Quorum Support(エンタープライズ版Besuみたいなもの)を利用していますが、セキュリティ対応や安定性の改善に対する精力的な取り組みを肌で感じています。残念ながらパーソナルユースでテクニカルサポートを受けることはできませんが、やはり長期的な安定運用を考えた場合、ConsenSys社製クライアントの運用は一考の価値があると考えられます。また、クライアントの多様性の観点からも、GethやPrysm以外のクライアントを利用することがEthereumコミュニティへの直接的な貢献に繋がります。

ノード運用を行う前に

それでは、Stakingに必要なノードの要件を考えていきます。

今回はクライアントとして以下のものを選択しました。

  • コンセンサスクライアント:Teku
  • 実行クライアント:Besu

これらはあくまで一例であり、実際の運用ではクライアントの様々な組み合わせが可能です。

ノード運用に必要なハードウェア性能の検討

基本的にはそれぞれのクライアントにおける推奨性能をドキュメントで確認してください。Prysmの場合、必要なスペックがこのように記載されています。

しかし、Tekuのようにドキュメント内で明確なスペックが書いてない場合もあるので、eth-dockerのドキュメントを参考に必要な性能の目安を記載しておきます。

CPU Memory Storage
4コア以上 16GB以上(24GB以上推奨) 2TB以上のSSD (DRAMレスやQLCは非推奨)

「ECCメモリを選択するかどうか」は個人の好みの範囲になると思います。筆者はECCなしのメモリを購入したので、メモリが壊れたら泣きながらデバッグすることになると思います。

Storageに関する補足

調べた限りでは、Storageに関してM.2 NVMe SSDを推奨する方も普通のSATA SSDで十分だという方もいます。この問題はRedditでも議論[4][5]されていますが、結論としては一般的に市販されているSATA SSDの性能で十分[6]なようです。RocketPoolのドキュメントにはRaspberry Pi 用のセットアップが記載されていますが、Samsung T5 での動作状況をもとにストレージの必須要件を公表[7]しています。

4KB Random Bandwidth
Read 15K IOPS 以上 60MiB/s 以上
Write 5K IOPS 以上 20MiB/s 以上

Redditの議論ではSATA SSDとしてSamsungの870 EVOについて言及されていましたが、このSATA SSDの性能は上記の値を十分に上回っています。

一方、2022年10月時点では同価格帯のNVMe SSDとしてSamsungの970 EVO plusが存在します。2TBのモデルを比較[8]すると分かりますが、価格差はほとんどない(10/16時点:870 EVOが¥29,280、970 EVO plusが¥29,980)にも関わらず、性能差が6倍以上あることが分かります。

オーバースペックではありますが、現状の価格差を考えると個人購入ではM.2 NVMe SSDを推奨せざるを得ない状況です。今後価格が大きく下がれば、SATA SSDの購入を検討する余地が出るかもしれません。eth-dockerのドキュメント内でも言及[9]されていますが、24時間365日読み書きが発生するストレージなので、性能よりも発熱や耐久性が重要な要素になると考えられます。

また、Prysmのように「空き容量が2TB以上」と記載されているクライアントもあるので、金銭的な余裕があれば2TBを超えるSSDの購入も検討してください。ブロックチェーンノードを動かす専用PCを販売しているDappnode社では、4TBのモデルも販売しているようです。筆者は、予算の問題で2TBのM.2 NVMe SSDを選択しました。

筆者が構築したPC

LenovoのThinkCentre M70q TinyをベースにPCの構築を行いました。

  • CPU: 6コア、ベースクロック2.0GHz(Intel Core i5-10400T)
  • Memory: 32GB (ADATA Premier DDR4 2666 SO-DIMM 16GB x2)
  • Storage: 2TB (Samsung 970 EVO plus)

「壊れる頃にはもっと良いものが安く買えるだろ」という割り切りもHome Stakingならではの発想といえます。安定稼働に関する細かい部分を言い始めると、「それならクラウド環境で良いだろ!!」バトルになりかねないのでロマン成分を多めに感じていくことが大切です。

Testnetから32ETHを取得する

Ethereumのネットワークには、本番環境であるEthereum Mainnetの他にEthereum Testnetが存在します。ITインフラエンジニアであれば、Production環境の他にStaging環境があると考えれば分かりやすいでしょう。

現在主に利用されているEthereum Testnetは、

になります。Goerliは開発者向けの安定したTestnetとして維持されているため、アプリケーション開発者は主にGoerliを利用していると考えられます。

Ethereum Testnetでも、Mainnetと同じく動作にはGasが必要です。つまり、アカウントにETHをチャージする必要があります。Testnetで利用するETHを取得するにはfaucet(蛇口)を利用するのが一般的です。Ethereum公式ドキュメントのNetworkに、Testnetごとのfaucetsが記載されています。

……本来であれば、公式ドキュメントに記載されているfaucetsを利用すれば十分なのですが、現在Goerliのfaucetsは治安が最悪なため供給量に強い規制が設けられています。つまり、Solo Staking検証に必要な32ETHをすぐ取得できない状況になっています。

EthStakerの#request-goerli-eth

2022年10月現在、Goerliで利用するETH(GoETH)をSolo Staking検証用に取得するには、EthStakerのDiscordへの参加を検討してください。

#request-goerli-ethを利用することで、認証されたアカウントであれば32.02 GoETHを簡単に素早く取得することが可能です。

アカウント認証の手順は、 #brightid-verificationで下記のように指示されます。手順が更新されていた場合は、指示された最新の手順に従ってアカウント認証を実行してください。

2022年10月時点:

Get @BrightID-Verified here! Follow these simple steps:

- Make sure you have the BrightID mobile app and that you have a few good connections. If not, go to https://www.brightid.org/ to download the app and to join a connection party. Joining a connection party is required (full schedule on https://meet.brightid.org/). Make sure to join early. Those connection parties are closed quickly if no one joins on time.
- When installing the BrightID app, you do not need to enter your real name or add a real picture. You can stay pseudoanonymous. You might want to choose the Google Play Store version instead of the APK if you are on Android.
- Use one app that has sponsorships. See https://apps.brightid.org/ (IDChain on https://idchain.one/begin/ seems like a good one to get your sponsorship). Getting this sponsorship is required.
- Use the /verify command in brightid-verification . You will need to complete the other steps (connection party + sponsorship) before you can successfully use that slash command. Those previous steps are required.
- Follow the bot instructions to get the @BrightID-Verified role.
- If you need support with BrightID, make sure to join their Discord server on https://discord.gg/nTtuB2M .

BrightIDを利用したEthStakerのアカウント認証

BrightIDとは、ソーシャルグラフを身分証明に応用したサービスです。このサービスを利用する最大の障壁は 「英語のZoomミーティングに出席する必要があること」 です。

とはいっても、名前を呼ばれて「It's me!」と元気よく返事する程度の内容なので、難易度的にはやるかやらないかだけです。

1. スマホでBrightIDのアプリをダウンロードしてアカウントを作成

スマホでBrightIDのアプリをダウンロードしてアカウントを作成します。本名や自画像の登録は不要ですが、ニックネームとアイコン画像が必要です。ミーティングで名前を呼ばれるため、英語圏の方が読みやすいアルファベットの名前にすることをオススメします。

2. Connection Partiesへ出席

ETHStakerのアカウント認証には、BrightID社が主催するConnection Partiesと呼ばれるオンラインミーティングにZoomで参加する必要があります。分かりにくいですが、スケジュール表の時間はミーティングの時間ではなく集合時間です。記載された時間の間にZoomルームへ入室してください。画面共有で表示されたQRコードをスマホで読み取る手順があるため、屋内の静かな場所でノートPCから参加することをおススメします。

  1. カメラをONにする指示が出たらカメラをONにしてください。聞き取れなくても、他の参加者がカメラをONにするので分かると思います
  2. QRコードを読み取ったあと、その場でルームの主催者との関係性を登録します
  3. Connection Levelを「Just met」にして登録完了
  4. 名前を呼ばれたら「It's me!」と返事をします

Connection Partiesは10分程度で終わります。BrightIDのアプリ上で、アカウントの状態が「Unverified」→ 「Meets」へ変更したらこの作業は完了です。参加時に質問してる方がいましたが、検証状態の反映にはおおよそ20分程度かかるそうです。

3. BrightIDでスポンサーを取得

BrightIDを利用しているサービスに登録しよう!という手順です。筆者はEthStakerで例として記載されていたIDChainを利用しました。

  1. ノートPC上のMetamaskインストール済みのブラウザでIDChainのページを開きます
  2. 表示されたQRコードをスマホのBrightIDアプリでスキャンします
    • BrightIDアプリのリンク処理が終わらずエラーが出ましたが、しばらく待つとArchivementsの「Get sponsored」がチェックされました

4. #brightid-verification/verifyコマンドを実行

全ての準備が整ったので、ETHStakerのDiscord上でアカウント認証コマンドを実行します。

  1. ETHStakerのDiscordにある#brightid-verification/verifyコマンドを実行
    • 「Get sponsored」がチェックされたあと、/verifyコマンドに結果が反映されるまで5分程度待つ必要がありました
  2. 表示された手順に従い、表示されたQRコードをBrightIDでスキャン
  3. Click here after scanning QR Code in... というボタンを押して認証完了

全ての手順が上手く行った場合、#brightid-verificationでBrightID Botから以下のメッセージが送信されます。

Hey, I recognize you! I just gave you the BrightID-Verified role. You are now BrightID verified in ethstaker server!

これでBrightIDを利用したETHStakerのアカウント認証は完了です。#request-goerli-eth/request-goethコマンドを実行して、利用する検証アカウントに32.02 GoETHを送ってもらいましょう!

中編に続く

脚注
  1. https://ethereum.org/en/staking/solo/ ↩︎

  2. https://geth.ethereum.org/docs/interface/peer-to-peer ↩︎

  3. https://hackmd.io/@n0ble/the-merge-terminology ↩︎

  4. https://www.reddit.com/r/ethstaker/comments/rxitpv/sata_vs_m2_ssd_for_staking_server/ ↩︎

  5. https://www.reddit.com/r/ethstaker/comments/qpbq8y/choosing_the_cheaper_larger_ssd_for_staking/ ↩︎

  6. https://www.reddit.com/r/ethstaker/comments/xacc5i/best_practice_for_staking_on_the_ethereum_beacon/ ↩︎

  7. https://docs.rocketpool.net/guides/node/local/prepare-pi.html#testing-the-ssd-s-performance ↩︎

  8. https://kakaku.com/prdcompare/prdcompare.aspx?pd_cmpkey=K0001326167_K0001158044&pd_ctg=0537 ↩︎

  9. https://eth-docker.net/docs/Usage/Hardware ↩︎

Discussion