什么是区块链和比特币?

有人说区块链是新一代价值互联网,有人说它是最慢的数据库,有人说区块链是一项类似于蒸汽机一样巨大的发明创新,也有人说区块链是一个巨大的庞氏骗局。到底什么是比特币,为什么它这么火?本篇文章将带你揭示比特币的前世今生。

区块链跟比特币的定义

区块链是一种去中心化的分布式记账本,而比特币是账本中所记录的数字货币的一种实现。

作为区块链的一种实际应用,比特币(Bitcoin)的原型是由中本聪(Satoshi Nakamoto)在2008年11月1日发表的一篇论文中提出的。比特币的真正诞生是在2009年1月3日。到今天为止,比特币的市值已经水涨船高,一枚比特币的价值高达55484.70美元,合362869.94元人民币!

比特币市值趋势图

区块链要解决什么问题?

既然区块链是一种去中心化的货币结算体系,那么原来的货币结算体系有什么问题呢?中本聪在论文的原文讲到:中心化的金融机构由于信任问题,不可避免在交易过程中存在仲裁与纠纷,就导致无法实现不可撤销的交易,在撤销过程中会导致额外的支付成本。当然,这只是现有中心化货币体系不可避免的问题,而区块链基于分布式存储技术跟密码学,实现了交易的不可撤销性,通过去中心化金融机构的方式,实现点对点的交易,目的是通过加密上的可靠性解决人们之间的信任问题,从而提高效率

互联网通过提高信息传播的速度来提高效率;区块链通过降低信任成本提高效率。

区块链的工作原理

区块链是价值互联网,人们间的财富通过比特币的数量度量,比特币的交易记录代表的是价值的交换。比特币本身是一种加密货币(crypto-currency),是一种虚拟的数字货币,由一串复杂代码组成。基于密码学的设计确保了比特币的所有权不能被篡改,同时保持了一定的匿名性。

区块链为了实现分布式货币体系的功能,需要解答以下几个问题:

  1. 怎么记账?
  2. 怎么转账?
  3. 由谁发行货币?

怎么记账?

区块就是记账本,记账操作由区块完成。当一笔交易发生时,需向全体区块广播,然后所有区块都记录下这笔交易信息,完成记账。


区块

区块就是一个带有时间戳的记账本,链就是哈希指针,将区块相连。

区块分布在不同的网络节点中,且是分布式的。区块的组成包括块头(Block Header)跟块体(Block Body)。

  • 块头:记录了区块链的版本、指向前一个区块块头的哈希指针(对前一个区块块头算哈希值)、Merkle tree的根哈希值、目标域(target)和随机数(nonce)。

  • 块体:保存交易列表

其中目标域和随机数是挖矿用到的参数,而哈希指针就是连接区块的链。

哈希指针既可以指向内容地址(通过结合 key-value 的数据库实现,key为当前区块哈希值,value为指向的前一区块哈希值),又可以保存内容的哈希值。如果内容改变,哈希指针也会相应改变。这样不诚实的区块篡改区块链的交易记录几乎不可能实现,因为一旦不诚实区块的交易记录篡改,该区域的哈希值就会改变,后面所有区块的哈希值都要修改,除非不诚实的区块与后面所有区块串通,这几乎是不可能的。


哈希算法

