쉽게 이해하는 DecentRandom의 원리
DecentRandom이 어떻게 안전한 난수를 만드는지를 가벼운 표현과 비유를 통해 쉽게 설명해보고자 합니다.
숫자 빙고 게임
숫자 빙고는 종이와 연필, 그리고 상대방만 있으면 할 수 있는 게임입니다. 숫자 빙고 게임의 원리를 이해하고 있다면, DecentRandom도 쉽게 이해할 수 있습니다.
숫자 빙고에는 몇 가지 기본 원칙이 있습니다.
- 이기면 보상을 받는다. (딱밤을 때릴 권한, 아니면 최소한 기분이라도 좋다.)
- 내가 어떻게 숫자를 배열했는지를 절대 들키지 않으려 한다.
- 상대방의 숫자를 불렀을 때 그 숫자가 상대방의 빙고판 어디에 위치해있는지 알 수 없다.
위 원칙들은 DecentRandom의 그것과 굉장히 흡사합니다.
조금 더 쉽게 풀어보겠습니다.
명제 1) 빙고 게임에서 내가 고른 상대방 숫자의 위치는 무작위한 것일까?
위 명제.1은 참일까요?
적어도 내 입장에서 ‘상대방이 어떤 숫자를 어느 위치에 적었는지 모르는 한’ 참이라 할 수 있습니다.
명제 2) 상대방은 자신이 적은 숫자의 위치를 알리지 않을까?
상대방은 게임에서 이기고자(보상이 있으므로) 자신이 숫자를 나열한 형태를 절대 알리지 않으려할 것입니다. 보상이 있음으로 인해 이 게임은 유지될 수 있고, 게임이 유지되는 한, 내가 부르는 숫자의 위치는 랜덤(무작위)한 것이라 할 수 있습니다.
그럼, 하나 더 나아가 보겠습니다.
명제 3) 숫자의 위치를 조작하지 않았는지 나중에 검증할 수 있는가?
만약, 내가 숫자 21을 불렀고, 상대방은 21의 위치를 (1,3)에 놓았다고 합시다. 이 위치는 나중에 확인하더라도 변하지 않아야만 합니다. 상대방이 거짓을 말하거나 숫자의 위치를 슬쩍 바꿀 수 있다면 게임이 성립되지 않습니다. 빙고 게임에서는 게임이 끝난 뒤 상대방의 종이를 확인하면 부정을 저질렀는지 쉽게 확인할 수 있습니다.
위 세가지 조건이 충족되는 상황이면, 빙고 게임에서 내가 부른 숫자의 좌표(x, y)는 랜덤한 숫자라 할 수 있습니다.
DecentRandom의 난수 선택
DecentRandom의 난수 선택 방식은 숫자 빙고 게임과 흡사합니다.
검증인은 블록을 만들 때 특정한 숫자(아주 긴)를 선택하여 암호화한 뒤 블록에 포함합니다. 이는 마치 빙고 게임에서 상대방이 종이에 선을 긋고 숫자를 기입하는 것과 같습니다. 블록에 포함되어 누구나 볼 수 있지만, 암호화 되었기 때문에 원래의 숫자가 무엇인지 이 시점에서는 누구도 알지 못합니다. 빙고 게임에서 상대방의 종이에 기입은 되어있지만 이를 보지 못하는 것과 같은 상황 입니다.
이제 난수를 요청하는 이가 특정한 숫자를 선택하고, 이를 암호한 뒤 난수를 요청합니다. 이는 거래(Transaction)를 통해 블록에 포함되지만, 암호화되어 있으므로 검증인은 난수 요청자가 선택한 숫자가 무엇인지 까지는 알지 못합니다. (암호화된 숫자만 공개했으므로)
검증인과 요청자가 제시한 암호화된 숫자(해시)가 블록에 모두 포함되면 이 두 숫자를 조합하여 난수를 도출합니다.
이렇게 선택된 난수는 블록에 기록된 증거들이 남아있으므로 언제든 검증할 수 있습니다.
게임을 유지하는 보상 체계
빙고에서 보상을 통해 게임의 유효성이 유지되는 것처럼, DecentRandom도 보상과 벌칙을 통해 이를 유지합니다.
검증인은 자신의 숫자를 감추지 않으면, 블록 생성에 대한 보상을 받지 못하며, 다른 이들이 숫자를 먼저 인증하면 자신이 네트워크에 맡긴(Bonding한) RAND를 일정부분 잃게 됩니다.
난수를 요청하는 이 또한 숫자를 감추지 않으면, RAND를 추출하기 위한 보증금을 다른 사람이 인증하여 가로챌 수 있습니다.
덕분에 DecentRandom은 빙고 게임처럼, 탈중앙화된 방식으로 안전한 난수를 추출하거나 추첨을 진행할 수 있는 것입니다.
부가적인 기능들이 몇 가지 더 있지만, 기본적인 원리는 위와 같습니다. 백서 상으로 이해하면 자칫 복잡할 수 있지만, 실은 아주 간단한 원리입니다.