FlowのAccess Nodeを構築してみよう(後編)

Takashi Tahara (田原 崇)
20 min readSep 7, 2023

--

※※※※※Advertisement|広告※※※※※

書籍、SvelteとGraphQLでブロックチェーンゲームを作る!が好評発売中です。(URLは以下)

※※※※最新フレームワークでBlockchainアプリ開発ならこの一冊!※※※

前回の記事はこちらにあります。

水曜日の20:00 UTC(日本時間で木曜日の朝5時)に登録しておいたノードIDがAccess Nodeに選ばれるかがランダムで決まります。

その為、水曜日までに前もってノードを動かして、選ばれた時に即座に動かせるように準備しておいた方がいいかも知れません。

ちなみにAccess Node以外のNodeはExecution, Validation, Collection, Consensus全て運用チームの許可が必要です。その為Access Nodeは2023年2月からPermissionlessだとされています。他のノードも順次Permissionlessになっていく、とYoutubeの中で話されています。これら以外にObserver Nodeというのがあるのですが、このノードはステーキングが必要なく、その代わり任意のAccess Nodeに対してトランザクションを発行する事ができます。立ち位置的には微妙ですが、昨今のWeb3推進の政策が敷かれている日本ではこのObserver Nodeでも金融庁の許可が得られるかも知れません。ただ、外国のノードに対してトランザクションを発行して取引所を開設するのはやはり認可はおりづらいでしょうから、やはり一台は日本の中にAccess Node開設が必要、と考えられます。

通常、ブロックチェーンのフルノードはAPIを開放して他の取引所がそれを利用する形で運用しますので(ノード運用はコストが高いので自社で運用すると高くつきます)、Observer Nodeを運用するだけでそのAPIの代わりを用意してくれるのであれば、かなりdApps運用サイドとしてはありがたいですよね?Access Nodeに繋げば自由にトランザクションを発行できるのですから。Public Access NodeはRate Limitもありますし。

前置きが長くなりましたので早速ノードを実際に動かしていきます。

  1. まず、Node IDを発行します。

⇧ここにあるコードをコピーし、Terminal上で実行します。

curl -sL -O storage.googleapis.com/flow-genesis-bootstrap/boot-tools.tar
tar -xvf boot-tools.tar

すると、boot-tools boot-tools.tarの2つのフォルダとファイルが作成されます。

次に先ほどのページから以下のコードをコピーし、Terminalで実行するのですが、

#########################################################
# Generate Keys
$ mkdir ./bootstrap
# YOUR_NODE_ADDRESS: FQDN associated to your instance
$ ./boot-tools/bootstrapcmd key --address "<YOUR_NODE_ADDRESS_GOES_HERE>:3569" --role access -o ./bootstrap

ここでipv4アドレスかDNSアドレスが必要になります。ipv4アドレスは最近枯渇が激しいのですが、作成する必要があります。

では、EC2を作成します。

インスタンスはm6i.xlargeを選びます。m6iのiはIntelのiなのでArchitectureは64-bit(x86)である必要があります。

Amazon EC2 M6i インスタンスは、第 3 世代のインテル Xeon スケーラブルプロセッサ (Ice Lake) を搭載しています。このファミリーは、バランスの取れたコンピューティング、メモリ、およびネットワークのリソースを提供し、多くのアプリケーションに適しています。(引用元)

Discは750GB必要です。Access Nodeを運用してAPIを販売するなどを考える場合はSSD(gp3)を選ぶのか分かりませんが、SSD(gp3)を選びました。

一月の請求が1万円を超えるのでとりあえず、Sizeを10として私は作成しました。。

Launchボタンを押してインスタンスの情報を調べるとAuto-assigned IP addressとPublic IPv4 DNSがセットされているのでこれを使えるのではないかと思います。(Launchが死ぬほど早かったです。最近はすごく利便性やUXが良い。接続も右上のConnectから簡単に行えます。)

EC2 インスタンスLaunch後
#########################################################
# Generate Keys
$ mkdir ./bootstrap
# YOUR_NODE_ADDRESS: FQDN associated to your instance
$ ./boot-tools/bootstrapcmd key --address "ec2-18-176-215-185.ap-northeast-1.compute.amazonaws.com:3569" --role access -o ./bootstrap

⇧をターミナルで実行してみます。

出来ました! というかCloudSellが簡単に起動できるのが死ぬほどありがたいです。

tree ./bootstrap/

コマンドを実行してみます。(AMIにはtreeがインストールされていませんので、sudo dnf install treeコマンドでtreeをインストールしておきます)

Treeコマンド実行後

Youtubeの説明では青枠にPrivate Keyが, 赤枠にPublic Keyが含まれているようです。(9:00~頃からNode開発責任者のVishalさんが説明されています)

