Ethereumステーキング:バリデーター追加と安全な資産引き出し方法


目次

  1. はじめに
  2. バリデーター追加方法
  3. 資産の引き出し方法
     1. Partial Withdraw
     2. Full Withdraw
  4. リスクと鍵の管理
  5. おわりに

1. はじめに

Ethereumノード運用においては、鍵の生成や運用だけでなく、バリデーターの追加や資産の引き出し方法についても理解しておく必要があります。ノード運営の最中に、正しい手続きを踏まなければ、リスクを伴う可能性があります。特に、Partial WithdrawやFull Withdrawなどの引き出し方法の違いは、資産管理に大きな影響を与えるため、注意が必要です。

本レポートでは、バリデーターの追加手順や、資産の引き出し方法について解説し、さらにノード運営におけるリスクと鍵管理の重要性についても触れていきます。初心者でも安心してノード運営が行えるよう、具体的なステップと注意点をわかりやすく説明します。

2. バリデーター追加方法

本章ではバリデーターの追加方法の概要を説明する。具体例としてコンセンサスクライアントの1つであるPrysmをgoerliテストネットで実行する。使用するprysm.shファイルは、prysmの公式サイトから入手できる。

  1. バリデータープロセスを実行

    初めにバリデーターを使用するマシン上で実行する。この時、バリデーターキーの読み込み方法により実行するコマンドオプションは異なる(ターミナルログ2、ターミナルログ3)。ターミナルログ2では、バリデーターキーのファイルパスを、オプションで指定している。ターミナルログ3では、バリデーターキーを使用して署名を行うWeb3signerのホスト名とポート番号を、オプションで指定している。

ターミナルログ2. ローカルのvalidator keyを使用する場合
```bash
./prysm.sh validator accounts import --keys-dir=./path/to/validator_keys --prater
....
[2023-07-30 20:22:20]  INFO userprompt: (wallet path) /home/vitalik/.eth2validators/prysm-wallet-v2
Wallet password:
...
Enter the password for your imported accounts:
Importing accounts, this may take a while...
Importing accounts...  33% [===========================>                                                          ]  [1s:2s][2023-07-30 20:32:11]  INFO local-keymanager: Successfully imported validator key(s) publicKeys=0xa25f295f3a52
....
./prysm.sh --wallet-dir=/var/user/.eth2validators/prysm-wallet-v2 --prater
出所:Next Finance Tech社作成

ターミナルログ3. Web3Signerを通してvalidator keyを使用する場合
```bash
# --validators-external-signer-url: web3signerのhostとポート
# --validators-external-signer-public-keys:
./prysm.sh --validators-external-signer-url=http://localhost:9000 --validators-external-signer-public-keys=0x1234567890abcdefghijklmnopqrstuvqzABCDEF --prater
出所:Next Finance Tech社作成

  1. Launchpadでdeposit.jsonファイルをアップロード

    バリデーターの登録は、Launchpadと呼ばれるサイトを経由して行う。Launchpadにはメインネット用とテストネット用の2つが存在するため、どちらを選択しているか確認が必要である。また、当サイトではバリデーターを実行するまでの手順が紹介されており、設定に誤りがないか事前確認することを推奨する。

  2. 32ETHを送金

    Launchpadでdeposit.jsonファイルをアップロードした後に、ブラウザウォレットから32ETHを送金するアカウントを選択し、送金する。2023年7月現在、テストネットではおよそ3日、メインネットでは40日前後、ネットワークにバリデーターとして認識されるまでに時間がかかる。

3. 資産の引き出し方法

本章では、ステーキングした32ETHと報酬で得たETHの引き出し方法について説明する。バリデーターとして起動後、1エポック(およそ6分から7分)毎にバリデーターは報酬を受け取る。Ethereumバリデーターの最大デポジット額は32ETHとなっている。Ethereumのノード運用ではステーキング報酬により資産が32ETH以上になることことが想定されるが、上限を超えたETHは運用益に影響しないため無駄になる。これを防ぐために、EthereumではPartial Withdrawと呼ばれる仕組みがある。一方で、全額を引き出す場合はFull Withdrawを行う。各節で、それぞれの詳細について説明する。

3.(1) Partial Withdraw

