区块链的随机数之伤

https://blog.csdn.net/xp_lx1/article/details/85229070

 

 

 


 

随机种子





 

 

利用区块中的数据作为随机种子

 

 

 

 

 

 

一个可能的方案

 

  • RAM的交易数据
  • 某些活跃度比较高的dapps公开的数据

 

 

  1. 太依赖于别人的公开数据了,如果别人的数据格式变了,你的智能合约可能也要跟着更新
  2. 如果这些公开的数据变化的频率,有时高,有时低,你必须收集足够多的频繁变化公开数据才能确保每时每刻的不可预测性
  3. 目前EOS上满足条件的可作为随机种子使用的公开数据仍然比较少

成熟可靠的方案

 

 



 

 

  1. 用户A和B各有一个自己的种子,分别是seedAseedB,但一开始互相保密的。
  2. A对seedA进行hash运算,生成seedA_hash,然后把seedA_hash发给智能合约。
  3. B对seedB进行hash运算,生成seedB_hash,然后把seedB_hash发给智能合约。
  4. 在上面的步骤完成之后,A把seedA发送给智能合约
  5. B把seedB发送给智能合约
  6. 智能合约先验证A和B的seed,验证通过后,再对两个seed进行运算,根据运算结果判定输赢。

 

 

 

 

 

  1. 很难根据hash(seed)的结果倒推出seed
  2. 不同的seed进行hash之后,生成的结果极大概率是不同。这个极大概率无限接近于100%

 

改进的版本

 

 

 

 

  1. 用户A和B各有一个自己的种子,分别是seedAseedB,但一开始互相保密的。
  2. B对seedB进行hash运算,生成seedB_hash,然后把seedB_hash发给智能合约。
  3. A对seedA进行hash运算,生成seedA_hash,然后把seedA_hash发给智能合约。
  4. 在上面的步骤完成之后,A把seedA发送给智能合约
  5. B把seedB发送给智能合约
  6. 智能合约先验证A和B的seed,验证通过后,再对两个seed进行运算,根据运算结果判定输赢。

 

  1. 用户A和B各有一个自己的种子,分别是seedAseedB,但一开始互相保密的。
  2. B对seedB进行hash运算,生成seedB_hash,然后把seedB_hash发给智能合约。
  3. A把seedA发送给智能合约
  4. B把seedB发送给智能合约
  5. 智能合约先验证B的seedB是否合法,验证通过后,再对两个seed进行运算,根据运算结果判定输赢。

 

 

  1. 用户A和B各有一个自己的种子,分别是seedAseedB,但一开始互相保密的。
  2. B对seedB进行hash运算,生成seedB_hash,然后把seedB_hash交给A。
  3. A把seedA以及seedB_hash发送给智能合约
  4. B把seedB发送给智能合约
  5. 智能合约先验证B的seedB是否合法,验证通过后,再对两个seed进行运算,根据运算结果判定输赢。

 

 

还能再改进吗?