比特币的工作量证明详解
pow工作量证明机制案例
![pow工作量证明机制案例](https://img.taocdn.com/s3/m/32957829a55177232f60ddccda38376baf1fe0af.png)
pow工作量证明机制案例1. 比特币挖矿:比特币是最早采用pow工作量证明机制的加密货币。
在比特币网络中,矿工通过解决复杂的数学难题来获得新的比特币,并验证交易的有效性。
他们需要计算出一个符合特定要求的散列值,这个过程需要大量的计算能力和电力消耗。
2. 以太坊挖矿:以太坊也采用了pow工作量证明机制。
矿工需要通过解决一个复杂的谜题来获取新的以太币,并验证交易的有效性。
这个谜题是一个基于哈希函数的数学难题,矿工需要不断尝试不同的输入值,直到找到一个满足特定要求的哈希值。
3. Zcash挖矿:Zcash是另一种采用pow工作量证明机制的加密货币。
在Zcash网络中,矿工需要解决一个类似于比特币的哈希难题来获取新的Zcash币,并验证交易的有效性。
与比特币不同的是,Zcash使用了零知识证明技术来保护交易的隐私性。
4. Monero挖矿:Monero也是采用pow工作量证明机制的加密货币之一。
矿工需要通过解决一个名为CryptoNight的哈希难题来获取新的Monero币,并验证交易的有效性。
CryptoNight算法是一种内存硬算法,旨在抵抗ASIC挖矿设备的优势。
5. Grin挖矿:Grin是一种基于MimbleWimble协议的加密货币,也采用了pow工作量证明机制。
矿工需要解决一个名为CuckooCycle的图形难题来获取新的Grin币,并验证交易的有效性。
Cuckoo Cycle算法是一种内存密集型算法,旨在阻止ASIC挖矿设备的使用。
6. Filecoin挖矿:Filecoin是一个分布式存储网络,也采用了pow 工作量证明机制。
矿工需要通过解决一个名为Proof of Spacetime 的难题来获取新的Filecoin代币,并验证存储证明的有效性。
Proof of Spacetime要求矿工证明他们确实存储了特定数量的数据。
7. Handshake挖矿:Handshake是一个去中心化的域名系统,同样采用了pow工作量证明机制。
共识算法之POW
![共识算法之POW](https://img.taocdn.com/s3/m/8167a1771611cc7931b765ce050876323112742e.png)
共识算法之POW简介POW是proof-of-work的缩写,中译为:⼯作量证明,是⽐特币中采⽤的共识机制,也被许多公有区块链系统所采⽤(⽐如以太坊)。
⼯作量证明机制基础是哈希运算,因此要理解pow⾸先要明⽩哈希函数(⽐特币⼤量采⽤了sha256,以及rimped160)。
本篇⽂章重点介绍pow共识算法的原理,不具体介绍⽐特币的相关细节。
什么是哈希函数?哈希运算是密码学的重要组成部分,⼀般⽤来保护数据的完整性。
给定⼀段消息,通过哈希函数可以将消息映射为固定长度的哈希值(⽐如sha256,将任意长度的消息映射为256位的哈希值)。
哈希函数具有两个重要的特点:“⽆碰撞“和”不可逆“。
1. 所谓不可逆,就是当你知道x的HASH值,⽆法求出x;因此哈希函数在数学上是⼀种单向函数。
2. 所谓⽆冲突,就是当你知道x,⽆法求出⼀个y,使x与y的HASH值相同。
简单来说就是,⽆法找到⼀个不同的消息y,使得y的哈希值与x 的哈希值相同。
(当然,因为消息的⽐特空间 << 所求哈希值的⽐特空间,因此其实这样的y是存在的,只是这样的y很难找,只是⼀个概率上的不可能)哈希函数的应⽤从哈希函数的特性我们可以看出,当x被改变时,x所对应的哈希值也会发⽣改变,因此可以通过⼀段消息的哈希值是否改变来间接反应消息是否被修改,也就是我们说的数据完整性验证。
(当然这个⼀般还要也公钥密码体制相结合来使⽤,这⾥不解释公钥密码体制,⾃⾏google)。
### 在⽐特币中的使⽤⽐特币主要使⽤了sha256哈希函数,有三个⽤途:1. ⽐特币地址是公钥的两次sha256运算结果2. 保证每笔交易的完整性3. pow⼯作量证明机制的基础⽐特币共识算法pow⼯作量证明机制,我们从“⼯作量”和“证明”两个概念上来理解pow。
1. 什么是⼯作量?⽐特币⼀直被⼈诟病做了⼤量⽆意义的运算,耗费了巨量的电能。
这⾥的运算就是⽐特币共识机制中的⼯作量,⽽这个运算就是哈希运算。
比特币的工作原理
![比特币的工作原理](https://img.taocdn.com/s3/m/f8c39c72b80d6c85ec3a87c24028915f814d8447.png)
比特币的工作原理比特币是一种基于区块链技术的加密货币,它的工作原理涉及到分布式账本、共识机制、加密算法等多个方面。
下面将详细介绍比特币的工作原理。
1. 分布式账本:比特币使用一种称为区块链的分布式账本来记录交易信息。
区块链是由多个区块组成的链式结构,每个区块包含了一定数量的交易记录。
每个区块都包含了前一个区块的哈希值,这样就形成了一个不可篡改的链式结构。
2. 共识机制:比特币采用了一种称为工作量证明(Proof of Work, PoW)的共识机制。
矿工通过解决一个复杂的数学难题来竞争记账权,解题的过程称为挖矿。
挖矿的目的是为了找到一个符合一定条件的哈希值,这个哈希值必须满足一定的难度要求,同时也需要包含前一个区块的哈希值。
当一个矿工成功找到符合条件的哈希值时,就可以将新的区块添加到区块链中,获得一定数量的比特币作为奖励。
3. 加密算法:比特币使用了一种称为SHA-256的加密算法来进行哈希计算。
SHA-256是一种不可逆的哈希函数,它可以将任意长度的数据转换为一个固定长度的哈希值。
这个哈希值的特点是唯一性和不可预测性,即无法通过哈希值反推出原始数据。
4. 钱包和地址:比特币的用户通过钱包来管理自己的比特币。
钱包包含了一个或多个比特币地址,每个地址对应着用户的公钥。
比特币地址是由一串数字和字母组成的字符串,用于接收和发送比特币。
用户可以通过私钥对交易进行签名,以证明自己的拥有权。
5. 交易验证:比特币的交易需要经过验证才能被添加到区块链中。
当一个用户发起一笔交易时,这笔交易会被广播到网络中的节点。
节点会对交易进行验证,包括检查交易的有效性、双花检测等。
一旦交易通过验证,就会被打包成一个区块,并广播给网络中的其他节点。
6. 区块确认:新添加到区块链中的区块需要得到其他节点的确认才能被认可为有效。
节点会对新区块进行验证,并将其添加到自己的区块链中。
当一个区块被添加到区块链中后,它的哈希值将会被其他节点用于验证后续区块的有效性。
区块链技术的共识算法介绍
![区块链技术的共识算法介绍](https://img.taocdn.com/s3/m/8bda3ffe970590c69ec3d5bbfd0a79563d1ed46a.png)
区块链技术的共识算法介绍区块链技术是一种分布式的数据库技术,被广泛应用于加密货币以及其他领域。
共识算法是区块链技术中至关重要的一部分,它解决了在分布式环境下如何达成一致的问题。
本文将对区块链技术中常见的共识算法进行介绍,并分析它们的优缺点。
一、工作量证明(Proof of Work,PoW)工作量证明是比特币中使用的共识算法,也是目前最为广泛使用的共识算法之一。
在PoW中,网络参与者(矿工)通过解决数学难题来获得记账的权力。
解决难题需要消耗大量的计算能力,因此具有一定的安全性,使得恶意节点难以控制网络。
尽管PoW算法的安全性已经得到了验证,但它面临着能源消耗高、交易确认时间长等问题。
由于计算量大,导致对电力和硬件的需求很高,使得PoW算法在可持续性和环保性方面存在一定的挑战。
二、权益证明(Proof of Stake,PoS)权益证明是另一种常见的共识算法,相对于PoW来说,PoS更加环保和高效。
在PoS中,记账的权力是根据用户持有的货币数量来确定的。
持有的货币数量越多,就越有可能被选中作为记账节点。
这种算法机制可以减少能源消耗,并提高交易速度。
然而,PoS算法也存在一些问题。
首先,富豪获取更多的权益,导致权力集中化的可能性增加。
其次,在PoS中,如果节点持有的货币被黑客攻击并窃取,那么攻击者将获得更多的权力,从而破坏了区块链的安全性。
三、权益证明+权益共识(Delegated Proof of Stake,DPoS)DPoS是在PoS基础上发展起来的一种共识算法,通过代理选举的方式解决了PoS中权力集中化的问题。
在DPoS中,持币者可以投票选出受托人(Witness),他们负责验证和打包交易,并生成新的区块。
受托人的数量相对较少,从而确保了交易速度和网络安全性。
DPoS算法强调了自治和去中心化,但它也引发了一些争议。
例如,一些人认为DPoS算法在一定程度上牺牲了安全性和去中心化的原则。
此外,由于受托人的选举是根据持有的货币数量来进行的,这可能会导致权力集中的问题。
解密区块链技术中的共识机制:PoW、PoS与DPoS(六)
![解密区块链技术中的共识机制:PoW、PoS与DPoS(六)](https://img.taocdn.com/s3/m/983f7925640e52ea551810a6f524ccbff121caea.png)
解密区块链技术中的共识机制:PoW、PoS与DPoS引言随着区块链技术的不断发展,共识机制作为其核心机制之一,扮演着至关重要的角色。
共识机制是指在分布式网络中,各个节点对于交易的确认达成一致的过程。
本文将解密区块链技术中的三种常见共识机制:工作量证明(Proof of Work,PoW)、权益证明(Proof of Stake,PoS)和股权证明(Delegated Proof of Stake,DPoS)。
一、工作量证明(PoW)工作量证明是最早应用于比特币的共识机制。
在该机制中,节点通过解决数学难题来确认交易的有效性,并获得记账权。
解决难题需要耗费大量的计算能力,因此被称为“挖矿”。
挖矿者需不断尝试生成符合条件的哈希值,直到找到一个满足条件的解,这个解会被网络中的其他节点验证。
一旦验证通过,该节点即可将交易打包成一个区块,并将其添加到区块链上。
PoW机制的优势在于安全性较高,因为攻击者需要掌握超过50%的算力才能篡改区块链的记录。
然而,PoW机制也存在一些问题。
首先,挖矿过程需要大量的计算资源和电力消耗,对环境造成了不小的负面影响。
其次,随着区块链的扩大,交易速度变慢,因为解决难题所需要的计算时间变长。
因此,工作量证明机制并不适合所有的区块链应用场景。
二、权益证明(PoS)权益证明是工作量证明的一种改进形式。
与PoW不同,PoS机制中节点的记账权不再由计算能力决定,而是与其所持有的数字货币数量成正比。
简单来说,持有更多货币的节点在记账过程中拥有更大的权益。
这种方式旨在解决PoW中能源浪费和计算能力不平衡的问题。
在PoS机制中,每个节点都有一定的概率获得记账权。
概率的计算根据节点所持有的数字货币数量来确定。
节点在获得记账权后,将负责确认一段时间内的交易。
与PoW相比,PoS机制更加节约资源,且具有更快的交易速度。
然而,PoS机制也存在一些弱点。
首先,权益越大的节点越容易获得记账权,这可能导致寡头垄断的问题。
简述工作量证明机制的工作过程
![简述工作量证明机制的工作过程](https://img.taocdn.com/s3/m/fb6256c985868762caaedd3383c4bb4cf7ecb70c.png)
简述工作量证明机制的工作过程工作量证明(Proof of Work,简称PoW)是一种在区块链系统中用于确认和验证交易的机制。
它起源于比特币,并在此后的很多区块链系统中得到广泛应用,包括以太坊、莱特币等。
在工作量证明机制中,参与者需要通过完成复杂计算任务,即所谓的“挖矿”,来证明自己对于区块链系统的贡献,并通过这个过程来产生新的区块链并确认交易。
下面将详细介绍工作量证明机制的工作过程。
1.交易广播:在区块链系统中,用户需要将自己的交易广播到网络中,让其他节点得知。
每个交易包含有发送方、接收方、交易数量等信息。
2.交易打包:在收到交易广播后,节点会进行交易打包,将一定数量的交易打包成一个区块。
节点收集到的交易可按照一定规则进行排序和筛选。
3.工作量证明计算:在选定了一定数量的交易后,节点需要进行工作量证明计算。
该计算通常基于哈希函数,节点需要寻找一个符合规定难度的哈希值。
这个过程需要不断尝试不同的随机数值。
4.矿工挖矿:在工作量证明计算过程中,节点会将交易信息、前一个区块的哈希值和尝试的随机数等数据打包成一个新的区块。
挖矿是通过不断调整随机数值来查找符合规定难度的哈希值。
在比特币中,挖矿的过程包括计算哈希、调整难度、生成新的区块。
5.区块传播:当一个节点成功地找到符合规定难度的哈希值并生成了新的区块后,它将这个区块广播到网络中,通知其他节点。
6.区块验证:其他节点在收到新区块后,会对其进行验证。
节点会检查交易是否有效、哈希值是否符合规定难度、区块链的连通性等。
如果验证通过,节点会接受这个新区块,并将其加入到自己的区块链中。
7.竞争与分叉:由于每个节点都可以参与挖矿,不同节点可能在同一时间找到符合条件的哈希值,从而生成了多个新的区块。
这时就会出现竞争和分叉的情况。
分叉指的是出现了多个不同版本的区块链。
节点会根据一定的规则选择最长的区块链作为有效链,而其他版本的链则被废弃。
8.奖励与确认:节点在挖矿的过程中,如果成功找到符合规定难度的哈希值并生成新的区块,会获得一定数量的奖励,如比特币、以太币等。
比特币的工作原理
![比特币的工作原理](https://img.taocdn.com/s3/m/be5e6079590216fc700abb68a98271fe900eaf72.png)
比特币的工作原理比特币是一种基于区块链技术的加密数字货币,它的工作原理是通过去中心化的方式实现交易的验证和记录。
以下是比特币的工作原理的详细解释。
1. 区块链技术:比特币使用区块链技术来记录所有的交易信息。
区块链是一个由区块组成的链式数据结构,每一个区块包含一定数量的交易记录。
每一个区块都包含前一个区块的哈希值,这样就形成为了一个不可篡改的链式结构。
2. 去中心化的网络:比特币网络是一个去中心化的网络,没有中央机构控制。
任何人都可以加入比特币网络,并成为网络的一部份。
这使得比特币具有去中心化、开放和透明的特点。
3. 钱包和地址:比特币用户通过使用钱包来管理他们的比特币资产。
每一个钱包都有一个惟一的地址,类似于银行账号。
比特币地址由一串数字和字母组成,用于接收和发送比特币。
4. 交易验证:当一个比特币用户发起一笔交易时,这笔交易会被广播到整个比特币网络中。
网络中的节点会验证这笔交易的有效性,包括验证发送者是否拥有足够的比特币余额,并且没有重复的交易。
5. 挖矿和共识机制:比特币的挖矿是通过解决复杂的数学问题来创建新的区块,并将交易记录添加到区块链中。
挖矿过程需要大量的计算能力,参预挖矿的人被称为矿工。
矿工通过解决问题来竞争获得记账权,并获得一定数量的比特币作为奖励。
6. 工作量证明:比特币使用工作量证明(Proof of Work)机制来确保网络的安全性和可靠性。
矿工需要花费大量的计算能力来解决问题,这样可以防止恶意节点对网络进行攻击。
7. 区块奖励和减半机制:每当一个区块被成功挖出并添加到区块链上时,矿工会获得一定数量的比特币作为奖励。
这个奖励被称为区块奖励。
然而,比特币的总供应量是有限的,为了控制通胀,比特币的区块奖励会定期减半。
目前,每当挖出210,000个区块时,区块奖励就会减半一次。
8. 交易确认:一旦一笔交易被包含在一个区块中并被添加到区块链上,它就会被认为是已确认的。
通常情况下,交易需要经过多个区块的确认才干被认为是不可逆转的。
工作量证明算法的挖矿奖励分配机制
![工作量证明算法的挖矿奖励分配机制](https://img.taocdn.com/s3/m/68c0c64bb42acfc789eb172ded630b1c59ee9b02.png)
工作量证明(Proof of Work)算法是一种用于验证数字货币交易的机制,通过解决复杂的数学问题来获得数字货币奖励。
这种算法的目标是生成一个符合特定条件的数字签名或哈希值,该数字签名或哈希值是唯一有效的,其他无效的签名或哈希值会被系统拒绝。
通过竞争这种证明过程,获得奖励的是最早完成该证明的参与者。
在比特币网络中,挖矿奖励主要来自网络产生的数字货币——比特币。
每个区块生成后,都会按照某种规则分配比特币奖励。
一般来说,比特币的奖励数量随着时间的推移而减少,以激励矿工持续工作以解决越来越困难的数学问题。
奖励的数量与比特币网络中使用的哈希率有关,通常来说,更高的哈希率意味着更多的奖励。
分配机制主要包括以下几个步骤:1. 区块生成:每个新的区块被生成时,其前一区块的链上都会附带一些关于这个区块的详细信息,包括挖矿的哈希值、挖矿时间等。
2. 计算奖励:为了获得奖励,矿工需要在该区块中寻找出一个有效的交易组合(即“工作量证明”),这通常是一个相当复杂且耗时的过程。
这个过程的结果是一个有效的数字签名或哈希值,这会触发一个特殊的操作,导致一部分比特币流入矿工的账户。
3. 奖励分配:奖励的数量根据挖矿的时间和难度进行调整。
随着时间的推移,比特币的奖励数量会逐渐减少。
同时,挖矿的难度也会增加,这意味着要获得奖励需要更多的计算能力。
因此,奖励的分配主要取决于矿工的哈希率。
奖励分配的主要目的是激励矿工持续参与挖矿过程,保持网络的安全性和稳定性。
同时,这也是一种共识机制,通过这种方式,网络上的参与者可以达成共识并确认交易的有效性。
此外,一些新的数字货币也在使用工作量证明算法作为其共识机制的一部分。
在这些数字货币中,挖矿奖励分配机制可能会有所不同,但基本原则仍然是激励矿工参与挖矿过程并保持网络的安全性。
总的来说,工作量证明算法的挖矿奖励分配机制是为了确保数字货币网络的正常运行和稳定性,同时也为参与者提供了一定的经济激励。
比特币挖矿的基本核算方法和基本公式解析
![比特币挖矿的基本核算方法和基本公式解析](https://img.taocdn.com/s3/m/74121fff370cba1aa8114431b90d6c85ec3a88df.png)
比特币挖矿的基本核算方法和基本公式解析比特币技术的一个重要部分是挖矿,挖矿是比特币系统运行所需的工作量证明机制,它节省了比特币网络免受恶意参与者的攻击并确保了网络的安全性。
挖矿是比特币系统中产生新比特币的一项活动。
因此,了解比特币挖矿的基本核算方法和基本公式是十分重要的。
比特币挖矿是一种加密算法,这种算法要求矿工使用专业的计算机硬件来执行一系列的数学运算,从而产生一个新的比特币块。
不同的比特币挖矿算法具有不同的难度,但最常用的算法是“工作量证明”(PoW)。
简而言之,“工作量证明”要求矿工解决一个难以解决的数学问题,这是一种让计算机满足特定条件的方法。
如果数学问题被解决,矿工将获得一定量的比特币作为奖励。
要了解挖矿的基本核算方法,必须要了解常用于比特币挖矿的一些基本公式。
首先,可以使用以下公式来计算矿工的收入:(矿工每小时的收入)=每秒算力)×(比特币价格) /个块的难度
其次,可以使用以下公式来计算比特币的网络总算力:
(网络总算力)=(算力总量)×(硬件算力)
最后,可以使用以下公式来计算比特币系统的区块时间:
(区块时间)=(单块时间)×(单个块的难度)
以上就是比特币挖矿的基本核算方法和基本公式。
除了使用上述公式外,比特币挖矿还将根据外部因素而异,比如比特币网络算力的增长和减少,交易量的增加,新节点的加入等。
因此,要有效地挖掘比特币,矿工必须不断检查动态变化的外部因素,以便能够了解当前比特币系统的情况,并作出相应的调整。
如果矿工能够熟悉比特币挖矿的基本核算方法和基本公式,从而避免常见的错误,并对比特币系统有更好的理解,也许就能够稳定收入,并获得更多的利润。
比特币挖矿原理
![比特币挖矿原理](https://img.taocdn.com/s3/m/f7afb549bfd5b9f3f90f76c66137ee06eff94eaf.png)
比特币挖矿原理
比特币挖矿是指通过计算复杂的数学问题来验证和添加交易到比特币区块链的过程。
挖矿的目的是为了获得新的比特币奖励,并维护整个比特币网络的安全性和运作顺畅。
比特币的挖矿过程主要依靠一种称为工作量证明(Proof of Work,PoW)的机制。
在PoW中,矿工需要通过解决一个复
杂的哈希函数来找到一个符合特定条件的哈希值。
这个条件是根据当前的网络难度进行动态调整的。
一旦一个矿工找到符合条件的哈希值,就可以将其提交给网络进行验证。
在比特币网络中,每10分钟左右会产生一个新的区块。
这个
区块中包含了被验证的交易数据以及矿工的奖励。
矿工将自己找到的符合条件的哈希值和交易数据打包成一个区块,并通过网络广播给其他矿工。
其他矿工在收到一个新的区块后,会验证其中的交易和哈希值是否符合规则。
如果验证通过,这个新的区块就会被添加到区块链的末尾,并被认为是整个网络的最新状态。
同时,矿工也会获得一定数量的比特币作为奖励,这就是矿工获得收益的方式。
由于PoW机制的特性,比特币挖矿需要消耗大量的计算能力
和电力资源。
为了增加挖矿的难度,比特币网络会自动调整条件,使得每个区块的生成时间保持在约10分钟左右。
这样做
的目的是为了确保比特币的发行速度稳定,并防止网络被攻击或滥用。
总的来说,比特币挖矿的原理是通过解决复杂的数学问题来验证和添加交易到比特币区块链,并获得比特币奖励。
这个过程依赖于工作量证明机制,需要消耗大量的计算能力和电力资源,以维护整个比特币网络的安全性和稳定性。
解密区块链技术中的共识机制:PoW、PoS与DPoS(七)
![解密区块链技术中的共识机制:PoW、PoS与DPoS(七)](https://img.taocdn.com/s3/m/0a1eb44ea517866fb84ae45c3b3567ec102ddc3e.png)
解密区块链技术中的共识机制:PoW、PoS与DPoS引言:区块链技术作为一种分布式账本的创新,正逐渐改变着我们对于传统中心化系统的认知。
而其中一个核心的概念就是共识机制,它能够确保在没有中心权威的情况下,不同节点之间的数据一致性和安全性。
本文将对区块链技术中的三种共识机制:工作量证明(Proof of Work,PoW)、权益证明(Proof of Stake,PoS)以及股份授权证明(Delegated Proof of Stake,DPoS)进行深入探讨。
一、工作量证明(Proof of Work,PoW)工作量证明是比特币创始人中本聪提出的一种共识算法,也是目前最为广泛使用的共识机制之一。
其基本原理是通过计算难解的问题,确保在加入区块链网络时需要付出一定的努力和资源。
只有解决了问题的节点才能添加新的区块到链上,并获得相应的奖励。
这个问题通常被称为“挖矿”,而解决问题的过程就是“挖矿”的过程。
工作量证明机制的优势在于其对算力的要求较高,一方面可以有效遏制恶意节点的攻击,另一方面也能一定程度地防止碰撞攻击。
然而,工作量证明的缺点也显而易见:需要大量的计算能力和能源消耗,矿机竞争激烈,导致能源浪费和环境污染问题日益突出。
二、权益证明(Proof of Stake,PoS)权益证明机制在工作量证明的基础上进行改进,最早是由Peercoin提出的。
与工作量证明不同,权益证明机制强调的是持有货币的数量和时间,而非计算能力。
根据参与节点持有的货币数量来随机选择验证新区块的节点,并给予奖励。
权益证明机制的优势在于能够避免能源浪费和环境污染的问题,降低了参与挖矿的门槛,也降低了对矿机的依赖性。
然而,权益证明机制也存在一些问题。
首先,权益集中的节点往往更容易掌握更大的权力,导致潜在的中心化威胁。
其次,由于没有计算难度,攻击者可以通过购买大量货币来获得控制权,并进行双重支付等恶意行为。
三、股份授权证明(Delegated Proof of Stake,DPoS)股份授权证明机制在权益证明的基础上进一步发展,其问世最早可以追溯到BitShares。
区块链中的POWPOSDPOS共识机制及其优缺点
![区块链中的POWPOSDPOS共识机制及其优缺点](https://img.taocdn.com/s3/m/2fc541aff9c75fbfc77da26925c52cc58ad6904b.png)
区块链中的POWPOSDPOS共识机制及其优缺点POW(Proof of Work)、POS(Proof of Stake)和DPOS (Delegated Proof of Stake)是区块链中常见的共识机制,在保证网络安全和实现分布式一致性方面发挥着重要作用。
1.POW(工作量证明):POW是比特币最早采用的共识机制,通过竞争计算难题的解决权来获取记账权。
矿工通过解决复杂的数学难题来证明自己在工作上付出了大量的计算力。
优点包括:-安全性高:POW机制需要大量计算资源,攻击者想要控制链条需要付出巨大的成本。
-去中心化:POW允许任何人都能参与到共识过程中,没有特权的角色存在。
缺点包括:-能源消耗高:POW机制需要大量的计算算力,这就导致了大量的能源消耗,对环境造成了一定影响。
-低效性:POW机制在处理速度上有一定限制,可能会导致交易速度慢。
2.POS(权益证明):POS是通过持有一定数量的代币来获取记账权的共识机制。
持有更多代币的人在整个网络中获得更大的权益,优点包括:-能源效率高:相对于POW机制,POS消耗的能源较少。
-合理性更强:POS机制让持有更多代币的人有更大的参与度,可以避免矿池垄断和51%攻击的问题。
缺点包括:-垄断可能:POS机制存在“富者更富”和权益集中化的问题,富豪会获得更大的利益。
-长期持币者收益:POS机制将大量收益转给长期持有者,而非网络活跃的参与者。
3.DPOS(委托权益证明):DPOS机制是在POS机制的基础上进一步发展,通过选举出少数可信的节点来代表整个网络记账,优点包括:-交易速度快:相对于POW和POS机制,DPOS大大提升了交易的速度。
-扩展能力强:由于只需选举少数节点,DPOS的扩展能力更强,可以支持更多的并发交易。
-抗攻击性:DPOS机制对于恶意攻击、拒绝服务等恶意行为有较强的抵抗能力。
缺点包括:-需要信任:DPOS机制依赖于选举出的节点,节点的行为需要被信任和监督才能保证整个网络的安全和稳定。
比特币中的工作量证明
![比特币中的工作量证明](https://img.taocdn.com/s3/m/05ee6038bc64783e0912a21614791711cc79790c.png)
⽐特币中的⼯作量证明对于⽐特币⽹络中的任何⼀个节点,如果想⽣成⼀个新的区块并写⼊区块链,则必须解出⽐特币⽹络出的⼯作量证明的迷题。
这道题的3个关键要素是⼯作量证明函数、区块及难度值。
⼯作量证明函数是这道题的计算⽅法,区块决定了这道题的输⼊数据,难度值决定了解这道题所需要的计算量。
⽐特币⽹络中使⽤的⼯作量证明函数正是前⽂提及的SHA-256。
已经讲过区块的数据结构,但并未具体描述区块的产⽣过程。
区块其实就是在⼯作量证明环节产⽣的。
矿⼯通过不停地构造区块数据,检验每次计算出的结果是不是满⾜⼯作量,从⽽判断该区块是不是符合⽹络难度。
区块头即为⽐特币的⼯作量证明的输⼊数据。
难度值是矿⼯们挖矿的重要参考指标,它决定了矿⼯⼤约需要经过多少次哈希运算才能产⽣⼀个合法的区块。
⽐特币的区块⼤约每10分钟⽣成⼀个,如果要在不同的全⽹算⼒条件下,新区块的产⽣都基本保持这个速率,难度值必须根据全⽹算⼒的变化进⾏调整。
简单地说,难度值被设定在⽆论挖矿能⼒如何,新区块产⽣速率都保持在10分钟⼀个。
难度值的调整是在每个完整节点中独⽴⾃动发⽣的。
每隔2016个区块,所有节点都会按统⼀的公式⾃动调整难度值,这个公式是由产⽣最新2016个区块的花费时长与期望时长(期望时长为20160分钟,即两周,是按每10分钟⼀个区块的产⽣速率计算出的总时长)⽐较得出的,根据实际时长与期望时长的⽐值,进⾏相应调整(或变难或变易)。
也就是说,如果区块产⽣的速率⽐10分钟快,则增加难度,⽐10分钟慢,则降低难度。
这个公式可以总结为如下形式:新难度值=旧难度值*(过去2016个区块花费时长/20160分钟)⼯作量证明需要有⼀个⽬标值。
⽐特币⼯作量证明的⽬标值(Target)的计算公式如下:⽬标值=最⼤⽬标值/难度值其中,最⼤⽬标值为⼀个恒定值:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF⽬标值的⼤⼩与难度值成反⽐。
POW(工作量证明)——区块链共识算法
![POW(工作量证明)——区块链共识算法](https://img.taocdn.com/s3/m/5a0aa1b7dd88d0d232d46a00.png)
然而,在PoS共识机制下,股权集中会导致共识协议的参与者集中。区块链的出块权只能由少数在创世块中拥有股权的玩家决定。如果这些人合谋对区块链进行攻击,则完全可以成功的实现双花攻击(Double spending attack). 尽管开发者和投资人出于利益考虑不会进行这样的攻击来摧毁他们自己的公链,但PoS公链也无可避免的在主网上线后就被这些人垄断和支配。更糟的是,如果出块可以获得大量奖励和交易费用,这些垄断者就会将大量股权牢牢控制在自己的手里,使得PoS公链成为一个本质上由巨头控制的网络。
公链项目早期,PoW是一个更好选择
对于一个公有链来说,其上线初期往往是股权最集中的时候。在主网上线伊始,创始块中分配的币绝大多数属于项目方和私募投资人,而这些人的数量往往非常有限。对于PoW共识机制,初始股权的集中不会带来安全性问题,因为它的出块和安全性不依赖于股权持有的分散,而是依赖于算力的分散。对于使用反 ASIC 矿机的挖矿算法的公有链来说,任何人只要拥有显卡和网络就可以成为矿工,这有助于促进更多人参与挖矿,实现早期算力的分散。只要超过50%的算力来自于诚实的矿工,区块链中的交易就是安全不可逆转的。
POW= 工作量证明= 挖矿
通俗的来说,在POW共识机制中,挖矿是指利用有计算能力的设备来进行哈希计算,这个计算的过程就是工作量,通过不断的计算来得出一个合理的哈希值,这就是所谓的解题。当有人或者节点得出了这一个合理的哈希值,那么他就可以获得记账权,记录区块链上的交易记录,这个记录就是产出区块,获得记账权就会得到一定量比特币的奖励。
工作量证明及哈希算法
![工作量证明及哈希算法](https://img.taocdn.com/s3/m/ef5ae0d3ac51f01dc281e53a580216fc700a5316.png)
⼯作量证明及哈希算法什么是⼯作量证明:1、⼯作的结果作为数据加⼊区块链成为⼀个区块2、完成这个⼯作的⼈会获得奖励(这也就是通过挖矿获得⽐特币)3、整个“努⼒⼯作并进⾏证明”的机制,就叫⼯作量证明为什么采⽤哈希算法:1、不可逆:⽆法从⼀个哈希值恢复原始数据,哈希并不是加密2、唯⼀性:对于特定的数据,只能有⼀个哈希值,并且这个哈希值是唯⼀的3、防篡改:改变输⼊数据中的⼀个字节,导致输出⼀个完全不同的哈希哈希算法特征:1、正向快速:给定明⽂和hash算法,在有限时间和有限资源内能计算出hash值2、逆向困难:给定hash值,在有限时间内很难逆推出明⽂3、输⼊敏感:原始输⼊信息修改⼀点信息,产⽣的hash值会有很⼤的不同4、冲突避免:很难找到两段内容不同的明⽂,使得他们的hash值⼀致(发⽣冲突)main.gopackage mainimport ("core""fmt""strconv")func main() {bc := core.NewBlockChain()bc.AddBlock("Send 1 BC to Ivan")bc.AddBlock("Send more BC to Ivan")for _,block := range bc.Blocks {fmt.Printf("Prev hash: %x\n", block.PrevBlockHash)fmt.Printf("Data: %s\n", block.Data)fmt.Printf("Hash: %x\n", block.Hash)//创建⼯作量证明pow := core.NewProofOfWork(block)//验证⼯作量证明fmt.Printf("Pow: %s\n", strconv.FormatBool(pow.Validate()))fmt.Println()}} block.gopackage coreimport ("time""strconv""bytes""crypto/sha256")//Block keeps block headertype Block struct {Timestamp int64 //区块创建的时间Data []byte //区块包含的数据PrevBlockHash []byte //前⼀个区块的哈希值Hash []byte //区块⾃⾝的哈希值,⽤于校验区块数据有效Nonce int //记录⼯作量证明⽤到的数字}//NewBlock create and returns Blockfunc NewBlock(data string, prevBlockHash []byte) *Block {block := &Block{Timestamp:time.Now().Unix(),Data: []byte(data),PrevBlockHash: prevBlockHash,Hash: []byte{},}pow := NewProofOfWork(block) //新建⼯作量证明nonce,hash := pow.Run() //执⾏⼯作量证明(挖矿)block.Hash = hashblock.Nonce = noncereturn block}func (b *Block) SetHash() {timestamp := []byte(strconv.FormatInt(b.Timestamp, 10))headers := bytes.Join([][]byte{b.PrevBlockHash, b.Data, timestamp},[]byte{}) hash := sha256.Sum256(headers)b.Hash = hash[:]}//NewGenesisBlock create and returns genesis Blockfunc NewGenesisBlock() *Block {return NewBlock("Genesis Block", []byte{})} proofofwork.gopackage coreimport ("math""math/big""fmt""crypto/sha256""bytes")var (maxNonce = math.MaxInt64)const targetBits = 20//ProofOfWork represents a proof-of-worktype ProofOfWork struct {block *Blocktarget *big.Int}//NewProofOfWork builds and returns a ProofOfWorkfunc NewProofOfWork(b *Block) *ProofOfWork {target := big.NewInt(1)target.Lsh(target,uint(256-targetBits))pow := &ProofOfWork{b, target}return pow}func (pow *ProofOfWork) prepareData(nonce int) []byte {data := bytes.Join([][]byte{pow.block.PrevBlockHash,pow.block.Data,IntToHex(int64(pow.block.Timestamp)),IntToHex(int64(nonce)),},[]byte{},)return data}func (pow *ProofOfWork) Run() (int, []byte) {var hashInt big.Intvar hash [32]bytenonce := 0fmt.Printf("Mining the block containing \"%s\"\n", pow.block.Data)for nonce < maxNonce {data := pow.prepareData(nonce)hash = sha256.Sum256(data)fmt.Printf("\r%x", hash)hashInt.SetBytes(hash[:])if hashInt.Cmp(pow.target) == -1 {break}else{nonce++}}fmt.Print("\n\n")return nonce,hash[:]}func (pow *ProofOfWork) Validate() bool {var hashInt big.Intdata := pow.prepareData(pow.block.Nonce)hash := sha256.Sum256(data)hashInt.SetBytes(hash[:])isValid := hashInt.Cmp(pow.target) == -1return isValid} utils.gopackage coreimport ("bytes""encoding/binary""log")func IntToHex(num int64) []byte {buff := new(bytes.Buffer)err := binary.Write(buff, binary.BigEndian, num)if err != nil {log.Panic(err)}return buff.Bytes()} 打印结果:Mining the block containing "Genesis Block"00000965faabec60c056cc30d9e6e45a0db7cfa84cb5897d8d5bdaa96971bd5fMining the block containing "Send 1 BC to Ivan"000006910ca6331d7c640787defe1189fb158bc3d624949bc61b68a3f0031efcMining the block containing "Send more BC to Ivan"00000a9e4f7f891bf6dd7323a1a5b698d5ba88c9363c8f5c9676fd075d526796Prev hash:Data: Genesis BlockHash: 00000965faabec60c056cc30d9e6e45a0db7cfa84cb5897d8d5bdaa96971bd5f Pow: truePrev hash: 00000965faabec60c056cc30d9e6e45a0db7cfa84cb5897d8d5bdaa96971bd5f Data: Send 1 BC to IvanHash: 000006910ca6331d7c640787defe1189fb158bc3d624949bc61b68a3f0031efc Pow: truePrev hash: 000006910ca6331d7c640787defe1189fb158bc3d624949bc61b68a3f0031efc Data: Send more BC to IvanHash: 00000a9e4f7f891bf6dd7323a1a5b698d5ba88c9363c8f5c9676fd075d526796 Pow: true。
POW工作量证明底层算法实现
![POW工作量证明底层算法实现](https://img.taocdn.com/s3/m/a5cfd25ace84b9d528ea81c758f5f61fb73628b9.png)
POW⼯作量证明底层算法实现POW 算法说明⽐特币区块链通过竞争记账⽅式解决去中⼼化的账本⼀致性问题。
竞争记账是过程,⽽不证明竞争结果。
采⽤⼯作量证明(Proof of Work,PoW)的机制来实现竞争结果判定。
哈希结果要满⾜前n位均为0要求,需要多次进⾏哈希值的计算。
⼀般来说,n值越⼤,需要完成的哈希计算量也越⼤。
要寻找4个前导0的哈希值,预期⼤概要进⾏2^16尝试。
⼯作量证明的优缺点优点:完全去中⼼化,节点⾃由进出;缺点:⽬前已经吸引全球⼤部分的算⼒,其它再⽤Pow共识机制的区块链应⽤很难获得相同的算⼒来保障⾃⾝的安全;挖矿造成⼤量的资源浪费;tps较⼩,不能满⾜⼤量交易的需求。
算法实现(Python)1#!/usr/bin/env python32# -*- coding: utf-8 -*-3"""4 @desc:5 @author: xsmile6 @software: PyCharm on 2020/6/147"""8import hashlib9import time1011 blocks = []121314class Block:15"""16区块类17"""18 index = 0 # 全局记录区块总数19 Difficulty = 12021def__init__(self, data, pre_hash, nonce):22"""23初始化区块信息24 :param data: 区块携带数据25 :param pre_hash: 前⼀区块 hash 值26 :param nonce: 随机数27 :param difficulty: 挖矿难度28"""29 self.index = Block.index30 self.time_stamp = time.time()31 self.data = data32 self.pre_hash = pre_hash33 self.nonce = nonce34 self.hash_value = ''35 self.difficulty = Block.Difficulty36 Block.index += 1373839def block_hash(block):40"""41⽣成区块成功验证后 hash 值42 :return: 区块 hash 值43"""44 block_info = str(block.index) + str(block.time_stamp) + str(block.data) + \45 str(block.pre_hash) + str(block.nonce) + str(block.difficulty)46 block_hash = hashlib.sha3_256(block_info.encode('utf-8')).hexdigest()4748return block_hash495051def verify_hash(block):52"""53验证区块 hash 是否符合难度要求54 :param block: 要被验证的区块55 :return: bool56"""57 pre_hash_difficult = '0' * block.difficulty5859return block.hash_value.startswith(pre_hash_difficult)606162def verify_block(new_block, last_block):63 verify_result = False64if (new_block.index is last_block.index + 1) and (new_block.pre_hash is last_block.hash_value): 65 verify_result = True6667return verify_result686970def create_block(last_block, data):71"""72创建新区块73 :param last_block: 当前区块链上最后⼀个区块74 :param data: 区块数据75 :return: 挖矿成功的区块76"""77 new_block = Block(data=data, pre_hash=last_block.hash_value, nonce=0)78while True:79 current_hash = block_hash(new_block)80print('挖矿中.......当前 hash:', current_hash)81 new_block.hash_value = current_hash82if verify_hash(new_block):83if verify_block(new_block=new_block, last_block=last_block):84print('挖矿成功')85break86 new_block.nonce += 18788return new_block899091def create_genesis_block():92"""93创建创世区块94 :return: 返回创世区块95"""96 block = Block(data='', pre_hash='', nonce=0)97 block.hash_value = block_hash(block)98return block99100101def run():102"""103代码执⾏104 :return: None105"""106 genesis_block = create_genesis_block()107 blocks.append(genesis_block)108 new_block = create_block(last_block=blocks[-1], data='俊伟君')109 blocks.append(new_block)110print('end')111112113pass114115116if__name__ == "__main__":117 run()118pass代码说明主要⽤到 hashlib 库对区块进⾏ hash 运算得到 64 位 hash 值以及 time 库产⽣时间戳。
一、PoW工作量证明
![一、PoW工作量证明](https://img.taocdn.com/s3/m/4ffd50ee900ef12d2af90242a8956bec0975a5c1.png)
⼀、PoW⼯作量证明1.1 产⽣区块定义区块结构体type Block struct {PreHash string // 上⼀个区块的哈希值TimeStamp string // 时间戳Diff int // 当前⽹络难度系数:控制哈希值有⼏个前导0Data string // 数据:交易信息Index int // 区块⾼度Nonce int // 随机值:决定了当前区块的哈希值,⼤量随机尝试,直到哈希值前导0有Diff个,即所谓的挖矿HashCode string // 当前区块的哈希值}产⽣⾸个区块func GenerateFirstBlock(data string) Block {var firstBlock BlockfirstBlock.PreHash = "0"firstBlock.TimeStamp = time.Now().String()firstBlock.Diff = 4firstBlock.Data = datafirstBlock.Index = 1firstBlock.Nonce = 0firstBlock.HashCode = GenerationHashValue(firstBlock)return firstBlock}产⽣新区块func GenerateNewBlock(data string, oldBlock Block) Block {var newBlock BlocknewBlock.PreHash = oldBlock.HashCodenewBlock.TimeStamp = time.Now().String()newBlock.Diff = 4newBlock.Data = datanewBlock.Index = oldBlock.Index + 1newBlock.Nonce = 0newBlock.HashCode = pow(newBlock.Diff, &newBlock)return newBlock}// 计算区块的哈希值func GenerationHashValue(block Block) string {// 准备区块内的数据var hashData = strconv.Itoa(block.Index) + strconv.Itoa(block.Nonce) + strconv.Itoa(block.Diff) + block.TimeStamp // 对数据进⾏哈希算法var sha = sha256.New()sha.Write([]byte(hashData))hashed := sha.Sum(nil)// 将字节转为字符串return hex.EncodeToString(hashed)}// PoW⼯作量证明算法进⾏哈希碰撞func pow(diff int, block *Block) string {// 不停的挖矿for {// 计算哈希值hash := GenerationHashValue(*block)// 哈希值前导0满⾜要求,挖矿成功if strings.HasPrefix(hash, strings.Repeat("0", diff)) {fmt.Println("挖矿次数:",block.Nonce)fmt.Println("挖矿成功:",hash)return hash} else {block.Nonce++}}}1.2 产⽣区块链通过链表的形式,维护区块链业务type Node struct {NextNode *Node // 指针域Data *Block.Block // 数据域:Block包中的Block}创建头节点func CreateHeaderNode(data *Block.Block) *Node {// ⽣成⼀个头节点,存放⾸个区块headerNode := new(Node)headerNode.NextNode = nilheaderNode.Data = datareturn headerNode}添加新节点func AddNode(data *Block.Block, node *Node) *Node {// ⽣成⼀个新节点,存放新的区块var newNode *Node = new(Node)newNode.NextNode = nilnewNode.Data = data// 上⼀个节点的指针域指向当前的新节点node.NextNode = newNodereturn newNode}遍历区块链func ShowNodes(node *Node) {n := nodefor{//尾节点,结束循环if n.NextNode==nil{fmt.Println(n.Data)break}else {fmt.Println(n.Data)n = n.NextNode}}}1.3 数据持久化使⽤LevelDB实现区块链数据持久化存储⼿动实现⼀个LevelDBpackage test_leveldbimport "fmt"//定义LevelDB结构体type DB struct {path stringdata map[string][]byte}//模拟开启连接func New(path string) (*DB, error) {self := DB{path: path,data: make(map[string][]byte),}return &self, nil}//模拟关闭连接func (self *DB) Close() error {return nil}//模拟 PUTfunc (self *DB) PUT(key []byte, value []byte) error {self.data[string(key)] = value}//模拟 GETfunc (self *DB) GET(key []byte) ([]byte, error) {if v, ok := self.data[string(key)]; ok {return v, nil} else {return nil, fmt.Errorf("没有此值")}}//模拟 DELETEfunc (self *DB) DELETE(key []byte) error {if _, ok := self.data[string(key)]; ok {delete(self.data, string(key))return nil} else {return fmt.Errorf("没有此值")}}//模拟遍历取值func (self *DB) Ietrator() Iterator {return NewDefaultIterator(self.data)}迭代器实现package test_leveldbimport "fmt"type Iterator interface {Next() bool // 判断是否有下⼀个值Key() []byte // 键Value() []byte // 值}// 键值的结构体type Pair struct {Key []byteValue []byte}// 迭代器的结构体type DefaultIterator struct {data []Pairindex intlength int}// 创建默认的迭代器func NewDefaultIterator(data map[string][]byte) *DefaultIterator { self := new(DefaultIterator)self.index = -1self.length = len(data)for k, v := range data {p := Pair{Key: []byte(k),Value: v,}self.data = append(self.data, p)}return self}//Next⽅法func (self *DefaultIterator) Next() bool {// 迭代器还有值if self.index < self.length-1 {self.index++return true} else {return false}}//Key⽅法func (self *DefaultIterator) Key() []byte {if self.index == -1 || self.index >= self.length {panic(fmt.Errorf("越界异常"))}return self.data[self.index].Key}//Value⽅法func (self *DefaultIterator) Value() []byte {if self.index == -1 || self.index >= self.length {panic(fmt.Errorf("越界异常"))}return self.data[self.index].Value}1.4 在⼴域⽹中做⼴播。
工作量证明算法的挖矿机制解析
![工作量证明算法的挖矿机制解析](https://img.taocdn.com/s3/m/447cd09a27fff705cc1755270722192e453658f8.png)
工作量证明(Proof of Work,简称PoW)是一种区块链技术中的基础挖矿机制,用于验证交易和创建新区块。
该机制的核心思想是通过解决复杂的问题来获得挖矿奖励,同时保证区块链的安全性。
在PoW机制中,矿工需要在区块链上解决一系列计算难题,并消耗一定的计算能力和电力,以证明他们已经完成了这些难题。
PoW挖矿机制的工作原理如下:1. 矿工首先从区块链中获取当前的信息,如当前时间、上一个区块的哈希值等。
2. 矿工需要生成一个新的交易块,并尝试将其添加到区块链中。
为了生成一个新的交易块,矿工需要生成一个随机数(也称为工作量),并将其与当前时间、上一个区块的哈希值等输入一起输入到一个加密哈希函数中。
3. 加密哈希函数会返回一个哈希值,这个哈希值需要满足一定的条件才能将新的交易块添加到区块链中。
这些条件通常包括交易块的完整性、合法性以及与前一个区块的链接性等。
4. 矿工需要在计算哈希值时消耗大量的计算能力,以获得一个符合条件的哈希值。
如果矿工不能在规定的时间内找到符合条件的哈希值,他们将被视为失败,并且可能需要等待一段时间后再次尝试。
5. 如果矿工成功地找到了符合条件的哈希值,那么他们的交易块将被添加到区块链中,同时他们也会获得一定的奖励和声誉。
奖励通常是以货币的形式发放给矿工,而声誉则是由其他矿工和社区成员的认可和信任所体现的。
PoW挖矿机制的优点:1. 安全性:PoW机制能够有效地防止恶意节点对区块链的攻击,因为攻击者需要同时解决一系列计算难题才能攻击整个区块链。
这大大增加了攻击者的成本和风险。
2. 共识机制:PoW机制提供了去中心化的共识机制,使不同的节点能够在没有中央控制的情况下达成共识。
3. 节能环保:PoW机制通常只需要大量的计算能力和电力,不需要昂贵的硬件设备或复杂的硬件设施。
然而,PoW挖矿机制也存在一些缺点:1. 耗时:挖矿过程通常需要大量的时间和计算资源,这可能会影响区块链的性能和效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
比特币的工作量证明
PoW(Proof of Work,工作量证明)是区块链技术中基本的、常见的一种共识机制。
加密币中的挖矿,其实就是运用工作量证明来进行的。
一、PoW的起源
工作量证明最早是一个经济学名词,指系统为达到某一目标而设置的衡量机制。
通俗来说,就是当你完成一定量的工作后,确认这一工作量的证明。
因为监测整个工作的过程是非常的耗时的,而只通过检验工作结果来确认工作量,显然效率要更高。
工作量证明系统(或者说协议、函数),是一种应对拒绝服务攻击和其他服务滥用的经济对策。
它要求发起者进行一定量的运算,也就意味着需要消耗计算机一定的时间。
这个概念由Cynthia Dwork和MoniNaor 1993年在学术论文中首次提出。
在1999年,Markus Jakobsson and Ari Juels两人将pow概念引入计算机体系,工作量证明(PoW)这个名词,在两人的文章中被真正提出。
起初,PoW被用于抵挡拒绝服务攻击和网络爬虫,后来在反垃圾邮件中被广泛使用。
反垃圾邮件系统哈希现金(Hash Cash),其设计理念是一个正常用户写一封邮件是需要一定的时间,而发送垃圾邮件者是无法接受这个等待的时间,PoW系统使垃圾邮件发送者需要更多的时间来发送邮件,增大他们的成本,起到抵挡攻击的作用。
PoW共识机制是基于哈希函数本身复杂的运算,通过给定的初始值和简单的值递增规律,
利用其碰撞原理,找到特定的碰值,可以通过对碰值的调节,实现对于工作量的调节。
二、哈希函数
哈希函数(Hash Function)即散列函数,输入一个x,会得出相应的输出H(x)。
其中,这里的x可以是任意长度的字符串,而输出的H(x)却具有固定长度,哈希函数正是将任意长度的数据映射到有限长度的域上。
在计算过程上,虽然复杂,但非常高效。
比特币这种加密系统使用的哈希函数,还需要同时具备免碰撞、匿名性、防篡改等特点。
免碰撞指的是:如果输入的x≠y,绝不会出现H(x)=H(y)的情况,即输入两个不同的数据块,其哈希值一般来说也不会相同。
理论上相同的可能性并非绝对没有,但概率极小。
所以,对于一个给定的数据块,要找到与它哈希值相同的数据块极难。
哈希函数的隐匿性是指,对于一个给定的输出结果H(x),想要逆推出输入的x,在计算上是不可能的。
而对于数据块的任何一处小小的改动,哈希值随之产生的变动都会非常明显,这一点构成了哈希函数的防篡改特点。
同时,在这一函数中,穷举法是能够使得哈希值H(x)落在特定范围的最好方法。
在比特币的区块链上,使用哈希穷举实现工作量证明能够拥有随机和易验证两种特性,这两种特性将于后文中提到。
三、工作量证明的原理
在工作量证明系统中,客户端完成一定难度的工作,得出一个结果,验证者只需通过验证这个结果就能检验客户端是否做了相应的工作。
这种方案的一个核心特征是不对称性:工作对于请求方是适中的,对于验证方则是易于验证的。
其工作流程如下:
对于任意一串字符,给出了一定的工作量要求,对这串字符进行变更,使其得到具有特定规律的一个结果,若得到这个结果,则验证通过。
为了达到这个目标,需要不断地对这串字符进行哈希计算,直到计算量达到一定次数时,才能得到要求的变更后的数列。
在计算之前,根据工作量要求可以得出预期的计算次数,这个预期的次数和实际不一定完全吻合,但会大体接近,如果重复多次,会发现这确实是一个符合统计学规律的概率事件。
而这里提到的预期计算次数,其实就是要求的工作量。
以上是工作量证明的基本原理,比特币系统中的工作量证明机制与其类似,但更为复杂。
四、比特币的工作量证明
在工作量证明的区块链中,系统会根据算力大小来选取打包的节点,对于节点来说,单纯的
打包和数据上传非常简单,不过,系统需要选取一个特定的节点来处理某件事,为了避免众多节点对同一件事打包而引起不必要的分叉,比特币通过前文中提到的哈希穷举,增加打包难度,以延长打包时间。
简言之,就是每个节点都需要在10分钟内找到一个随机数,并保证这个随机数加上上文所说的哈希运算,能够满足一定的规律。
为了找到这个随机数,只能通过不断尝试新的随机数,不断的运算。
而随着运算量的增大,目标范围也会不断缩小。
哈希穷举的随机性和易验证性在这里体现了出来。
首先,即使知道了这个随机数的范围,也只能通过大量计算去得到;然后,如果有人找到了随机数,那么其他节点能够很容易地检验这个结果的正确性。
如果算力增强,就需要修改难度以增加计算次数,比特币中就有修改难度的规则。
所以,想要找到这样一个随机数,计算量要远远大于预期的工作量。
为了鼓励节点不断地对数据和信息进行打包,比特币的区块链网络设置了奖励,即支付给打包(记账)节点的奖励和交易费。
打包奖励是指创建区块的节点会获得一定数量的比特币作为奖励,奖励的数量随着比特币区块的生成而减少。
交易费即使用比特币转账时支付给记账节点的费用,这是支持节点工作、维护区块链自动运转的重要因素。
这两种打包奖励都是通过工作量证明来进行,在比特币中也就是为人所熟知的挖矿行为。
而衍生而来的矿机,在一开始其实是个人计算机这样的运算设备,随着算力的提高,难度的增大,专业矿机诞生。
自始至终,算力的竞争从未结束,而难度和算力也在不断进行博弈。
工作量证明的优点是足够安全、公平和去中心化,其免碰撞、匿名性与不可篡改的特点奠定了比特币区块链技术的核心;但它的缺点也很明显,耗时长效率低,算力提高的同时耗费了电力,除了挖矿,这些强大的算力难以转化成其他资源。