⛓️
Chainlink Nodes
Chainlink Nodeをローカル環境(Macbook Pro)で動かしてみた際のメモ。
Setup
基本的に公式サイトに従う。
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
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
-
setAuthorizedSenders
でsender
は複数指定可能。 -
setAuthorizedSenders
の実装的にOperator contractのOWNER field
にはcontractをデプロイするアカウントを入力するのがよさそう?
Add a job to the node
- job作成後、tomlを元にした
Task List
が表示される。
Create a request to your node
-
ATestnetConsumer
: 0xBd6D6C31798F5900c4DCfeC6FaBF86651E18e4Ce -
Fund the contract by sending LINK to the contract's address.
-
requestEthereumPrice function
実行後、Taskが処理開始。
-
また、そのあたりのタイミングでAlchemyのリクエストが急増。
config.toml
で設定したURLにちゃんとリクエストが飛んでいることがわかる。ただ、何がトリガーかはいまいち不明。
処理の流れは以下と推測される。
- [Consumer]
_jobId
をrequestに包含し、oracleAddress
にoperatorRequest
を送信。
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);
}
- [Operator]
oracleRequest
functionで、OracleRequest
eventをemit。
-
[Chainlink Network] Chainlink NodesがP2Pネットワーク内でevnetを監視し、対象のjobIdを持つNodeへ処理を投げる。
-
[Chainlink Node] Consumerの
requestEthereumPrice
のrequestで設定していたfulfill用のfunctionをNodeが実行し、Consumerコントラクトにオフチェーンの情報を保持する。(ちゃんとNode AddressからfulfillOracleRequest2
transactionが発生している。)
function fulfillEthereumPrice(
bytes32 _requestId,
uint256 _price
) public recordChainlinkFulfillment(_requestId) {
emit RequestEthereumPriceFulfilled(_requestId, _price);
currentPrice = _price;
}
Discussion