精华内容
下载资源
问答
  • PoW共识算法

    2021-09-02 21:01:10
    PoW共识算法 Proof of Work(工作量证明):PoW PoW历史进程 PoW的学术研究早在1993年就开始了。1993年,美国计算机科学家、哈佛大学教授辛西娅 · 德沃克(Cynthia Dwork)首次提出了工作量证明思想,用来解决垃圾...

    PoW共识算法

    Proof of Work(工作量证明):PoW

    PoW历史进程

    PoW的学术研究早在1993年就开始了。1993年,美国计算机科学家、哈佛大学教授辛西娅 · 德沃克(Cynthia Dwork)首次提出了工作量证明思想,用来解决垃圾邮件问题。该机制要求邮件发送者必须算出某个数学难题的答案来证明其确实执行了一定程度的计算工作,从而提高垃圾邮件发送者的成本。1997年,英国密码学家亚当 · 伯克(Adam Back)也独立地提出、并于2002年正式发表了用于哈希现金(Hash cash)的工作量证明机制。哈希现金也是致力于解决垃圾邮件问题,其数学难题是寻找包含邮件接受者地址和当前日期在内的特定数据的SHA-1哈希值,使其至少包含20个前导零。1999 年, 马库斯 · 雅各布松(Markus Jakobsson)正式提出了 “工作量证明” 概念。这些工作为后来中本聪设计比特币的共识机制奠定了基础。

    区块链的PoW

    2008年,中本聪发布比特币创世论文,将工作量证明思想应用于区块链共识过程中,设计了区块链的PoW共识算法。

    SHA256

    SHA256是一个哈希函数,是SHA-2细分的一种算法。哈希函数,又称为散列算法,散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(或哈希值)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。

    SHA256算法,对于任意长度的消息,都会产生一个256bit的哈希值,也被称为消息摘要。这个摘要相当于是个长度为32个字节的数组,通常用一个长度为64的十六进制字符串来表示

    例如:blockchain经过SHA256得到

    ef7797e13d3a75526946a3bcf00daec9fc9c9c4d51ddc7cc5df888f74dd434d1
    

    想继续了解SHA256哈希函数原理的可以点击这里SHA256算法原理详解

    工作量证明

    首先,PoW直译就是工作量证明,简单直白理解就是通过工作证明来决定挖矿的收益。挖矿就是产出比特币的途径,参与者通过参与挖矿这一过程,来获取挖矿的收益,也就是获取对应的奖励——比特币,参与者也被称为矿工。挖矿通常采用的是矿机,矿机性能越好,收益也就越多,就是根据工作证明来执行比特币的分配方式。

    PoW也是通过计算一个数值(nonce),用这个nonce加上交易数据再进行hash后得到的hash值比目标值小,再得到这个结果后会马上对全网进行广播打包区块,网络中的节点收到广播打包区块,会对结果进行验证,如果验证通过,证明这个结果是正确的,接受这个正确的结果并记录到自己的账本中,这个过程就是工作量证明。

    对工作量证明简单地举个例子:我们对blockchain字符串加随机数进行SHA256运算

    "blockchain0" => bd4824d8ee63fc82392a6441444166d22ed84eaa6dab11d4923075975acab938
    "blockchain1" => db0b9c1cb5e9c680dfff7482f1a8efad0e786f41b6b89a758fb26d9e223e0a10
    "blockchain2" => 8f0532cd22055fb7599aa48f38501dcd46e61712ab49a02f840f5545830e9260
    ...
    "blockchain400" => 6e110d98b388e77e9c6f042ac6b497cec46660deef75a55ebc7cfdf65cc0b965
    "blockchain401" => c004190b822f1669cac8dc37e761cb73652e7832fb814565702245cf26ebb9e6
    "blockchain402" => 0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9
    

    在经过403次计算后,才能恰好找到前4位为0的哈希散列。为了实现工作量证明的目标,不停的递增nonce的值并对新的字符串进行哈希运算,才得到的最后的结果。(blockchain402)SHA256的结果前四位不为0,只是举例用。

    nonce值

    从上面blockchain字符串的例子就可以看出来,如果要把字符串+nonce在进行SHA256运算在得出前N位为0的难度很大,要经过不断的递增测试才能得到对应的结果。

    nonce可以理解为一个随机数,nonce是从0开始一直递增,直到出现的hash值满足前N位为0,就是代表挖矿成功。难度系数为多少,hash最前面就需要满足多少个0。

    举个简单的例子:

    投掷一枚骰子,第一次要求总点数小于12才能赢,这很简单;第二次总结数小于11才能赢,赢得概率也很大,以此类推,当总点数小于3的时候,只有两次都是1点才能赢,赢得概率只有2%。目标越小,难度也越大。

    挖矿的随机数也是类似,随着前N位的0增加,难度也越来越大。

    难度值

    难度值就是对挖矿难度程度的度量。

    也就是计算一个给定目标的hash值的困难程度。

    难度值计算公式

    difficulty=difficulty_1_target / current_target
    

    difficulty_1_target的长度为256bit,前32为0,后面全为1,一般显示为hash值:

    0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    

    difficulty_1_target表示比特币网络最初的目标hash。

    current_target是当前块的目标hash,先经过压缩然后存储在区块中,区块的hash值必须小于给定的目标hash,区块才成立。

    例如:如果区块中存储的压缩目标HASH为 0x1b0404cb , 那么未经压缩的十六进制HASH为

    0x0404cb * 2 ^ (8 * (0x1b - 3)) = 0x00000000000404CB000000000000000000000000000000000000000000000000
    

    所以,目标HASH为0x1b0404cb时, 难度为:

    0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / 0x00000000000404CB000000000000000000000000000000000000000000000000 = 16307.67 pdiff
    

    PoW的优缺点

    优点

    1. 完全去中心化,节点自由进出;
    2. 全网算力强,篡改成本高,难以实现

    缺点

    1. 共识达成时间长,长达10分钟的交易确认时间
    2. 强大的算力造成电力资源的浪费

    参考文献

    [1]袁勇, 倪晓春, 曾帅,等. 区块链共识算法的发展现状与展望[J]. 自动化学报, 2018, 044(011):2011-2022.

    [2]Dwork C, Naor M. Pricing via processing or combatting junk mail. In: Proceedings of the 12th Annual International Cryptology Conference on Advances in Cryptology. Santa Barbara, California, USA: Springer-Verlag, 1992. 139−147

    [3]Back A. Hashcash — a denial of service counter-measure[Online], available: http://www.hashcash.org/papers/hashcash.pdf, April 10, 2018.

    [4]Jakobsson M, Juels A. Proofs of work and bread pudding protocols (extended abstract). Secure Information Networks. Boston, MA, Germany: Springer, 1999. 258−272

    展开全文
  • Pow共识算法

    2019-10-06 16:05:11
    谈到哈希算法,每个程序员都不陌生,但是谈到比特币共识算法PoW,如果没有接触过的技术人员可能觉得应该会很复杂,毕竟全球的比特币节点数量如此庞大,达成共识的算法应该不会很简单。但其实如果你已掌握哈希算法,...

    谈到哈希算法,每个程序员都不陌生,但是谈到比特币共识算法PoW,如果没有接触过的技术人员可能觉得应该会很复杂,毕竟全球的比特币节点数量如此庞大,达成共识的算法应该不会很简单。但其实如果你已掌握哈希算法,几分钟内你就能理解PoW。为了更好的说明PoW的原理,我们再把哈希算法及相关概念描述一下:

    哈希函数相关概念

    • 哈希函数——是一类数学函数,可以在有限合理的时间内,将任意长度的消息压缩为固定长度的二进制串,其输出值称为哈希值。
    • 碰撞定义——是指两个不同的消息在同一哈希函数作用下,具有相同的哈希值。
    • 哈希函数的安全性——是指在现有的计算资源(包括时间、空间、资金等)下,找到一个碰撞是不可行的。
    • 抗弱碰撞性——对于给定的消息\(M_1\),要发现另一个消息\(M_2\),满足\(H(M_1)=H(M_2)\)在计算上是不可行的。
    • 抗强碰撞性——找任意一对不同的消息\(M_1\)\(M_2\),使\(H(M_1)=H(M_2)\)在计算上是不可行的。
    • 雪崩效应——当一个输入位发生变化时,输出中的每一位均有50%的概率发生变化。

    哈希算法就是以哈希函数为基础构造的,常用于实现数据完整性和实体认证。一个优秀的 hash 算法,将能实现:

    • 正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
    • 逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
    • 输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
    • 冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。

    哈希函数的性质

    抗碰撞性

    哈希函数的抗碰撞性是指寻找两个能够产生碰撞的消息在计算上是不可行的。但找到两个碰撞的消息在计算上不可行,并不意味着不存在两个碰撞的消息。哈希函数是把大空间上的消息压缩到小空间上,碰撞肯定存在。只是计算上是不可行的。例如,如果哈希值的长度固定为256位,显然如果顺序取\(1,2,\cdots,2^{256}+1\)\(2^{256}+1\)个输入值,计算它们的哈希值,肯定能够找到两个输入值,使得它们的哈希值相同。

    原像不可逆

    原像不可逆,指的是知道输入值,很容易通过哈希函数计算出哈希值;但知道哈希值,没有办法计算出原来的输入值。

    难题友好性

    难题友好性指的是没有便捷的方法去产生一满足特殊要求的哈希值。

    一个哈希函数\(H\)称为难题友好的,如果对于每个\(n\)位的输出\(y\),若\(k\)是从一个具有较高不可预测性(高小熵)分布中选取的,不可能以小于\(2^n\)的时间找到一个\(x\),使\(H(k||x)=y\)

    为了引申出工作量证明PoW的原理,考虑一个由哈希函数构成的解谜问题:已知哈希函数\(H\),一个高小熵分布的值\(value\)以及目标范围\(Y\),寻找\(x\),使得\(H(value||x) \in Y\)

    这个问题等价于需要找到一个输入值,使得输出值落在目标范围\(Y\)内,而\(Y\)往往是所有的输出值的一个子集。实际上,如果一个哈希函数\(H\)的输出位\(n\)位,那么输出值可以是任何一个\(0\)~\(2^n\)范围内的值。预定义的目标范围\(Y\)的大小决定了这个问题的求解难度。如果\(Y\)包含所有\(n\)比特的串,那么问题就简单了,但如果\(Y\)只包含一个元素,那么这个求解是最难的,相当于给定一个哈希值,找出其中一个原像,原像不可逆的性质说明了这个难度。事实上,由于\(value\)具有高小熵分布,这确保了除了随机尝试\(x\)值以完成搜寻那个很大的空间外,没有其他有效的途径了。

    哈希函数的难题友好性构成了基于工作量证明的共识算法的基础。通过哈希运算得出的符合特定要求的哈希值,可以作为共识算法中的工作量证明。这里比特币的安全保证依赖于哈希函数的安全性,如果哈希函数被攻破,可以想象Pow共识算法就失效了,不用算力达到\(51\%\)就可以攻击了。

    PoW共识算法

    理解了难题友好性,就基本理解了PoW的原理。结合比特币去理解PoW。比特币PoW的过程,就是将不同的nonce值作为输入,尝试进行SHA256哈希运算,找出满足给定数量前导0的哈希值的过程。要求的前导0的个数越多,代表难度越大。比特币节点求解工作量证明问题的步骤归纳如下:

    1)生成铸币交易,并与其他所有准备打包进区块的交易组成交易列表,通过Merkle树算法生成Merkle根哈希;
    2)把Merkle根哈希及其他相关字段组装成区块头,将区块头的80字节数据作为工作量证明的输入;
    3)不停地变更区块头中的随机数nonce,并对每次变更后的区块头做双重SHA256运算,将结果值与当前网络的目标难度做比对,如果满足难度条件,则解题成功,工作量证明完成。该矿工获得记账权,生成新区块并广播到全网。

    最后,如果你熟悉传统共识算法比如Paxos、Raft等,可以对比思考一下为什么比特币要采用工作量证明的方式达成共识?比特币区块链实质上就是一个状态复制机,不过相对于一般分布式系统几个副本间达成共识,比特币可以认为是数千数万个“副本”达成共识,如果采用节点间协商投票等方式,在节点数量巨大且节点网络一直动态变化的情况下基本是不可行的。而Pow共识算法,共识的过程节点只需自己计算难题就都可以了,不需要与其他节点进行协商交互,因此对节点的数量不敏感,甚至节点数量越多系统越安全,无论是一个节点还是数万个节点,能够达成共识。

    转载于:https://www.cnblogs.com/s-lisheng/p/11287328.html

    展开全文
  • PoW 共识算法中的博弈困境分析与优化
  • 工作量证明 (PoW, proof of work)是 目前主流 的共识算法 , 其主要是依靠算力竞争来保障区块链 数据的一致性及安全性 。 该算法有两大缺陷 : 一是 算力竞争毫无意义地消耗了大量计算资源和电力能...

    工作量证明 (PoW, proof of work)是 目前主流 的共识算法 , 其主要是依靠算力竞争来保障区块链 数据的一致性及安全性 。 该算法有两大缺陷 : 一是 算力竞争毫无意义地消耗了大量计算资源和电力能 源 ; 二是可扩展性不强 , 比如采用 PoW 共识算法 的比特币每一次交易需要等待 6 个区块加 入区块 链 ,1分钟只能进行 7 笔交易 ; 所以 PoW 共识算 法并不适合于大规模的 V2V 电力交易 。

    展开全文
  • 上一节课我们了解了常用的几种共识算法,今天我们详细地分析PoW(Proof-of-Work,工作量证明)共识算法,了解其来源和优缺点。...第十二课 PoW共识算法 1. 概述 PoW(Proof-of-Work,工作量证明)是比特币采用的

    上一节课我们了解了常用的几种共识算法,今天我们详细地分析PoW(Proof-of-Work,工作量证明)共识算法,了解其来源和优缺点。

    在学习课程的时候,你也可以领取BaaS平台为期一个月的试用机会,免费使用高性能区块链服务(点击链接即可免费领取https://blockchain.xunlei.com/baas/try.html)。课程学习结合实践操作,让你迅速成为区块链大牛!

    *以下为第十二课的内容~

    第十二课 PoW共识算法

    1. 概述

    PoW(Proof-of-Work,工作量证明)是比特币采用的共识机制。由于比特币在加密货币中的重要地位,PoW也成为后续加密货币系统的主流共识机制之一。

    PoW是一种针对拒绝服务攻击的应对方法,其要求客户端执行某些需要消耗资源的运算,而其答案能被服务方快速验算,以耗用的时间、设备与能源做为担保成本,以确保服务无法被恶意节点所滥用。

    2. PoW机制的来源

    这个概念由Cynthia Dwork 和Moni Naor 1993年在学术论文《 Pricing via Processing, Or, Combatting Junk Mail, Advances in Cryptology》中首次提出;而“Proof of Work”一词则是在1999年由Markus Jakobsson与Ari Juels发表的论文《Proofs of Work and Bread Pudding Protocols》中提出正式的定义;PoW技术最初在Hashcash中应用。Hashcash是Adam Back 在1997年提出的,作为一种遏制互联网系统资源被滥用的措施,例如反垃圾电子邮件应用。

    Hashcash要求邮件客户端生成一个字符串,用SHA-1算法计算这个字符串得到的哈希值中,有特定数量的0前缀。SHA-1算法的碰撞非常困难,而且要求的哈希值的前缀0的数量越多,客户端要找到符合条件的字符串需要的计算量就越大。在电子邮件的应用中,为了给发出的消息加上戳记,只需要向电子邮件添加头部字段即可:用于电子邮件的每一个 To: 或 Cc: 接收者的 X-Hashcash 头。例如,某个想给adam@cypherspace.org这个邮箱发送消息的人可能会在消息中包含一个X-Hashcash消息头:

    X-Hashcash:

    1:20:1303030600:adam@cypherspace.org::McMybZIhxKXu57jd:ckvi

    服务端可以通过检查戳记的SHA-1散列来校验它,如下所示:

    00000b7c65ac70650eb8d4f034e86d7d5cd1852f

    可见,哈希结果有5个前缀字符是0,每个字符占4个比特,因此这个哈希值的前20个比特为零,即前缀0的比特数量为20。

    Hashcash的头部格式为:1:bits📅resource:ext:salt:suffix,包括 7 个域:

    1. 版本号。

    2. 前缀为0的比特数量。若其哈希值的0前缀数量少于此数,那么它就是非法的。

    3. 生成戳记的日期。可以认为当前时间之后的戳记以及那些在很久以前的戳记是非法的。

    4. 戳记为哪个资源而生成。可能是一个电子邮件地址,但是也可能是一个 URI 或者其他命名的资源。

    5. 特定应用程序可能需要的扩展,通常为空。

    6. 随机因子(salt)。用于将该戳记与其他人为相同的资源在同一日期生成的戳记区别开来。

    7. 后缀字符串。是算法真正起作用的部分。由于在特定的时间,A给B发邮件,前 6 个域就已经是固定的,为了生成一个通过期望数目的前导零进行散列的的戳记,客户端必须尝试很多连续的后缀值。

    通过让邮件客户端做这样的计算,能有效防止垃圾邮件的泛滥。生成一个 20比特0前缀哈希的字符串只需要几秒钟的时间,当你一天中只发送几十封电子邮件时,这个代价并不大。但是,对那些想要发送数百万消息的垃圾邮件制造者来说,这就是无法承受的消耗。

    在比特币出现之前,Hashcash的PoW算法也被Hal Finney以可重复使用的工作量证明(RPOW)的形式用于一种比特币之前的加密货币实验中。另外,Wei Dai的B-money、Nick Szabo的Bit-Gold这些数字货币的先行者,都是基于Hashcash的PoW机制下进行挖矿的。

    3. 比特币的PoW共识机制

    比特币网络于2009年上线。比特币网络的PoW共识机制使用基于Hashcash的PoW来挖矿,挖矿节点发布自己的计算结果,由比特币P2P网络上的去中心化节点负责验证。比特币的PoW计算难度会被周期性的调整,以保证出块时间的稳定。

    3.1. 哈希函数的选择

    由于SHA-1已被证明不安全,比特币采用了SHA-2系列的SHA-256算法作为哈希函数。使用SHA-256作为哈希函数时,无论输入长度为多少,输出总有一个固定的256位(32字节)长度。

    由于PoW严重依赖于哈希算法,因此哈希算法的安全性至关重要。若使用了不安全的哈希算法,则恶意节点能付出远小于其它诚实节点的计算量,就能找到符合要求的字符串,这样恶意节点就可能承包所有的出块,获得所有的奖励,并能随意篡改数据。

    理论上进行暴力破解SHA-1至少需要2的80次方(哈希循环的一个周期)才能碰撞破解。但是在2005年,中国密码学家王小云院士提出哈希函数的碰撞攻击理论,只用了2的69次方次就完成了SHA-1的循环碰撞周期。

    不容忽视的是,SHA-1和SHA-2使用了相同的Merkle-Damgard引擎,这意味着对SHA-1的成功攻击行为会影响到SHA-2的安全,即使还没有宣布一个全轮回的SHA-2被成功攻破,但毫无疑问,攻击机制正被私下的研发。这也是NIST赞助SHA-3竞赛的一个原因,NIST感觉需要一个与之前算法不同的哈希算法。

    NIST设置的筛选SHA-3的标准为:

    l 候选散列函数必须好实现。它应该消耗最少的资源即使散列大量的消息文本。许多候选算法实际上无法达到这个要求。

    l 候选算法在安全性方面必须是保守的。它应该抵御已知的攻击,同时保持一个大的安全系数。它应该同SHA-2相同的四个散列大小(224bit、256bit、384bit或512bit),但如果需要能够支持更长的散列位宽。

    l 候选算法必须接受密码分析。源代码和分析结果公开为感兴趣的第三方审查和评论。在分析过程中发现的任何缺陷都需要解决,通过调整或通过重新设计。

    l 候选算法必须使代码多样性。它不能使用Merkle-Damgard引擎产生消息散列。

    2012年10月2日,Keccak哈希算法被选为NIST散列函数竞赛的胜利者。Keccak算法(读作为“ket-chak”)是Guido Bertoni, Joan Daemen, Michael Peters, and Giles Van Assche的工作,在2008年10月被提交作为SHA-3的一个候选算法。

    Keccak采用了创新的的“海绵引擎”散列消息文本,它抗碰撞性好、快速、设计简单、方便硬件实现。Keccak已可以抵御最少复杂度为2的n次方的攻击,其中N为散列的大小(比特位数),具有广泛的安全界限。至目前为止,第三方密码分析已经显示出Keccak没有严重的弱点。尽管如此,Keccak的创建者已经启动Crunchy加密比赛,挑战人们去发现和报告成功且可验证的对Keccak的攻击方法。

    2015年, NIST 批准了SHA-3的标准草案,Keccak哈希算法正式成为SHA-3标准。根据wikipedia,SHA家族函数的比较情况如下:

    在这里插入图片描述
    图1. SHA家族函数对比(资料来自wikipedia.org)

    3.2. 比特币的PoW

    比特币的PoW共识机制也常被称为Nakamoto 共识或中本聪共识,以比特币的发明者中本聪Satoshi Nakamoto命名。

    比特币用区块头部的其中6个字段作为工作量证明的输入字符串。参与PoW计算的6个字段总大小为80字节,由4字节的版本号、32字节的上一个区块的散列值、32字节的Merkle Root Hash、4字节的时间戳(当前时间)、4字节的当前难度值、4字节的随机数组成,如下表所示:

    在这里插入图片描述
    表1. 参与哈希计算的区块头

    比特币的PoW,就是要求挖矿节点找到一个合适的 nonce, 即令nonce从0开始递增,直到使得这区块头部经过2次SHA-256计算(即SHA256(SHA256(BlockHeader)))的哈希值小于当前区块的目标阈值。比特币的nonce是一个4字节的无符号整数,若尝试完所有的4字节无符号整数还是没找到符合要求的值,则可以修改time,或修改coinbase交易以改变mrkl_root,然后再重新寻找满足条件的nonce值。

    由于SHA-256的哈希值是256-bit的,因此目标阈值(target threshold)也是一个256-bit(32字节)的无符号整型,要求区块头的哈希值必须小于等于此值。

    比特币的难度值是动态调整的。每出2016个区块就调整一次难度值,如果区块产生的速率比10分钟快则增加难度,比10分钟慢则降低难度。调整公式如下:

    难度值 = 旧难度值 * ( 过去2016个区块花费时长 / 20160 分钟 )

    而使用这个难度值来计算目标阈值的计算公式为:

    目标阈值 = 最大目标值 / 难度值

    其中最大目标值为一个恒定值:

    0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

    根据上述公式可知,目标值的大小与难度值成反比。难度值越大,则目标值越小,即符合要求的哈希值的前缀0的数量越多,导致查找随机数(nonce)的计算时间就越长。

    比特币将这个32字节长度的目标阈值通过类似科学计数法的方法将其压缩为4字节的表示,结果即为区块头部的bits字段。比特币规定,bits编码由两个部分组成:bits值的最高位的1个字节为幂(exponent),接下来3个字节为系数(coefficient),这样,计算目标阈值的公式为:

    Target = coefficient * 256^(exponent – 3)

    3.3. 区块头实例解析

    下面以比特币的实际区块为例说明区块头部组成和目标阈值的计算方法。我们可以在 https://www.blockchain.com/explorer,查看区块数据,例如区块高度为552020的页面显示如下:

    在这里插入图片描述
    图2. 552020的区块头

    在这个页面可以看到区块头的全部字段,例如区块生成时间是“2018-11-30 09:14:39”;区块的bits值为388648495;nonce值为2211011375;区块的hash值为:0000000000000000001a8fece3de933223b7464b8467c951b65a651b2155675e。通过 https://blockchain.info/rawblock接口可查看包含所有交易数据在内的区块的全部内容:https://blockchain.info/rawblock/0000000000000000001a8fece3de933223b7464b8467c951b65a651b2155675e

    其中区块头如下:

    接下来我们可以算下这个区块的目标阈值。从上图可以看到,这个区块的bits值为388648495,先将其转换成16进制表示为:0x172A4E2F,如前所述,这个值包含两个部分,最高位的1个字节为幂:exponent = 0x17

    接下来3个字节为系数:coefficient = 0x2A4E2F

    代入目标阈值的计算公式:

    Target = coefficient * 256^(exponent – 3)= 0x2A4E2F * 256^(0x17– 3)= 0x2A4E2F0000000000000000000000000000000000000000

    由于目标阈值是32字节的,这个值为23个字节,只要在高位补9个字节的0,即为目标阈值:0x0000000000000000002A4E2F0000000000000000000000000000000000000000

    也就是说,552020这个区块的哈希值要小于等于这个目标值。区块的实际哈希值0x0000000000000000001a8fece3de933223b7464b8467c951b65a651b2155675e,是满足条件的。而使哈希值满足条件而找到的nonce值为2211011375。

    3.4. 交易确认

    比特币系统在挖矿的过程中每10分钟生成一个区块,所有节点可以利用这10分钟的时间,来完成接收,打包,见证的工作,同时将产生的交易在整个网络里进行广播。PoW要面对的一个问题是区块分叉,为此比特币规定每个交易需要至少有5个验证过的区块在其后面得到验证才能算作确认,也就是说比特币的共识机制认为等待6个确认的情况下,分叉切换的概率就足够低了(例如按一个节点1%的算力来计算,6个区块后被长度被赶超的概率是100的6次方分之1),因此,比特币的交易确认时间在1小时以上。

    4. 以太坊的PoW共识机制

    4.1. Ethash算法

    以太坊设计了ethash作为工作量证明算法,包括找到算法的随机数输入以使结果低于特定的难度阈值。它的特点是计算的效率不仅与CPU相关,还与内存大小和内存带宽相关。该算法的一般流程如下:

    1. 首先根据块信息计算一个种子。

    2. 使用这个种子,计算出一个16MB的cache数据。

    3. 通过cache,计算出一个1GB(初始大小)的数据集(DAG)。DAG可以理解为是一个完整的搜索空间,全客户端和矿工需要存储完整的DAG,挖矿过程中需要从DAG中重复的随机抽取数据拿去和其他数据计算哈希值(类似于比特币挖矿中查找合适Nonce)。

    4. DAG中每个元素的生成只依赖于cache中的少量数据,验证者可以从Cache快速计算DAG指定位置的元素,以执行哈希验证。

    5. 每3000个区块的DAG完全不同,并且它的大小也随时间线性增长,从1G开始,每年大约增长7G左右。

    6. 由于仅根据cache就可以使用少量内存快速的计算出DAG中指定位置的数据,所以轻客户端只需要存储cache就可以高效的进行校验。

    参与哈希计算的区块头内容,以太坊和比特币之间最主要的的区别是,以太坊区块不仅包含交易列表也包含最近状态(merkle patricia trie结构的根hash编码在状态中更精确)。除此之外,另外两个值,区块数和难度,也储存在区块中。

    借助DAG结构,Ethash工作量证明是内存难解的,也就是需要大量的内存用于存储数据,并且计算过程需要频繁访问内存,占用大量的内存带宽,这使它能抵抗类似比特币那样的ASIC矿机 ,以支持矿工可以用电脑的CPU挖矿。但自从GPU矿工的效率高出两个数量级,CPU挖矿就不再盈利了。

    4.2. 交易确认

    与比特币类似,以太坊的交易同样需要等待6区块以确认交易。以太坊的难度调整的方式是每15秒整个网络会产生一个区块,这个"心跳"基本上主要强调系统状态同步,保证不可能维持一个分叉(允许double spend)或被恶意分子重写历史,除非攻击者有半数以上的网络挖矿能力(即所谓的 51% 攻击)。

    5. 小结

    目前业界普遍认为PoW是最适合公链的共识机制,优点是开放,任何人都可以参与进来;不需要任何权威机构的介入也能保证安全。

    然而其缺点也同样明显,例如速度慢、能耗巨大、导致集中化的矿池等。而且从长远来看,随着技术的发展,依靠算力的机制也终会被算力打败,PoW共识机制将变得不再安全,例如,有人可能会制造一台量子计算机,算力可能比其他人快百亿倍,能够在一秒钟内破坏比特币或以太坊区块链。因此,人们也有充足的理由和动力去研发其它的共识机制。

    展开全文
  • 分布式共识四】POW共识算法

    千次阅读 2018-03-07 16:12:17
    下面我来说说Bitcoin是如何通过Pow算法解决拜占庭将军问题的。比特币2008年,中本聪介绍了一个点对点的电子现金系统--比特币。比特币的基石是拜占庭共识协议。比特币怎样实现了拜占庭共识协议将在接下来的章节中介绍...
  • PoS:资源消耗少,但是实现比较复杂,中间步骤多如果产生安全漏洞,网络流量压力大。 DAG:吞吐量极高,异步通讯无中央控制,但是高效实现极为复杂,不支持强一致,无全局排序。...或许会出来新的颠覆性的算法。 ...
  • Go语言实现PoW共识算法(详解)

    千次阅读 2018-09-19 11:08:39
    没错,PoW就是比特币所使用的共识机制。 通过计算一个数值( nonce ),使得拼揍上交易数据后内容的 Hash 值满足规定的上限。在节点成功找到满足的Hash值之后,会马上对全网进行广播打包区块,网络的节点收到广播...
  • 没错,PoW就是比特币所使用的共识机制。通过计算一个数值( nonce ),使得拼揍上交易数据后内容的 Hash 值满足规定的上限。在节点成功找到满足的Hash值之后,会马上对全网进行广播打包区块,网络的节点收到广播打包...
  • 区块链兄弟社区,区块链技术专业问答先行者,中国区块链技术爱好者聚集地 作者:吴寿鹤 ...下面我来说说Bitcoin是如何通过Pow算法解决拜占庭将军问题的。 比特币 2008年,中本聪介绍了一个点对点的...
  • 本套课程带你认识常用的共识算法及其代码实现 课程简介 @课程收益: 掌握劳动量证明(PoW)算法及其实现;  课程配套学习资料,建议学员学习过程中跟着视频教程实操,可理解更加深入。技术问题可在下方留言,每晚8...
  • 共识算法POW

    2017-12-07 21:21:00
    简介 POW是proof-of-work的缩写,中译为:工作量证明,是比特币中采用的共识...本篇文章重点介绍pow共识算法的原理,不具体介绍比特币的相关细节。 什么是哈希函数? 哈希运算是密码学的重要组成部分,一般用来保...
  • 共识算法POW原理及实现

    千次阅读 2019-11-22 21:29:19
    POW共识算法主要是通过计算难度值来决定谁来出块。POW的工作量是指方程式求解,谁先解出来,谁就有权利出块。方程式是通过前一个区块的哈希值和随机值nonce来计算下一个区块的哈希值,谁先找到nonce,谁就能最先计算...
  • 用go语言实现的一个简单的工作量证明算法,代码和可执行程序都有,下载后放在gopath路径下就可直接运行演示
  • #资源达人分享计划#
  • 大部分公有链或虚拟货币,如比特币、以太坊,均基于PoW算法,来实现其共识机制。即根据挖矿贡献的有效工作,来决定货币的分配。### 比特币区块比特币区块由区块头和该区块所包含的交易列表组成。区块头大小为80字节...
  • 区块链:3、共识算法 PoS机制 概念、三个关键要素、POS过程、共识记账、能否解决拜占庭将军问题
  • 关于本专栏:共识算法的(code)实现原理。将主要用于代码的实现研究,而文章将通过其他方式呈现,直接点击链接,即可呈现。之所以没有在这个位置呈现,是为了保证文章的整洁性。主要用于讨论。 ...
  • 共识算法PoW算法及其实现 工科硕士,持有高校计算机教师资格证书,从事计算...
  • 共识算法 POW/POS

    2020-07-01 09:15:35
    在区块链系统中,共识算法是区块链保持数据安全、不可篡改、透明性等特色的关键技术。共识机制是区块链的灵魂,是区块链建立信任的基础。 一个区块链项目选择使用何种共识机制,决定了这个项目是否能建立起完善的...
  • 比特币源码分析--PoW和PoS共识算法

    千次阅读 2018-07-08 11:45:17
    前面的两篇文章学习了非拜占庭模型的经典共识算法paxos和拜占庭模型的经典共识算法PBFT,本文学习另外两种基于概率的共识算法:工作量证明算法PoW和权益证明算法PoS。其中PoW也是比特币区块链所采用的共识算法。1 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,568
精华内容 2,627
关键字:

pow共识算法