※Alpha-6の開始がアナウンスされました。
本記事で紹介しているA5については、R6年1月末でクローズされました。
Alpha6でproveするためにはSGXに対応した端末が必要ですが、Proposeは本記事のとおり構築しても実施することができます。
A6からはHoleskyテストネットを利用するため、エンドポイントの取得はBlockPi(https://dashboard.blockpi.io/) を利用してください(可能な方はノードを立ち上げてください。)
目 的
イーサリアムのType1 ZK‐EVMをめざすTaikoのテストネットノードを、初心者でもほぼコピペだけで構築し、Propose/Prove
のTxを生成する。
前提条件
- 毎月40ドルの支出を許容できること。
Taikoノード(Proposer / Prover可能)の最小ハードウェア要件
- CPU:8/16コア
- 32GB以上のメモリ
- 1TBのストレージ
※今回はSepoliaノードを構築せずAlchemyのエンドポイントを利用するため、Taikoノードを動かすだけなら実際のストレージ要件は100GB程度です。
(実際、私はAlchemyでほぼ制限がかからずPropose/Proveを成功させている。Alpha-6開始間近ということもあり、Sepoliaノードの構築は不要と判断。)
上記の要件を満たすコスパ最高のVPSがこちら(簡単な契約方法は後ほど説明します。)
ドイツの会社ですが、たったの月額40ドルで
10コアのCPU、60GBのメモリ、1.6TBのストレージ(SSD)のモンスターマシンを借りることができます。
※8/16コアのCPUに対して10コアのCPUだけど大丈夫?と思った人もいるかと思いますが、これは8コア/16スレッドのCPUという意味だと思いますので問題ありません。
簡単に説明すると……
8/16コアのCPUはハイパースレッディングという技術で、1つのコアに2つの処理をさせています。なので、処理速度は単純に2倍にはならず、おおよそ最大で25%の性能向上が見込まれるといわれています。
なので8コア×1.25=10コア
単純計算なので厳密には違うと思いますが、8/16コアCPUと10コアCPUは同等の性能を持つので問題にならないのです。
事前準備
- VPS契約
- 最低限のセキュリティ対策
- 必要なツールのインストール等
VPS契約
下図のように選択(何か月借りるかはおまかせします。)
続き(rootのパスワードなので強度を高くしましょう。「12345Abcde!!」これくらいやれば安心です。ここで強度を確認できます。https://www.security.org/how-secure-is-my-password/)
続き(deepl使えば楽に住所を翻訳できます。)
続き(ここは説明不要かと思います。)
以上で契約は終了です。
最低限のセキュリティ対策
※サイバーセキュリティに関してはノーガード戦法で攻めるぜ!という方はrootでのログインを確認できた時点で必要なツールのインストールに飛んでも大丈夫です。(自己責任)
まず、Contaboの契約が終わったらメールが2通届きます。1通目メールに記載されているIDとパスを利用して、VPSの管理画面にログインしましょう。(後ででもいいので、初期パスから任意のパスに必ず変更してくださいね。2FAも設定したらなおのことよし。)
https://my.contabo.com/account/login
1通目
VNCの無効化
ログインが完了したらVNCを無効化する。
続き
続き
これでVNCの無効化が完了しました。
VPSにログインする。
次に2通目のメールに記載されているIPアドレス、ユーザ名(root)、契約時に決めたパスワードでVPSにアクセスしてみましょう。
お好きなターミナルを起動する。
おすすめはWindows Terminalです。(Windowsの感覚でコピペができる。)
1.以下をターミナルに入力(VPSのアドレスに書き換えてください。)
ssh root@VPSのIPアドレス
2.パスワードを聞かれるので入力(パスは入力されないので、文字が出なくてもあせらない。)
root@VPSのIPアドレス's password:
おめでとうございます。
これでVPSにログインすることができました。
SSHでrootにログインできないようにする。
最低限のセキュリティを担保するためにsshでrootにログインできないようにしようと思います。
※本来であれば、この作業の後に公開鍵認証に変更する、sshのポートをウェルノウポートの22から別のポートに変更する等いろいろ対策を講じることができますが、この記事は初めてテストノードを構築してみようという方(Linux?何それ?)を対象としていますので、ここらでセキュリティ対策は妥協しようと考えます。
3.一般ユーザの作成(ユーザ名を「Taiko」とします。)
sudo useradd -m -s /usr/bin/bash taiko
4.一般ユーザのパスワードの設定(rootのパスを使いまわさない。sudoグループに追加するので強度高めのパスワードがおすすめ。)
sudo passwd taiko # パスワードを変更する
5.パスワード入力画面が出るので入力
New password: #新しいパスワードの設定 ※表示されません
Retype new password: #再入力
6.以下の表示が出ればOK
passwd: password updated successfully
7.sudoグループにユーザ名を追加
sudo adduser taiko sudo
8.ユーザ名が追加されているか確認
cat /etc/group | grep sudo
9.以下のようにユーザ名が追加されていればOK
sudo:x:27:taiko
10.いったんVPSからログアウト
exit
11.再度VPSにログイン
ssh taiko@VPSのIPアドレス #一般ユーザでSSH接続する。
12.設定変更のためrootになる(パスを聞かれるので、VPSを契約したときに決めたパスワードを入力)
su -
13.ssh接続の設定ファイルをバックアップ
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org
14.ssh接続の設定ファイルの変更
vi /etc/ssh/sshd_config
15.文字がいっぱい出てくるので以下の文を探す。
PermitRootLogin yes
16.上記の文を見つけたら、キーボードの「i」を押して入力モードになる。そして「yes」→「no」に変更する。
PermitRootLogin no
変更が終わったら「esc」キーを押して「:wq」と入力すれば上書き保存できます。
17./etc/ssh/sshd_configの構文をチェック
sshd -t #これでエラーを吐かなければOK
18.SSH接続の設定を反映させる。
systemctl restart sshd.service
19.ログアウト
exit
1. に戻り、ルートでのログインを試してみる。これでログインできなければ成功
以降の作業は 11. のとおりログインして実行する。
必要なツールのインストール等
- Dockerのインストール
- Gitのインストール
-
テストネット用ウォレットアドレスの取得
- SepoliaのETH(ガス代)取得
- Sepoliaのエンドポイント取得
- TTKOjの取得
- TTKOjをデポジット
Dockerのインストール
以下説明を簡略化します。ひたすらコピペしてください。
(引用元:https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04-ja)
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
sudo apt update
apt-cache policy docker-ce
sudo apt install docker-ce
sudo systemctl status docker
これでDockerがインストールできました。
次にsudoなしでコマンドを実行するために一工夫しましょう。
今ログインしている一般ユーザをdockerグループに所属させる。(ユーザは「taiko」とします。)
sudo usermod -aG docker taiko
一度rootに入る(パスワードはVPS契約時に設定したパスワード)
su -
Dockerグループに追加されているか確認
id -nG
一般ユーザが表示されればOK
Docker Compose CLI プラグインのインストール
sudo apt-get update
sudo apt-get install docker-compose-plugin
docker compose version
バージョンが表示されればOK
Gitのインストール
以下説明を簡略化します。ひたすらコピペしてください。(引用元:https://github.com/git-guides/install-git/)
sudo apt-get update
sudo apt-get install git-all
git version
バージョンが表示されればOK
テストネット用ウォレットアドレスの取得
メタマスク等で新しいアドレス(秘密鍵も使います)を取得してください。(さすがにこれができない人はここにこないと思います。)
※Foundryupをインストールすると以下のコマンドで新アドレスと秘密鍵を一発で取得できるので便利です。(今後テストネットいっぱい触りたい人はチャレンジしてみてください。)
cast wallet new
SepoliaのETH(ガス代)取得
メタマスクのネットワークをSepoliaに変更
※ネットワークにない場合はこちらから追加
https://sepolia-faucet.pk910.de/にアクセスして、さっき作ったアドレスを入力してETHをマイニングしてください。
5ETHくらいマイニングしたら心に余裕ができます。
テストネット用の捨て垢ETHアドレスを用意してアドレス入力→放置
Sepolia Holeskyのエンドポイント取得
BlockPi でHoleskyのエンドポイントを作成してください。
Alchemyにアクセスして、アカウントを作成してください。(課金する必要はありません。無料版で制限がかからずコンスタントにPropose/ Proveを成功させることができます。)
アカウント作成が終わったら、Apps→Create new appとすすむ。
続き(画像のように設定してください。)
続き(Creatre appを押したら以下の画面になるので、API Keyを選択)
続き(赤枠内のHTTPS、WebSocketのURLを控えておく。)
この2つは誰にも見られないようにしてください。
TTKOjの取得
Sepoliaのガス代を取得したウォレットを準備して、TTKOjを入手してください。L1側に最低2.5TTKOjが必要です。(3TTKOjくらい用意しておけばいいでしょう。大体0.8ETHくらい。)
SepoliaETH→JolnirETH→JolnirTTKOj→SepoliaTTKOj
ブリッジ→スワップ→ブリッジとめんどくさいですが、SepoliaL1にTTKOjがないとProveできないので必ずやってください。
ブリッジとスワップのやり方については公式ドキュメントを参照してください。
やり方は大丈夫だよって人は以下から実行してください。
Sepolia→Jolnirはほぼ一瞬ですが、逆は3~4時間かかります。ノード構築前に終わらせておきましょう。
TTKOjのデポジット
1.TaikoL1契約を支出者として承認する。
Sepoliaネットワークに2.5TTKOj以上あることを確認してから以下にアクセス
https://sepolia.etherscan.io/address/0x75F94f04d2144cB6056CCd0CFF1771573d838974#writeProxyContract
下図のように作業してください。
コントラクトアドレス:0x95fF8D3CE9dcB7455BEB7845143bEA84Fe5C4F6f
続き
続き
2.TTKOjをデポジットする。
Sepoliaネットワークに2.5TTKOj以上あることを確認してから以下にアクセス
https://taiko.xyz/docs/guides/enable-a-prover
下図のように作業してください。
これで事前作業はすべて終了です。
Taikoノードの構築
以下ひたすらコピペしてください。
git clone https://github.com/taikoxyz/simple-taiko-node.git
cd simple-taiko-node
サンプルの.envファイルをコピー
cp .env.sample .env
必要な値を設定(A6対応)
.envファイルをエディタで開く。(お好きなエディタを使ってください。ここではvimを使います。)
vim .env
もともと記載してあったものはすべて削除して、以下をコピペしてください。
そのあと、29、30、40、51、53行目のイコールの後ろに#で入れるものを記載してあるので、それを入力してください。
※キーボードの「i」を押すと入力モードになります。
############################### DEFAULT #####################################
# Chain ID
CHAIN_ID=167007
# Exposed ports
PORT_L2_EXECUTION_ENGINE_HTTP=8547
PORT_L2_EXECUTION_ENGINE_WS=8548
PORT_L2_EXECUTION_ENGINE_METRICS=6060
PORT_L2_EXECUTION_ENGINE_P2P=30306
PORT_PROVER_SERVER=9876
PORT_PROMETHEUS=9091
PORT_GRAFANA=3001
# Comma separated L2 execution engine bootnode URLs for P2P discovery bootstrap
BOOT_NODES=enode://2833d948c31b10a820ed76e652c49c5025ec5c01e8100b4f0b2b6d527c2bf5bdc093f0c8f8c1f63feebed96b00c0e1403d29a1a88a108ed8f3bbbe56fe9d583a@43.130.29.245:30303,enode://0c66c4f514f40247b96ff61ee6012d644cd75e30513b3b93526dec0c7668a8979bb06f8fe4e7f57e0de12a41d2844c6f3f8571f6c8009b9951b7de367270901f@43.153.11.70:30303,enode://c6d64b973649b62eaa261e6b02f27b0f5125518cb80d087dfa681d893cfc9336e1b3dc456e38ac0d8501d06e0cdebcb86b8f254d7305c62cb4c9b12a1e7e8aee@43.153.26.219:30303,enode://3a81fa59ea092344bfb7cb2ac2d8a4c32982eb072481ddb0f680efa150e282ac446a623ed3a3d90c4154408a3a0c77a9d0fd9f29f20bef7861081c294b715ec4@34.173.190.75:30303,enode://d863f9917f59202b46f3cacedfa8c1a3932e782940dbcc6da5692a183c678aef387bf360fbce8e3b4381923b83839ffbbe9762abe64818f762d03ecad6662a1c@34.30.123.17:30303,enode://c8f085360640c68e013a5a6ff6a1d03e5af57a2db599e862014b90439af4b09a3e28bfcc8bfe2082949a6a3f9bb1f5ec19526a4e25fb2e14b11d08a4a1e82eb4@35.224.11.87:30303
# Taiko protocol contract addresses
TAIKO_L1_ADDRESS=0x95fF8D3CE9dcB7455BEB7845143bEA84Fe5C4F6f
TAIKO_TOKEN_L1_ADDRESS=0x75F94f04d2144cB6056CCd0CFF1771573d838974
TAIKO_L2_ADDRESS=0x1000777700000000000000000000000000000001
# P2P
DISABLE_P2P_SYNC=false
############################### REQUIRED #####################################
# L1 Sepolia RPC endpoints (you will need an RPC provider such as Infura or Alchemy, or run a full Sepolia node yourself)
# If you are using a local Sepolia L1 node, you can refer to it as "http://host.docker.internal:8545" and "ws://host.docker.internal:8546", which refer to the default ports in the .env for an eth-docker L1 node.
# However, you may need to add this host to docker-compose.yml. If that does not work, you can try the private local ip address (e.g. http:/192.168.1.15:8545). You can find that with `ip addr show` or a similar command.
L1_ENDPOINT_HTTP= #BlockPiで取得したHTTPSのURL
L1_ENDPOINT_WS= #BlockPiで取得したWSSのURL
############################### OPTIONAL #####################################
# If you want to be a prover who generates and submits zero knowledge proofs of proposed L2 blocks, you need to change
# `ENABLE_PROVER` to true and set `L1_PROVER_PRIVATE_KEY`.
ENABLE_PROVER=true
# How many provers you want to run concurrently, note that each prover will cost ~8 cores / ~16 GB memory.
ZKEVM_CHAIN_INSTANCES_NUM=1
# A L1 account private key (with a balance of TTKOj deposited on TaikoL1) which will be used to sign the bond for proving the block.
# WARNING: only use a test account, pasting your private key in plain text here is not secure.
L1_PROVER_PRIVATE_KEY= #テストネット用ウォレットの秘密鍵(0xは消して)
# Gas limit for proveBlock transactions (in gas)
PROVE_BLOCK_TX_GAS_LIMIT=
# Minimum accepted fee for accepting proving a block (in wei)
MIN_ACCEPTABLE_PROOF_FEE=1
# If you want to be a proposer who proposes L2 execution engine's transactions in mempool to Taiko L1 protocol
# contract (be a "mining L2 node"), you need to change `ENABLE_PROPOSER` to true, then fill `L1_PROPOSER_PRIVATE_KEY`
# and `L2_SUGGESTED_FEE_RECIPIENT`
ENABLE_PROPOSER=true
# A L1 account (with balance) private key who will send TaikoL1.proposeBlock transactions
L1_PROPOSER_PRIVATE_KEY= #テストネット用ウォレットの秘密鍵(0xは消して)
# A L2 account address who will be the tx fee beneficiary of the L2 blocks that you proposed
L2_SUGGESTED_FEE_RECIPIENT= #テストネット用ウォレットアドレス
# Gas limit for proposeBlock transactions (in gas)
PROPOSE_BLOCK_TX_GAS_LIMIT=
# Maximum gas tip used for proposeBlock transactions (in wei)
PROPOSE_BLOCK_TX_GAS_TIP_CAP=10000000000
# Fee sent to prover for the off-chain bond (in wei)
BLOCK_PROPOSAL_FEE=1
# Comma-delineated list (no spaces) of prover endpoints proposer should query when attempting to propose a block
# If you keep this default value you must also enable a prover by setting ENABLE_PROVER=true
PROVER_ENDPOINTS=http://taiko-a6-prover.zkpool.io:9876
# Whether to prove unassigned blocks or not (blocks that have expired their proof window
# without the original prover submitting a proof.)
PROVE_UNASSIGNED_BLOCKS=false
# Comma-delimited local tx pool addresses you want to prioritize, useful to set your proposer to only propose blocks with your prover's transactions
TXPOOL_LOCALS=
# Timeout when waiting for a propose or prove block transaction receipt to be seen, in seconds
WAIT_RECEIPT_TIMEOUT=360
↑をコピペしたら[esc」キーを押して「:wq」と入力して上書き保存
ノードを開始する。
docker compose up -d
これでノードの構築は終了です。
ノードの動作確認
http://"VPSのIPアドレス":3001/d/L2ExecutionEngine/l2-execution-engine-overview
↑にアクセスしてダッシュボードを確認してください。(もし聞かれたら、初期ユーザ:admin 初期パス:admin)
下図のようにブロック高が上がっていけば構築成功です。
Propose/Proveの確認
simple-taiko-nodeのディレクトリで移動する。
cd simple-taiko-node
Proposeの確認
docker compose logs -f taiko_client_proposer | egrep "Propose transactions succeeded"
成功していれば下図のようなログが出ます。
ctrl+Cでキャンセルできます。
Proveの確認
docker compose logs -f taiko_client_prover_relayer | egrep "block proof was|proof submission error|Block proven"
成功していれば下図のようなログが出ます。
ctrl+Cでキャンセルできます。
ノードの終了
設定を変更したり等、ノード内で作業したときは再起動が必要となります。
一時停止
docker compose down
再度ノード開始
docker compose up -d
完全削除
docker compose down -v
rm -f .env
最後に
自分自身手探りの状態で構築に臨みましたが、なんとか構築することができました。
Taiko Alpha-5の情報がインターネット上にほとんどなかったため、構築したくてもできない人が結構いるだろうなと思い、コピペだけでできるようにこの記事を作ろうと考えました。私自身は非エンジニアなので、間違ってる部分も多々あるかと思います。もし間違いがあれば優しく指摘してやってくれると助かります。
久々すぎて読みずらい記事になったかもですが、活用していただければ幸いです。
ちょっと力尽きてしまった感があるので、よくXで見かけるやつ↓は、GitHubのリンクを貼っておくので、自力実装してみてください。