증명 가능한 공정함
Limbo는 플레이어들이 로켓이 폭발할 지점을 예측하는 싱글플레이어 게임입니다.
공정성과 공평성을 보장하기 위해, 우리는 1,000만 개의 시드 값을 사전 생성하고 암호화합니다. 이러한 시드들은 역순으로 사용되어 게임 결과를 결정합니다.
각 라운드가 종료된 후, 결과에 사용된 시드가 공개됩니다. 또한, 각 게임 결과는 미래의 게임 결과와 해시되어, 미래 라운드의 결과를 예측하거나 조작할 수 없게 만듭니다.
게임 결과 생성 알고리즘:
- 암호화된 난수와 비트코인 블록 해시를 해시하여 시드 값을 얻고, 이를 10^13으로 나눈 후 16진수로 변환합니다.
- 결과를 2^52로 나누어 0과 1 사이의 난수를 얻습니다.
- 1% 하우스 엣지를 적용하여 난수를 조정하고, 승수와 함께 원본 데이터를 생성합니다.
- 원본 데이터를 100으로 나누어 게임 결과에 사용되는 실제 승수를 생성합니다. (원본 데이터가 100 미만인 경우 승수는 1로 고정됩니다.)
게임 결과를 확인하려면, 비트코인 포럼에서 확인할 수 있습니다. 여기를 클릭하세요.
const seed = '...';
const bitCoinBlockHash = '...';
let saltSeed = keccak256(toUtf8Bytes(seed + bitCoinBlockHash)).slice(2);
const nBits = 52;
saltSeed = saltSeed.slice(0, nBits / 4);
const r = parseInt(saltSeed, 16);
let X = r / Math.pow(2, nBits);
X = parseFloat(X.toPrecision(9));
X = Math.floor(99 / (1 - X)); // house edge 1%
const successMultiply = Math.max(1, X / 100);
알고리즘 특성
- 초기 시드의 무작위성 보장: 초기 시드(Genesis)를 Cryptographically Secure Pseudo-Random Number Generator (CSPRNG)에 기반한 Linux의 /dev/urandom 소스를 사용하여 생성하여 무작위성을 보장합니다.
- 광범위하게 인정된 공용 도메인 PRNG 사용: 초기 시드를 SHA-3 표준 keccak256 해시 알고리즘을 사용하여 시드로 변환합니다.
- 시드 값의 안전한 저장: 1천만 개의 시드를 사전에 생성하고 AES 알고리즘을 사용하여 암호화하여 독립된 데이터베이스에 저장합니다.
- 소금 값으로 공정성 보장: 소금 값을 미리 지정하여, 아직 발생하지 않은 비트코인 블록의 해시 값을 사용하여 공정한 RNG 난수 생성을 보장합니다.
- 검증 가능한 공정성을 제공하는 게임: 공정성 검증을 용이하게 하기 위해 천만 번째 시드를 미리 공개합니다.
시드 생성 단계
시드 생성용 난수는 CSPRNG를 사용하여 생성됩니다. 여기서 CSPRNG 기술은 nodeJS의 내장 라이브러리인 crypto.randomBytes를 사용합니다.
crypto.randomBytes는 OpenSSL의 RAND_bytes를 기반으로 하며, RAND_bytes는 Linux의 /dev/urandom의 CSPRNG를 사용합니다.
난수는 16진수로 변환됩니다.
이 난수는 keccak256 알고리즘을 사용하여 해시되어 첫 번째 시드를 생성합니다.
'단계 3'에서 생성된 첫 번째 시드는 keccak256 알고리즘을 사용하여 다시 해시되어 두 번째 시드를 생성합니다.
단계 3-4는 총 1천만 번 반복되어 1천만 개의 시드를 생성합니다.
이 모든 시드는 AES 암호화를 사용하여 안전하게 저장됩니다.
2^52 범위 내의 값을 가진 난수를 생성합니다.
공개 단계
생성된 천만 번째 시드는 먼저 게임 플랫폼과 커뮤니티에 공개됩니다. 기사를 확인하세요
시드가 공개된 후, 비트코인 블록 체인에서 아직 만들어지지 않은 n번째 비트코인 블록의 해시 값이 소금 값으로 사전에 지정되어 게임 플랫폼과 커뮤니티에 발표됩니다. 기사를 확인하세요
n번째 비트코인 블록의 해시 값 공개 후, 이는 공개적으로 소금으로 지정되어 게임 플랫폼과 커뮤니티에 공개됩니다. 기사를 확인하세요
천만 번째(+1) 시드: 96cf82c49c9e4c43bb9b7692c0d222cb98a9e880144061f2a74a2ae1ded0f46e
게임 활용 단계
9,999,999번째 시드는 소금과 결합되어 keccak256 알고리즘을 사용하여 해시됩니다. 이는 게임의 RNG 난수로 사용됩니다.
게임이 진행됨에 따라 시드는 역순으로 교체되며, 9,999,998번째 시드, 9,999,997번째 시드 등으로 대체됩니다. RNG 난수는 게임이나 애플리케이션에 적용됩니다.
검증 단계
게임의 한 라운드가 끝나면 해당 라운드에서 사용된 시드가 공개됩니다.
검증을 위해 해당 라운드의 시드는 keccak256으로 해시될 수 있습니다.
모든 사용자는 해시된 값이 이전 라운드의 시드 값과 일치하는지 확인할 수 있습니다.
첫 번째 게임은 미리 공개된 천만 번째 시드를 사용하여 검증됩니다.