Klaytn 문서 아카이브
시작하기스마트 컨트랙트노드 운영dApp 개발자
  • Klaytn 문서
  • -
    • Klaytn Overview
      • 왜 클레이튼일까요?
      • 클레이튼 디자인
        • 합의 메커니즘
        • 계정
        • 트랜잭션
          • 기본
          • 수수료 위임 트랜잭션
          • 수수료 부분 위임 트랜잭션
          • Ethereum
        • 연산
          • 클레이튼 스마트 컨트랙트
          • 실행 모델(Execution Model)
          • Computation Cost
            • 연산 비용 (구 버전 문서)
          • Klaytn 가상머신
            • 클레이튼 가상머신 (구 버전 문서)
        • 스토리지
        • 트랜잭션 비용
          • 트랜잭션 비용 (구 버전 문서)
        • 클레이튼의 네이티브 코인 - KLAY
        • 토큰 이코노미
        • 거버넌스
        • 다중 채널
        • KNI
      • 확장성 솔루션
    • Getting Started
      • Deploying Smart Contract Using Foundry
      • Deploying Smart Contract Using Hardhat
      • Deploying Smart Contract Using KEN
        • Launch an Endpoint Node
        • Top up your Account
        • Install Development Tools
        • Deploy a Smart Contract
        • Check the Deployment
        • Account Management
          • Creating Accounts
          • Managing Accounts
      • Development Environment
      • Getting KLAY
    • 스마트 컨트랙트
      • 솔리디티 - 스마트 컨트랙트 언어
      • 미리 컴파일된 컨트랙트
        • 미리 컴파일된 컨트랙트 (구 버전 문서)
      • IDE 및 도구
        • Truffle
      • 샘플 컨트랙트
        • KlaytnGreeter
        • ERC-20
          • 1. ERC-20 스마트 컨트랙트 작성
          • 2. 스마트 컨트랙트 배포
          • 3. 클레이튼 월렛에서 ERC-20 토큰 사용
        • ERC-721
          • 1. ERC-721 스마트 컨트랙트 작성
          • 2. Deploying Smart Contract
      • 테스트 가이드
      • 배포 가이드
      • 클레이튼 호환 토큰
      • 이더리움 컨트랙트 이식
    • Run a Node
      • 배포
        • Endpoint Node
          • 시스템 요구사항
          • 설치 가이드
            • 다운로드
            • Installation Guide
            • 환경설정
            • EN 실행하기
            • 설치 테스트하기
          • ken CLI 명령어
          • JSON-RPC API
        • 코어 셀
          • System Requirements
          • 네트워크 설정
          • Installation Guide
            • Download
            • 설치하기 전에
            • 컨센서스 노드 설정
              • Installation Guide
              • Configuration
              • CN 실행하기
            • 프록시 노드 설정
              • Installation Guide
              • Configuration
              • PN 실행하기
            • 코어 셀 테스트하기
          • 모니터링 설정
          • H/A 설정
        • Service Chain
          • Getting Started
            • 4개 노드 서비스 체인 설정하기
            • Connecting to Baobab
            • 크로스체인 토큰 전송
            • HA(High Availability) for ServiceChain
            • Nested ServiceChain
            • Value Transfer between Sibling ServiceChains
          • 참조 매뉴얼
            • System Requirements
            • Download
            • SCN User Guide
              • Installation
              • Configuration
              • SCN 실행 및 중지하기
              • 노드 상태 확인하기
              • kscn commands
              • homi commands
            • SPN/SEN User Guide
              • Installation
              • Configuration
              • 노드 실행 및 중지
              • Checking Node Status
            • Bridge Configuration
            • 앵커링
            • KAS 앵커링
            • 토큰 전송
            • Configuration Files
            • 로그 파일
            • Genesis JSON
            • 업그레이드 및 하드포크
          • How-To Guides
        • Download Node Packages
          • v1.11.1
          • v1.11.0
          • v1.10.2
          • v1.10.1
          • v1.10.0
          • v1.9.1
          • v1.9.0
          • v1.8.4
          • v1.8.3
          • v1.8.2
          • v1.8.1
          • v1.8.0
          • v1.7.3
          • v1.7.2
          • v1.7.1
          • v1.7.0
          • v1.6.4
          • v1.6.3
          • v1.6.2
          • v1.6.1
          • v1.6.0
          • v1.5.3
          • v1.5.2
          • v1.5.1
          • v1.5.0
          • v1.4.2
          • v1.4.1
          • v1.4.0
          • v1.3.0
          • v1.2.0
          • v1.1.1
          • v1.0.0
          • v0.9.6
          • v0.8.2
    • 운영 가이드
      • Configuration
      • 노드 로그
      • Log operation
      • 에러 및 문제 해결
      • Klaytn Command
      • Chaindata Change
      • Chaindata Migration
    • dApp Developers
      • JSON-RPC APIs
        • API references
          • eth
            • Caution
            • Account
            • Block
            • Transaction
            • Config
            • Filter
            • Gas
            • Miscellaneous
          • klay
            • Account
            • Block
            • Transaction
              • Working with Klaytn Transaction Types
            • Configuration
            • Filter
            • Gas
            • Miscellaneous
          • net
          • debug
            • Logging
            • Profiling
            • Runtime Tracing
            • Runtime Debugging
            • VM Tracing
            • VM Standard Tracing
            • Blockchain Inspection
          • admin
          • personal
          • txpool
          • governance
        • Service Chain API references
          • mainbridge
          • subbridge
        • Transaction Error Codes
      • RPC Service Providers
        • Public Endpoints
      • SDK & Libraries for interacting with Klaytn Node
        • caver-js
          • Getting Started
          • Sending a sample transaction
          • API references
            • caver.account
            • caver.wallet
              • caver.wallet.keyring
            • caver.transaction
              • Basic
              • Fee Delegation
              • Partial Fee Delegation
            • caver.rpc
              • caver.rpc.klay
              • caver.rpc.net
              • caver.rpc.governance
            • caver.contract
            • caver.abi
            • caver.kct
              • caver.kct.kip7
              • caver.kct.kip17
              • caver.kct.kip37
            • caver.validator
            • caver.utils
            • caver.ipfs
          • caver-js ~v1.4.1
            • Getting Started (~v1.4.1)
            • API references
              • caver.klay
                • Account
                • Block
                • Transaction
                  • Legacy
                  • Value Transfer
                  • Value Transfer Memo
                  • Account Update
                  • Smart Contract Deploy
                  • Smart Contract Execution
                  • Cancel
                • Configuration
                • Filter
                • Miscellaneous
              • caver.klay.net
              • caver.klay.accounts
              • caver.klay.Contract
              • caver.klay.KIP7
              • caver.klay.KIP17
              • caver.klay.abi
              • caver.utils (~v1.4.1)
            • Porting from web3.js
        • caver-java
          • Getting Started
          • API references
          • caver-java ~v1.4.0
            • Getting Started (~v1.4.0)
            • Porting from web3j
        • ethers.js
        • web3.js
      • Tutorials
        • Klaytn Online Toolkit
        • Fee Delegation Example
        • Count DApp
          • 1. Environment Setup
          • 2. Clone Count DApp
          • 3. Directory Structure
          • 4. Write Smart Contract
          • 5. Frontend Code Overview
            • 5-1. Blocknumber Component
            • 5-2. Auth Component
            • 5-3. Count Component
          • 6. Deploy Contract
          • 7. Run App
        • Klaystagram
          • 1. Environment Setup
          • 2. Clone Klaystagram DApp
          • 3. Directory Structure
          • 4. Write Klaystagram Smart Contract
          • 5. Deploy Contract
          • 6. Frontend Code Overview
          • 7. FeedPage
            • 7-1. Connect Contract to Frontend
            • 7-2. UploadPhoto Component
            • 7-3. Feed Component
            • 7-4. TransferOwnership Component
          • 8. Run App
        • Building a Buy Me a Coffee dApp
          • 1. Project Setup
          • 2. Creating a BMC Smart Contract
          • 3. Testing the contract using scripts
          • 4. Deploying BMC Smart contract
          • 5. Building the BMC Frontend with React and Web3Onboard
          • 6. Deploying Frontend code on IPFS using Fleek
          • 7. Conclusion
        • Migrating Ethereum App to Klaytn
        • Connecting MetaMask
        • Connecting Remix
        • Verifying Smart Contracts Using Block Explorers
      • Developer Tools
        • Wallets
          • Kaikas
          • Klaytn Wallet
          • Klaytn Safe
            • Klaytn Safe Design
            • Create a Safe
            • Add assets
            • Send assets
            • Contract Interaction
            • Transaction Builder
            • Points to Note
            • Frequently Asked Questions
          • Wallet Libraries
            • Web3Auth
            • Web3Modal
            • Web3-Onboard
        • Oracles
          • Orakl Network
          • Witnet
          • SupraOracles
        • Block Explorers
          • Klaytnscope
          • Klaytnfinder
        • Klaytn Contracts Wizard
    • Glossary
  • ---
    • Klaytn 하드포크
    • 클레이튼 2.0
      • 메타버스 패키지
      • 완결성과 개선 사항들
      • 이더리움 호환성
      • 거버넌스 탈중앙화
      • 대규모 에코 펀드
    • FAQ
    • 오픈 소스
    • 이용약관
    • 지원 언어
  • ℹ️최신 Klaytn 문서
