chainlinkのオラクルノードを建てる
※筆者の理解が記述されていますので、間違った情報が含まれるかもしれません。取り扱いにはご注意ください。
オラクルノードの概要
基本的にはブロックチェーンは、ブロックチェーン外の情報を取得できない。
それをできるようにしようというのがオラクルという仕組みだったりオラクルという言葉の意味。
オラクルノードというのは、ブロックチェーン業界で言われるイーサリアムノードなど直接ブロックチェーンを構築しているノードとは異なり、ブロックチェーン外で動作するノードのことを言う。
つまり、オラクルノードは誤解を恐れずに言うと、リクエストが来たらそれを処理してレスポンスを返す、WEBサーバだと思ってしまって良いと思う。
今回はそのオラクルノードを建てる。
では、そのただのWEBサーバであるオラクルノードがどのようにブロックチェーンと連携するのか。
ブロックチェーン上にはオラクルコントラクトがデプロイされており、オラクルコントラクトがオラクルノードへのリクエストを投げることになる。
オラクルノードはブロックチェーンのRPCエンドポイントを介して、ブロックチェーンに流れてくるリクエストを監視し、対象のリクエストがあればそれを処理して、処理結果をまたRPCエンドポイントを介してブロックチェーン上に投げる(オラクルノードへ返す)ということをやっている。
ここで再度意識しておきたいのが、オラクルノードはブロックチェーンには存在しないこと。なので、我々がブラウザやターミナルやpythonコードからRPCエンドポイントを介してブロックチェーンにアクセスするのと同様の方法で、ブロックチェーンを定期的に監視している。決して、オラクルコントラクトのリクエストが能動的にオラクルノードに到達するのではなく、ブロックチェーン上に刻まれたリクエストをオラクルノードが取りに来る、というイメージ。オラクルノードが定期的に指定されたコントラクトアドレス(オラクルコントラクトのアドレス)とジョブID(リクエストに含まれているはずのジョブのID)をフィルターとして、ブロックチェーンを監視している。
オラクルノードはリクエストを処理すると結果をRPCエンドポイントを介してオラクルコントラクトに返す。
このとき、オラクルコントラクトは設定されたオラクルノードからの操作しか受け付けないようになっている(オラクルノードがオラクルコントラクトに登録されているかの確認が入る)。
つまり、オラクルノードには所謂ウォレットアドレスが設定されており、このウォレットアドレスをオラクルコントラクトに事前登録しておく必要がある。
あとは、オラクルコントラクトのメソッドをいかに実行するかという話になってくる。pythonコードからオラクルコントラクトのメソッドを呼び出しても良いだろうし、その他のコントラクト(コンシューマーコントラクト)をブロックチェーン上にデプロイして、コンシューマーコントラクトからオラクルコントラクトを呼ぶのも良い。
これでようやく、(コンシューマーコントラクト)→オラクルコントラクト→オラクルノード→オラクルノードがブロックチェーン外の情報を取ってくる→オラクルコントラクトに返す→ブロックチェーン上に情報が刻まれる。
という流れができて、ブロックチェーン上にブロックチェーン外の情報を書き込むことができる。
ノードを建てる手順
参考URLは以下。基本的にこの手順をなぞっただけです。
Dockerをインストール
sudo apt update
sudo apt install docker.io
Dockerがインストールされたかを確認
docker --version
#実行結果
Docker version 26.1.3, build 26.1.3-0ubuntu1~24.04.1
Dockerのコンテナ内でPostgreSQLを動作させる
docker run --name cl-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres
#実行結果
assword -p 5432:5432 -d postgres
Unable to find image 'postgres:latest' locally
latest: Pulling from library/postgres
af302e5c37e9: Pull complete
23db180a1f67: Pull complete
dc59dd9c8eb3: Pull complete
aec09e638045: Pull complete
4dd47a683737: Pull complete
7cebbe7849b3: Pull complete
dc4330b02129: Pull complete
498cc40b9fe9: Pull complete
6d3411bb4696: Pull complete
8f14f34d54d3: Pull complete
88d4f7416643: Pull complete
e91ad5cfb8d0: Pull complete
e0c4d5055fb9: Pull complete
254ee626d709: Pull complete
Digest: sha256:87ec5e0a167dc7d4831729f9e1d2ee7b8597dcc49ccd9e43cc5f89e808d2adae
Status: Downloaded newer image for postgres:latest
854d2334bcba33d1e95b990515e1deee9c3f655d6f033b4a93dcce2e565f70e6
PostgreSQLのコンテナが動いていることを確認
docker ps -a -f name=cl-postgres
#実行結果
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
854d2334bcba postgres "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp cl-postgres
configファイルの作成
#設定ファイル保存用ディレクトリを作成
mkdir sepolia
#configファイルを作成(./sepoliaに保存)
echo "[Log]
Level = 'warn'
[WebServer]
AllowOrigins = '\*'
SecureCookies = false
[WebServer.TLS]
HTTPSPort = 0
[[EVM]]
ChainID = '11155111'
[[EVM.Nodes]]
Name = 'Sepolia'
WSURL = 'wss://CHANGE_ME'
HTTPURL = 'https://CHANGE_ME'
" > ./sepolia/config.toml
secretsファイルの作成
echo "[Password]
Keystore = 'mysecretkeystorepassword'
[Database]
URL = 'postgresql://postgres:mysecretpassword@host.docker.internal:5432/postgres?sslmode=disable'
" > ./sepolia/secrets.toml
chainlinkコンテナの起動
#ディレクトリ移動
cd sepolia
#chainlinkコンテナ起動
sudo docker run --platform linux/x86_64/v8 --name chainlink -v ./:/chainlink -it -p 6688:6688 --add-host=host.docker.internal:host-gateway smartcontract/chainlink:2.20.0 node -config /chainlink/config.toml -secrets /chainlink/secrets.toml start
起動当初、e-mailアドレス、パスワードを設定させられます。
これはブラウザからchainlinkノードにアクセスするために使用します。
chainlinkノードが起動しているかの確認
#コンテナが動いているか確認
sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
59e35d728f82 smartcontract/chainlink:2.20.0 "chainlink node -con…" 10 minutes ago Up 10 minutes (healthy) 0.0.0.0:6688->6688/tcp, :::6688->6688/tcp chainlink
854d2334bcba postgres "docker-entrypoint.s…" 7 hours ago Up 7 hours 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp cl-postgres
ブラウザからchainlinkノードにアクセスできるか確認
http://localhost:6688/
※ここで設定したe-mailアドレスとパスワードが聞かれます。
