Introduction to Chainlink Trust Minimized Services

드림보이즈·2023년 6월 10일

이번 영상에서는 체인링크의 핵심 기술 서비스에 대해 배운다. 집중해야 한다.
실제로 프로젝트에 적용해야 할 기술이기 때문이다.

(data feed를 위한 빌드업)

체인링크는 Oracle Problem을 해결하기 위해 탄생한 것이다.
스마트 컨트랙트가 작성되어 블록체인 네트워크에 올라가면, 외부 시스템을 읽어올 수 없다.
예를 들어, 축구 승부예측 컨트랙트를 올리면 경기 결과가 미래에 어떻게 나올지, 그걸 신뢰할 수 있을지 어떻게 아는가?

(VRF를 위한 빌드업)

랜덤 함수를 구현할 수 있을까? 노드마다 랜덤 값이 다를텐데?
API도 마찬가지다. 같은 API라도 시간마다 결과가 다를 수 있기 때문에,
블록체인이 외부 데이터를 지 혼자서 못 받아 오는 것이다.


외부 데이터를 블록체인으로 전송하기 위해 Centralized node를 만들었다.
어떤 문제가 있을까?


1개기 때문에 얘를 누군가 해킹한다면, 블록체인 네트워크 전체가 ㅈ될 수 있겠지.
single-point Failure 문제가 발생한다. (누가 몰라?)

그래서 DON을 제시한다.
하나가 아닌 여러 노드가 각각 데이터를 받아서, 지들끼리 합의를 하고 그 값을 블록체인 네트워크에 보내는 것이다.
여기서 합의는 블록체인 합의 알고리즘처럼 독립적이지만 신뢰 필요없는 과정으로 이루어진단다.

QnA

Q, DOS에서 각각이 다른 데이터를 생산하나?
A. 그럴 때도 있고, 아닐 때도 있다. 각각이 다른 조직이면 다른 결과를 낼 수도 있을거고, 그럴경우 모아서 평균이나 등 방법 사용해서 final report 만들어서 블록체인으로 보냄

Q. 해킹, 공격 당한 적 있음?
A. 단 한 번도 없음

결국 체인링크의 핵심 서비스 기술 3가지

  • 외부에서 데이터 받아오기 (Data feed)
  • 계산 (VRF + Automation)

인 것이다. 이제 각각이 무엇이고 실습은 어떻게 하는지 알아보자.


1. Data Feed / Functions


위에서 설명했던 DON을 더 디테일하게 설명해줬다.
체인링크가 혼자 다 하는게 아니고 여러 data provider들이 존재했다.

실제 과정을 UI로 볼 수 있다.
예시로 ETH/USD 비율을 각 data provider들이 얼마로 측정하는지 보여주고, 왼편에 합의된 가격이 보인다.
heartbeat는 update하는 시간이라고 보면 된다.
0초가 되면 다시 계산을 해서 값이 update 되겠지.

이런 서비스들을 사용할 때 쓰인다고 한다.
대출에서 당연히 데이터의 정확성이 매우 중요할 것이고,
mirror asset은 현실 자산을 온체인으로 데이터를 옮기는 것이니, 당연히 중요할 것이다.
이거 참고해서 아이디어 낼 때 참고하면 좋을 것 같다.

실습 타임이다. 최신 BTC/USD 값을 받아오는 실습이다.
매우 쉽다.

https://docs.chain.link/data-feeds/using-data-feeds

이 코드를 복사해 리믹스에 붙여넣고, 컴파일, 배포, 함수로 확인만 하면 된다.

실행은 20초면 되는데, 좀 더 자세히 코드를 뜯어보자.

먼저 이게 full code고

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

contract PriceConsumerV3 {
    AggregatorV3Interface internal priceFeed;

    /**
     * Network: Sepolia
     * Aggregator: BTC/USD
     * Address: 0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43
     */
    constructor() {
        priceFeed = AggregatorV3Interface(
            0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43
        );
    }

    /**
     * Returns the latest price.
     */
    function getLatestPrice() public view returns (int) {
        // prettier-ignore
        (
            /* uint80 roundID */,
            int price,
            /*uint startedAt*/,
            /*uint timeStamp*/,
            /*uint80 answeredInRound*/
        ) = priceFeed.latestRoundData();
        return price;
    }
}

먼저 import interface 부분이다.
interface는 상속받아서 쓸 수 있는 함수라고 생각한다.

import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

여기서 불러오는 AggregatorV3Interface의 코드는 ㄹㅇ 별거 없다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface AggregatorV3Interface {
  function decimals() external view returns (uint8);

  function description() external view returns (string memory);

  function version() external view returns (uint256);

  function getRoundData(uint80 _roundId)
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  function latestRoundData()
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );
}

다음

contract PriceConsumerV3 {
    AggregatorV3Interface internal priceFeed;

    /**
     * Network: Sepolia
     * Aggregator: BTC/USD
     * Address: 0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43
     */
    constructor() {
        priceFeed = AggregatorV3Interface(
            0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43
        );
    }

여기서

AggregatorV3Interface internal priceFeed;

는 AggregatorV3Interface 인터페이스를 priceFeed로 이름을 바꾼 것이다.

    constructor() {
        priceFeed = AggregatorV3Interface(
            0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43
        );
    }

이미 배포된 BTC/USD 정보를 받아오는 주소를 입력해 해당 정보를 받아올 수 있는 것이다.


이제 컨트랙트에서 체인링크 함수들을 어떻게 사용할까?

외부 데이터 유즈 케이스이다. 참고하고 프로젝트 아이디어 짤 때 생각해보자.

여기서 DON은 api call, data feed 때 처럼 합의한다.

스마트 컨트랙트만 짤 줄 알면 되지 나머지 과정 솔직히 몰라도 된다.


Functions 실습

아래 문서를 보고 따라하면 된다.

https://docs.chain.link/chainlink-functions/getting-started

git clone https://github.com/smartcontractkit/functions-hardhat-starter-kit.git

이후 폴더 안으로 이동해서

npm i

그리고

npx env-enc set-pw

이는

"env-enc"라는 패키지에서 제공하는 "set-pw"라는 기능을 실행하는 것입니다.
"env-enc"는 .env 파일의 내용을 암호화하여 저장하고 관리하는 데 도움을 주는 패키지입니다.
"set-pw"는 "env-enc"에서 제공하는 기능 중 하나로, .env 파일의 암호를 설정하는 명령어입니다.

라고 한다.

그리고

npx env-enc set

"set" 기능은 "env-enc"에서 제공하는 기능 중 하나로, 암호화된 .env 파일에 새로운 환경 변수를 추가하거나 기존 환경 변수 값을 업데이트할 수 있습니다.

두 가지를 추가해야 한다.

PRIVATE_KEY : 내 메타마스크 지갑 개인키

SEPOLIA_RPC_URL : alchemy 혹은 infura에서 받은 내 rpc_url

세팅 완료 후

npx hardhat compile
profile
시리즈 클릭하셔서 카테고리 별로 편하게 보세용

0개의 댓글