Technical solution to eliminate desync in single-player sessions

"
Giving the player the RNG seed at the beginning of the instance means a malicious client knows in advance what the next random outcome will be.

With this alone, you already have lots of hack possibilities. For example, you could have a hack which tells players whether the next monster hit will be blocked or not, when their next attack will be a critical, and so on.


You are still misunderstanding the way the seed works. Yes, you could predict the damage of your next hit, but you could NOT 'change' the damage of your next hit. Your client must adhere to the seed.


"
A malicious client is in full control of the order of events, allowing it to assign specific numbers to specific events, from the pool of random numbers which its allowed.


The client can control the order of events, but it cannot 'assign specific numbers' to events. There is not a 'pool of random numbers', its a deterministic seed. You are misunderstanding the nature of how this works.


"
Let me just save you some trouble on this point; you can mitigate this, but it means uploading essentially a full replay file of the instance to the server upon instance change for verification. Over a large instance with lots of combat, this would likely be dozens of megabytes in size, severely increasing instance transition speed; keep in mind that most internet connections have significantly better download speed than upload speed, and even GGG's download bandwidth is limited.


Currently this amount of data is being sent back and forth between the client. My solution proposes that the client streams data to the server and that the server does not need to send data back to the client. This will significantly reduce the amount of bandwidth required.


"
A malicious client is still in full control of whether events occurred at all.


I addressed this in my previous post.
"
How so? Boss rolls a crit - whoops nope, that was my crit, the boss gets this other non-crit roll that came afterwards instead. Computers are really good at crunching numbers, and you only need to look at and reorder relatively small subsets of the data, not the whole sequence.


You are misunderstanding how the deterministic seed works. Your client can't make the boss 'reroll' his attack/crit without corrupting the entire snapshot.
"
Seriously? Do you really believe packet loss doesn't occur naturally?

A significant percentage of user packets never make it to their own router, assuming a wireless connection.


Packet loss is completely different from a full lapse in the data stream. This data stream would utilize a TCP stream, whereas the current system relies heavily on UDP packets.

I do appreciate you playing devil's advocate ScrotieMcB, because I am looking for someone that can refute this solution. I know that you want desync to be eliminated as much as me, so your critical feedback is definitely necessary to finding a solution. And I certainly do not want cheating to be possible, so that's why I have put a lot of thought into making this system work while minimizing any chance of cheating.
Last edited by qwave on Nov 18, 2013, 1:37:05 AM
"
Tuoweit wrote:
"
syrioforel wrote:
"
Tuoweit wrote:
But the client would have full authority to reorder the actions any way it pleases in order to optimize the outcome for the player, as long as it followed the PRNG sequence.


Computing even a single alternate sequence of actions that would collide with what you actually did would be very difficult.


How so? Boss rolls a crit - whoops nope, that was my crit, the boss gets this other non-crit roll that came afterwards instead. Computers are really good at crunching numbers, and you only need to look at and reorder relatively small subsets of the data, not the whole sequence.


That depends on how many things you allow to modify the RNG state, how often your updates need to be sent up to the server (needs to be properly addressed still), etc.
IGN: SplitEpimorphism
"
qwave wrote:
There is not a 'pool of random numbers', its a deterministic seed. You are misunderstanding the nature of how this works.
Bullshit. It is a pool of numbers.

Deterministic seed #XXXXXXX = RandomNumber1, RandomNumber2, RandomNumber3, RandomNumber4, ...

When you have a seed, a deterministic random number generator is no longer truly random, it's deterministic. It's a specific set of numbers, and when the client can order events, it's a pool of numbers which can be ordered as it wishes so long as it knows the seed in advance.

Just in case you didn't know this already, GGG already sends the client a random seed for the map layout of an instance. So guess what? We have fully functioning maphacks in the game right now. That is just what happens when you give seeds to the client.
When Stephen Colbert was killed by HYDRA's Project Insight in 2014, the comedy world lost a hero. Since his life model decoy isn't up to the task, please do not mistake my performance as political discussion. I'm just doing what Steve would have wanted.
Yeah, it would be extremely difficult to modify the RNG state without generating completing new permutations of data. As long as the RNG state only changes when you perform actions, then it will be virtually impossible to undo full seconds of snapshot because the server has already received the stream.
I'm not playing devil's advocate. I'm playing fuck this suggestion. Because fuck this suggestion.
When Stephen Colbert was killed by HYDRA's Project Insight in 2014, the comedy world lost a hero. Since his life model decoy isn't up to the task, please do not mistake my performance as political discussion. I'm just doing what Steve would have wanted.
"
qwave wrote:
"
How so? Boss rolls a crit - whoops nope, that was my crit, the boss gets this other non-crit roll that came afterwards instead. Computers are really good at crunching numbers, and you only need to look at and reorder relatively small subsets of the data, not the whole sequence.


You are misunderstanding how the deterministic seed works. Your client can't make the boss 'reroll' his attack/crit without corrupting the entire snapshot.


You're not rerolling, you're changing the order of events to distribute more good rolls to the player.
"
qwave wrote:
"
Couldn't you (the player) simply introduce an artifical delay between actions on the client and sending the info to the server? At the very least this could be exploited to prevent deaths in hardcore.


Let's assume someone had the ability to do this dependably. So what you're suggesting is that I am playing hardcore, and a mob kills me. However, since my client is authoritative, I can simply 'roll myself back' before this death and not actually notify the server that I died.

There are two considerations I would make in this situation:


1. You could only roll yourself back as far as the last snapshot data you streamed. The client will be continually streaming your snapshot in realtime.

2. The server must mandate that it receives a continuous stream of data, otherwise it will forcefully sync you back to the last known state. You might consider this the same thing as the 'desyncs' that we already have. However, this particular 'desync' has nothing to do with being out of 'sync' as much as it has to do with an actual 'loss of connection' (The actual data stream connection has been severed). This would not occur nearly as frequently as the current desync.


What's the granularity of the client->server updates?

If each action is streamed with timestamp, you could prematurely cut off the stream upon encountering a bad result, after computing the bad result.

You hypothetically would have the the ability to undo anything within a certain time window. With better connections you can guarantee a smaller window, but I'm not sure how small.

The above example given of possibly just-barely-avoiding an incoming crit could fall into that bad case space.
IGN: SplitEpimorphism
"
Bullshit. It is a pool of numbers.

Deterministic seed #XXXXXXX = RandomNumber1, RandomNumber2, RandomNumber3, RandomNumber4, ...

When you have a seed, a deterministic random number generator is no longer truly random, it's deterministic. It's a specific set of numbers, and when the client can order events, it's a pool of numbers which can be ordered as it wishes so long as it knows the seed in advance.

Just in case you didn't know this already, GGG already sends the client a random seed for the map layout of an instance. So guess what? We have fully functioning maphacks in the game right now. That is just what happens when you give seeds to the client.


Scrotie, I appreciate your criticism, but you still have a misunderstanding on how this 'pool of numbers' is used. Lets assume your pool of numbers are:
0.52, 0.1, 0.9, 0.33

This means that you would have to fabricate a situation in which these randomly generated numbers are used to generate random numbers in your favor.

To further reduce the likelyhood of doctoring the numbers, the server could send a seed for EACH type of action. This would make it even more difficult to perform a series of actions with a favorable outcome.

Report Forum Post

Report Account:

Report Type

Additional Info