Powered by GitBook
On this page
  • 소개
  • 준비사항
  • 시작하기
  • 1단계: 직접 결제를 위한 초기 설정
  • 2단계: 컨트랙트 상태 변수 초기 설정
  • 3단계: 직접 결제로 무작위 워드 요청하기
  • 4단계: 무작위 워드 할당하기
  • 실제 구현
  • 샘플 코드 생성 및 배포
  • 스마트 컨트랙트와의 상호작용
  • 결론

Was this helpful?

  1. -
  2. dApp Developers
  3. Developer Tools
  4. Oracles

Orakl Network

PreviousOraclesNextWitnet

Last updated 1 year ago

Was this helpful?

소개

Orakl Network는 스마트 컨트랙트가 오프체인 데이터 및 기타 리소스에 안전하게 액세스할 수 있도록 하는 탈중앙화 오라클 네트워크입니다. 데이터 피드, VRF, 요청-응답 솔루션을 제공하는 Klaytn 네이티브 오라클임을 자부하고 있습니다.

Orakl Network를 통해 사용자는 스마트 컨트랙트에서 예측 불가능하고 편향되지 않은 무작위성을 확보할 수 있습니다. Orakl Network의 검증 가능한 랜덤 함수(VRF)를 통해 스마트 컨트랙트는 VRF를 사용하여 검증 가능한 랜덤 값을 생성할 수 있으며, 이는 무작위성이 필요한 다양한 디앱에서 사용할 수 있습니다.

