数字货币开发专题(Proof Of Work工作证明)
来源:互联网 发布:linux 502端口映射 编辑:程序博客网 时间:2024/05/16 06:49
区块链爱好者(QQ:53016353)
数字货币开发中使用到的工作证明(Proof Of Work,简称POW),顾名思义,即工作量的证明。通常来说只能从结果证明,因为监测工作过程通常是繁琐与低效的。
数字货币在Block的生成过程中使用了POW机制,一个符合要求的Block Hash由N个前导零构成,零的个数取决于网络的难度值。要得到合理的Block Hash需要经过大量尝试计算,计算时间取决于机器的哈希运算速度。当某个节点提供出一个合理的Block Hash值,说明该节点确实经过了大量的尝试计算,当然,并不能得出计算次数的绝对值,因为寻找合理hash是一个概率事件。当节点拥有占全网n%的算力时,该节点即有n/100的概率找到Block Hash。
工作证明机制看似很神秘,其实在社会中的应用非常广泛。例如,毕业证、学位证等证书,就是工作证明,拥有证书即表明你在过去投入了学习与工作。生活大部分事情都是通过结果来判断的。
挖矿
挖矿即不断接入新的Block延续Block Chain的过程。
挖矿为整个系统的运转提供原动力,是比特币的发动机,没有挖矿就没有比特币。挖矿有三个重要功能:
发行新的货币(总量达到之前)
维系货币的支付功能
通过算力保障系统安全
金矿消耗资源将黄金注入流通经济,比特币通过“挖矿”完成相同的事情,只不过消耗的是CPU时间与电力。当然,比特币的挖矿意义远大于此。
Block Hash算法
Block头部信息的构成:
字段名 含义 大小(字节)
Version 版本号 4
hashPrevBlock 上一个block hash值32
hashMerkleRoot 上一个block产生之后至新block生成此时间内,
交易数据打包形成的Hash 32
Time Unix时间戳 4
Bits 目标值,即难度 4
Nonce 随机数 4
下面采用高度为125552的block数据为例,演示block hash的计算过程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
php
$header_hex = "01000000" . // version
// previous block hash
"81cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000" .
// merkle root hash of transactions in this block
"e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f1fc122b" .
// Time
"c7f5d74d" .
// Bits (Difficulty)
"f2b9441a" .
// Nonce
"42a14695";
$header_bin = pack("H*", $header_hex); // hex to bin
$h = hash('SHA256', hash('sha256', $header_bin, true), true); // double sha256
echo bin2hex($h), "\n";
// output: 1dbd981fe6985776b644b173a4d0385ddc1aa2a829688d1e0000000000000000
echo bin2hex(strrev($h)), "\n";
// output: 00000000000000001e8d6829a8a21adc5d38d0a473b144b6765798e61f98bd1d
该计算过程简单明了:首先将数个字段合并成一块数据,然后对这块数据进行双SHA256运算。
产量调节
Block的产量为大约每两周2016个,即每10分钟一块。该规则在每个节点的代码里都固定了。
1
2
3
4
5
6
// 目标时间窗口长度:两周
static const int64 nTargetTimespan = 14 * 24 * 60 * 60;
// block频率,每10分钟一块
static const int64 nTargetSpacing = 10 * 60;
// 每两周的产量2016,也是调节周期
static const int64 nInterval = nTargetTimespan / nTargetSpacing;
但由于实际算力总是不断变化的(目前一直是快速上升的),所以需根据最近2016个块的耗费时间来调整难度值,维持每10分钟一个block的频率.
Block字段详解
Version,版本号,很少变动,一般用于软件全网升级时做标识
hashPrevBlock,前向Block Hash值,该字段强制多个Block之间形成链接
hashMerkleRoot,交易Hash树的根节点Hash值,起校验作用,保障Block在网络传输过程中的数据一致性,有新交易加入即发生变化
Time,Unix时间戳,每秒自增一,标记Block的生成时间,同时为block hash探寻引入一个频繁的变动因子
Bits,可以推算出难度值,用于验证block hash难度是否达标
Nonce,随机数,在上面数个字段都固定的情况下,不停地更换随机数来探寻
最为关键的字段是hashPrevBlock,该字段使得Block之间链接起来,形成一个巨大的“链条”。Block本是稀松平常的数据结构,但以链式结构组织起来后却使得它们具有非常深远的意义:
形成分支博弈,使得算力总是在主分支上角逐
算力攻击的概率难度呈指数上升(泊松分布)
每个block都必须指向前一个block,否则无法验证通过。追溯至源头,便是高度为零的创世纪块(Genesis Block),这里是Block Chain的起点,其前向block hash为零,或者说为空。
新block诞生过程
下面是一个简单的步骤描述,实际矿池运作会有区别,复杂一些:
节点监听全网交易,通过验证的交易进入节点的内存池(Tx Mem Pool),并更新交易数据的Merkle Hash值
更新时间戳
尝试不同的随机数(Nonce),进行hash计算
重复该过程至找到合理的hash
打包block:先装入block meta信息,然后是交易数据
对外部广播出新block
其他节点验证通过后,链接至Block Chain,主链高度加一,然后切换至新block后面挖矿
由于hashPrevBlock字段的存在,使得大家总是在最新的block后面开挖,稍后会分析原因。
主链分叉
从block hash算法我们知道,合理的block并不是唯一的,同一高度存在多个block的可能性。那么,当同一个高度出现多个时,主链即出现分叉(Fork)。遇到分叉时,网络会根据下列原则选举出Best Chain:
不同高度的分支,总是接受最高(即最长)的那条分支
相同高度的,接受难度最大的
高度相同且难度一致的,接受时间最早的
若所有均相同,则按照从网络接受的顺序
等待Block Chain高度增一,则重新选择Best Chain
按照这个规则运作的节点,称为诚实节点(Honest Nodes)。节点可以诚实也可以不诚实。
分支博弈
我们假设所有的节点:
都是理性的,追求收益最大化
都是不诚实的,且不惜任何手段获取利益
所有节点均独自挖矿不理会其他节点,并将所得收益放入自己口袋,现象就是一个节点挖一个分支。由于机器的配置总是有差别的,那么算力最强的节点挖得的分支必然是最长的,如果一个节点的分支不是最长的,意味其收益存在不被认可的风险(即零收益)。为了降低、逃避此风险,一些节点肯定会联合起来一起挖某个分支,试图成为最长的分支或保持最长分支优势。
一旦出现有少量的节点联合,那么其他节点必然会效仿,否则他们收益为零的风险会更大。于是,分支迅速合并汇集,所有节点都会选择算力更强的分支,只有这样才能保持收益风险最小。最终,只会存在一个这样的分支,就是主干分支(Best/Main Chain)。
对于不诚实节点来说,结局是无奈的:能且只能加入主干挖矿。不加入即意味被抛弃,零收益;加入就是老实干活,按占比分成。
Hash Dance
Block hash的计算是随机概率事件,当有节点广播出难度更高的block后,大家便跑到那个分支。在比特币系统运行过程中,算力经常在分支间跳来跳去,此现象称为Hash Dance。一般情况下,分支的高度为1~2,没有大的故障很难出现高于2的分支。
Hash Dance起名源于Google Dance.
算力攻击的概率
算力攻击是一个概率问题,这里作简单叙述:
p = 诚实节点挖出block概率
q = 攻击者挖出block概率,q = 1 – p
qz = 攻击者从z个block追上的概率
我们假设p>q,否则攻击者掌握了一半以上的算力,那么概率上永远是赢的。该事件(攻击者胜出)的概率是固定,且N次事件之间是相互独立的,那么这一系列随机过程符合泊松分布(Poisson Distribution)。Z个块时,攻击者胜出的期望为lambda:
攻击者在攻击时已经偷偷的计算了k个块,那么这
椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟。ECDSA于1999年成为ANSI标准,并于2000年成为IEEE和NIST标准。它在1998年既已为ISO所接受,并且包含它的其他一些标准亦在ISO的考虑之中。与普通的离散对数问题(discrete logarithm problem DLP)和大数分解问题(integer factorization problem IFP)不同,椭圆曲线离散对数问题(elliptic curve discrete logarithm problem ECDLP)没有亚指数时间的解决方法。因此椭圆曲线密码的单位比特强度要高于其他公钥体制。
数字签名算法(DSA)在联邦信息处理标准FIPS中有详细论述,称为数字签名标准。它的安全性基于素域上的离散对数问题。椭圆曲线密码(ECC)由Neal Koblitz和Victor Miller于1985年发明。它可以看作是椭圆曲线对先前基于离散对数问题(DLP)的密码系统的模拟,只是群元素由素域中的元素数换为有限域上的椭圆曲线上的点。椭圆曲线密码体制的安全性基于椭圆曲线离散对数问题(ECDLP)的难解性。椭圆曲线离散对数问题远难于离散对数问题,椭圆曲线密码系统的单位比特强度要远高于传统的离散对数系统。因此在使用较短的密钥的情况下,ECC可以达到于DL系统相同的安全级别。这带来的好处就是计算参数更小,密钥更短,运算速度更快,签名也更加短小。因此椭圆曲线密码尤其适用于处理能力、存储空间、带宽及功耗受限的场合。
ECDSA是椭圆曲线对DSA的模拟。ECDSA首先由Scott和Vanstone在1992年为了响应NIST对数字签名标准(DSS)的要求而提出。ECDSA于1998年作为ISO标准被采纳,在1999年作为ANSI标准被采纳,并于2000年成为IEEE和FIPS标准。包含它的其他一些标准亦在ISO的考虑之中。
- 数字货币开发专题(Proof Of Work工作证明)
- Proof of work - 工作量证明
- Proof of work - 工作量证明
- Proof of work - 工作量证明
- 用python阐释工作量证明(proof of work)
- Proof of work - 工作量证明
- 数字货币开发专题(钱包开发的原理是什么)
- 数字货币开发专题(数字货币开发者指南)
- 数字货币开发专题(安全散列算法SHA256)
- 数字货币开发专题(分布式和区块链技术)
- 数字货币开发专题(钱包生成二维码功能)
- 数字货币开发专题(区块链会不会被攻击)
- 数字货币开发专题(什么是比特币挖矿机)
- POC [Proof of Concept] 原型 / 概念证明
- POC [Proof of Concept] 原型 / 概念证明
- 数字货币开发专题(开发使用的算法和协议)
- 数字货币开发专题(创世区块里藏着什么秘密)
- 数字货币开发专题(51%攻击技术和运行方法)
- Android Studio开发问题1-出现 Error running app:Instant Run requires 'Tools|Android|Enable ADB integration'
- 4.28
- Flashsim安装以及支持4KB,8KB闪存页
- springmvc(五)---全局异常处理器
- 石头剪子布
- 数字货币开发专题(Proof Of Work工作证明)
- javaScript语言基础---(二)
- Linux vim编写程序时出现高亮字符,如何取消?
- 神经网络的简介
- java内存模型
- 全新手在linux上安装jdk
- Java CAS 和ABA问题
- numpy 高阶函数 —— np.histogram
- PAT-A-1093. Count PAT's (25)