zoukankan      html  css  js  c++  java
  • 用python阐释工作量证明(proof of work)

    了解比特币的都知道挖矿非常耗电,这是由于比特币用到了工作量证明.

    工作量证明是指系统为达到某目标而设置的工作度量方法.一開始是用在网络攻防上,大大提高攻击者的计算量,攻击成本也就上去了.
    工作量证明须要由工作者和验证者双方共同完毕.它有两层含义.
    • 1.工作者须要完毕的工作必须有一定的量,这个量由验证者给出.
    • 2.验证者能够迅速的检验工作量是否达标,注意这里的检验完毕过程必须简单.

    举几个样例
    • A跟B说,你给我还原这个魔方,B还原魔方须要非常多时间,而A验证却非常快,仅仅须要看一眼即可了.
    • A跟B说,你给我解这个10次方程,过程非常麻烦,可是结果easy验证.
    • A跟B说,你给我把这个游戏玩通关,B须要一定时间,而A验证却非常快.
    • RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分easy,可是想要对其乘积进行因式分解却极其困难.
    • ...

    在计算机系统中,能够这样设计:
    验证者给定一个随机字符串s,工作者必须找出一个数n,使得随机字符串拼上这个数n后的md5结果前面几位都是0.
    即md5(s+n)的结果符合验证者的要求.工作者仅仅能不停的穷举,找出这样一个数n.

    以下上python代码.

    工作方:

    #coding=utf-8
    from itertools import count
    from hashlib import md5
    msg = 'randomstring'
    for i in count():
        hashid = md5(msg+str(i)).hexdigest()
        if hashid.startswith('0000'):
            print i,hashid
            break
    
    输出39496 00001c48020e444f58a297a0785df5cf,即工作方须要md5()39496次.

    而验证方仅仅须要拿工作方给过来的n,进行一次md5就可以验证.
    即if md5(msg+str(n)).hexdigest()[:4] == '0000'.

    由于md5用十六进制表示,每一位出现的概率是16.所以工作者要找到前面4位都是0平均须要16*16*16*16=65536次.
    验证者能够依据自身须要来规定前面0的个数来控制工作者的工作量.想要对方耗多点电,那就多加几个0吧.

  • 相关阅读:
    NTP on FreeBSD 12.1
    Set proxy server on FreeBSD 12.1
    win32 disk imager使用后u盘容量恢复
    How to install Google Chrome Browser on Kali Linux
    Set NTP Service and timezone on Kali Linux
    Set static IP address and DNS on FreeBSD
    github博客标题显示不了可能是标题包含 特殊符号比如 : (冒号)
    server certificate verification failed. CAfile: none CRLfile: none
    删除文件和目录(彻底的)
    如何在Curl中使用Socks5代理
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6915624.html
Copyright © 2011-2022 走看看