Ethereumステーキング:鍵の概要
目次
- はじめに
- 鍵とは
- 鍵の役割
- Deposit CLIによる鍵の生成
- おわりに
1. はじめに
Ethereumノード運用は、Ethereumエコシステムの維持に貢献し、その対価として報酬を得ることができる重要な仕組みです。特に、自分自身でノードを運用するSolo home stakingでは、最大限の報酬が期待できる一方で、鍵の管理やノードの設計・運用などの高度なスキルが必要です。鍵の安全性を確保することは、資産を守るための最重要課題となります。
本レポートでは、Ethereumにおける「鍵」の基本概念や、Deposit CLIを使った鍵の生成手順について詳しく解説します。これからノード運営を考えている方や、鍵の取り扱いに不安を抱いている方に、鍵の重要性と安全な管理方法をお伝えします。
2 . 鍵とは
ブロックチェーン上の活動(暗号資産の移転やステーキング)には、必ずアカウントとそれに対応する鍵が必要である。例えばステーキングにおいて、アカウントはバリデーターの識別子として、鍵はバリデーターアカウントがネットワークに貢献しているかを証明する際に使用される。
アカウントを作る際にはニーモニックと呼ばれる11~24の英単語のフレーズをPrivate Keyの代わりに保管する。実際のPrivate Keyの値は任意の文字列(以下、パスワード)で暗号化して保管し、使用時にはパスワードで復号化する。ニーモニックは、Private KeyのBackupやRecoveryとして利用されるため、ユーザーはこのニーモニックのフレーズを厳重に保管する必要がある(図2)。
3 . 鍵の役割
Ethereumのノード運用において、2つの鍵ファイルを使用する。本章では、各ファイルの役割について説明する。
- Keystoreファイル
暗号化したPrivate Key(以下、秘密鍵)とPublic Key(以下、公開鍵)などの情報を保有している。これら2つの鍵はValidate key(以下、バリデーターキー)とも呼ばれ、バリデーターとしての活動を行うときに使用する(図3)。
- deposit.jsonファイル
公開鍵などの情報の他に、引き出しを行う際に必要なwithdrawal addressを保有している。公開鍵自体は、外部に流出したとしても特に問題にはなく、ビーコンチェーンなどのネットワーク情報を監視するサービスや、自分の運用しているノード状態を確認する際などに使用される。Solo home stakingをする際、2023年8月現在、最低32ETHを紐づけられたアドレスに送金する必要がある。ステーキング開始後、ステーキングによる運用益は指定したwithdrawal addressに送金されるため、これらの運用益、純資産を引き出すために引き出し先のアドレスを設定する必要がある(図4)。
4. Deposit CLIによる鍵の生成
Deposit CLIは、Ethereum Foundationが提供しているBLS Keystoreファイルを生成するためのツールである。このツールは、前述したニーモニックをユーザーに提供し、BLS Keystoreファイルとdeposit.jsonファイルを生成する。これらのファイルは、外部に流出した場合資産の損失につながる可能性がある。そのため、インターネットに接続していないマシン上でDeposit CLIを使用し、Keystoreファイルを生成することを推奨する(図5)。
以下、BLS Keystoreを生成する例を提示する。この例では、goerliテストネットワーク上で、Deposit CLIを用いてバリデーターアカウントを1つ作成する(ターミナルログ1)。多くのバリデータークライアントのチュートリアルでは、Withdraw addressをKeystoreファイルを生成する際に設定していないが、弊社ではWithdraw addressを設定する操作を時間をおいて設定することは人為的なミスにつながると考えており、Keystore生成時に設定することを推奨している。
#eth1_withdrawal_addressは自分のmetamask等のアドレス(例:0x1234567890abcdefghijklmnopqrstuvqzABCDEF)を指定する。
$ ./deposit new-mnemonic --num_validators 1 --chain goerli --eth1_withdrawal_address 0x1234567890abcdefghijklmnopqrstuvqzABCDEF
***Using the tool on an offline and secure device is highly recommended to keep your mnemonic safe.***
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]:
**[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.: 0x1234567890abcdefghijklmnopqrstuvqzABCDEF
**[Warning] you are setting an Eth1 address as your withdrawal address. Please ensure that you have control over this address.**
Please choose the language of the mnemonic word list ['1. 简体中文', '2. 繁體中文', '3. čeština', '4. English', '5. Italiano', '6. 한국어', '7. Português', '8. Español']: [english]:
Create a password that secures your validator keystore(s). You will need to re-enter this to decrypt them when you setup your Ethereum validators.:
Repeat your keystore password for confirmation:
This is your mnemonic (seed phrase). Write it down and store it safely. It is the ONLY way to retrieve your deposit.
fame blue walk raise imitate media promote toddler upset pen enact method winter orient tackle tent power remember alone harbor educate almost similar fiction
Press any key when you have written down your mnemonic.
Please type your mnemonic (separated by spaces) to confirm you have written it down. Note: you only need to enter the first 4 letters of each word if you'd prefer.
##### #####
## ##### ##
### ## ####### #########################
## ## ##### ## ##
## ##### ## ##
## ## ## ###
######## ## ####
## ## ### ##### #####
# ## # #####
# # # #####
## ## ##
## ## ##
## ### ## ##
############### ## ##
### ## ##
############################# ##
## ###
####### ################# ###
## ## ## ## ## ###
############## #############
Creating your keys.
Creating your keystores: [####################################] 1/1
Verifying your keystores: [####################################] 1/1
Verifying your deposits: [####################################] 1/1
Success!
Your keys can be found at: /home/vitalik/ethereum/consensus/prysm/staking_deposit-cli-d7b5304-linux-amd64/validator_keys
上記のdeposit コマンドは実行ディレクトリ上でvalidator_keysディレクトリを生成する。このディレクトリは、keystore.jsonファイルとdeposit_data.jsonファイルを含んでいる。以下、それぞれのファイルについて説明する。
- keystore.jsonファイル
秘密鍵の暗号化された値であるcrypto、公開鍵の値であるpubkey、1つのニーモニックから複数の鍵を導出する際に使用されるpath、などの情報が保管されている(ファイル1)。
```bash
{
"crypto": {
"kdf": {
"function": "scrypt",
"params": {
"dklen": 11,
"n": 222222,
"r": 3,
"p": 4,
"salt": "1234567890abcdefghijklmnopqrstuvwzABCDEFGHIJKLMNOPQRSTUVWZ123456"
},
"message": ""
},
"checksum": {
"function": "sha256",
"params": {},
"message": "1234567890abcdefghijklmnopqrstuvwzABCDEFGHIJKLMNOPQRSTUVWZ123456"
},
"cipher": {
*"function": "aes-128-c*tr",
"params": { "iv": "abcdefghijklmnopqrstuvwz12345678" },
"message": "1234567890abcdefghijklmnopqrstuvwzABCDEFGHIJKLMNOPQRSTUVWZ123456"
}
},
"description": "",
"pubkey": "1234567890abcdefghijklmnopqrstuvwzABCDEFGHIJKLMNOPQRSTUVWZ1234567890abcdefghijklmnopqrstuvwzABCD",
"path": "m/12345/1234/0/0/0",
"uuid": "12345678-abcd-efgh-ijkl-1234567890ab",
"version": 4
}
- deposit_data.jsonファイル
公開鍵の値であるpubkey、出金先アドレスであるwithdrawal_credentials、デポジット額であるamount、秘密鍵による電子署名であるsignature、ネットワーク名であるnetwork_name、などの情報が保管されている(ファイル2)。pubkeyは、keystore.jsonのpubkeyと同じ値が存在していなければならない。また、withdrawal_credentialsは、”0100….. + eth1_withdrawal_address”の形式になっている。
```bash
[
{
"pubkey": "1234567890abcdefghijklmnopqrstuvwzABCDEFGHIJKLMNOPQRSTUVWZ1234567890abcdefghijklmnopqrstuvwzABCD",
"withdrawal_credentials":
"0100000000000000000000001234567890abcdefghijklmnopqrstuvqzABCDEF",
"amount": 32000000000,
"signature":
"ab6ca3cb41c5422a342082d61cfd28a2fb2f141c3fc172ac5642a6d471848a0407555c9febf90a3f9f9955230123730a05cd979a8b770bd7ae64748452b37fb8d265d4d86a7608df277f9d9d36d42ef79fae13a37ae1bb8aece8d2b757df9e3d",
"deposit_message_root": "7bb2b24aa670a389bb81f1c3ec12a3895504f8e413b7e94f53cba7e5a5bc491f",
"deposit_data_root": "14150e38312ee8808250d5f426cea00ac56caa47c8ac72546c6ca354fdda7ed0",
"fork_version": "00001020",
"network_name": "goerli",
"deposit_cli_version": "2.5.0",
},
]
上記の例では1つの秘密鍵に対して1つの公開鍵のみが関連付けられているが、1つの秘密鍵に対して複数の公開鍵を関連付けることもできる。これを行う場合、1つのノードで複数のバリデーターアカウントを実行させることができる。
5. おわりに
鍵管理はEthereumノード運用における最も重要な要素の一つです。適切な手順で鍵を生成し、安全に保管することが、資産を守るための第一歩です。本レポートでは、鍵の生成方法や基本的な管理方法について解説しましたが、運用を開始する前に、鍵に関連するリスクや保存方法についてしっかりと理解し、計画を立てることが求められます。
テストネットでの実験や複数のセキュリティ対策を講じることで、リスクを最小限に抑えることが可能です。安全な鍵管理は、安定したステーキング報酬の基盤となります。Ethereumエコシステムの持続可能な発展に貢献するためにも、鍵管理にしっかりと向き合いましょう。