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アドレスとパスワードが聞かれます。

いいなと思ったら応援しよう!