Hacker News new | ask | show | jobs
by pshc 603 days ago
> it feels like the SERVER is tracking the time

TBH this is what I expected for all online chess. How else to reconcile the two players' differing clocks and also prevent client-side cheating?

5 comments

I guess my naive frustration comes from crazy fps games tracking things so precisely and yet somehow Chess.com can’t handle a turn based game?! Honestly.

I do recognize that fps games utilize predictive algorithms and planning to estimate future player positions but still, turn based networking with 100ms accuracy should be a solved problem

Bullet chess is almost an RTS ;) You need starcraft-like micro ;)
Yeah honestly I agree like it would be nice if they switched to WebRTC or UDP.
So you need to send a few bytes of information every few seconds, but you want to spam the network with UDP packets containing those few bytes?
Sure; why not? If I can stream videos on that same network for entertainment, or play another online, multiplayer game, why not use UDP if it gives a better user experience? It's not like UDP transport of those bytes is significantly worse network-wise and certainly lighter weight than those other alternatives.
Every single online multiplayer game that cares about latency reimplements a subset of HTTP over UDP.
>reimplements a subset of HTTP over UDP.

TCP, although I like to imagine FPS games where shooting someone sends "DELETE /players/n00b HTTP/1.1" to the server.

Yes TCP!!!!
Huh, that's not what I would expect at all. If you are having custom network protocols anyway, why deal with all the overhead that even a subset of HTTP brings? You might as well make an entirely new protocol at that point.
Is TCP. Why everybody does it you ask?
Netcode dev here. Predicting the clock is a trivially solved problem. The client and server know the latency between each other, the server can offset the timestamp on the input from the client to compensate for this difference, and the client can offset it's rendering of the clock data from the server. The same techniques used in regular online gaming would apply here. The only X factor here is the impact of the client lieing about its latency to the server, perhaps that could have an impact, not sure.
> The only X factor here is the impact of the client lieing about its latency to the server, perhaps that could have an impact, not sure.

on lichess it does have an impact. lichess has a thing they call lag compensation where the server can add time to a player's clock after the server receives their move.

The goal is to make it fair for someone with high lag playing someone with low lag.

I don't know the exact cheating method used. I'll have a guess, though. What if someone spent a few seconds looking at the board before making their move, and then adding (edit: oops, subtracting) a few seconds to their clock in their response packet. The server would see the client made their move instantly based on the time in the response packet, but it took a few seconds for the server to receive the packet. i.e. lag. So it might add time to compensate for the perceived lag.

Lag compensation cheating is a frequent topic on the lichess forums.

> How else to reconcile the two players' differing clocks and also prevent client-side cheating?

Is there a point in preventing cheating, really? I can just make a bot...

It hasn’t been done client side in any pvp game I’ve heard of.
I'm pretty sure freechess.org did.
How is it being done client side?
Freechess shipped a binary called “timeseal” that did the calculations for you and encrypted the communications. It was not foolproof—-not by a long shot, but it also didn’t completely suck.

You can read about what became timeseal here. https://eprint.iacr.org/2004/203.pdf

Well it's a long time since I played there. But it had custom chess clients, which I assume just recorded how much time your move actually took and sent that with the move.

Yes, it's easy to cheat with this, but it's very easy to cheat with chess anyway.

This makes the most sense. Start a timer when the UI actually hands control to the player whose move it is, stop the timer when they've completed their move, and simply subtract that from their remaining time. The interval gets sent to the server and relayed to the other player to update their opponent's clock accurately.
Track the two clients pings? What client side cheating prevention would you need to do in chess? Afaik you can't cheat by clipping through walls or jumping around on the map.
The client side cheating would by lying about when you received the packet in order to give yourself more time to think. Even if you only shifted it by 200ms per move, that could add up to a lot over the course of a long game.
To give additional context: bullet chess can go down to 1 minute per player. Lying about a few millisecond per move there is huge.
Cheat by giving yourself more time