Node IDを知るには以下のコマンドを叩きます。

cat ./bootstrap/public-root-information/node-id

2. Access Nodeを試しに実行する

次にFLOWをステークしNode IDを登録することになるのですが、その前にちょっとAccess Nodeの起動に必要な情報が揃ったので、実際に動くかどうか確認してみます。(コマンドの詳細は前半の記事を見てください)

sudo docker run --rm \
-v $PWD/bootstrap:/bootstrap:ro \
-v $PWD/data:/data:rw \
--name flow-go \
--network host \
gcr.io/flow-container-registry/access:v0.29.8 \
--nodeid=75f84c62148ccb4f11bb540d72cd85a5927dbf74f70831b275f2f82cacd6c9c6 \
--bootstrapdir=/bootstrap \
--datadir=/data/protocol \
--secretsdir=/data/secrets \
--rpc-addr=0.0.0.0:9000 \
--http-addr=0.0.0.0:8000 \
--rest-addr=0.0.0.0:80 \
--rpc-metrics-enabled=true \
--bind 0.0.0.0:3569 \
--dynamic-startup-access-address=secure.mainnet.nodes.onflow.org:9001 \
--dynamic-startup-access-publickey=28a0d9edd0de3f15866dfe4aea1560c4504fe313fc6ca3f63a63e4f98d0e295144692a58ebe7f7894349198613f65b2d960abf99ec2625e247b1c78ba5bf2eae \
--dynamic-startup-epoch-phase=EpochPhaseStaking \
--loglevel=error

まず、AMIにdockerをインストールします。

私の環境はAmazon Linux 2023という環境であり、dockerのインストールにamazon-linux-extrasが使えなくなっています。その為、以下のサイトを参考にしてAmazon Linux 2023にDockerをインストールします。

$ sudo dnf list | grep docker  (Dockerパッケージを見つけます)
docker.x86_64が見つかります。
sudo dnf update //To Install Latest Update
sudo dnf install -y docker // Install Docker
Dockerのインストールが完了しました

最後にDockerを起動します。以下のコマンドを叩きます。

sudo systemctl start docker.service // To start Docker Service
sudo systemctl enable docker // To Automatically start Docker on Reboot

sudo systemctl status docker (Dockerのステータスを確認します)
runningと表示されDockerが起動しています

Dockerの起動が完了したら、先ほどのdocker runコマンドを実行します。もしImageがTerminalに存在しなければ自動でImageをgcrからpullしてくれます。

一つ注意することとしてはdockerコマンドを実行するときは、全てsudoで実行する必要があります。(つけないとpermissionエラーになります)

Access Nodeのdocker runコマンドを実行

Imageが見つからないのでpullを実行していますね。

sudo docker imagesでImageがダウンロードされてるのは確認出来ますが

sudo docker psでContainerが見つからないので起動に失敗しています。

やはりステーキングしていないから? 標準出力の最後の2行を確認してみます。