区块链中的哈希指针通过密码学中的加密哈希算法(cryptographic hash function)计算得到,它具有三个性质:

  • 哈希碰撞 (collision resistance)

    哈希碰撞的数学表达为 $x\neq y\;H\left(x\right)=H\left(y\right)$,即不同的输入值得到了相同的哈希值。理论上任何一种哈希算法都不可避免哈希碰撞,因为输入空间是无限大的,而输出空间只有 $2^{256}$(以区块链所用的SHA-256算法为例)。但想制造哈希碰撞,需要通过暴力求解(brute-force)的方法。但是这种做法并不现实,因为计算量实在太大。借用此原理,可以通过检验一段信息(一串字符)的哈希值是否变化来核实这段信息是否被篡改。目前尚没有哈希函数被证明为哈希碰撞的,只能通过实践的经验。没有百分百安全的哈希函数,曾经被认为安全的哈希函数MD5已被找到人为制作哈希碰撞的方法。

  • 计算不可逆(hiding)
    哈希函数的计算为单向的,计算过程不可逆。即计算出的哈希值隐藏了输入的任何信息。只能通过暴力的方法,检测哪个输入值的哈希值为目标哈希值。但是只要输入空间足够大,且输入分布比较均匀,各种取值的可能性接近,则难以实现哈希函数的逆运算,除非地球爆炸(SHA-256算法为例)。为了使得输入满足要求,同时将输入加入一个随机数nonce,再一起哈希,即 $H(x\parallel nonce)$,随机数的分布是比较均匀的。

  • puzzle friendly
    值结果是不可预测的,通过输入值我无法预测将来哈希值的取值范围。主要用于挖矿中工作量证明(proof of work)的计算,通过找到一个比特币块头的随机数nonce,使得 $H(block header)\leq target$,这个target就是目标哈希值。


Merkle tree

块体中的交易记录通过默克尔树(Markle tree)的结构体来保存。它的结构与二叉树相同,唯一的区别是指针用哈希指针替代。这样做的目的是为了快速计算记录的交易有没有变化。

默克尔树

Merkle tree 主要用来提供 Merkle proof(默克尔证明),来证明一笔交易是否真正发生。Merkle proof的原理是通过比较待验证交易(叶子节点)所最终得到的Merkle tree的根哈希值与轻节点块头保存的根哈希值是否相等即可,需要辅助计算的另一半哈希值由全节点的块体提供。


区块总结

区块的物理实体搭载在一个网络节点中,负责对发生过的比特币交易记账。通过哈希指针与前一个区块相连,避免了不诚实区块对交易内容的篡改。每一笔交易都用一个 Merkle tree 的叶子节点保存,通过哈希指针最终指向根节点。区块的块头只保存Merkle tree根节点的哈希值,用来进行Merkle proof检验。

  • 区块最终会指向第一个区块,被称为创世纪块(genesis block)。

  • 区块链分为全节点与轻节点。
    | 全节点 | 轻节点 |
    | :——————-: |:——————-:|
    | 一直在线 | 不是一直在线 |
    | 在本地硬盘上维护完整的区块链信息 | 不用保存整个区块链,只要保存每个区块的块头 |
    | 在内存里维护UTXO集合,以便快速检验交易的正确性 | 不同保存全部交易,只保存与自己相关的交易 |
    | 监听比特币网络上的交易信息,验证每个交易的合法性 | 无法检验网上发布的区块的合法性 |
    | 决定哪些交易会被打包到区块里 | 可以验证挖矿的难度 |
    | 监听别的矿工挖出来的区块,验证其合法性 | 只能检测哪个是最长链,不知道哪个是最长合法链 |
    | 挖矿
    (决定沿哪条链挖下去)
    (当出现等长的分叉,选择哪一个分叉) | 不能决定挖矿 |

怎么转账

转账需要开户,区块链中的开户不需要向一个中心化的机构申请,只需要自己在本地创建一个公私钥对(比特币中公私钥对生成冲突的概率很小,比地球爆炸的概率还小,这样一个私钥就对应一个唯一的电子身份)。


公私钥对

公私钥对来自非对称加密(asymmetric encryption algorithm),公钥(public key)对内容加密,私钥(privte key)用来解密,同时私钥也可以用来加密,公钥用来解密。对称加密是用同一把密钥实现内容的加密,关键是找到一个安全传输密钥的途径,否则一旦密钥被破解,所加密的内容很容易被窃听或篡改。非对称加密用公钥加密,配对的私钥解密。公钥可以公开,且不能实现解密,私钥保存在本地,无需随内容传输,这样就保证了加密内容的安全,与https协议的原理一致。区块链中的利用非对称加密实现数字签名,对个人信息进行验证,用通讯方的私钥加密,然后用其公钥解密验证


