"50000 EOS 砸向你"抽奖活动的算法再解读

5月17号, EOS Cannon社区联合币乎,举办了“50000 EOS 砸向你”活动,在文章内EOS Cannon将抽奖算法代码做了公示,算法链接如下:
https://github.com/bihu-id/bihu-tools/blob/master/bihu-airdrop-tool.py

image.png

社区内也有多篇关于活动公平公正的解读,但还是有些币友有困惑。
比如:

北京时间5月25号中午12:00点(含整点)起,挖出的第一个区块加奖券号来计算出一个随机得分,来最终确认我们的得分。我们最终以得分从大到小排序来确定奖次排挖出的第一个。是3926171661加上我的AA-00004242等于多少啊。 我是怎么排名的。

辉哥能不能。分析下。开奖结果啊。我查了半天。还是不明白。怎么和我的开奖号联系。什么叫谁的大谁第一

下面就讲讲我的理解, 奖券号和最终名次的关系。

首先了解下哈希计算

  • 哈希算法在比特币中的应用有很多,比如生成区块ID,交易ID等等
  • 哈希,就是对任意长度的输入,计算出一个固定长度的输出。比如常用的SHA256算法,不管输入的内容是什么,最后都会计算出一个256位的二进制数字。
  • 确定性 ,如果内容发生改变,它的哈希一定会改变。不可逆,知道哈希无法推出原始内容。
  • 快速的计算时间, 保证了哈希的可用性

官方的计算流程

https://github.com/bihu-id/bihu-tools

  1. 币乎会给每个合格的参与者, 分配一个奖券号,从1开始的整数。
  2. 币乎会在空投活动开始前,公布比特币未来的某个区块号,比如1000。
    • 使用这个区块的hash,计算一个luck number
    • luck_num = hash1(hash2(...hash(n)(block.hash)))
  3. 对每一个奖券号,计算得分score.
    • score = hash( luck_num + 奖券号) % base
  4. 依据得分排序,最高的一等奖,以此等等。
  1. 官方给的奖券号比如“AA-00004242”,最终计算时,使用的是4242这个数字。

  2. 计算得分之前,需要先获取比特币的某个区块号的哈希值。
    在这次活动中,这个区块是北京时间25号中午12点开始挖到的第一个区块。这个信息,可以从比特币浏览器比如https://btc.com/获得。
    假设,今天5月20号是活动结束时间的话,这个区块号是523492,挖到的时间是北京时间 05-20 12:06:35
    https://btc.com/0000000000000000003b7171726062699476825cf3571db2f7d0f7b87c3a856a
    这个区块的哈希是 0000000000000000003b7171726062699476825cf3571db2f7d0f7b87c3a856a

  3. 步骤2中,为什么需要计算一个luck_num?
    大部分情况下,我们可以认为区块的哈希是不可预测的。
    然而当这些哈希值被用来计算某些开奖结果时候(比如比特币的博彩),有人是可以干扰计算结果的。对,就是比特币的矿工。
    当某些奖项的奖励足够大的时候,矿工是可以通过放弃出块,来影响区块的。
    步骤2中,通过多个哈希函数的大约8000万次的运算,保证了即使矿工在挖到区块后,也不能立刻计算出最终的奖次排名(需要一段时间的运算才能拿到luck_num)。从而保证了,矿工也无法通过干扰结果来作弊。

  4. 对每个奖券号,计算一个分数score
    比如对于AA-00004242,计算过程就是将
    luck_num和 4242拼接在一起,计算其sha256的哈希值,作为分数。
    由于这个哈希值比较大,这里做了一个余数处理,保证了最大得分是1000亿。
    这里有一个值得注意的地方,假设总共10万个奖券号,1000亿的分数内,还是有低的概率使得得分相同的。( 根据公告,如果得分相同,奖券号小的排在前面。)

  5. 按照分数从大到小做个排名,就能知道奖次啦。
    在25号上午10点过后,币乎官方应该就会公布最大的奖券号。
    之后等待中午12点的第一个区块,所有的币友都可以开始计算奖券号的名次。机器好的话,应该比官方还能更快的知道。

希望第一名是看本文的其中一位吧。

你可能感兴趣的:("50000 EOS 砸向你"抽奖活动的算法再解读)