{"level":"info","node_role":"access","node_id":"75f84c62148ccb4f11bb540d72cd85a5927dbf74f70831b275f2f82cacd6c9c6","time":"2023-09-06T05:02:10.081476595Z",
  "message":"flow access node starting up"}
{"level":"fatal","node_role":"access","node_id":"75f84c62148ccb4f11bb540d72cd85a5927dbf74f70831b275f2f82cacd6c9c6",
  "error":"could not bootstrap protocol state: bootstrapping failed: could not
bootstrap sealing chain segment blocks: could not insert root block: could not
store payload: invalid payload referencing unknown execution result
aab975cac464249c04cc3b18da82c7333bade360e191c3ed149f6b8d137da045, err: could
not retrieve resource: key not found","time":"2023-09-06T05:02:19.658691873Z"}

unknown execution result aab975cac464249c04cc3b18da82c7333bade360e191c3ed149f6b8d137da045

が気になりますね。ステーキングしてNode IDが選出されるのを待つしかないのかも知れません。。

3. Node IDを登録する為にFLOWをステークする

https://port.onflow.org/ にアクセスし、Stake & Delegateをクリックします。すると、Staking Collection Upgradeという画面が私の環境では出ましたのでUpgrade Accountをクリックしました。

左のStart Stakingをクリックします。

Accessをクリックして次へ進みます。

次へを押します。

この時に必要なFLOW(100.01)を持っている必要があります

登録するノードの詳細情報を入力します。

ノードの詳細情報は以下のコマンドを入力すると取得できます。

cat ./bootstrap/public-root-information/node-info.pub.75f84c62148ccb4f11bb540d72cd85a5927dbf74f70831b275f2f82cacd6c9c6.json
Network Address, Node ID, Networking Keyなどが取得できる

Continueを押します。

(この辺りはホントUXが良いですよね。FlowのCTOは2010年頃AppleでKeyNoteを作っていたので、私自身あの頃のMacのソフトウェアでKeyNoteが一番好きだったのですが、何かしたいと思うことが一瞬でできるように工夫されているといつも思います)

確認画面が表示されます。チェックボックスにチェックを入れ、Submitを押すと完成です。(ここに手順が書かれてあります。)

トランザクションが完了すると、以下のように表示されます。

下のAccess Nodeと書かれているところに表示されているのはNode IDですね。1週間でAccess Nodeに新しく(ランダムに)選ばれるのは5つまでなので、結構ブームになると選出率に厳しいものがあり、今のうちに登録しておいた方が良いと思います。まぁ(ノード運営の)お金もそこまでかかりませんし、早い者勝ちですね。

4. Node IDがスロットに選出されるまでに下準備をしておく

Node IDがスロットに選出されるか分かるのは毎週木曜日の早朝です。その為、それまではNode IDが選出されずAccess Nodeを起動することが出来ないのでポートの解放などの準備を行います。

sudo docker run -itd -p80:80 -p443:443 --rm --name mynginx nginx

ポート解放チェックを行う為にNginxを起動します。(Imageがターミナルに無ければpullが同時に実行されます)

docker psを実行してコンテナの80ポートがホストの80ポートに繋がっていることを確認

起動中のEC2インスタンスをAWSコンソールで表示し、Security Groupsをクリック

表示された画面で右下のEdit inbound rulesをクリック

EC2インスタンスをLaunchした時点ではSSH(22)しかポートが空いていませんのでここにhttpとhttpsのポートを追加していきます。

次にアクセスコントロールリストを編集します。

起動中のEC2インスタンスをAWSコンソールで表示し、Subnet IDをクリック

表示されたSubnet List画面で表示されているSubnetを選択し、下に表示されるNetwork ACLをクリック

表示された画面で表示されているACLを選択し、下のInbound rulesをクリック、Edit inbound rulesをクリック。

HTTPとHTTPSを許可するようにルールを設定しSave changesをクリック(※1)

次にOutbound rulesタブをクリックし、Edit outbound rulesをクリック

TypeにCustom TCPを選択し、Port rangeに1024-65535をセットし、Save changesをクリック(※1)

SSL Certificateが無いのでhttpでしかアクセスできませんが、これでNginxにアクセスが出来ます。

httpでならNginxにブラウザからアクセスが出来る

次にAccess Nodeに必要となるTCP/3569ポートとTCP/9000ポートを同様に開放します。(※1)(80ポートと443ポートは閉じた方がいいですが、実際にAccess Nodeを起動する時までは開いておこうと思います。)

その他のAccess Node運営に必要な要件に関してはこちらをチェックしてください。

これでAccess Node起動の準備はできました! あとはNode IDがスロットに選出されるまで来週の木曜日を待ちましょう! ! 🥳

(※1) すみません、ACL設定のところで一つ誤りがあります。

nginxサーバーは手元のPCからEC2内にアクセスしますが

Access NodeはEC2内からインターネットのノードにアクセスします。

ACLのinboundとoutboundで解放すべきポートが逆になります。Security Groupはそのままで大丈夫ですので、ACLのinboundとoutboundのポートだけ全解放(1–65535)してdockerコマンドを実行しないと、到達不能エラーが起きます。

ブロックチェーンゲーム制作に欠かせないリファレンス本が出版されています。

変数の型、Struct、配列、リソースなど全てのオブジェクトのメソッドを網羅しています。GraphQLを使用してブロックチェーンとの通信をするdApp開発の内容を収録しています。

このリファレンスを用いて開発されたブロックチェーンゲームはこちら(*•̀ᴗ•́*)و ̑̑

このゲーム、なんと全てのロジックがブロックチェーン上で動いているんです。

対戦カードゲームですが、全部スマートコントラクトを介して処理されているんですよ。

スマートコントラクトの全長は2450行にも及びます。

※ゲーム自体のソースコードはこちら -> https://github.com/temt-ceo/CODE-of-flow

Flutterアプリ内でブロックチェーンのウォレットを呼び出す方法や、iPhone/Androidアプリ内からトランザクションを発行する手段サーバーサイドからトランザクションを発行する方法などをまとめています。

Jacob君の許可を頂いて、Jacob君の動画のエッセンスを詰め込んだリファレンス本がなんとたったの3,000円(税抜)

--

--

Takashi Tahara (田原 崇)

Programmer, Blockchain engineer, AI Engineer, and Front-end Engineer ( I have several certifications of Cisco, IBM, AWS, Google Cloud, C++, Go, Rust and more.)