深入浅出比特币的交易和挖矿

一、浅谈* 比特币*

  1. 比特币交易简化示例

相比传统中心化支付交易系统,比特币交易实现可信去中心化的交易,基于两个技术架构为基础:P2P网络和区块链。

区块链结构

  1. 比特币的技术特点

优点:

  • 去中心化
  • 防篡改(交易安全)
  • 有效的激励机制(挖矿)

缺点:

  • 交易耗时长:10分钟,4000笔

当然还有被诟病的是浪费算力资源,但不算是技术特点纬度的缺点。

  1. 挖矿和交易安全

比特币能有效运转,离不开挖矿机制和交易安全上的保障,下面会对这两个纬度上的问题深入的展开探讨。

二、深入交易问题

  1. 付款方防伪

付款方防伪指系统需要保证其他人不会伪造进行交易,依赖的是数字签名。

比特币中付款方的签名采用椭圆曲线数字签名ECDSA

背景知识:数字签名

(sk, pk) :=generateKeys( keysize)

sk私钥

pk公钥

sig:= sign( sk, message) 签名过程 是把 一段 消息 和 私 钥 作为 一个 输入, 消息 输出 是 签名。

isValid:= verify( pk, message, sig) 验证 过程 是 通过 把 一段 消息 和 签名 消息 与 公 钥 作为 输入,输出成功or失败

  1. 收款方防伪

收款方防伪的问题等价于交易时支付的对象是全局唯一的,具备唯一身份标识。

比特币采用椭圆曲线数字签名ECDSA

个人秘钥:256位

公钥:512位

待签名信息:256位

签名:512位

  1. 付款方余额是否充足

银行体系中,转账时要校验帐户是否有足够的余额,而比特币体系中,不直接记录帐户的余额,余额是否充足是根据交易记录进行判别,下面用一个简化的例子来推算下。

  1. 第一条交易记录:25个币输出给爱丽丝
    第二条交易记录:输入来自第一条记录0编号,即爱丽丝的25个币;输出其中17个输出给鲍勃,8个输出给爱丽丝;比特币交易要求输入=输出,所以就有爱丽丝自己转账给自己的情况;

现在我们对第四条记录进行故意的篡改,其输入有2[1]改成1[0],那首先校验输入25与输出(6+2=8)是不相符的;其次,1[0]在第二条交易记录中已经作为输入使用过,所以是重复交易;

由此可以推导比特币体系对于余额是否充足的校验是融入在交易记录的校验中,一条交易记录,首先校验输入值是否等于输出值,其次校验输入是否被重复使用,从输入值编号开始搜索到当前值,如该输入值未被使用过即校验成功。

一段真实的比特币交易数据

  1. 如何处理多条合法链

区块链的结构准确说不是链而是树,区块树。

上图中,黑色块代表是主链,正常情况下,每个计算节点都应该在尾区块上挂接新区块,但以下两种情况下会出现分叉:

  • 坏人计算节点故意在非尾区块中添加新区块,如上图B区块。
  • 好人计算节点未收到黑色的尾区块,将新区块B挂接其认为的尾区块,到区块链广播到网络中,merge成上图的分叉区块链。

从合法性角度,图中两个分叉都是符合比特币体系要求,那到底哪条链是主链呢?比特币体系采用最长优先的生存法则,基于风险收益的博弈,计算节点会把新区块添加在最长分支链尾部,这样偶尔出现的分叉节点就不会变长。

  1. 防止双重支付

比特币体系中,双重支付可以构造的,即理论上肯定存在。下面举个例子来讲:

受害者A如何防止双重支付的风险,比特别白皮书建议:挂接6个区块(即60分钟)后,再确认这笔交易。6个区块属于经验值,实际运行过程中,坏人追赶6个区块的成功率=0

三、深入挖矿问题

  1. 为什么要挖矿

