Skip to content

Commit fd491dc

Browse files
authored
feat(entropy): add protocol explanation for callbacks + latex formulas (#410)
1 parent 96d88d6 commit fd491dc

File tree

2 files changed

+39
-24
lines changed

2 files changed

+39
-24
lines changed

next.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const withNextra = require("nextra")({
1919
}),
2020
},
2121
},
22+
latex: true,
2223
});
2324

2425
// Use this array as a shorter way to specify redirect URLs so we can write down a lot of them.

pages/entropy/protocol-design.mdx

Lines changed: 38 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,47 +3,61 @@
33
The Entropy protocol is an extension of a classical commit/reveal protocol.
44
The original version has the following steps:
55

6-
1. Two parties A and B each draw secret random numbers, `x_A` and `x_B`.
7-
2. A and B hash their random numbers and share the hashes, `h_A = hash(x_A)` and `h_B = hash(x_B)`
8-
3. A and B reveal `x_A` and `x_B`
9-
4. Both parties verify that `hash(x_A) == h_A` and `hash(x_B) == h_B`
10-
5. The random number `r = hash(x_A, x_B)`
6+
1. Two parties A and B each draw secret random numbers, $x_A$ and $x_B$.
7+
2. A and B hash their random numbers and share the hashes, $h_A = \mathrm{hash}(x_A)$ and $h_B = \mathrm{hash}(x_B)$
8+
3. A and B reveal $x_A$ and $x_B$
9+
4. Both parties verify that $\mathrm{hash}(x_A) = h_A$ and $\mathrm{hash}(x_B) = h_B$
10+
5. The random number $r = \mathrm{hash}(x_A, x_B)$
1111

1212
This protocol has the property that the result is random as long as either A or B are honest.
1313
Thus, neither party needs to trust the other -- as long as they are themselves honest, they can
14-
ensure that the result `r` is random.
14+
ensure that the result $r$ is random.
1515

1616
Entropy implements a version of this protocol that is optimized for on-chain usage. The
1717
key difference is that one of the participants (the provider) commits to a sequence of random numbers
1818
up-front using a hash chain. Users of the protocol then simply grab the next random number in the sequence.
1919

20-
**Setup**: The provider P computes a sequence of `N` random numbers, `x_i` for `(i = 0...N-1)`:
20+
**Setup**: The provider P computes a sequence of $N$ random numbers, $x_i$ for $0 \leq i \leq N-1$:
2121

22-
- `x_{N-1} = random()`
23-
- `x_i = hash(x_{i + 1})`
22+
- $x_{N-1} = \mathrm{random}()$
23+
- $x_i = \mathrm{hash}(x_{i + 1})$
2424

25-
The provider commits to `x_0` by posting it to the Entropy contract.
26-
Each random number in the sequence can then be verified against the previous one in the sequence by hashing it, i.e., `hash(x_i) == x_{i - 1}`
25+
The provider commits to $x_0$ by posting it to the Entropy contract.
26+
Each random number in the sequence can then be verified against the previous one in the sequence by hashing it, i.e., $\mathrm{hash}(x_i) = x_{i - 1}$
2727

2828
**Request**: To produce a random number, the following steps occur.
2929

30-
1. The user U draws a random number `x_U`, and submits `h_U = hash(x_U)` to the contract
31-
2. The contract remembers `h_U` and assigns it an incrementing sequence number `i`, representing which
30+
1. The user U draws a random number $x_U$, and submits $h_U = \mathrm{hash}(x_U)$ to the contract
31+
2. The contract remembers $h_U$ and assigns it an incrementing sequence number $i$, representing which
3232
of the provider's random numbers the user will receive.
33-
3. The user submits an off-chain request (e.g. via HTTP) to the provider to reveal the `i`'th random number.
34-
4. The provider checks the on-chain sequence number and ensures it is > `i`. If it is not, the provider
33+
3. The user submits an off-chain request (e.g. via HTTP) to the provider to reveal the $i$'th random number.
34+
4. The provider checks the on-chain sequence number and ensures it is > $i$. If it is not, the provider
3535
refuses to reveal the ith random number. The provider should wait for a sufficient number of block confirmations
3636
to ensure that the request does not get re-orged out of the blockchain.
37-
5. The provider reveals `x_i` to the user.
38-
6. The user submits both the provider's revealed number `x_i` and their own `x_U` to the contract.
39-
7. The contract verifies `hash(x_i) == x_{i-1}` to prove that `x_i` is the `i`'th random number. The contract also checks that `hash(x_U) == h_U`.
40-
The contract stores `x_i` as the `i`'th random number to reuse for future verifications.
41-
8. If both of the above conditions are satisfied, the random number `r = hash(x_i, x_U)`.
37+
5. The provider reveals $x_i$ to the user.
38+
6. The user submits both the provider's revealed number $x_i$ and their own $x_U$ to the contract.
39+
7. The contract verifies $\mathrm{hash}(x_i) = x_{i-1}$ to prove that $x_i$ is the $i$'th random number. The contract also checks that $\mathrm{hash}(x_U) = h_U$.
40+
The contract stores $x_i$ as the $i$'th random number to reuse for future verifications.
41+
8. If both of the above conditions are satisfied, the random number $r = \mathrm{hash}(x_i, x_U)$.
4242
As an added security mechanism, this step can incorporate the blockhash of the block that the
43-
request transaction landed in: `r = hash(x_i, x_U, blockhash)`.
43+
request transaction landed in: $r = \mathrm{hash}(x_i, x_U, \mathrm{blockhash})$.
4444

4545
This protocol has the same security properties as the 2-party randomness protocol above: as long as either
46-
the provider or user is honest, the number `r` is random. Honesty here means that the participant keeps their
47-
random number `x` a secret until the revelation phase (step 5) of the protocol. Note that providers need to
46+
the provider or user is honest, the number $r$ is random. Honesty here means that the participant keeps their
47+
random number $x$ a secret until the revelation phase (step 5) of the protocol. Note that providers need to
4848
be careful to ensure their off-chain service isn't compromised to reveal the random numbers -- if this occurs,
49-
then users will be able to influence the random number `r`.
49+
then users will be able to influence the random number $r$.
50+
51+
With automatic callbacks the flow is simplified:
52+
53+
1. The user U draws a random number $x_U$, and submits **both** $x_U$ and $h_U = \mathrm{hash}(x_U)$ to the contract
54+
2. The contract remembers $h_U$ and assigns it an incrementing sequence number $i$, representing which
55+
of the provider's random numbers the user will receive. $x_U$ is recorded in the event logs.
56+
3. After sufficient block confirmations, the provider submits a reveal transaction with $x_i$ and $x_U$ to the contract.
57+
4. The contract verifies $\mathrm{hash}(x_U) = h_U$ and $\mathrm{hash}(x_i) = x_{i-1}$ to prove that $x_i$ is the $i$'th random number.
58+
5. If both of the above conditions are satisfied,
59+
the random number $r = \mathrm{hash}(x_i, x_U)$ is generated and a callback is made to the requesting contract.
60+
61+
In this flow, providers can refuse revealing $x_i$ if the final random number $r$ is not in their favor, or
62+
they may be able to access $x_U$ before on-chain submission (e.g. via mempool) and rotate their commitments to influence the random number $r$.
63+
Of course, both of these behaviors are detectable and protocols can blacklist providers that exhibit them.

0 commit comments

Comments
 (0)