5月17号, EOS Cannon社区联合币乎,举办了“50000 EOS 砸向你”活动,在文章内EOS Cannon将抽奖算法代码做了公示,算法链接如下:
https://github.com/bihu-id/bihu-tools/blob/master/bihu-airdrop-tool.py
社区内也有多篇关于活动公平公正的解读,但还是有些币友有困惑。
比如:
北京时间5月25号中午12:00点(含整点)起,挖出的第一个区块加奖券号来计算出一个随机得分,来最终确认我们的得分。我们最终以得分从大到小排序来确定奖次排挖出的第一个。是3926171661加上我的AA-00004242等于多少啊。 我是怎么排名的。
辉哥能不能。分析下。开奖结果啊。我查了半天。还是不明白。怎么和我的开奖号联系。什么叫谁的大谁第一
下面就讲讲我的理解, 奖券号和最终名次的关系。
首先了解下哈希计算
- 哈希算法在比特币中的应用有很多,比如生成区块ID,交易ID等等
- 哈希,就是对任意长度的输入,计算出一个固定长度的输出。比如常用的SHA256算法,不管输入的内容是什么,最后都会计算出一个256位的二进制数字。
- 确定性 ,如果内容发生改变,它的哈希一定会改变。不可逆,知道哈希无法推出原始内容。
- 快速的计算时间, 保证了哈希的可用性
官方的计算流程
https://github.com/bihu-id/bihu-tools
- 币乎会给每个合格的参与者, 分配一个奖券号,从1开始的整数。
- 币乎会在空投活动开始前,公布比特币未来的某个区块号,比如1000。
- 使用这个区块的hash,计算一个luck number
- luck_num = hash1(hash2(...hash(n)(block.hash)))
- 对每一个奖券号,计算得分score.
- score = hash( luck_num + 奖券号) % base
- 依据得分排序,最高的一等奖,以此等等。
-
官方给的奖券号比如“AA-00004242”,最终计算时,使用的是4242这个数字。
-
计算得分之前,需要先获取比特币的某个区块号的哈希值。
在这次活动中,这个区块是北京时间25号中午12点开始挖到的第一个区块。这个信息,可以从比特币浏览器比如https://btc.com/获得。
假设,今天5月20号是活动结束时间的话,这个区块号是523492,挖到的时间是北京时间 05-20 12:06:35
https://btc.com/0000000000000000003b7171726062699476825cf3571db2f7d0f7b87c3a856a
这个区块的哈希是 0000000000000000003b7171726062699476825cf3571db2f7d0f7b87c3a856a -
步骤2中,为什么需要计算一个luck_num?
大部分情况下,我们可以认为区块的哈希是不可预测的。
然而当这些哈希值被用来计算某些开奖结果时候(比如比特币的博彩),有人是可以干扰计算结果的。对,就是比特币的矿工。
当某些奖项的奖励足够大的时候,矿工是可以通过放弃出块,来影响区块的。
步骤2中,通过多个哈希函数的大约8000万次的运算,保证了即使矿工在挖到区块后,也不能立刻计算出最终的奖次排名(需要一段时间的运算才能拿到luck_num)。从而保证了,矿工也无法通过干扰结果来作弊。 -
对每个奖券号,计算一个分数score
比如对于AA-00004242,计算过程就是将
luck_num和 4242拼接在一起,计算其sha256的哈希值,作为分数。
由于这个哈希值比较大,这里做了一个余数处理,保证了最大得分是1000亿。
这里有一个值得注意的地方,假设总共10万个奖券号,1000亿的分数内,还是有低的概率使得得分相同的。( 根据公告,如果得分相同,奖券号小的排在前面。) -
按照分数从大到小做个排名,就能知道奖次啦。
在25号上午10点过后,币乎官方应该就会公布最大的奖券号。
之后等待中午12点的第一个区块,所有的币友都可以开始计算奖券号的名次。机器好的话,应该比官方还能更快的知道。
希望第一名是看本文的其中一位吧。
网友评论