Urgent.News

What's breaking now, across thousands of outlets.

Tech

One rounding, not many: why a provably-fair verifier must match the server bit for bit

Originally published on the Betkyo Journal , where every figure is read from the game engine's source. Every provably fair round on this site turns a 256-bit hash into a number between 0 and 1 and then into an outcome. The server does that in Kotlin; the browser verifier does it in JavaScript. Both languages hold numbers as 64-bit doubles with 53 bits of precision , and a hash has more bits than…

A provably-fair verifier must match the server bit for bit to ensure accurate outcomes. This is because a hash, consisting of thirty-two bytes, needs to be converted into a number between 0 and 1. The server handles this conversion in Kotlin, while the browser verifier performs it in JavaScript. Both languages use 64-bit doubles with 53 bits of precision, which means that the hash, having more bits than that, requires some rounding during the conversion process.

If the server rounds once and the verifier rounds multiple times, the resulting numbers may differ by the last bit, leading to potential discrepancies in game outcomes. To prevent this, the engine constructs the number as two exact pieces added together in a single operation, dividing the first four bytes by 2³² and the next bytes by 2⁵⁶ or 2⁶⁴.

This ensures that the only rounding occurs once, matching the server's conversion method. The verifier, like the server, uses the same arithmetic to compute the result, making a rejection truly reflective of the game's fairness. By avoiding multiple rounding operations, the provably-fair verifier helps maintain trust in the integrity of the game's outcome.

Written by urgent.news from Dev.to's reporting — not their text. Machine-written — may contain errors; check the original before relying on it.

Read the original at dev.to →

More in Tech

Nothing could start without the dependency we had filed as optional

Our configuration service was tier three. No SLO, no pager, a single replica for a long time, and a line in the architecture document describing it as a soft dependency because clients cache their…

  • Configuration service deemed soft dependency, but crucial for client startup
  • Node pool rotation caused service outage, triggering cascade failures
  • Service reclassified as tier one with added redundancy and monitoring

Consolidation in the Vendor Market Is Now a Technical Risk

Three of the products we depend on changed hands in the last eighteen months. In each case the acquirer was larger, already sold us something else, and made reassuring noises about continuity.

  • Vendor market consolidation has reduced credible suppliers from eight to three.
  • Acquisitions led to abrupt loss of leverage and abrupt end of fallback options.

I Made Four Authorization Engines Answer the Same Questions

"Which authorization engine should I use" always gets answered with a table. Cedar is analyzable, Rego is expressive, Zanzibar is relationship-based. I could never feel the difference from any of it.

  • Four authorization engines tested with identical rules and simultaneous requests
  • Cedar, Rego, Zanzibar, and Casbin engines each with unique strengths and weaknesses
  • ReBAC failed to handle time-based constraints during business hours

Stop Slamming Downstream Services: Singleflight Request Coalescing with Java Virtual Threads

Stop Slamming Downstream Services: Singleflight Request Coalescing with Java Virtual Threads Virtual threads solved your JVM I/O bottlenecks, but downstream internal services are now on fire because…

  • Singleflight request coalescing pattern addresses virtual thread load on services.
  • Developers often use Redis or synchronized blocks, worsening the issue.
  • JVM-based Singleflight ensures efficient, scalable high-throughput handling.

More from Saturday 12 September →