⛓️

Chainlink Nodes

2024/05/10に公開

Chainlink Nodeをローカル環境(Macbook Pro)で動かしてみた際のメモ。

Setup

基本的に公式サイトに従う。
https://docs.chain.link/chainlink-nodes/v1/running-a-chainlink-node

Notes

  • .api fileに記述するメールアドレスとパスワードがChainlink Node (Chainlink node's UI interfaceも)のAdminアカウントとなる。
    • 作成しない場合、5. Start the Chainlink Node by running the Docker image.docker run実行時にEnter API Email:Enter API Password:が表示される。
    • なので、.api fileを作成しておいた方が無難かも。
  • Configure users and rolesでadmin以外のユーザを作ってもいい。

Chainlink node's UI interfaceに接続

  • .api fileに記述したメールアドレスとパスワードでログイン。
  • ログイン後

Tutorial

試しに、Fulfilling Requestsをやってみた。

Deploy your own Operator contract

  • Operator: 0xa154e9Ce8bE9Cfe8543e31232eB820da54E7A50b
  • Operator contractのOWNER fieldに入力するAdmin wallet addressに、ユーザがChainlinkを使った際のコストがLINKトークンとして支払われるっぽい。
    • Node addressを指定してはダメ。次のsender指定時に実行時エラーとなってしまう。

Whitelist your node address in the Operator contract

  • setAuthorizedSenderssenderは複数指定可能。
  • setAuthorizedSendersの実装的にOperator contractのOWNER fieldにはcontractをデプロイするアカウントを入力するのがよさそう?

https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/operatorforwarder/AuthorizedReceiver.sol#L15
https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/operatorforwarder/AuthorizedReceiver.sol#L60-L65
https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/operatorforwarder/Operator.sol#L450-L454

Add a job to the node

  • job作成後、tomlを元にしたTask Listが表示される。

Create a request to your node

処理の流れは以下と推測される。

  1. [Consumer] _jobIdをrequestに包含し、oracleAddressoperatorRequestを送信。
ATestConsumer.sol
    function requestEthereumPrice(
        address _oracle,
        string memory _jobId
    ) public onlyOwner {
        Chainlink.Request memory req = _buildChainlinkRequest(
            stringToBytes32(_jobId),
            address(this),
            this.fulfillEthereumPrice.selector
        );
        req._add(
            "get",
            "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD"
        );
        req._add("path", "USD");
        req._addInt("times", 100);
        _sendChainlinkRequestTo(_oracle, req, ORACLE_PAYMENT);
    }

https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/ChainlinkClient.sol#L144

https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/ChainlinkClient.sol#L173

  1. [Operator] oracleRequest functionで、OracleRequest eventをemit。

https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/operatorforwarder/Operator.sol#L85-L104

  1. [Chainlink Network] Chainlink NodesがP2Pネットワーク内でevnetを監視し、対象のjobIdを持つNodeへ処理を投げる。

  2. [Chainlink Node] ConsumerのrequestEthereumPriceのrequestで設定していたfulfill用のfunctionをNodeが実行し、Consumerコントラクトにオフチェーンの情報を保持する。(ちゃんとNode AddressからfulfillOracleRequest2transactionが発生している。)

    function fulfillEthereumPrice(
        bytes32 _requestId,
        uint256 _price
    ) public recordChainlinkFulfillment(_requestId) {
        emit RequestEthereumPriceFulfilled(_requestId, _price);
        currentPrice = _price;
    }

Reference

Discussion