频道栏目
首页 > 资讯 > 云计算 > 正文

比特币基础概念入门3

17-09-19        来源:[db:作者]  
收藏   我要投稿

挖矿与共识

一、实验介绍

1.1 实验知识点

比特币分发与挖矿双重支付工作量证明

1.2 实验环境

Python 2.7

二、比特币分发与挖矿

作为一种货币,中本聪在设计之初就对比特币的分发做了周详的设计,总共2100万枚比特币将按照一个递减的速率的分发,具体是每四年速率减缓一次。最初发现每个区块会奖励50个比特币,到了现在(2017年),发现新区块的奖励已经降低到了12.5个比特币。

此处输入图片的描述

新区块是如何被发现的呢? 这就涉及到了比特币的 “挖矿”,所有的“矿工” 会竞争解决一个问题来获得记账权并获得相应的新币奖励。

它们解决的问题是一个与哈希加密算法有关的数学难题,具体来说就是对于一个字符串,寻找一个后缀来使哈希值小于某一特定值。 我们可以通过一个python小程序来看一看,一个固定的字符串添加不同的后缀再哈希得到的值有什么规律:

import hashlib
text = "Jiawencoin is coming"
for nonce in xrange(20):
    input = text + str(nonce)
    hash = hashlib.sha256(input).hexdigest() 
    print input, '=>', hash

此处输入图片的描述

可以看到得到的哈希值似乎没有任何规律。

如果得到的哈希值是完全随机的(近似均匀抽样),那么我们可以通过设置一个阈值,让竞争者找到一个后缀,使其对应的哈希值小于这个值。我们可以通过调整这个值的大小来改变期望的计算次数,我们的哈希函数得到的结果的最大值是2的256次方,所以如果我们把阈值设为2的240次方,那得到小于这个值的概率是1除以2的16次方。我们可以通过调整阈值来控制难度,阈值越小,难度越高。在比特币系统中,难度会随着前面发现区块的时间动态调整,使得发现每个区块的平均时间为10分钟。

我们可以通过下面这个例子来体会一下不同难度下所需要的计算时间:

import hashlib
import time

max_nonce = 2 ** 32 # 4 billion

def proof_of_work(header, difficulty_bits):
    target = 2 ** (256-difficulty_bits) 
    for nonce in xrange(max_nonce):
        hash_result = hashlib.sha256(str(header)+str(nonce)).hexdigest() 
        if long(hash_result, 16) < target:
            print "Success with nonce %d" % nonce 
            print "Hash is %s" % hash_result 
            return (hash_result,nonce)

    print "Failed after %d (max_nonce) tries" % nonce 
    return nonce

if __name__ == '__main__': 

    nonce = 0
    hash_result = ''

    for difficulty_bits in xrange(30): 
        difficulty = 2 ** difficulty_bits
        print "Difficulty: %ld (%d bits)" % (difficulty, difficulty_bits) 
        start_time = time.time()
        new_block = 'test block with transactions' + hash_result
        (hash_result, nonce) = proof_of_work(new_block, difficulty_bits) 
        end_time = time.time()
        elapsed_time = end_time - start_time
        print "Elapsed Time: %.4f seconds" % elapsed_time

此处输入图片的描述

对于矿工而言,在挖矿的过程中它们得到了经济回报。 但是如果从系统设计者的角度来看,解决这样的数学问题并没有对产生任何社会价值,却消耗了大量的算力、电力等等,这完全就是社会资源的浪费。

难道挖矿只是为了分发货币吗?其实不是的,这种机制的设计其实是为了应对数字货币中特定的问题,也就是双重支付,我们下面来看一看双重支付到底是什么。

三、双重支付

双重支付,顾名思义就是把一份钱给用两次,如果我们用的是纸币,应该是没有办法把一张钱给用两次,因为大多数人都不会收半张钱。 但是对于数字货币或者虚拟资产,用两次是很正常的事情。

举个例子,我高中的时候就做过一次双重支付。

以前我们高中的时候食堂用饭卡来买东西,把卡放到窗口旁边以后会显示你还剩多少钱,当时我的饭卡里面有5块钱,我就先到A窗口划了一下,显示还剩5块,我暂时没有买东西,然后又到B窗口划了一下,又显示还剩5块,然后我在两边各买了5块的东西,最后用5块买到了10块的东西。

在区块链中我们也可以实现相似的操作

此处输入图片的描述

我们可以看上面这幅图, A支付给了B , 这项交易被写入了区块 ,假设这个区块的名字是M , 然后A马上开始从 M 的前一个区块开始挖新的区块,构成一条新的链条,在这个新的链条中A 把比特币支付给了自己的地址,如果这条新的链条的长度超过了原来的链条,那么所有人会接受这条最长链条,抛弃原来的链条(这是因为在比特币中所有人都遵循将最长链条视为有效链条的规则)。如此一来,M及M以后的区块的交易都变得无效,A转出去的比特币又变回来了。

四、工作量证明

下面我们要说明的是,通过“挖矿”我们可以给予人们动机去当诚实的节点。

我们先从数学角度分析一下这个问题:

p = 诚实节点发现下一节点的概率

q = 欺诈节点发现下一节点的概率

qz = 欺诈节点从落后z个节点到追上诚实节点的概率

我们假设在A支付给B后就马上开始准备新的链条 ,如果在z个区块后B确认了交易,那么在这段时间内A生成区块的数量应该是一个均值为 z * (q/p) 的泊松分布,那么A能够完成双重支付攻击的概率就是:

此处输入图片的描述

那么如果q > p ,几乎一定会追上诚实节点,这也是51%算力攻击这种说法的来源(更详细的介绍51%算力攻击

如果q < p的话,坏人能够追上的概率随着z的增加呈现出指数型衰减 。由于比特币的交易需要6次确认, 并且在现实中已经几乎没有机构能够垄断算力,所以双重支付攻击基本是不可能实现的。

从另一方面来看,就算有人有能力能够追上诚实节点并发动51%算力攻击,他可以选择当一个诚实的节点,从挖到的新区块的奖励和比特币价值的增长中获得收益。也可以选择对系统进行攻击,损害整个社区使比特币失去价值。如果作为诚实节点的经济激励大于作恶,他就会有经济动机去保持诚实。

从上面的分析来看,工作量证明通过用算力投票的方式让节点自发地选择做诚实的节点从而让双重支付几乎不会发生,这样的机制非常巧妙,在比特币后很多新币也发明了如POS , DPOS等新的共识机制来解决双重支付的问题。

总结

在这短短的三节内容中我们介绍了比特币的加密算法,交易与数字签名,区块链结构,挖矿与共识等内容,可以说是涵盖了整套比特币系统中的精华。如果读者有兴趣进一步研究比特币相关技术,可以阅读后面提供的参考资料,或者添加我的微信 caijiawen2016 作进一步的交流。

参考资料。

Nakamoto S. Bitcoin: A peer-to-peer electronic cash system[J]. 2008.Mastering BitcoinBitcoin and Cryptocurrency Technologies

相关TAG标签
上一篇:路由器静态一对一NAT全局地址同时用于PAT
下一篇:比特币基础概念入门2
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站