自己给对方转账只需要对方的地址、要转的比特币数量以及自己的公钥即可。

对方地址根据公钥算哈希再通过一定计算得到,自己的公钥是为了验证这笔交易的数字签名是由自己的私钥生成,验证自己的身份。

双花攻击(double-spending attack)

如果我利用网络的延迟,同时向双发转一笔矛盾的比特币,例如我只有5个比特币,我同时向甲乙两人转5个比特币,就构成了双花攻击。

区块之间除了有哈希指针指向前一个区块,还有指针指向比特币的来源,这样在转账的同时回回溯检测用户到底有没有双花行为,防范双花攻击。

由谁发行货币

Coinbase transaction 是生成比特币的唯一方法.

创世纪,即第一个区块链的区块,2009年1月3日由中本聪在位于芬兰赫尔辛基的一个小型服务器上挖出,并获得了50个比特币的奖励。后面每次新块的产生,系统都会给予一定的比特币奖励,这也是比特币的唯一来源。由于比特币像黄金一样供应量极少且数量有限,所以区块的挖掘被成为挖矿。

比特币产生规则:起初的21w个区块会有50个比特币的初块奖励,超过21w个区块后,每个区块会有25个比特币,再超过21w个区块后,每个区块获得到奖励会继续减半,只有12.5个比特币。


Proof of work

Proof of work —— CPU算力证明是区块被挖出的方法。因此比特币是跟CPU算力资源挂钩。

区块头有一个 target 目标域,确定了要计算的哈希值的数值范围,只要对区块计算出的哈希值在此范围内,那么这个区块就被挖出。候选区块通过修改区块头中的 nonce 随机数实现对区块哈希值的控制。由于后期挖矿的人不断增加,挖矿的设备也像军备竞赛一样越发豪华(CPU->GPU->ASIC芯片 Application Specific Integrated),因此为了保证比特币数量的稳定,通过减小target 目标域提高计算难度。出块难度为10分钟生成一个区块。比特币规定每2016个区块后调整难度阈值,大概两周调整一次。

通过CPU算力选出记账的区块,可以极大避免51%攻击。因为如果攻击者想要控制区块的生成,需要付出超过51%算力的计算资源,成本上是根本不划算的。

最长合法链

如果两个区块同时被挖出,那么区块链都认为两者有效。后续的候选区块可以选择在分叉的区块中任意选择,直到哪一条链的长度率先到达6,就将此链视为最长合法链,然后撤销另一条分叉链。

比特币初期虽然竞争少,奖励多,但当时比特币不值钱,曾经出现过2w个比特币买1个披萨的案例。而现在虽然比特币竞争激烈,所耗电费相当于挪威一年的能源消耗,但价值高。

总结

区块链本身是一种理论创新,分布式存储、加密算法以及通讯都是现有的技术。它主要解决中心化货币交易体系因不信任导致的纠纷所带来的支付代价问题,包括一些已有的支付方式无法解决的问题,例如跨境付款,而不是与已有的支付方式做竞争。区块链通过密码学上的不可篡改性,把数据从不可信变成可信。从技术角度看,区块链是互联网发展的一个升级,它和互联网相同的是,能提高社会整体的工作效率;不同的是,互联网从通信速度方面提高效率,区块链从信任角度提高效率。未来的区块链项目关键是看能否可以协助人们解决生产生活中的效率问题,而不能被神话,它的概念也不能被滥用,同时它的监管仍需要很长的路要走。


参考资料

  1. 北大《区块链技术与应用》公开课

  2. 区块链白皮书

  3. 【回形针PaperClip】区块链到底是什么?

  4. 今年世界总发电量的0.6%被用于挖比特币

  5. 区块链分享