EKT 멀티체인 기술은 스마트 계약 데이터의 저장 및 설계 문제를 어떻게 해결합니까?

EKT多链技术
本文约1711字,阅读全文需要约7分钟
스마트 계약 데이터의 저장 및 설계 문제를 해결하는 방법

지난해 Ethereum의 CtyptoKitties(crypto cat) 게임이 인기를 끌면서 많은 사람들이 스마트 계약을 플레이하는 새로운 방법인 게임 만들기를 발견했습니다! 모바일 게임 시장에서는 Fight the Landlord, Texas Hold'em 등 체스와 카드 게임이 큰 시장을 점유하고 있다. 이러한 유형의 게임에는 공통적인 특징이 있습니다. 게임의 각 라운드가 시작되기 전에 각 라운드에서 카드의 무작위성을 보장하기 위해 난수를 생성하여 카드를 섞는 것이 필요합니다. 스마트 컨트랙트를 통해 이러한 종류의 체스 및 카드 게임을 구현하는 데 직면하는 문제 중 하나는 블록체인의 데이터를 포함한 스마트 컨트랙트가 오픈 소스이기 때문에 이 셔플링 라운드에서 사용된 난수가 이전 블록에 기록되면 현재 게임 라운드의 끝 체인에서 플레이어는 이 임의의 숫자를 기반으로 다른 모든 플레이어의 카드를 계산할 수 있으며 셔플링은 원래 의미를 잃고 게임이 계속되지 않습니다. 이 상황을 블록체인에서 어떻게 해결할 수 있을까요? 이번 글에서는 스마트 컨트랙트의 데이터 저장 문제에 대해 함께 논의해 보도록 하겠습니다.

1. 체스와 카드 게임의 셔플링 알고리즘

누구나 Doudizhu 또는 Texas Hold'em과 같은 체스 및 카드 게임을 했을 수 있습니다. 이 게임에서는 각 라운드가 시작될 때 플레이어의 손에 있는 카드가 다릅니다. 어떻게 이것을 달성합니까? 이 문제를 컴퓨터 분야에서는 "셔플링 알고리즘"이라고 합니다. 추상적으로 말하면 유한 집합에 대한 무작위 순열 알고리즘(배열 무작위 정렬)을 생성하는 방법을 설명하는 문제입니다. 이 알고리즘에 의해 생성된 무작위 순열은 확률이 동일하며 알고리즘은 매우 효율적이어야 합니다. 유명한 Fisher–Yates 셔플 알고리즘에 대한 솔루션을 살펴보겠습니다.

1-N 카드는 원래 목록 list1에 저장됩니다.

무작위로 섞인 카드는 새 목록 list2에 저장됩니다.

숫자 i를 무작위로 생성(1에서 나머지 숫자(이 숫자 포함)까지)

하위 비트부터 시작하여 i번째 숫자(이 숫자는 빼지 않은 상태)를 가져와서 list2에 저장

모든 숫자가 제거될 때까지 세 번째 단계를 반복하여 i를 재생성합니다.

꺼낸 목록은 원래 목록을 임의로 정렬한 목록이며 알고리즘이 완성됩니다.

위의 알고리즘은 의사 코드로 다음과 같이 표현됩니다.

이 알고리즘에서 난수 i는 각 플레이어의 손에 있는 최종 카드를 직접 결정하는 매우 중요한 역할입니다. 이 숫자가 노출되면 최종 셔플링 결과를 쉽게 추측할 수 있습니다.

2. 스마트 계약의 난수 문제

개방성, 투명성 및 변조 불가능한 특성으로 인해 블록체인은 딜러가 속일 수 있는 여지를 남기지 않습니다. 따라서 블록체인 스마트 계약을 기반으로 하는 체스 및 카드 게임의 구현은 플레이어의 이익을 매우 잘 보장할 수 있으며 매우 유망한 응용 프로그램이기도 합니다. 문제는 게임의 공정성과 플레이어의 이익을 보장하기 위해 스마트 계약을 통해 난수를 생성하고 저장하는 방법입니다. 우리는 먼저 Ethereum에서 게임 계약의 현재 상황을 분석한 다음 우리의 생각을 제시합니다.

1. 안전하지 않은 난수 생성 방식

블록 내의 특정 변수를 기반으로

block.coinbase, block.difficulty, block.gaslimit, block.number, block.timestamp 등과 같이 블록에 대한 많은 메타 정보가 블록에 기록됩니다. 많은 사람들이 이러한 메타 정보를 기반으로 난수를 생성할 수 있다고 생각하지만 실제로는 안전하지 않습니다. 우선, 이 임의의 숫자가 충분한 이익을 창출할 수 있다면 블록체인의 운영을 유지하는 채굴자들은 이 데이터를 수정할 동기를 갖게 됩니다. 둘째, 공격자가 공격을 원할 경우 이 정보를 바탕으로 동시에 난수를 생성할 수도 있다.

일부 생성된 블록의 블록해시 기반

각 블록에는 고유한 블록해시가 있으며 EVM은 block.blockhash()를 통해 블록해시를 얻을 수 있는 인터페이스도 제공합니다. 현재 많은 스마트 컨트랙트에서는 이전 블록의 블록해시, 즉 block.blockhash(block.number - 1)이 난수 생성에 자주 사용됩니다. 이 체계의 단점 또한 매우 명백합니다. 공격자가 공격을 원할 경우 이전 블록의 블록해시를 기반으로 동일한 난수로 스마트 계약을 생성할 수도 있습니다.

2. 더 안전하게 난수를 생성하고 저장하는 방법

앞선 기사에서 오라클 머신의 문제점을 설명했는데, 오라클 머신은 블록체인 세계와 현실 세계 정보를 연결하는 다리 역할을 합니다. 직접 난수 생성기를 구현한 다음 오라클 시스템을 통해 스마트 계약을 가져오거나 Random.org와 같은 웹사이트에 직접 전화하여 실제 난수를 얻을 수 있습니다. 이 측면과 관련하여 EKT의 지속적인 개선을 통해 이 문제를 해결할 수 있는 좋은 메커니즘도 제공할 것입니다.

서두에 언급한 체스와 카드 게임의 예로 돌아가서 난수 생성 문제가 해결되더라도 난수는 언제 블록체인에 기록됩니까? 각 게임을 "세션"으로 생각할 수 있습니다. 각 세션의 시작은 난수 생성을 기반으로 하지만 난수가 생성된 후 즉시 블록체인에 기록되지 않습니다. 이 정보는 먼저 자체 "개인" 영구 공간에 기록됩니다. 게임의 각 라운드가 끝나면 이 데이터는 자체 사적인 공간에서 블록체인에 기록되므로 게임의 공정성을 보장할 뿐만 아니라 게임의 정보를 사전에 공개하지 않습니다.