퍼블릭세일 Round 1 추첨 방식 안내

Wonkyung Lyu
Airbloc Protocol
Published in
5 min readJun 14, 2018

에어블로커 여러분 안녕하세요.
에어블록 프로토콜의 Technical Director 류원경입니다.

퍼블릭세일 참가 안내와 같이, 이번 퍼블릭세일은 두 번의 라운드로 나누어 진행됩니다. 그 중 첫 번 째 라운드는 2018. 6. 14 16:00 (UTC+9)까지 화이트리스트(KYC)에 등록된 지갑 중 1,500개 지갑을 무작위로 추첨하여 최대 1 ETH 까지 세일에 참여할 수 있도록하는 방식입니다. (추첨 조건: 잔고 0.5 ETH 이상)

저희 에어블록 프로토콜 팀은 이러한 추첨(Lottery) 방식을 통해 불필요한 Gas War를 방지하고, 더욱 많은 분들에게 에어블록 세일에 참여하실 수 있는 기회를 제공할 것입니다.

이 글에서는 저희가 구체적으로 어떠한 방식을 이용해 추첨을 진행할 것인지 기술적 설명을 드리고자 합니다.

1.먼저 2018. 6. 14 16:00 (UTC+9)까지 화이트리스트에 등록된 지갑을 모두 추출합니다.

여기서 추출된 지갑 주소는 모두 정상적으로 KYC를 통과하여 정당하게 에어블록 프로토콜의 퍼블릭세일에 참여할 권리를 가진 지갑들입니다. 더불어, 이 중 허수를 제거하기 위해 최소 0.5 ETH 이상을 보유하고 있는 지갑들만 한정하여 추출합니다.

2. 추출된 지갑을 지갑 주소 알파벳에 따라 순차 정렬 후, 이를 0부터 n-1(단, 여기서 n은 지갑의 총 갯수이다.)까지 번호를 매깁니다.

자체 컴퓨팅 장비와 프로그램을 이용하여 무작위 정렬 하는 것은 향후 공정성 이슈를 불러올 수 있으며, KYC 등록 시간 순서나, 국가별, 이름별 정렬 또한 특정 집단에 편중된 결과를 초래할 수 있기 때문에 이미 16진수로 (준)랜덤 생성된 이더리움 지갑 주소를 활용하는 것이 좋다고 판단하였습니다.

3. 이렇게 번호가 매겨진 지갑 주소들은 .txt 파일로 저장되어 GitHub Repository에 업로드되며, 이 파일의 위변조 가능성을 방지하기 위해 SHA256 Hash를 Ethereum Block위에 함께 기록합니다.

파일은 다음과 같은 포맷을 가지고 있을 것입니다.

# BEGINNING OF LOTTERY DATA FOR AIRBLOC PROTOCOL PUBLIC SALE

0 0x04257b97df060e5D8fc63f32C5c839d40b6B8f23
1 0x0b07605e98EB1e8B50f477C6b2c80EA1318e3605
2 0x51e38d2beb5A59d2bA8DC23813Da6CcF5F429dD4
3 0x8a54E128eFB303cf61C5fB7B2037c0B39bB5Bcf9

# END OF LOTTERY DATA

4. n개의 행을 가지고 있는 지갑 주소 목록에서 1,500개의 지갑을 고릅니다.

다만 이 전체 지갑 목록은 이미 위에서 무작위로 정렬되어 있기 때문에, 특정 시작점 s(단, s는 0보다 크거나 같고 n보다 작다.)를 정한 뒤 s번 지갑부터 s+1,499번 지갑까지의 사이에 있는 지갑 1,500개를 당첨 지갑으로 정하기로 합니다.

만약 s+1,499n-1을 넘어가는 경우에는 s 부터 n-1 까지 추첨하고 남은 숫자 만큼을 0에서 시작해 추첨합니다. 즉, 이 전체 지갑 목록은 n-1 다음이 다시 0인 원형으로 순환하는 형태입니다. 따라서 자신의 지갑 주소가 앞 쪽에 위치하던 뒷 쪽에 위치하던 모두가 같은 확률로 당첨될 가능성을 가지고 있습니다.

랜덤 수 s의 추출은 공정성을 위해 미국 NIST(National Institute of Standards and Technology)에서 운영하는 Randomness Beacon을 이용합니다.

이 비콘은 매 1분마다 랜덤한 16진수 문자열 128자리를 만들어 기록합니다. 우리는 2018. 6. 14 19:00 (UTC+9)에 생성된 Version 1.0의 Output Value를 사용합니다. 만약 해당 시간의 Status가 Normal이 아닌 경우에는 1분씩 늘려나가 정상인 값을 사용합니다.

이렇게 만들어진 128자리의 16진수를 10진수 값으로 치환합니다. 가령 2018. 6. 14 12:42 am (UTC+9)의 Output Value는 다음과 같습니다. 중간의 white space는 무시합니다.

03A86577E2F16B910CB6984142C6D1DC3E75617A8669B9481AAA0CBB305B2C578B0629E8094B41FF978F2F65352B3138C551984F4987ECD142B8CC35CA595EEC

이 값을 10진수로 치환하면 다음과 같습니다. (치환에는 이 을 사용합니다.)

191574440747937233099005510275433026035028733407948386342467338297112395703138894591392012950143437555264640221601678929820402037090120783756023750549228

이 어마무시한 숫자를 R이라고 했을 때, sRn으로 나누었을 때의 나머지입니다.(즉, s=R%n) 따라서 s는 랜덤하게 0부터 n-1 까지의 값을 가지게 됩니다. (MOD 연산에는 이 을 사용합니다.)

5. 최종적으로 선택된 1,500개의 지갑 주소는 GitHub Repository와 이 Medium 블로그를 통해 공개됩니다.

블록체인 위에 SHA256 Hash 값이 등록되어 위변조 불가능한 지갑 목록 파일과 NIST에서 생성된 공신력 있는 시간 기반의 R값이 항상 같다면, 이 과정은 여러번 진행되어도 언제나 같은 결과를 가지게 됩니다. 따라서 저희가 공개하는 결과값에 대한 확인이 필요하신 경우, 위에 기술된 절차를 같이 반복하시어 검증이 가능합니다.

이러한 투명하고도 공정한 과정을 통해 많은 분들이 에어블록 프로토콜 퍼블릭세일에 공평한 기회를 가지고 참여하실 수 있도록 하였습니다. 더불어 본인의 지갑이 당첨되지 않더라도, 가스 가격에 제한을 걸어 Gas War 없이 “First come, First serve”가 보장되는 두 번 째 라운드를 통해서도 퍼블릭세일에 참가하실 수 있으니 참고 부탁드립니다. :-)

--

--