币乎糖果空投算法解析(python)-3

小Co:上一篇讲解了怎么根据比特币区块哈希生成幸运数的,哈哈小新听懂了没?

小新:说实话上篇的内容挺难理解的,新的知识点好多,我没有理解很透彻。

小Co:没关系,那些内容你只要着重关注2点就行了。第一,区块哈希和幸运数是一一对应的,因为未来的某个时间点的区块哈希事先完全预料不到,所以这个幸运数也是无法预料的,这也是抽奖算法公平的体现;第二,python里使用hash算法的步骤就是那么3步,现在你知道怎么大概用就行了,之后我会专门花一篇文章,来详细说说hash在python里怎么运用。

小新:嗯嗯,这就好。那现在幸运数也生成了,接下来就该详细说说怎么用它来产生每个人的分数了吧。

小Co:是的,终于来到对个人来说,最关心的部分了。记得上文说的for循环吧,对于循环里的每个奖券号,都会调用score_for_each_lottery函数计算分数。现在我们就看看它的实现:

注意函数入参包括了幸运数和某个人的奖券号:

33行创建了一个sha256算法的hash对象h,注意这里生成对象的方法和上一篇中h = hashlib.new(n)有些不同,这是因为上一篇需要使用不同hash算法,每次在for循环里产生不同hash对象,而这里已经确定使用sha256算法,所以直接生成sha256这个类型的对象。

34行把幸运数放进去进行hash计算,这一行执行之后,对象h的值实际上就已经变化了,但是对于不同的奖券号来说此时h的值还是一样。

35行把奖券号放进去继续计算后,每一张奖券号的h就截然不同了,这里要稍留意的是,上文也提到过,hash算法计算必须传入二进制的值,所以这里也用bytes函数,把lottery_id进行了转化。

37行把base设置成了10的11次方的一个超大数,**的就是乘方的意思。哈哈,这个数很大吧,下面就知道它的作用了。

38行符号比较多,我们从内到外分解来看。h.hexdigest()是把h的值用16进制表示出来,所以可以看到,hash算法里一般输入的是2进制,输出是16进制。而int(h.hexdigest(), 16)就是把16进制的h值转变成10进制的数,这样就把hash算法的结果变成了我们平时使用的数字了,最后把它除上base,也就是10的11次方,就得到了每个人的最终分数。

小新:哇,短短几行代码,背后体现的东西也不少呢。我真没想到hash算法算完之后数字会这么大,要拿base那么大的值去做除法。我都数不清了,这得是多少亿了啊。。。

小Co:确实是一个超大的数,最后实际上算出来的score分数的值,都还是亿的数量级,你想想没除以base之前有多大。

小新:My god,我脑袋不够用了。

小Co:说完了每个人的分数是怎么生成的,到这实际上奖券计算的主要流程就已经说完了。但是接下来还有一些工作没有完成。

小新:咦?分数不是都已经算出来了吗,还要干嘛?

小Co:你想想,分数是算出来的,那这些分数要怎么处理呢,是直接显示在屏幕上?还是找个地方保存起来?

小新:emm...应该是保存起来吧,显示在屏幕上别人又看不到。

小Co:是的,保存起来才是正确的选择,毕竟好几万人的得分结果,屏幕上显示是完全不合理的。一般来说我们会把结果数据保存到文件里去。下面我们看看得分算完之后,最后的步骤是怎么样的。

这是我们之前贴过的代码,在第2篇里也简要分析过,现在65行计算奖券分数已经完成了。再详细说说后面的内容:

66行的作用就是把所有奖券的分数从高到低进行排序。这一行的内容其实挺多,也有一丢丢复杂,我把设计到的知识点说出来,小新你有兴趣可以继续去了解。Sorted()函数是用来排序的,key = 表示是根据什么内容来排序的。lambda t: t[1]是lambda表达式,表示传入t的话,将会返回t[1],reverse =True表示进行倒序排序(也就是从大到小),由于reward_map是字典的数据结构,reward_map.items()表示其中的所有项,所以这里key(排序依据)就是分数。

最后再看看把分数保存到文件的函数:

58行用open新建了一个rewards.txt文件,’w’表示会对这个文件写入内容。

59到61行是一个for循环,遍历奖券结果rewards,r是每个奖卷的结果。f.write表示每次向文件里写入什么内容,这里可以看到依次写入了一个递增的数字(str(c)),airdrop_prefix(‘AA’),‘-’,奖卷结果(str(rewards[r])), 换行符'\n'。str(n).zfill(7)限制n的长度是7,向右对齐,左边不足的补0。

最后63行f.close()表示文件写完了,关闭这个文件。

好了,到这里整个EOS空投的算法就结束了,小新你感觉如何呀?

小新:就结束了吗?感觉还意犹未尽呢,好多懵懵懂懂的内容,不过我也会主动去学习文章里提到的python基础知识的,下次肯定不会这么小白了!

小Co:哈哈,那可要好好期待了。好了,小新,那我们下一个系列见吧。88~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容