挖矿是因为有利可图,如下图,挖矿者可以在区块链中插入一个币基交易,获得挖矿奖励。

背景:聪哥的创始区块

比特币的第一个区块包含着第一个币基交易,coinbase中也存了一段特殊的文本信息。

"The Times 03/Jan/2009 Chancellor on brinkof second bailout for banks"

  1. 如何挖矿

挖矿的过程我称之为Hash解谜,我们知道Hash算法是单向不可逆的,所以我们要算出指定条件的hash结果,只能通过穷举,所以挖矿比的就是算hash的速度。

延展:梅克尔Hash树

比特币限制一个区块的大小不超过1MB,大概能存放不超过4000笔的交易。这4000笔的存储格式采用如下的梅克尔Hash树,即所以交易都在叶子节点,叶子节点两两向上计算hash值,至到根节点,叫梅克尔根。计算区块的Hash时,其中一个变量就是梅克尔根Hash值,不使用具体的4000笔交易,但任何一笔交易的调整都会引发梅克尔根Hash值的变化,因此保障了交易数据不可篡改。

  1. 为什么比特币数量有上限

我们知道比特币的交易并不增加大盘的比特币数,大盘的比特币数量是通过挖矿奖励而增加的,聪哥规定,每生产21万个区块,奖励减半,所以,这是一个递减的等比数列,根据该数列的特性,比特币大盘总量是有上限的。

计算比特币数量上限2100万:

奖励递减:50, 50/2, 50/4, 50/8…

等比数列求和公式:

n无限大时,S无限接近a1/(1-q)=100

所以,比特币上限:100*21万区块=2100万个

再估算下时间:

n=4, 2021年,比特币 1837.5万个

n=5, 2025年,比特币 1968.75万个

n=6, 2029年,比特币 2034.375万个

n=7, 2033年,比特币 2067.1875万个

n=12, 2053年,比特币 2098.974609375万个

由此可得,到了2025年之后,挖矿奖励已经缩水很明显了,每次奖励已不足两个币。

  1. 为什么挖矿越来越难

历史总是惊人的相似,比特币挖矿设备的升级,好比当年美国西部淘金的设备升级,如下图。

矿工不断升级设备,就是为了更有机会更有效率地挖到矿,获得奖励。

过去几年,全网运算能力增速每周25%,每年几百倍。

按2015年难度水平推演:

CPU: 20MH/S,几十万年/区块

GPU: 200MH/S,几百年/区块

FPGA: 1GH/S,100年/区块

当前挖矿市场被ASIC所主导

再来看看下图是当前全网算力和挖矿难度的走势图,比特币体系规定,每挖出2016个区块,即两周左右的周期,挖矿难度会调整一次,以便让一个区块的挖矿时间能稳定在10分钟左右。所以,下图中蓝色代表的全网算力曲线是连续曲线,而红色代表的挖矿难度曲线是一条两周为周期跳变的线。

目前比特币的区块已经超过了50万块,下面来对比一下创始区块和第50万块的挖矿难度:

创世区块Hash:

000000000019d6689c….

10个0,实际要求8个0,难度系数1

4G次即可,一颗CPU,10分钟搞定

Block #50万 Hash:

00000000000000000024fb37…

18个0,16^18次方

4,294,967,296TH

  1. 何为矿池

矿池的技术前提是联合挖矿,即把挖矿这件事分解给多个矿工协同完成,简单说就是让每个矿工计算一个区间的Hash值,任何一位算出的Hash值符合要求,即挖矿成功,由此可见,联合的矿工越多挖矿速度越快。

但矿池的出现,导致寡头现象越来越明显,下图是全网的算力分布,图中可见,top4的矿池已经掌握了全网51%+的算力。如果top4家联手,就会直接引发比特币51%风险。比特币设计初衷是去中心化,去中心化是保障交易安全的重要基础,而如今矿池寡头的现象,估计是聪哥当初未预料到的,这也是比特币体系的弊端之一。