工作量证明机制是怎样的?
- 发行新的货币(总量达到之前)
- 维系货币的支付功能
- 通过算力保障系统安全
字段名 | 含义 | 大小(字节) |
---|---|---|
Version | 版本号 | 4 |
hashPrevBlock | 上一个block hash值 | 32 |
hashMerkleRoot |
上一个block产生之后至新block生成此时间内,
交易数据打包形成的Hash |
32 |
Time | Unix时间戳 | 4 |
Bits | 目标值,即难度 | 4 |
Nonce | 随机数 |
4
|
12345678910111213141516171819 |
|
123456 |
|
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 个块,那么这
专访 Mable Jiang:复盘 Multicoin 投资方法论与 DeFi 洞察
原文标题:《对话 Mable:复盘 Multicoin Capital 的投资方法论与 DeFi 观察 | 链捕手》受访者:Mable Jiang,Multicoin Capital 执行董事撰文:王...
信标链、PoS、分片……接触以太坊 2.0 得先理解这些术语
原文标题:《以太坊 2.0 术语库》整理:ETH 中文网Attestation 证明证明是指验证者所发起的投票,由验证者的签名聚合而成,用以证明区块的有效性,投票通过验证者的余额进行加权。Attest...
手把手教你搭建 IPFS 私有网络
在联盟链的场景下,IPFS 作为去中心化存储的首选方案,本文将介绍如何使用 go-ipfs 搭建一个私有网络并进行简单使用。...