오라클 네트워크는 개발자에게 두 가지 결제 방법을 통해 VRF 서비스에 대한 액세스를 제공합니다: 선불 또는 직접 결제. 이 튜토리얼에서는 오라클 네트워크의 VRF 기능을 활용하여 스마트 컨트랙트에서 난수를 요청해볼 것입니다.

준비사항

  • Kaikas

  • Remix IDE

  • Remix의 Klaytn 플러그인

  • Faucet에서 얻은 테스트 KLAY

시작하기

다음 단계들에서는 Orakle Network를 사용하여 스마트 컨트랙트에서 난수를 요청합니다. 시작해 봅시다!

1단계: 직접 결제를 위한 초기 설정

스마트 컨트랙트에서 난수를 요청하려면 VRFCoordinator 스마트 컨트랙트의 초기 설정을 진행해야 합니다. 생성자 파라미터를 통해 제공된 VRFCoordinator 주소에 VRFCoordinator 인터페이스를 연결하여 랜덤 워드 요청(requestRandomWordsPayment)에 사용하는 것을 권장합니다. 현재 Klaytn 테스트넷 Baobab에 컨트랙트 주소 0xfa605ca6dc9414e0f7fa322d3fd76535b33f7a4f로 VRFCoordinator 컨트랙트가 배포되어 있습니다.

