검수요청.png검수요청.png

랜덤

위키원
wjddn843 (토론 | 기여)님의 2019년 9월 17일 (화) 09:30 판 (C언어)
이동: 둘러보기, 검색

랜덤(random)이란, 사전적인 의미로 일정한 법칙이나 규칙 또는 버릇이 붙어 있지 않는, 또는 사람의 의사(意思)가 개입하지 않은 무작위(無作爲)한 것을 말한다.

개요

블록체인에서의 랜덤은 랜덤 함수를 의미한다. 스마트계약이 있는 블록체인(이더리움, 이오스)는 랜덤 함수를 제공하지 않는다. 블록체인의 특성상 트랜잭션이 검증되려면 어떤 노드에서도 같은 결과가 나와야 하기 때문이다.[1] 이는 확률 요소가 있는 게임이나 도박 응용을 구현하는데 문제가 된다. 트랜잭션을 미리 실행시켜보고 그 결과가 자신에게 불리할 경우 네트워크에 전파하지 않을 것이기 때문이다.[2]

블록 변수

Solidity를 기준으로 랜덤 시드가 될 수 있는 블록 변수들이 있다.

  • 블록의 번호
  • 블록의 시간
  • 블록해시

그러나 기본적으로 블록 변수들은 마이너에 의해 통제된다. 만약 트랜잭션의 결과가 블록 보상 이상의 인센티브가 있는 경우 이를 랜덤 시드로 쓰는 것은 적절하지 않다. 예를 들어 블록 보상이 3 이더인데, 100 이더짜리 도박판이 열리면 마이너는 작업증명(Proof of Work; PoW)에 성공했더라도 그 블록에 자신이 도박판에서 지는 트랜잭션이 포함될 경우 그 블록을 발표하지 않고 버릴 수도 있음을 염두에 두어야 한다. 블록의 번호를 쓸 경우 마이너 뿐만 아니라 유저에게도 예측될 수 있다. 예를 들어 1~6의 주사위를 던져 짝수가 나오면 이기는 게임이라 했을 때, 블록의 번호를 하나씩 올려가보면서 시뮬레이션하여 짝수가 나오는 블록에 포함되도록 트랜잭션 발표를 조정할 수 있다. 블록의 시간은 마이너에 의해 통제된다고 볼 수 있다. 블록의 해시는 마이너와 사용자 모두 예측하기 어렵지만, 마이너가 이해관계에 놓여있는 경우 위에서 언급한 것처럼 블록 자체를 발표 안 할 가능성이 존재한다.[2]

예제

Keccak256

솔리디티에서 난수를 만들려면 keccak256 해시 함수를 사용하면 된다.

uint randNonce = 0;
uint random = uint(keccak256(now, msg.sender, randNounce)) % 100;
randNonce++;
uint random2 = uint(keccak256(now, msg.sender, randNounce)) % 100;

now → 타임스탬프 값 실행 시 0~99까지 난수를 만들 수 있다.[3]

C언어

rand()함수 사용

#include <stdio.h>
#include <stdlib.h> // rand()함수 포함 라이브러리
#include <time.h> // time()함수 포함 라이브러리

int main()
{
    srand(time(NULL)); // 매번 다른 시드값 생성
    int random = 0; // 정수형 변수 선언
    for (int i = 0; i < 10; i++) // 10번 반복
    {
         random = rand()%9; // 난수 생성
         printf("%d\n", random); // 출력
    }
}
  • random = rand()%9; : rand()함수에 의해 난수를 생성하고 그 숫자를 9로 나눈 나머지를 random 변수에 대입하는 코드이다.
  • srand(time(NULL)); : srand()함수는 rand()라는 함수에 무작위 시드값을 주기 위한 함수이며, 그 파라미터로 time(NULL)이라는 매개변수를 전달한다.
  • time(NULL) : 1970년 1월 1일 이후 경과된 시간을 초 단위로 반환하는 함수이다. time()함수를 사용하기 위해서는 #include <time.h>를 꼭 추가해야한다.[4]

활용

  • NBLab
국내 메이저 게임 개발사인 네오위즈 계열사 '네오위즈 플레이 스튜디오' 산하의 블록체인 랩에서 블록체인상의 무작위 난수 생성(RNG) 연구를 반영한 테스트 게임 디앱(dApp) 'Three Stars Slot'을 이오스(EOS) 메인체인 상에 런칭했다. 해당 댑은 난수 발생 방식의 접목 뿐만 아니라 컨트랙트 상 사용자의 계정 보안을 위한 다양한 방식의 보안 체계를 함께 적용한 테스트 디앱이다.[5] Signidice 알고리즘 방식의 유일한 문제는 기존에 사용되었던 시드(seed)를 사용하지 않기 위해 사용되었던 시드를 모두 컨트랙트(contract)에 기록한다는 것이다. 이를 해결하기 위해 그리고 블록의 제공하는 상태 값 또한 시드로 활용하였다. 블록에서 제공하는 상태 값 그리고 난수 요청자가 제공하는 시드가 결합된 요청은 사실상 기존에 요청되지 않은 요청이라고 볼 수 있다. 따라서 이 방식을 사용할 경우 요청자의 시드를 매번 컨트렉트에 기록할 필요가 없게 된다. NBLab은 블록체인 기술 연구 뿐만 아니라 새로운 사업 가능성을 찾고 도전하는 것을 목표로 설립된 조직이다. NBLab의 비전은 'PLAY THE CRYPTO WORLD'로 차별화된 플레이 경험을 통해 유저들이 크립토 세상을 놀이터처럼 즐길 수 있도록 만들어 나갈 것이다. NBLab은 설립 이후, 다양한 연구와 사업을 진행하고 있으며, 오랜기간 게임을 개발하고 서비스를 직접 운영하고 있는 회사인 만큼 블록체인 기술의 실제적인 활용에 많은 초점을 맞추고 있다.[6]

각주

  1. NEOWIZ PLAY STUDIO Blockchain Lab,〈블록체인에서 난수를 생성하는 방법〉, 《Medium》, 2018-09-12
  2. 2.0 2.1 joojis,〈이더리움에서의 랜덤 구현〉, 《티스토리》, 2018-01-30
  3. bear2u, 〈Keccak256을 통한 난수 생성〉, 《Github》, 2018-03-16
  4. 열코, 〈C 랜덤 - 난수 생성하기〉, 《티스토리》, 2018-09-06
  5. 서리,〈NEOWIZ PLAY STUDIO BLOCKCHAIN LAB, 블록체인상 랜덤 함수 생성 연구를 반영한 테스트 게임 런칭〉, 《코리오스》, 2018-09-14
  6. EOSeoul,〈Three Stars Slot EOS 메인넷 런칭 소식〉, 《Medium》, 2018-09-13

참고자료

같이 보기


  검수요청.png검수요청.png 이 랜덤 문서는 블록체인 기술에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.