Is there some way to generate a non-predictable random number in a decentralised network?

Is there a way to generate a random number with given restrictions:

• It will be used in a decentralised network with a big number of peers (no central authority to generate it)
• Its generation should not rely on any third-party service (for example, going to a specific website)
• Its generation is triggered by a semi-random data being sent through the network, and it should relate to the data
• The computer sending the data should not have an advantage in determining the random number (for example, computing some number that would have a really high chance of becoming the seeked number)

I was thinking of using a random number like that to counter a 51% attack against the Bitcoin network. The main problem there is that an attacker with a lot of computation power can compute a couple "blocks" in advance and only release them to counter "blocks" generated by legitimate users. I figured a way to counter that would be by requiring generation of some random number that couldn't be pre-computed in advance, but only when a block is sent through the network. Required use of that number would then invalidate blocks that are precomputed beforehand, preventing the attack.

So, is there a way to generate a random number like that described above?

-

3 Answers

A service that provides such numbers is called a random beacon.

Since everyone has to agree on what a beacon's value is and peers may not have a complete view of the network, it is very difficult to construct a universally verifiable value using only internal network data. Since data only becomes canonical when it is included in a block (a block that is accepted by everyone else), I'm not sure what else could be used.

If you relax the internal-only constraint and allow external beacons, you will hopefully be able to use NIST's beacon service. You can also construct values with financial data however this only works when markets are open.

-

The classic way to do this is to have all parties commit to individual random values by publishing a secure hash of a suitably random-nonce-padded number. Once the commitments have been distributed, the parties open the commitments by publishing the nonce and the number. The numbers are combined in some previously agreed suitable fashion such as adding them modulo some number or xoring them together. As long as your value was included then you are confident that the result is random. If the numbers used are large enough, the nonce is not required.

-

This is a well-known problem from the secure multi-party computation literature, known as the coin-tossing problem. Several people want to get together and jointly generate an unbiased coin toss, where the security property is that no one can influence the bias of the coin.

The problem is impossible if adversaries are allowed to be computationally unbounded. The simplest protocol in the computationally bounded setting is the following (I'll describe it for generating a single bit -- it generalizes naturally for generating multiple bits):

1. Party $i$ publishes a commitment to a secret randomly chosen bit $b_i$.

2. After everyone has posted their commitment, everyone opens their commitments. The final coin is taken to be $b_1 \oplus \cdots \oplus b_n$.

As long as one person generates their $b_i$ honestly, the outcome is an unbiased coin. This follows from the hiding and binding properties of the commitment scheme.

-

Actually, your protocol is vulnerable to a classic attack.  Suppose there are two parties, Alice and Bob, and Bob goes last.  Then, Bob can ensure the final bit will be 0 as follows.  Bob can copy Alice's commitment, then copy Alice's opening of the commitment, which ensures that $b_1=b_2$ and thus the final coin is always 0.  To fix this, you could compute the final coin as $H(b_1,\dots,b_n)$, or use other standard fixes. – D.W. Sep 7 '12 at 8:24
{"extraction_info": {"found_math": true, "script_math_tex": 0, "script_math_asciimath": 0, "math_annotations": 0, "math_alttext": 0, "mathml": 0, "mathjax_tag": 0, "mathjax_inline_tex": 6, "mathjax_display_tex": 0, "mathjax_asciimath": 0, "img_math": 0, "codecogs_latex": 0, "wp_latex": 0, "mimetex.cgi": 0, "/images/math/codecogs": 0, "mathtex.cgi": 0}, "config": {"markdown_headings": false, "markdown_code": true, "boilerplate_config": {"ratio_threshold": 0.18, "absolute_threshold": 10, "end_threshold": 15, "enable": true}, "remove_buttons": true, "remove_image_figures": true, "remove_link_clusters": true, "table_config": {"min_rows": 2, "min_cols": 3, "format": "github"}, "remove_chinese": true, "remove_edit_buttons": true, "extract_latex": true}, "english_confidence": 0.9499865770339966, "perplexity_flag": "middle"}