Skip to content

Latest commit

 

History

History
22 lines (15 loc) · 2.11 KB

SWC-120.md

File metadata and controls

22 lines (15 loc) · 2.11 KB

Title

Weak Sources of Randomness from Chain Attributes

Relationships

CWE-330: Use of Insufficiently Random Values

Description

Ability to generate random numbers is very helpful in all kinds of applications. One obvious example is gambling DApps, where pseudo-random number generator is used to pick the winner. However, creating a strong enough source of randomness in Ethereum is very challenging. For example, use of block.timestamp is insecure, as a miner can choose to provide any timestamp within a few seconds and still get his block accepted by others. Use of blockhash, block.difficulty and other fields is also insecure, as they're controlled by the miner. If the stakes are high, the miner can mine lots of blocks in a short time by renting hardware, pick the block that has required block hash for him to win, and drop all others.

Remediation

  • Using external sources of randomness via oracles, and cryptographically checking the outcome of the oracle on-chain. e.g. Chainlink VRF. This approach does not rely on trusting the oracle, as a falsly generated random number will be rejected by the on-chain portion of the system.
  • Using commitment scheme, e.g. RANDAO.
  • Using external sources of randomness via oracles, e.g. Oraclize. Note that this approach requires trusting in oracle, thus it may be reasonable to use multiple oracles.
  • Using Bitcoin block hashes, as they are more expensive to mine.

References