import "@bisonai/orakl-contracts/src/v0.1/VRFConsumerBase.sol";
import "@bisonai/orakl-contracts/src/v0.1/interfaces/VRFCoordinatorInterface.sol";

contract VRFConsumer is VRFConsumerBase {
  VRFCoordinatorInterface COORDINATOR;
  constructor(address coordinator) VRFConsumerBase(coordinator) {
      COORDINATOR = VRFCoordinatorInterface(coordinator);
  }
}

2단계: 컨트랙트 상태 변수 초기 설정

이 단계에서는 컨트랙트 기능에 필요한 상태 변수의 초기 설정을 진행합니다. 여기에는 난수 결과를 저장하는 s_randomResult 변수, onlyOwner 모디파이어에서 사용되는 s_owner 변수, callbackGasLimit 변수, 반환할 난수의 개수를 나타내는 keyHash 변수 및 numWord 변수가 포함됩니다.

  uint256 public s_randomResult;

  address private sOwner;

   bytes32 keyHash = 0x47ede773ef09e40658e643fe79f8d1a27c0aa6eb7251749b268f829ea49f2024;

   uint32 callbackGasLimit = 500000;

   uint32 numWords = 1;

  error OnlyOwner(address notOwner);
  modifier onlyOwner() {
      if (msg.sender != sOwner) {
          revert OnlyOwner(msg.sender);
      }
      _;
  }
  constructor(address coordinator) VRFConsumerBase(coordinator) {
      COORDINATOR = VRFCoordinatorInterface(coordinator);
      sOwner = msg.sender;
  }

3단계: 직접 결제로 무작위 워드 요청하기

직접 결제를 사용하여 난수를 요청하려면 사용자는 value 속성을 사용하여 호출과 함께 $KLAY를 보내야 합니다.


receive() external payable {}

function requestRandomWordsDirect(
    bytes32 keyHash,
    uint32 callbackGasLimit,
    uint32 numWords
)
    public
    payable
    onlyOwner
    returns (uint256 requestId)
{
  requestId = COORDINATOR.requestRandomWordsPayment{value: msg.value}(
    keyHash,
    callbackGasLimit,
    numWords
  );
}

위 코드는 COORDINATOR 컨트랙트에 정의된 requestRandomWordsPayment() 함수를 호출하는 함수를 설명하며, 인자로 keyHash, callbackGasLimit, numWords를 전달합니다. 결제 금액은 msg.value를 통해 COORDINATOR 컨트랙트의 requestRandomWordsPayment()로 전송됩니다. 결제 금액이 예상 결제 금액보다 클 경우 초과 결제 금액은 requestRandomWordsPayment 함수의 호출자에게 반환되므로 코드 상단에 표시된 것처럼 사용자 컨트랙트에 receive() 함수를 정의해야 합니다.

4단계: 무작위 워드 할당하기

이 함수는 난수 요청을 이행할 때 VRFCoordinator 컨트랙트에 의해 호출됩니다.

function fulfillRandomWords(
    uint256 /* requestId */,
    uint256[] memory randomWords
)
    internal
    override
{
    // requestId should be checked if it matches the expected request
    // Generate random value between 1 and 50.
    s_randomResult = (randomWords[0] % 50) + 1;
}

이제 Orakl VRF 솔루션 코드가 완성되었으니 실제로 작동하는 모습을 확인해 보겠습니다.

실제 구현

아래 예시에서 컨트랙트는 난수를 요청하고 요청을 이행할 수 있는 권한을 제공합니다.

샘플 코드 생성 및 배포

