Chainlink Functions 분산화된 Oracle Network (DON)에서 계산을 실행하는 방법에 대해 알아보겠습니다. 예제 코드는 리스트 내 숫자들의 기하 평균을 계산합니다. OCR이 오프 체인 계산과 집계를 완료하면 결과를 스마트 컨트랙트로 반환합니다.
시작하기 전에
사전 준비
링크에 있는 내용을 해보고, 준비하셔야 지금 페이지의 내용을 따라 올 수 있습니다.
Chainlink Functions Starter Kit의 tutorials 브랜치로 깃 체크아웃해야합니다.
git checkout tutorials
이 튜토리얼은 /tutorials/1-simple-computation 디렉토리에 위치해 있습니다.
이 튜토리얼은 숫자 리스트에서 평균값(기하 평균)을 구성하기 위해 설정되었습니다. 코드 예제의 설명을 자세히 알아보려면 설명 섹션을 읽어보세요.
config.js 파일을 열어보세요. args 값이 ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]로 설정되어 있으므로 소스 코드는 "1,2,3,4,5,6,7,8,9,10"의 평균(기하 평균)을 계산합니다. 다른 집합의 평균을 계산하려면 args 값을 변경할 수 있습니다. 요청 구성 파일에 대한 자세한 정보는 explanation의 config.js를 읽어보세요.
source.js 파일을 열어 JavaScript 소스 코드를 분석하세요. 설명파트의 source.js를 읽으면 소스 코드에 대한 더 자세한 설명을 볼 수 있습니다.
Chainlink Functions Hardhat Starter Kit에는 로컬 컴퓨터에서 Functions 코드를 테스트할 수 있는 시뮬레이터가 포함되어 있습니다. functions-simulate 명령을 사용하여 코드를 로컬 런타임 환경에서 실행하고, 엔드 투 엔드 이행을 시뮬레이션하여 Functions을 분산화된 Oracle Network에 제출하기 전에 문제를 해결할 수 있습니다.
functions-simulate 작업을 실행하여 소스 코드를 로컬에서 실행하고, config.js와 source.js가 올바르게 작성되었는지 확인하세요.
npx hardhat functions-simulate --configpath REPLACE_CONFIG_PATH
example
$ npx hardhat functions-simulate --configpath tutorials/1-simple-computation/config.js
secp256k1 unavailable, reverting to browser version
__Compiling Contracts__
Nothing to compile
Duplicate definition of Transfer (Transfer(address,address,uint256,bytes), Transfer(address,address,uint256))
Executing JavaScript request source code locally...
__Console log messages from sandboxed code__
calculate geometric mean of 1,2,3,4,5,6,7,8,9,10
geometric mean is: 4.53
__Output from sandboxed source code__
Output represented as a hex string: 0x00000000000000000000000000000000000000000000000000000000000001c5
Decoded as a uint256: 453
__Simulated On-Chain Response__
Response returned to client contract represented as a hex string: 0x00000000000000000000000000000000000000000000000000000000000001c5
Decoded as a uint256: 453
Gas used by sendRequest: 351895
Gas used by client callback function: 75017
위의 예제 출력을 읽으면 기하 평균이 올바르게 계산되었음을 알 수 있습니다: 4.53입니다. Solidity는 소수를 지원하지 않기 때문에 반환하는 bytes 인코딩된 값 0x00000000000000000000000000000000000000000000000000000000000001c5를 콜백에서 반환하기 전에 소수점을 이동하여 값이 정수 453처럼 보이도록 합니다.
참고: 자세한 설명을 보면 source.js 코드 설명을 읽으세요.
분산화된 Oracle Network에 평균(기하 평균)을 계산하는 요청을 보내세요. functions-request 작업을 subid(구독 ID)와 계약 매개변수와 함께 실행하세요. 이 작업은 Functions JavaScript 소스 코드와 인수 및 비밀값을 FunctionsConsumer의 executeRequest 함수를 호출할 때 전달합니다. 소비자(contract) 계약에 대한 자세한 내용은 functionsConsumer.sol 섹션을 읽어보세요.
npx hardhat functions-request --subid REPLACE_SUBSCRIPTION_ID --contract REPLACE_CONSUMER_CONTRACT_ADDRESS --network REPLACE_NETWORK --configpath REPLACE_CONFIG_PATH
Chainlink Functions 소비자(contract) 계약을 작성하려면 계약에서 FunctionsClient.sol을 가져와야 합니다.
import {Functions, FunctionsClient} from "./dev/functions/FunctionsClient.sol";
Chainlink Functions 요청을 구축하는 데 필요한 모든 함수를 얻기 위해 Functions.sol 라이브러리를 사용하세요. API 참조: Functions를 읽을 수 있습니다.
using Functions for Functions.Request;
최신 요청 ID, 최신 수신 응답 및 최신 수신 오류(있는 경우)는 상태 변수로 정의됩니다. latestResponse 및 latestError는 동적 크기의 byte 배열인 bytes로 인코딩되므로 응답이나 오류를 읽기 위해 여전히 디코딩해야 합니다:
bytes32 public latestRequestId;
bytes public latestResponse;
bytes public latestError;
콜백 중에 스마트 계약에서 발생시킬 OCRResponse 이벤트를 정의합니다.
event OCRResponse(bytes32 indexed requestId, bytes result, bytes err);
계약을 배포할 때 네트워크에 대한 오라클 주소를 전달합니다:
constructor(address oracle) FunctionsClient(oracle)
원하는 경우 updateOracleAddress 함수를 호출하여 오라클 주소를 변경할 수 있습니다.
남은 두 가지 함수는 다음과 같습니다:
Functions 라이브러리를 사용하여 요청을 초기화하고 전달된 암호화된 비밀값이나 인수를 추가합니다. 요청 초기화, 비밀값 추가, 인수 추가에 대한 API 참조를 읽을 수 있습니다.
Functions.Request memory req;
req.initializeRequest(Functions.Location.Inline, Functions.CodeLanguage.JavaScript, source);
if (secrets.length > 0) {
req.addRemoteSecrets(secrets);
}
if (args.length > 0) req.addArgs(args);
FunctionsClient의 sendRequest 함수를 호출하여 오라클에 요청을 전송합니다. 요청을 보낼 때의 API 참조를 읽을 수 있습니다. 마지막으로, 요청 ID를 latestRequestId에 저장합니다.
bytes32 assignedReqID = sendRequest(req, subscriptionId, gasLimit);
latestRequestId = assignedReqID;
latestResponse = response;
latestError = err;
emit OCRResponse(requestId, response, err);
각 설정에 대한 자세한 설명은 요청 구성 섹션을 참조하세요. 이 예제에서 다음과 같은 설정이 사용됩니다:
자바스크립트 소스 코드 섹션을 자세히 읽어보면 호환 가능한 자바스크립트 소스 코드 작성 방법에 대한 설명이 나와 있습니다. 코드는 자체적으로 설명되어 있으며 주석을 통해 모든 단계를 이해하는 데 도움이 됩니다. 주요 단계는 다음과 같습니다:
https://docs.chain.link/chainlink-functions/tutorials/simple-computation