ZooBC 위키
앱과 ZooBC 위에서의 개발

멀티플레이어 앱

ZooBC의 보드 게임과 주사위 게임은 2~4명이 하며, 모든 수는 모든 노드가 같은 규칙으로 검사하는 트랜잭션입니다. 판돈은 팟을 이루며, 게임이 끝나면 프로토콜이 이를 지급합니다. 게임이 무승부로 끝나지 않는 한 앱 풀을 위한 1 % 레이크를 뺍니다.

열기와 참가하기

플레이어는 CreateApp으로 유형과 좌석 수 2~4개(배틀십은 항상 정확히 2개)를 골라 게임을 열고, 첫 판돈을 냅니다. 게임은 Open 상태가 됩니다. 각 JoinApp은 같은 판돈을 내며, 마지막 좌석이 채워지면 게임은 Active 상태가 됩니다. 선택적으로 상대를 지정하면 게임은 그 계정만 참가할 수 있는 직접 도전이 됩니다.

좌석에는 네이티브 ZooBC 계정 같은 36바이트 계정이 필요합니다. 24바이트 주소를 쓰는 Ethereum과 Bitcoin 해시 유형의 계정은 좌석을 차지할 수 없습니다. 오류 메시지는 "multiplayer apps require a ZBC account"라고 말하지만 그렇습니다(키와 계정 유형). 솔로 베팅은 어떤 계정이든 받아들입니다.

누가 먼저 두는가

누가 먼저 시작하는지가 중요할 수 있으므로, 누구도 이를 미리 알거나 조종할 수 없습니다. 마지막 좌석이 채워지면 차례는 대기 상태가 됩니다. 아무도 시간이 흐르지 않으며, 모든 수는 무동작입니다. 두 블록 뒤에 해결자가 첫 좌석을 추첨하며, 이는 그 블록의 시드와 앱 id의 해시를 좌석 수로 나눈 나머지입니다. 마지막 참가를 담은 블록의 생산자는 자기 블록의 시드는 알지만 두 블록 뒤의 시드는 모르므로, 누가 시작할지에 따라 참가를 포함하거나 빼놓을 수 없습니다. 규칙상 생성자도 마지막 참가자도 먼저 시작하지 않습니다. 배틀십은 예외입니다. 참가자가 자기 보드를 커밋하는 것으로 먼저 둡니다.

네 가지 주사위 게임(루도, 피그, 레이스, 모노폴리 라이트)에서는 수가 그것을 포함한 블록에서 적용되지 않습니다. 대기 중으로 저장되었다가, 다음 블록이 그 블록의 시드와 해당 수의 트랜잭션 id를 키로 삼아 적용하므로, 수를 포함한 생산자는 주사위 결과를 결코 보지 못합니다. 대기 중인 수는 한 번에 하나만 허용되며, 그사이 규칙에 어긋나게 된 수는 버려집니다.

수 시계

마지막 좌석이 참가할 때, 그리고 수가 받아들여질 때마다 다시, 기한은 240블록 앞, 약 1시간 뒤로 설정됩니다. 차례인 플레이어는 그 전에 수를 두거나, 빈 수를 담은 AppMove를 보내야 합니다. 빈 수는 기한을 240블록 더 미루는 유료 킵얼라이브입니다. 차례가 아닌 플레이어의 수나 규칙에 어긋난 수는 제출할 때 거부되며, 블록에 들어가더라도 수수료가 들지 않는 무동작이 됩니다.

수 시계: 마지막 수 이후 240블록이 지나면 기다리던 플레이어가 1 % 레이크를 뺀 팟을 청구할 수 있습니다.
수 시계: 마지막 수 이후 240블록이 지나면 기다리던 플레이어가 1 % 레이크를 뺀 팟을 청구할 수 있습니다.

게임이 끝나는 방식

결말방식지급
승리어떤 수가 게임을 이김1 % 레이크를 뺀 팟을 승자에게
무승부어떤 수가 게임을 무승부로 끝냄모든 좌석이 판돈을 돌려받음. 레이크 없음
기권플레이어가 ResignApp을 보냄레이크를 뺀 팟을 나머지 좌석들이 똑같이 나눔. 남는 부분은 그중 첫 좌석에게
시간 초과차례가 아닌 착석 플레이어가 기한 + 1부터 ClaimAppTimeout을 보냄레이크를 뺀 팟을 차례였던 좌석을 뺀 모든 좌석이 나눔

레이크는 floor(pot × 100 ÷ 10,000), 즉 팟의 1 %입니다. 두 플레이어가 각각 1 ZBC를 걸면 팟은 2 ZBC이고, 승자는 이긴 수가 담긴 블록에서 1.98 ZBC를 받습니다. 블록 생산자는 팟에서 아무것도 가져가지 않습니다. 저절로 끝나는 것은 없습니다. 기한을 넘기면 게임은 플레이어가 청구를 보내기로 할 때까지 기다리며, ZooBC Foundation을 포함한 누구도 게임을 취소할 수 없습니다.

엔진

각 게임의 엔진은 노드의 일부이며, 알아 둘 만한 몇 가지 단순화가 있습니다.

  • 체스에는 캐슬링과 앙파상이 없으며, 폰은 항상 퀸으로 승격합니다.
  • 체커는 잡기를 강제하며 연속 점프를 이어 갑니다.
  • 리버시는 둘 곳이 없는 좌석을 건너뜁니다.
  • 점과 상자는 상자를 완성하면 한 수를 더 둡니다.
  • 피그는 100점에서 이기며, 뱀과 사다리 게임인 레이스는 49에서 끝납니다.
  • 루도는 좌석마다 말 네 개를 움직입니다.
  • 모노폴리 라이트는 각 좌석이 1,500으로 시작하며 GO를 지날 때 200을 받습니다.

배틀십: 공개 체인 위의 비밀

배틀십에는 모든 것이 공개된 체인 위에서 숨겨진 정보가 필요하며, 이를 커밋 후 공개 방식으로 얻습니다. 플레이 전에 각 플레이어는 10 × 10 보드의 100칸 각각에 대해 비밀 32바이트 솔트를 고르고, 모든 칸에 대해 SHA3-256(is_ship ‖ salt)를 공개합니다. 해시 100개, 총 3,200바이트입니다. 생성자는 CreateApp으로 자기 커밋을 보내고, 참가자는 첫 수로 자기 커밋을 보냅니다. 모든 솔트가 무작위이므로 해시는 아무것도 드러내지 않습니다.

플레이어는 수 [0, cell]로 포격합니다. 그 보드의 주인은 대기 중인 칸을 [1, is_ship, salt]로 공개해야 하며, 모든 노드가 이것이 커밋된 값으로 해시되는지 검사합니다. 거짓말을 하면 다른 해시가 나와 거부되므로, 주인은 진실을 말하거나 시간이 다 되어 ClaimAppTimeout에 지는 수밖에 없습니다. 함선 칸 17개를 먼저 맞힌 플레이어가 이깁니다. 함선 칸을 적게 커밋해도 얻는 것은 없습니다. 포격하는 쪽이 100발을 모두 쏘았는데 공개된 함선 칸이 17개 미만이면 포격하는 쪽이 이깁니다.

커밋 후 공개 방식의 배틀십: 체인 위의 해시, 포격, 그리고 모든 노드가 검사하는 공개.
커밋 후 공개 방식의 배틀십: 체인 위의 해시, 포격, 그리고 모든 노드가 검사하는 공개.

같이 보기