Ethereumでは、運用しているノードが32ETH以上の資産を持っている場合、登録したWithdraw Addressに数日分の運用益を自動送金する仕組みになっており、これをPartial Withdrawと呼ぶ。Partial Withdrawの設定方法は、大きく2つある。

  1. バリデーターキー作成時に設定する
    Deposit CLIでkeystoreファイルとdeposit.jsonファイルを作成する際に、コマンドオプションとして --eth1_withdrawal_addressを指定する。作成されたdeposit.jsonファイルを使用してバリデーター登録を行うと、自動でPartial Withdrawが設定され、対象のアドレスに数日に1度報酬が配布される。
コマンド1. eth1_withdrawal_addressオプションを使用し、Partial Withdrawを設定
```bash
 ./deposit new-mnemonic --num_validators 1 --chain goerli --eth1_withdrawal_address 0x1234567890abcdefghijklmnopqrstuvqzABCDEF
出所:Next Finance Tech社作成

  1. Deposit CLIのサブコマンドで設定する
    バリデーター登録の際に利用したdeposit.jsonと対応するニーモニックの値、送金先アドレス、Validator Indexが必要である。Validator Indexは、beaconcha.inで登録したバリデーターのページを開くと確認できる。例ではValidator Indexは526,618となる(図6)。
図1. Validator Indexの例 出所:Next Finance Tech社作成

Partial Withdrawアドレスを設定する際は、変更に必要なbls_to_execution_changesファイルを作成する。作成したファイルは、各バリデータークライアントのアプリを使用してネットワークに共有する。今回はPrsymに対応しているprysmctlと呼ばれるツールを利用して、bls_to_execution_changesファイルを共有している(ターミナルログ4)。

ターミナルログ4. prysmctiを使用し、Partial Withdrawを設定
```bash
./deposit generate-bls-to-execution-change

Please choose your language ['1. العربية', '2. ελληνικά', '3. English', '4. Français', '5. Bahasa melayu', '6. Italiano', '7. 日本語', '8. 한국어', '9. Português do Brasil', '10. român', '11. Türkçe', '12. 简体中文']:  [English]:
Please choose the (mainnet or testnet) network/chain name ['mainnet', 'goerli', 'sepolia', 'zhejiang']:  [mainnet]: goerli
Please enter your mnemonic separated by spaces (" "). Note: you only need to enter the first 4 letters of each word if you'd prefer.: news brass song bargain viable any gaze flag foot ask horror involve mutual oven gap shock hello taste kiss enforce rival ceiling indoor average
Please enter the index position for the keys to start generating withdrawal credentials in ERC-2334 format. [0]:
Please enter a list of the validator index number(s) of your validator(s) as identified on the beacon chain. Split multiple items with whitespaces or commas.: 526618   ## Value in beaconchain
Please enter a list of the old BLS withdrawal credentials of your validator(s). Split multiple items with whitespaces or commas. The withdrawal credentials are in hexadecimal encoded form.: 005361919f3dd01db0deeb054661a8e47b0637242a942641ebe33c1752ca65e5 ## Value in deposit.json
Please enter the 20-byte execution address for the new withdrawal credentials. Note that you CANNOT change it once you have set it on chain.: 0x1234567890abcdefghijklmnopqrstuvwz123456

**[Warning] you are setting an Eth1 address as your withdrawal address. Please ensure that you have control over this address.**

Repeat your execution address for confirmation.: 0x1234567890abcdefghijklmnopqrstuvwz123456

**[Warning] you are setting an Eth1 address as your withdrawal address. Please ensure that you have control over this address.**

