본문 바로가기
블록체인

Chainlink API

by 맑은청이 2021. 5. 23.
728x90
반응형

오늘 학습해 볼 내용은 아래와 같다. 

1. SC(스마트 계약) 에서 API로 부터 데이터를 요청하는 법

2. 코어 어댑터(Core Adapters)와 외부 어댑터(External Adapters)의 이해와 오라클이 이를 활용하는 법 

3. 계약에 대한 오라클 작업과 어댑터 

4. 오라클에서 데이터를 요청하는 법 

 


1. SC(스마트 계약) 에서 API로 부터 데이터를 요청하는 법

기본적인 송신(Request) 모델은 다음과 같다.

ChainlinkClient 는 SC가 오라클로 부터 데이터를 사용할 수 있게 하는 상위 컨트랜트다. 

client 생성자는 LINK 토큰을 이용해서 구현된 transferAndCall이라는 함수를 통해서 Chainlink 오라클에 요청을 한다. 

이 요청에는 인코딩된 정보가 들어있다. 

 

LINK 토큰

LINK는 수신 과정을 트리거하면서 토큰을 전송하는 기능인 transferAndCall을 구현 

 

API 데이터 요청 방법

일반적으로 이행 함수(fulfillment function)을 통해 오라클은 어디서 어디로 송신해야할지 알고 있다. 하지만 API call 같은 경우에는 계약에 정의(define)을 해주어야한다. 

그전에 온체인 데이터를 가져오는 오라클의 동작에 대해 이해해야한다. 

 

- Initiators

Initiators 는 Oracle 내부에서 동작한다. 송수신 동장에서 RunLog Initiators 가 SC가 송신을 만들때 블록체인을 관찰한다. 송신을 확인하면 작업을 시작한다. 작업이 시작될 수 있게 어댑터(코어 및 외부 모두)가 실행되고 송신에 대한 수신이 반환된다.  

 

 

-Runlog

가장 간단한 Initiator 로 RunLog 가 만들어지면 Chainlink는 job's ID 를 포함한 log event를 블록체인에 보고한다. 이 벤트가 Chiainlink 오라클 계약의 로그 이벤트와 시그니처가 일치하면 체인링크 노드는 해당 로그에서 데이터를 구문 분석해서 새 로그 run 으로 전달한다. 새로운 Runlog 로 생성된 새로운 run은 자동적으로 이벤트 로그를 생성한 계약에 실행 보고를 하는 매개변수가 자동으로 제공된다.

 

코어 어댑어

각 오라클 동작은 실행 시 수행해야하는 일련의 동작이 있는데 이런 동작은 어댑터에 의해 정의된다. 

 

예) API에 GET request를 날릴려면 JSON response 에서 특정정수필드를 찾고 후에 request contract를 재제출해야하는데 코어 어댑터에 따르면 아래와 같은 동작이 필요하다. \

 

HttpGet - API 호출

JsonParse - 데이터를 얻기 위해 Json parse

EthUint256 - 데이터를 이더리움 호환 데이터 유형인 uint256으로 변환

EthTx - 거래를 체인에 제출하여 사이클 완료 

 

 

1) HttpGet API를 호출하고 ETH/USD 쌍에 대한 결과 반환

2) JsonParse 지정된 패스("RAW.ETH.USD.VOLUME24HOUR") 에서 해당 결과를 찾은 값을 반환(예:703946.0675653099)

 

3) 입력을 부동 소수점으로 분석하고 형식에 맞는 정수로 만들기 위해 10^18 곱함

 

4) EthUint256 는 입력을 정수로 포맷한 다음 솔리디티의 uint256포맷으로 변환 

 

5) EthTx-  입력을 받고 데이터 필드에 배치 후 트랜잭션에 서명 후 데트워크에 브로드 케스트

 

계약 예시

 

생성자는 오라클이 작업에 대해 필요한 오라클 주소, 작업 ID 및 LINK 수수료로 계약을 설정합니다.

LINK가 필요한 이유는 contract를 calling 하기 위해서는 LINK 를 통해 수수료를 부과해야하기 때문이다. 

 

    function requestVolumeData() public returns (bytes32 requestId) 
    {
        Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
        
        // Set the URL to perform the GET request on
        request.add("get", "https://min-api.cryptocompare.com/data/pricemultifull?fsyms=ETH&tsyms=USD");
        
        // Set the path to find the desired data in the API response, where the response format is:
        request.add("path", "RAW.ETH.USD.VOLUME24HOUR");
        
        // Multiply the result by 1000000000000000000 to remove decimals
        int timesAmount = 10**18;
        request.addInt("times", timesAmount);
        
        // Sends the request
        return sendChainlinkRequestTo(oracle, request, fee);
    }

다음 requestVolumeData는 여러 매개변수를 오라클에게 보낸다. 어댑터는 이러한 정보를 읽어 작업을 수행한다. 

 

마지막으로 이행함수는 오라클 작업이 완료되면 결과를 보낸다. 

728x90
반응형