Author Topic: 有关基础DPOS类博彩DAC随机种子的产生方式的讨论  (Read 2678 times)

0 Members and 1 Guest are viewing this topic.

Offline xiahui135

  • Sr. Member
  • ****
  • Posts: 496
    • View Profile

Offline lastagile

  • Full Member
  • ***
  • Posts: 144
    • View Profile
谢谢翻译


从我的 iPhone 发送,使用 Tapatalk

Offline BTSdac

  • Hero Member
  • *****
  • Posts: 1219
    • View Profile
  • BitShares: K1
对于菠菜类dac 的攻击方法有很多,
比如:代表联合作恶,代表拒绝出块而导致的代表中奖几率变大,A|A攻击
github.com :pureland
BTS2.0 API :ws://139.196.37.179:8091
BTS2.0 API 数据源ws://139.196.37.179:8091

Offline BTSdac

  • Hero Member
  • *****
  • Posts: 1219
    • View Profile
  • BitShares: K1
博彩类DAC有可能成为一个非常有前途DAC,基础博彩类应用非常关键的(去中心化博彩比较于中心化博彩的优势的地方)就是生产一个不受任何第三方控制的随机数,使用这个随机数衍生出各种应用。
但随机数的产生是非常困难的一件事件,必须要满足以下条件的随机数才是可靠的
1.所有的参与者都提供随机种子,或者所有的参与者各自委托自己信任的人提供随机种子。
2.所有的种子提供者能在确认其他提供者不能更改种子的前提下公布自己的种子。
3.种子本身的随机性。

BM 在DPOS中给出了非常好的随机数产生方式
让101位受讬人担任被信任的种子提供者。
“分布式”意味着一个区块的随机数事由前一轮101位受讬人所提供的密钥产生,只要至少其中一位是诚实的,结果就会是真正的随机。“可证明”表示他们需要在下一个回合发布密钥的哈希值到区块链。根据密钥所得出的哈希值必须和之前发布的哈希值相同。由于两者必须一致,因此受托人不可能通过公开不诚实的密钥来作弊。

因此在DPOS中,我们可以透过以下的伪代码 (包含了固定数量的受讬人)来阐述:

代码:

struct Block
 
{
 
  hash  HASH( S[n] ) // where n is the index of secrets generated by this delegate
 
  hash  S[n-1]
 
};
每个区块中的头部中包含一个HASH(S[n]),其中S[n]是这个受托人下一次生产区块时将揭晓的密钥。同时当前区块也包含上一个区块的秘钥S[n-1]。

如此一来,我们就有了密钥的串流,每隔一个产块间隔 (15-30秒)就会提供一组密钥。从这个串流我们可以用以下方式产生区块的随机数R:

但这方法其实有一些瑕疵,我讲他命名为A|A攻击,
也就是说如果上一轮代表A作为最后一个出块者,那么他就知道在下一轮中他出块的位置,如果他下一轮中出块的位置是首位的话,那么他就可以完全控制下轮首位块的随机数。当然如果多个代表联合起来的话会让问题变的非常严重。
这个瑕疵在BTS系统可以接受,因为随机数在BTS系统(现阶段)唯一的作用就是确定下一轮出块的顺序,也就是101个块才使用一次随机数,而101个块就会完成一次代表顺序洗牌,所以在BTS系统不存在威胁。而在博彩类游戏中有可能需要每块都使用这个随机数。所以对随机数的要求更高了,将变成大漏洞。

这个问题的根源是 全洗牌模式下会产生如下的出块顺序
A|A (竖线表示前后轮)
A在两次公布自己前轮秘密和下轮秘密的HASH 的间隔为0.那么A中间就没有任何其他因子去干扰他的随机数,从而是A有1/101的几率控制下轮第一个块的随机数。(在下轮中A有1/101的几率在首位)。

所以在下面的方法中就是想方设法让A的前后位置间隔尽量拉大,再确定下轮顺序之前,前轮末块的随机种子是有效的,可以多次使用这个随机种子排序不同的代表。

名称解释
代表间隔: 同一代表两次出块的间隔。
前轮:     前一轮出块代表
后轮:     相对于前轮或者当前轮
洗牌:    在前轮结束后,在后轮开始前 将2-101个代表按照前轮的随机数重新确定先后出块顺序。DPOS 每轮都把101个代表出块顺序全洗牌一次

方法一,前后轮首末相同轮换制
1.如果在新一轮的顺序中首位和前轮末位为同一代表
,按照随机种子,置换新轮首末顺序。
此方法可以避免前后轮A|A攻击,
但无法避免一个人控制多个代表的攻击,比如 BA|BA攻击, (AB被一个代表控制)

方法二 新轮位置置换法
1.新轮的顺序出来后,检查前后轮代表位置间隔,
2.按代表位置间隔排序,
3.if (如果代表间隔小于 常数N ,) 讲他的位置与 反向间隔最长的代表置换
4.反复循环,直到所有代表位置都满足 间隔大于N的条件
 
在这种情况下,能发起的攻击只有  A|XXXXXA 攻击  (XXXXX:个数为常数N的代表)
这样只有 N个代表串通后才可能发起攻击,并且攻击成功几率非常低。为小小量(远远低于1/101)的数量级

不足:如果取高N值是不是对 代表顺序“洗牌”随机数有影响? 收敛速度?

方法三  上下区分别洗牌
1.让所有代表按照上轮的顺序,分成上下半区, 上半区 1-50  下半区 51-101
2.新轮中上半区(1-50)的代表洗牌,作为后轮1-50的出块顺序 同理下半区代表洗牌,作为后轮51-101代表出块顺序
这样一来,所有的代表前后轮的间隔都大于50

能发起的攻击是 A|XXXXXA 攻击(XXXXX:50个勾结的代表)并且攻击成功几率非常低。为小小量(远远低于1/101)的数量级

不足: 上下半区代表位置固化。

方法四:2/3洗牌
1.讲上轮代表按上轮出块顺序分为 2个区,  A区 1-67  B区 67-101  (代表总数最好是3的倍数 并且为奇数)
2.随机选取 A区 的33个代表,让其加入B区,
3.A区的代表随机内部洗牌,顺序作为新轮顺序的1-34
4.B区代表随机内部洗牌,按先后作为新轮35-101的顺序。

能发起的攻击是A|XXXXXA攻击 (XXXXX:相互勾结的 33%的代表)并且攻击成功几率非常低。为小小量(远远低于1/101)的数量级


方法五:两轮秘密随机种子
每个代表的随机秘密种子需要下两轮 (102-302块后揭晓)
A-2|XXXXA-1|A0
A在A0时间戳时,揭晓的是A-2时间戳的 秘密种子,在A-2 时间戳时,A预测他出现在下轮末尾的几率为1/101 ,并且出现在下下轮首位的几率是 1/101*101 但就算他有幸运得到A|XXAXX|A A这样的出块顺序,但由于他的随机数之间被其他代表的随机因子扰动了,不可能完成攻击。

1.每个代表在第一次生成块的时候需要公布两个秘密种子的HASH ,一个为下一轮,一个为下下轮,
2.以后每次出块,公布前前轮的秘密种子,和下下轮的秘密种子HASH.
这让每个代表设下秘密和公布秘密的价格都大于101块。而着101个间隔包含全部的代表喂入的种子,所以如果只要一个代表是诚实的那么,每块的随机数都是可信的。避免A|A攻击。
github.com :pureland
BTS2.0 API :ws://139.196.37.179:8091
BTS2.0 API 数据源ws://139.196.37.179:8091