Verifying your BLSToExecutionChange file:         [####################################]  1/1

Success!
Your SignedBLSToExecutionChange JSON file can be found at: /path/to/bls_to_execution_changes

./prysmctl validator withdraw --beacon-node-host=<node-url> --path=<bls_to_execution_changes-*.json>
出所:Next Finance Tech社作成

3.(2) Full Withdraw

運用ノードの全ての資産を出金する操作はFull Withdrawと呼ばれ、運用ノードは全てのビーコンノードに対してネットワークから脱退(Exit)することを数日かけて知らせる。無事に全てのノードに対して脱退を伝達し終えた後、指定したWithdraw Addressに全額振り込まれる。

Full Withdrawの方法は各クライアントごとによってコマンドが変わるため一概には述べることができないが、ここでは例としてPrysmにおけるFull Withdraw方法を記載する(ターミナルログ5)。

ターミナルログ5. PrysmにおけるFull Withdraw例
./prysmctl-v4.0.7-linux-amd64 validator exit --wallet-dir=/path/to/.eth2validators/prysm-wallet-v2 --beacon-rpc-provider=127.0.0.1:4000

Prysmatic Labs Terms of Use

By downloading, accessing or using the Prysm implementation ("Prysm"), you (referenced herein
as "you" or the "user") certify that you have read and agreed to the terms and conditions below.

TERMS AND CONDITIONS: <https://github.com/prysmaticlabs/prysm/blob/master/TERMS_OF_SERVICE.md>

Type "accept" to accept this terms and conditions [accept/decline]: (default: decline):
accept
WARN[0011] Running on Ethereum Mainnet                   prefix=flags
WARN[0011] You are using an insecure gRPC connection. If you are running your beacon node and validator on the same machines, you can ignore this message. If you want to know how to enable secure connections, see: <https://docs.prylabs.network/docs/prysm-usage/secure-grpc>  prefix=validator
Wallet password:
[Selected all accounts]
Are you sure you want to perform a voluntary exit on all accounts? Y/N (0x123456789, 0xabcdefghijk):
Y
...
INFO[0185] Voluntary exit was successful for the accounts listed. URLs where you can track each validator's exit:
...

出所:Next Finance Tech社作成

4. リスクと鍵の管理

本章では、ノード運用における鍵の安全な管理方法について説明する。特に、ニーモニック、BLS Keystoreファイル、deposit.jsonファイル、それぞれについて説明する。

ニーモニックは、BLS Keystoreファイルを再生成する際にも利用され、鍵管理において最も重要なものである。ニーモニックが流出した場合、悪意のあるユーザーや攻撃者が資産をSlashing(以下、スラッシング)などの仕組みを利用して減らしたり、Withdraw addressを設定して資金を引き出すなどの行為を行う可能性がある。ニーモニック生成から保管までの一連のオペレーションをオフラインで実行することを推奨する。

BLS Keystoreファイルは、暗号化された秘密鍵と公開鍵を保持している。そのため、利用する際にはパスワードを入力して秘密鍵を復号化する必要がある。しかし、これらが流出した場合、悪意のあるユーザーが別のノードを同一のバリデーターキーで実行することにより、スラッシングを引き起こす可能性がある。バリデーターがこのファイルを利用する際には、バリデーターが実行されているホストから参照できる場所に保管されていなければならないが、 BLS Keystoreファイルをバリデーターと同一サーバー上に設置する代わりに、ネットワークから遮断された別サーバー上にWeb3signerと呼ばれるRESTサーバーを設置することで、攻撃者がBLS Keystoreファイルを入手するリスクを低減できる。Web3Signerは、Metamaskなどを開発しているConsensysが提供しているRemote Signingサービスである。また、Web3SignerはKeystoreファイルを直接使用することもできるが、より安全な方法としては、HashiCorp Vault, Azure Key Vaultそして、AWS Secret Managerなどに秘密鍵を保存することもできる(図6)。ただし、KeyValueのStorageになっているため、KeystoreファイルをDecryptしてPrivate Keyの値を取得する必要がある。

図2. web3signer構成図 出所:Next Finance Tech社作成

deposit.jsonファイルは、BLS Keystoreファイルと同時に作成されるファイルである。このファイルはWithdraw credentialを所持し、Withdraw addressを事前に設定していない場合、悪意のあるユーザーが任意の送金アドレスを設定することができる。この問題自体はDeposit CLIを実行したときにWithdraw addressを設定することで、後から変更することを防ぐことができる。

5. おわりに

Ethereumノード運用において、バリデーターの追加や資産の引き出し手順を正しく理解しておくことは、効率的な運営と安全な資産管理に不可欠です。本レポートでは、バリデーターの管理やPartial WithdrawとFull Withdrawの違い、さらにリスク管理について説明しました。

ステーキングは安定した報酬を得られる一方で、鍵管理や運用方法に関する注意が必要です。運用開始前に十分な準備を行い、リスクを軽減することで、Ethereumエコシステムの健全な発展に貢献することができます。今後も、より多くのプレイヤーが安全にノード運用を行い、エコシステム全体を支える存在になることを期待しています。