Tournament

Provably fair

How every Battle and tournament is decided, and how to check it yourself.

In short

  • Every battle is fixed by three things. First, a secret seed: we lock it in and publish its fingerprint when the battle opens, before anyone enters. Second, the list of entries, fixed when entries close. Third, a Solana block produced after that.
  • Nobody, our staff included, can know all three while you can still enter.
  • After every battle that runs we publish all three, so you can check the result yourself.
  • Battle: the last man standing wins 1st; the next two in the survival ranking win 2nd and 3rd.
  • Tournaments: most kills wins the room, and equal kills go to fewer deaths.

Battle

Here is each of the three things that decide a battle (the seed, the entry list and R) in detail, and the rules our server enforces on them.

What decides a battle

  1. When a battle opens, the server makes a fresh random 32 byte seed and publishes its SHA-256 fingerprint. The seed itself stays sealed until the battle is over.
  2. When entries close, the list of entries is fixed. Each entry is a random 32 character reference (never your account ID) with how many Marines it holds, sorted by reference. The SHA-256 of that list is the entry digest.
  3. Only then is a Solana block chosen, and R is that block's hash (how, below).
  4. The battle seed is SHA-256 of the text seed:R:digest:battle (digest is the entry digest, the seed written as its 64 hex characters). Everything left to chance in the battle comes from the battle seed, so the same seed and entries always give the same battle.
  5. The battle is run twice, the second time on its own from the seed, R and the entries read back from the database. Both runs must end on the same final state hash and result digest, or the battle is held: no result is shown and nothing is paid.

How the winners are picked

  • The last man standing wins 1st; the next two in the survival ranking win 2nd and 3rd.
  • A place pays only a member's claimed Marine.
  • Each battle's results list its places in order. The Battle page shows each battle's prizes.

How R is chosen

R is never picked by a person or by our server. It comes from the Solana blockchain, from a block that does not exist yet when the entry list is fixed.

  1. Only after the entry list is fixed does the server read Solana's current slot (a slot is Solana's numbered place for a block).
  2. It then picks a slot in the future. For a battle that starts seconds after entries close (the countdown in the lobby), that is 28 slots ahead of the newest slot. For any other battle it is at least 150 slots ahead of the newest finalised slot; the operator can set more, never less.
  3. R is the hash of the first block produced at or after the target slot. If no block was produced in that slot, it is the next one. There is no choosing among later blocks.
  4. R is read from at least two independent Solana data providers, and they must all agree on the slot and the hash. If one has not seen the block yet, or they disagree, the battle waits. It never falls back to randomness made by our server.
  5. The margin: R's block must have been produced more than 2 seconds after the moment the entry list was fixed, by Solana's own block time. Our server checks this against the exact moment; a battle whose block came sooner is held.
  6. A separate check reads the block again and holds the battle if any rule fails: the seed fingerprint was public by the time the battle opened and before the first entry, the list was fixed once entries had closed, the target slot never changed, and R is the first block at or after the target. For a battle that starts seconds after entries close, R is read again once its block is finalised, and the results and prizes wait for that check.

A held battle shows no result and pays nothing. A Members Battle held only for the margin is cancelled and its claims returned when no member's Marine finished in a paid place. When one did, the operator decides: the battle stands exactly as computed, or it is cancelled and every claim returned. Nobody can change its result.

Your number in a Members Battle

  1. In a Members Battle that gives you your number when you claim, your Marine's number (1 to 10,000) comes from drand, a public source of randomness run by the League of Entropy. drand publishes a new signed round every 3 seconds, and the battle's results name the round that gave your number.
  2. Your number comes from the first round published after your claim, which did not exist when you claimed. The time of your claim is the database's clock, so nobody chooses the round.
  3. The round's randomness is the SHA-256 of its signature. From it, one of all 10,000 numbers is picked with equal chance, and picked again if that number is already taken.
  4. On the battle's results, Check it yourself checks each round's signature against drand's public key, checks each round was the first after its claim, and recomputes every number in the battle, in your browser.

Check a finished battle yourself

Open a finished battle's results on the Battle page and open Check this battle. It lists every value below. Check in my browser runs steps 1 and 3 for you; you can also do every step with any SHA-256 tool and a Solana block explorer.

Sign in to check a battle

  1. The seed. Copy the revealed Seed (64 characters) into any SHA-256 tool as plain text. The result must equal the Seed fingerprint, published when the battle opened.
  2. R. Open the Solana slot of R on a block explorer (the slot links to Solana's explorer). The block's hash must equal R, and its block time must be after Entries closed.
  3. The battle seed. Join the seed, R and the Entry digest with colons and add :battle at the end: seed:R:digest:battle. Its SHA-256 must equal the Battle seed.
  4. The result. The Final state hash and the Result digest are the fingerprints of the finished battle, from the battle code with the fingerprint shown. Both independent runs had to end on exactly these before any result was shown.
SHA-256(seed) = seed fingerprint
block hash at the slot of R = R
SHA-256(seed:R:digest:battle) = battle seed

The entry digest fingerprints the list of entries fixed when entries closed. It goes into the battle seed, so the list cannot be changed once R is known without changing the battle seed.

Tournaments

A tournament is a knockout of short DOOM 2 deathmatch rooms. Each round seats players in rooms, the best of each room go through, and the last room is the final.

How a room is ranked

  1. Most kills first. Points do not decide any place.
  2. Equal kills: fewer deaths first.
  3. Still equal: the player who made their last kill sooner ranks higher. A player with no kill ranks below one with a kill.
  4. Still equal: a fixed order by account ID, so every tie has exactly one answer.

The game server reports each room's kills and deaths, and the room is ranked by this rule when its round ends. If the final result cannot be read from the game server, the room is ranked from the last live standings it reported, by the same rule; those carry no kill times, so the last kill step is skipped.

Who goes through

  • The room size and how many go through from each room are set for each tournament by the operator. The tournament page shows both under Rooms, for example 4 a room, top 2 through.
  • When the players going through do not fill whole rooms, the places are topped up from the players who finished one place short of going through in their rooms, compared with each other by the same rule.
  • Everyone else is out. Who meets whom in the next round is shuffled at random by the server. That draw is not part of the Battle checks above.

The final and prizes

  • When one room is left it is the final. First place in the final is the champion, and the final's ranks give the places after it.
  • Prizes are set for each tournament by the operator and shown on its page.
  • A cash prize place that cannot be paid (a bot, a test account, or a banned or restricted account) is not passed down to the next player. While earn rates are on, a cash prize is paid at your earn rate when the tournament finishes, so it can be less or more than the figure shown. Rewards shows your rate.