Technology, Tutorials

Klaytn에서 Witnet으로 난수 생성하기

소개

Witnet은 스마트 컨트랙트를 통해 스포츠 결과, 주가, 일기 예보 및 무작위 값 등 가치 있는 온라인 데이터 소스에 연결할 수 있는 멀티체인 분산형 오라클 네트워크입니다. Witnet은 분산된 노드 피어인 Witnesses들에 의존하는 비허가(permissionless) 블록체인 오라클로서, 데이터를 요청하여 스마트 컨트랙트에 직접 기록합니다. 복권, NFT, 게임 등 예측 불가능성이 요구되는 스마트 컨트랙트의 활용을 위해 신뢰할 수 있는 난수 생성 기능을 제공합니다.

Witnet 재단은 거의 모든 dApp에서 사용할 수 있는 WitnetRandomness 컨트랙트(Witnet Randomness Oracle이라고도 함)을 제공합니다. 이 컨트랙트 인스턴스는 Klaytn 블록체인의 메인넷(Cypress)과 테스트넷(Baobab) 모두에서 실행됩니다. 이 튜토리얼에서는 Witnet Randomness Oracle을 사용하여 스마트 컨트랙트에서 난수를 생성합니다.

스마트 컨트랙트와 무작위성

스마트 컨트랙트의 결정론적 특성으로 인해 온체인으로 난수를 얻는 것은 까다로운 일입니다. 솔리디티에서는 기본 난수 생성 기능에 액세스할 수 없습니다. 온체인에서 무작위성을 생성하는 메커니즘은 조작 및 남용에 취약합니다. 이 때 오라클이 등장합니다. 위조되지 않는 방식으로 스마트 컨트랙트를 숫자와 같은 실제 데이터에 연결하는 것이 오라클의 역할입니다.

Witnet은 Klaytn과 같은 EVM 호환 체인에서 스마트 컨트랙트에 대한 안정적인 무작위성을 생성하는 솔루션을 제공합니다. 난수 요청은 무작위로 선택된 다수의 오라클 노드에 의해 처리됩니다. 이 과정은 여러 익명의 무작위로 선택된 오라클 노드들에 의해 암호화 방식으로 수행됩니다. 이들은 잘못된 보고를 할 경우 프로토콜의 지분이 삭감되며, 정직하게 행동하고 보상을 위해 경쟁하도록 장려됩니다. 난수를 생성하기 위해 Witnet 오라클은 두 가지 방법을 제공합니다.

이 튜토리얼에서는 witnet-solidity-bridge npm 패키지를 통하여 사용할 수 있는 IWitnetRandomness 인터페이스를 통해 WitnetRandomness 컨트랙트와 상호 작용하게 될 것입니다.

Witnet으로 난수 생성하기

이 섹션에서는 IWitnetRandomness 컨트랙트 인터페이스를 사용하여 WitnetRandomness 컨트랙트에서 난수를 생성합니다.

요구사항

이 튜토리얼은 아래와 같은 요구사항이 있습니다.

1단계 — WitnetRandomness 샘플 컨트랙트 열기

이 튜토리얼에서는 Witnet 팀이 제공한 샘플 컨트랙트를 사용합니다.

여기를 클릭하면 Remix IDE에서 WitnetRandomness 샘플 컨트랙트를 열 수 있습니다.

2단계 — 스마트 컨트랙트 컴파일 및 배포

이제 컨트랙트가 생겼으니 먼저 컴파일해 보겠습니다. Auto Compile 체크박스를 선택하거나 Compile 버튼을 선택하여 수동으로 컴파일할 수 있습니다.

컴파일 후 측면 패널의 Klaytn 로고를 클릭하고 환경을 Injected Web3로 변경합니다. 그러면 MetaMask 지갑에 연결하라는 팝업이 나타납니다. 연결하려는 계정을 선택하고 Next를 클릭하여 계속 진행합니다.

WitnetRandomness 컨트랙트 를 선택합니다.

배포하기 전에 컨트랙트 생성자는 Klaytn 네트워크의 WitnetRandomness 컨트랙트 주소가 필요합니다. 여기에서 주소를 볼 수 있습니다. 이 예시에서는 Klaytn Testnet 주소(0xB4B2E2e00e9d6E5490d55623E4F403EC84c6D33f)를 사용할 수 있습니다.

이제 생성자 인수를 설정 했으므로 **Deploy(배포)**를 클릭합니다.

3단계 — 난수 얻기

이미 배포된 컨트랙트를 보려면 Deployed Contracts(배포된 컨트랙트) 탭을 엽니다.

이제 난수를 생성해 봅시다. 난수를 생성하려면 이 2단계 프로세스를 거쳐야 합니다.

  1. requestRandomNumber(): 이 함수는 오라클 노드에서 완료할 난수 요청을 개시합니다. 사용자는 무작위 요청의 가스 비용을 지불하고 네이티브 토큰(KLAY/테스트 KLAY)을 예치해야 합니다. 그렇게 때문에 함수가 payable로 표시됩니다. 사용하지 않은 모든 금액은 발신자에게 다시 이체됩니다.
  2. requestRandomNumber 함수를 실행하려면 value 필드를 설정합니다. 넉넉하게 0.5 KLAY로 설정하겠습니다. 이 값은 난수를 요청할 때 트랜잭션 비용을 의미합니다. requestRandomNumber 버튼을 클릭하여 난수를 요청합니다.

참고: 요청 을 완료하는 데 시간이 좀 걸리므로 fetchRandomNumber() 호출 직후에 requestRandomNumber()를 호출하면 트랜잭션이 되돌려질 가능성이 높습니다. 5~10분 정도 후에 **fetchRandomNumber()**를 실행합니다.

  1. fetchRandomNumber(): 이 함수는 WitnetRandomness 컨트랙트에서 난수를 반환하여 스마트 컨트랙트의 randomness 변수에 저장합니다.

fetchRandomNumber()를 실행하기 전에 5~10분 동안 기다리는 것이 좋습니다. requestRandomNumber() 실행 직후 이 함수를 호출하면 아래와 같이 가스비 추산 오류가 발생할 수 있습니다.

fetchRandomNumber 트랜잭션이 성공했다면 randomness  버튼을 클릭했을 때 난수를 확인할 수 있습니다.

축하합니다! WitnetRandomness 컨트랙트를 사용하여 난수를 얻었습니다.

결론

이 튜토리얼에서는 분산형 오라클 네트워크 Witnet에 대해 설명하고, 난수의 중요성을 알아보았으며, 스마트 컨트랙트를 오프체인 데이터에 연결하는 데 오라클이 가장 적합한 이유를 설명했습니다. Witness Randomness 컨트랙트를 사용하여 난수를 요청하는 방법을 설명했습니다. 이제 Klaytn에서 Witnet 같은 오라클을 사용하여 흥미진진한 블록체인 애플리케이션 개발을 시작해보세요.