https://blog.csdn.net/xp_lx1/article/details/85229070
随机种子
利用区块中的数据作为随机种子
一个可能的方案
- RAM的交易数据
- 某些活跃度比较高的dapps公开的数据
- 太依赖于别人的公开数据了,如果别人的数据格式变了,你的智能合约可能也要跟着更新
- 如果这些公开的数据变化的频率,有时高,有时低,你必须收集足够多的频繁变化公开数据才能确保每时每刻的不可预测性
- 目前EOS上满足条件的可作为随机种子使用的公开数据仍然比较少
成熟可靠的方案
- 用户A和B各有一个自己的种子,分别是
seedA
和seedB
,但一开始互相保密的。 - A对
seedA
进行hash运算
,生成seedA_hash
,然后把seedA_hash
发给智能合约。 - B对
seedB
进行hash运算
,生成seedB_hash
,然后把seedB_hash
发给智能合约。 - 在上面的步骤完成之后,A把
seedA
发送给智能合约 - B把
seedB
发送给智能合约 - 智能合约先验证A和B的seed,验证通过后,再对两个seed进行运算,根据运算结果判定输赢。
- 很难根据hash(seed)的结果倒推出seed
- 不同的seed进行hash之后,生成的结果极大概率是不同。这个极大概率无限接近于100%
改进的版本
- 用户A和B各有一个自己的种子,分别是
seedA
和seedB
,但一开始互相保密的。 - B对
seedB
进行hash运算
,生成seedB_hash
,然后把seedB_hash
发给智能合约。 - A对
seedA
进行hash运算
,生成seedA_hash
,然后把seedA_hash
发给智能合约。 - 在上面的步骤完成之后,A把
seedA
发送给智能合约 - B把
seedB
发送给智能合约 - 智能合约先验证A和B的seed,验证通过后,再对两个seed进行运算,根据运算结果判定输赢。
- 用户A和B各有一个自己的种子,分别是
seedA
和seedB
,但一开始互相保密的。 - B对
seedB
进行hash运算
,生成seedB_hash
,然后把seedB_hash
发给智能合约。 - A把
seedA
发送给智能合约 - B把
seedB
发送给智能合约 - 智能合约先验证B的
seedB
是否合法,验证通过后,再对两个seed进行运算,根据运算结果判定输赢。
- 用户A和B各有一个自己的种子,分别是
seedA
和seedB
,但一开始互相保密的。 - B对
seedB
进行hash运算
,生成seedB_hash
,然后把seedB_hash
交给A。 - A把
seedA
以及seedB_hash
发送给智能合约 - B把
seedB
发送给智能合约 - 智能合约先验证B的
seedB
是否合法,验证通过后,再对两个seed进行运算,根据运算结果判定输赢。
还能再改进吗?