Remix IDE

  • Remix IDE로 이동합니다.

  • File Explorer 탭을 클릭하고 contracts 폴더에 demoOraklDirectVRF.sol이라는 이름의 새 파일을 만듭니다.

  • 새로 생성한 파일에 아래 코드를 붙여넣습니다.

  • Remix에서 Compile contract를 클릭합니다.

  • Klaytn 플러그인을 설치한 후 왼쪽의 Klaytn 탭을 클릭합니다.

  • Environment > Injected Caver - Kaikas를 선택합니다.

  • Contract에서 위에서 생성한 컨트랙트를 선택합니다. 예를 들어, VRFConsumer 컨트랙트를 선택합니다..

  • 코디네이터 컨트랙트 주소 0xfa605ca6dc9414e0f7fa322d3fd76535b33f7a4f을 생성자 파라미터에 입력합니다.

  • Deploy를 클릭합니다.

샘플 코드

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.8.2 <0.9.0;
import "@bisonai/orakl-contracts/src/v0.1/VRFConsumerBase.sol";
import "@bisonai/orakl-contracts/src/v0.1/interfaces/VRFCoordinatorInterface.sol";
contract VRFConsumer is VRFConsumerBase {
  VRFCoordinatorInterface COORDINATOR;
  // stores random number after request;
  uint256 public s_randomResult;
  // stores owner
  address private sOwner;
   bytes32 keyHash = 0x47ede773ef09e40658e643fe79f8d1a27c0aa6eb7251749b268f829ea49f2024;
   uint32 callbackGasLimit = 500000;
   uint32 numWords = 1;
  error OnlyOwner(address notOwner);
  modifier onlyOwner() {
      if (msg.sender != sOwner) {
          revert OnlyOwner(msg.sender);
      }
      _;
  }
  constructor(address coordinator) VRFConsumerBase(coordinator) {
      COORDINATOR = VRFCoordinatorInterface(coordinator);
      sOwner = msg.sender;
  }
  // https://baobab.scope.klaytn.com/account/0xfa605ca6dc9414e0f7fa322d3fd76535b33f7a4f
  receive() external payable {}
function requestRandomWordsDirect()
    public
    payable
    onlyOwner
    returns (uint256 requestId)
{
  requestId = COORDINATOR.requestRandomWordsPayment{value: msg.value}(
    keyHash,
    callbackGasLimit,
    numWords
  );
}
function fulfillRandomWords(
    uint256 /* requestId */,
    uint256[] memory randomWords
)
    internal
    override
{
    // requestId should be checked if it matches the expected request
    // Generate random value between 1 and 50.
    s_randomResult = (randomWords[0] % 50) + 1;
}
}

스마트 컨트랙트와의 상호작용

스마트 컨트랙트에서 난수를 요청하려면 먼저 requestRandomWordsDirect() 함수를 실행해야 합니다. 이 함수가 성공적으로 실행되려면 앞서 설명한 대로 사용자가 KLAY(최소 1 KLAY)를 전송해야 합니다. 이후 요청이 완료되면 s_randomResult() 함수를 실행할 수 있습니다. 이 s_randomResult() 함수는 난수를 반환합니다.

  • requestRandomWordsDirect(): 이 함수를 실행하기 위해 1 KLAY를 전송합니다. 아래 이미지에 설명되어 있습니다.

  • s_randomResult(): VRFCoordinator가 난수 요청을 수행한 후 응답은 s_randomResult 변수에 저장됩니다. 응답을 받으려면 s_response() 함수를 호출합니다.

짜잔 🎉! 이제 스마트 컨트랙트에서 난수 요청이 완료되었습니다.

결론

이 튜토리얼에서는 Orakl Network VRF 솔루션을 사용하여 스마트 컨트랙트에서 난수를 생성하는 방법을 배웠습니다. Orakl Network는 가격 피드, 데이터 요청-응답 등 더 많은 오라클 서비스를 제공합니다. Orakle Network의 자세한 가이드와 작동 방식은 Orakl Network 문서에서 확인하실 수 있습니다.