您的位置:首页 > 其它

比特币-区块链思想诞生的摇篮

2017-12-01 15:05 288 查看
比特币-区块链思想诞生的摇篮

作为区块链思想诞生的源头,比特币项目值得区块链技术爱好者仔细研究。比特币网络是首个得到大规模部署的区块链技术应用,并且是首个得到实践检验的数字货币实现,无论在信息技术历史还是在金融学历史上都具有十分重要的意义。

虽然后来的区块链技术应用已经远超越了数字货币的范畴,但探索比特币项目的发展历程和设计思路,对于深刻理解区块链技术的来龙去脉有着重要的价值。

本章将介绍比特币项目的来源、核心原理设计、相关的工具,以及关键的技术话题。

一、比特币项目简介

比特币(BitCoin,BTC)是基于区块链技术的一种数字货币实现,比特币网络是历史上首个经过大规模、长时间检验的数字货币系统。



比特币网络在功能上具有如下特点:

去中心化:意味着没有任何独立个体可以对网络中的交易进行破坏,任何交易请求都需要大多数参与者的共识;

匿名性:比特币网络中账户地址是匿名的,无法从交易信息关联到具体的个体,但这也意味着很难进行审计;

-通胀预防:比特币的发行需要通过挖矿计算来进行,发行量每四年减半,总量上限为2100万枚,无法被超发。

提示:通过blockchain.info网站可以实时查询比特币网络的状态信息,包括区块、交易等详细数据。

比特币的“成功”,刺激了相关的生态和社区发展,大量类似的数字货币(超过700种)纷纷出现,比较出名的有以太币和瑞波(Ripple)币等。

这些数字货币,要么建立在自己独立的区块链网络上,要么复用已有的区块链(例如比特币网络)系统。全球活跃的数字货币用户据称在290万~580万之间(参考剑桥大学Judge商学院2017年4月发表的《GLOBAL CRYPTOCURRENCY BENCHMARKING STUDY(全球加密货币基准研究)》报告)。

二、原理和设计

比特币网络是一个分布式的点对点网络,网络中的矿工通过“挖矿”来完成对交易记录的记账过程,维护网络的正常运行。

区块链网络提供一个公共可见的记账本,该记账本并非记录每个账户的余额,而是用来记录发生过的交易的历史信息。该设计可以避免重放攻击,即某个合法交易被多次重新发送造成攻击。

2.1、基本交易过程

每次发生交易,用户需要将新交易记录写到比特币区块链网络中,等网络确认后即可认为交易完成。每个交易包括一些输入和一些输出,未经使用的交易的输出(Unspent Transaction Outputs,UTXO)可以被新的交易引用作为合法的输入,被使用过的交易的输出(Spent Transaction Outputs,STO)则无法被引用作为合法输入。

一笔合法的交易,即引用某些已存在交易的UTXO作为交易的输入,并生成新的输出的过程。

在交易过程中,转账方需要通过签名脚本来证明自己是UTXO的合法使用者,并且指定输出脚本来限制未来本交易的使用者(为收款方)。对每笔交易,转账方需要进行签名确认。并且,对每一笔交易来说,总输入不能小于总输出。总输入相比总输出多余的部分称为交易费用(Transaction Fee),为生成包含该交易区块的矿工所获得。目前规定每笔交易的交易费用不能小于0.0001 BTC,交易费用越高,越多矿工愿意包含该交易,也就越早被放到网络中。交易费用在奖励矿工的同时,也避免了网络受到大量攻击。

交易中金额的最小单位是“聪”,即一亿分之一(10的负8次方)比特币。

表6-1展示了一些简单的示例交易。更一般情况下,交易的输入、输出可以为多方。



表6-1 简单的示例交易

需要注意,刚放进网络中的交易(深度为0)并非是实时得到确认的。进入网络中的交易存在着被推翻的可能性,一般要再生成几个新的区块(深度大于0)才认为该交易被确认。

下面分别介绍比特币网络中的重要概念和主要设计思路。

2.2、重要概念

2.2.1、账户/地址

比特币采用了非对称的加密算法,用户自己保留私钥,对自己发出的交易进行签名确认,并公开公钥。

比特币的账户地址其实就是用户公钥经过一系列Hash(HASH160,或先进行SHA256,然后进行RIPEMD160)及编码运算后生成的160位(20字节)的字符串。

一般地,对账户地址串进行Base58Check编码,并添加前导字节(表明支持哪种脚本)和4字节校验字节,以提高可读性和准确性。

注意:账户并非直接是公钥内容,而是Hash后的值,以避免公钥过早公开后导致被破解出私钥。

2.2.2、交易

交易是完成比特币功能的核心概念,一条交易可能包括如下信息:

付款人地址:合法的地址,公钥经过SHA256和RIPEMD160两次Hash,得到160位Hash串;

付款人对交易的签字确认:确保交易内容不被篡改;

付款人资金的来源交易ID:哪个交易的输出作为本次交易的输入;

交易的金额:多少钱,与输入的差额为交易的服务费;

收款人地址:合法的地址;

时间戳:交易何时能生效。

网络中节点收到交易信息后,将进行如下检查:

交易是否已经处理过;

交易是否合法,包括地址是否合法、发起交易者是否是输入地址的合法拥有者、是否是UTXO;

交易的输入之和是否大于输出之和。

如果检查都通过,则将交易标记为合法的未确认交易,并在网络内进行广播。

用户可以从blockchain.info网站查看实时的交易信息,一个示例交易的内容如下图所示。



2.2.3、交易脚本

脚本(script)是保障交易完成(主要用于检验交易是否合法)的核心机制,当所依附的交易发生时被触发。通过脚本机制而非写死交易过程,比特币网络实现了一定的可扩展性。比特币脚本语言是一种非图灵完备的语言,类似于Forth语言。

一般每个交易都会包括两个脚本:输出脚本(scriptPubKey)和认领脚本(scriptSig)。输出脚本一般由付款方对交易设置锁定,用来对能动用这笔交易输出(例如,要花费交易的输出)的对象(收款方)进行权限控制,例如限制必须是某个公钥的拥有者才能花费这笔交易。认领脚本则用来证明自己可以满足交易输出脚本的锁定条件,即对某个交易的输出(比特币)的拥有权。

输出脚本目前支持两种类型:

P2PKH:Pay-To-Public-Key-Hash,允许用户将比特币发送到一个或多个典型的比特币地址上(证明拥有该公钥),前导字节一般为0x00;

P2SH:Pay-To-Script-Hash,支付者创建一个输出脚本,里边包含另一个脚本(认领脚本)的哈希,一般用于需要多人签名的场景,前导字节一般为0x05。

以P2PKH为例,输出脚本的格式为:

scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG


其中:

OP_DUP是复制栈顶元素;

OP_HASH160是计算Hash值;

OP_EQUALVERIFY判断栈顶两元素是否相等;

OP_CHECKSIG判断签名是否合法。

这条指令实际上保证了只有pubKey的拥有者才能合法引用这个输出。

另外一个交易如果要花费这个输出,在引用这个输出的时候,需要提供的认领脚本格式为:

scriptSig: <sig> <pubKey>


其中,是用pubKey对应的私钥对交易(全部交易的输出、输入和脚本)Hash值进行签名,pubKey的Hash值需要等于pubKeyHash。

进行交易验证时,会按照先scriptSig后scriptPubKey的顺序依次进行入栈处理,即完整指令为:

<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG


读者可以按照栈的过程来进行推算,理解整个脚本的验证过程。

引入脚本机制带来了灵活性,但也引入了更多的安全风险。比特币脚本支持的指令集十分简单,基于栈的处理方式,并且非图灵完备,此外还添加了额外的一些限制(大小限制等)。

2.2.4、区块

比特币区块链的一个区块主要包括如下内容:

4字节的区块大小信息;

80字节的区块头信息;

交易个数计数器:1~9字节;

所有交易的具体内容,可变长。

其中,区块头信息十分重要,包括:

版本号:4字节;

上一个区块头的SHA256 Hash值:链接到一个合法的块上,32字节;

包含所有验证过的交易的Merkle树根的哈希值,32字节;

时间戳:4字节;

难度指标:4字节;

Nonce:4字节,PoW问题的答案。

可见,要对区块链的完整性进行检查,只需要检验各个区块头信息即可,无需获取具体的交易内容,这也是简单交易验证(Simple Payment Verification,SPV)的基本原理。另外,通过头部的链接,提供时序关系的同时加大了对区块中数据进行篡改的难度。

一个示例区块如图所示。



2.3、创新设计

比特币在设计上提出了很多创新点,主要考虑了避免作恶、负反馈调节和共识机制三个方面。下面分别介绍。

2.3.1、避免作恶

避免作恶基于经济博弈原理。在一个开放的网络中,无法通过技术手段来保证每个人都是合作的。但可以通过经济博弈来让合作者得到利益,让非合作者遭受损失和风险。

实际上,博弈论早已广泛应用于众多领域。一个经典的例子是两个人分一个蛋糕,如果都想拿到较大的一块,在没有第三方的前提下,该怎么制定规则才公平?最简单的一个方案是负责分配蛋糕的人后挑选。

比特币网络中所有试图参与者(矿工)都首先要付出挖矿的代价,进行算力消耗,越想拿到新区块的决定权,意味着抵押的算力越多。一旦失败,这些算力都会被没收掉,成为沉没成本。当网络中存在众多参与者时,个体试图拿到新区块决定权要付出的算力成本是巨大的,意味着进行一次作恶付出的代价已经超过可能带来的好处。

2.3.2、负反馈调节

在设计上,比特币网络很好地体现了负反馈的控制论基本原理。

比特币网络中矿工越多,系统就越稳定,比特币价值就越高,但挖到矿的概率会降低。反之,网络中矿工减少,会让系统更容易被攻击,比特币价值降低,但挖到矿的概率会提高。

因此,比特币的价格理论上应该稳定在一个合适的值(网络稳定性也会稳定在相应的值),这个价格乘以挖到矿的概率,恰好达到矿工的收益预期。

从长远角度看,硬件成本是下降的,但每个区块的比特币奖励每隔4年减半,最终将在2140年达到2100万枚,之后将完全依靠交易的服务费来鼓励矿工对网络的维护。

2.3.3、共识机制

传统共识问题往往是考虑在一个相对封闭的分布式系统中,允许同时存在正常节点、故障如何快速达成一致。

对于比特币网络来说,它是完全开放的,可能面对各种攻击情况,同时基于Internet的网络质量只能保证“尽力而为”,导致问题更加复杂,传统的一致性算法在这种场景下难以使用。

因此,比特币网络不得不对共识的目标和过程都进行一系列限制,提出了基于Proof of Work(PoW)的共识机制。

首先是不实现面向最终确认的共识,而是基于概率、随时间逐步增强确认的共识。现有达成的结果在理论上可能被推翻,只是攻击者要付出的代价随时间而指数级上升,被推翻的可能性随之指数级下降。

此外,考虑到Internet的尺度,达成共识的时间相对比较长,因此按照区块(一组交易)来进行阶段性的确认(快照),从而提高网络整体的可用性。

最后,限制网络中共识的噪声。通过进行大量的Hash计算和少数的合法结果来限制合法提案的个数,进一步提高网络中共识的稳定性。

三、挖矿

3.1、基本原理

要了解比特币,最应该知道的一个概念就是“挖矿”。挖矿是参与维护比特币网络的节点,通过协助生成新区块来获取一定量新增比特币的过程。

当用户向比特币网络中发布交易后,需要有人将交易进行确认,形成新的区块,串联到区块链中。在一个互相不信任的分布式系统中,该由谁来完成这件事情呢?比特币网络采用了“挖矿”的方式来解决这个问题。

目前,每10分钟左右生成一个不超过1 MB大小的区块(记录了这10分钟内发生的验证过的交易内容),串联到最长的链尾部,每个区块的成功提交者可以得到系统12.5个比特币的奖励(该奖励作为区块内的第一个交易,一定区块数后才能使用),以及用户附加到交易上的支付服务费用。即便没有任何用户交易,矿工也可以自行产生合法的区块并获得奖励。

每个区块的奖励最初是50个比特币,每隔21万个区块自动减半,即4年时间,最终比特币总量稳定在2100万个。因此,比特币是一种通缩的货币。

3.2、挖矿过程

挖矿的具体过程为:参与者综合上一个区块的Hash值,上一个区块生成之后的新的验证过的交易内容,再加上自己猜测的一个随机数X,一起打包到一个候选新区块,让新区块的Hash值小于比特币网络中给定的一个数。这是一道面向全体矿工的“计算题”,这个数越小,计算出来就越难。

系统每隔两周(即经过2016个区块)会根据上一周期的挖矿时间来调整挖矿难度(通过调整限制数的大小),调节生成区块的时间稳定在10分钟左右。为了避免震荡,每次调整的最大幅度为4倍。历史上最快的出块时间小于10秒,最慢的出块时间超过1个小时。

为了挖到矿,参与处理区块的用户端往往需要付出大量的时间和算力。算力一般以每秒进行多少次Hash计算为单位,记为h/s。目前,比特币网络算力峰值已经达到了每秒数百亿亿次。

汇丰银行分析师Anton Tonev和Davy Jose曾表示,比特币区块链(通过挖矿)提供了一个局部的、迄今为止最优的解决方案:如何在分散的系统中验证信任。这就意味着,区块链本质上解决了传统依赖于第三方的问题,因为这个协议不只满足了中心化机构追踪交易的需求,还使得陌生人之间产生信任。区块链的技术和安全的过程使得陌生人之间在没有被信任的第三方时产生信任。

3.3、如何看待挖矿

2010年以前,挖矿还是一个非常热门的盈利行业。

但是随着相关技术和设备的发展,现在个人进行挖矿的收益已经降得很低。从概率上说,由于当前参与挖矿的算力实在过于庞大(已经超出了大部分的超算中心),一般的算力已经不可能挖到比特币。特别是那些想着利用虚拟机来挖矿的想法,确实意义不大了。

从普通的CPU(2009年),到GPU(2010年)和FPGA(2011年年末),到后来的ASIC矿机(2013年年初,目前单片算力已达每秒数百亿次Hash计算),再到现在众多矿机联合组成矿池(知名矿池包括F2Pool、BitFury、BTCC等),短短数年间,比特币矿机的技术走完了过去几十年集成电路技术的进化历程,并且还颇有创新之处。确实是哪里有利益,哪里的技术就飞速发展!目前,矿机主要集中在中国(超过一半的算力)和欧美,大家比拼的是一定计算性能情况下低电压和低功耗的电路设计。全网的算力已超过每秒1018次Hash计算。

很自然地,读者可能会想到,如果有人掌握了强大的算力,计算出所有的新区块,并且拒不承认他人的交易内容,那是不是就能破坏掉比特币网络?确实如此,基本上个体达到1/3的算力,比特币网络就存在被破坏的风险了;达到1/2的算力,从概率上就掌控整个网络了。但是要实现这么大的算力,将需要付出巨大的经济成本。

那么有没有办法防护呢?除了尽量避免将算力放到同一个组织手里,没太好的办法,这是目前PoW机制自身造成的。

也有人认为为了共识区块的生成,大部分算力(特别是最终未能算出区块的算力)其实都浪费了。有人提出用PoS(Proof of Stake)和DPoS等协议,利用权益证明(例如持有货币的币龄)作为衡量指标进行投票,相对PoW可以节约大量的能耗。但PoS可能会带来囤积货币的问题。除此之外,还有活跃度证明(Proof of Activity,PoA)、消耗证明(Proof of Burn,PoB)、能力证明(Proof of Capacity,PoC)、消逝时间证明(Proof of Elapsed Time)、股权速率证明(Proof of Stake Velocity,PoSV)等不同的衡量指标。

当然,无论哪种机制,都无法解决所有问题。一种可能的优化思路是引入随机代理人制度,通过算法在某段时间内确保只让部分节点参加共识的提案,并且要发放一部分“奖励”给所有在线贡献的节点。

四、共识机制

比特币网络是完全公开的,任何人都可以匿名接入,因此共识协议的稳定性和防攻击性十分关键。

比特币区块链采用了PoW的机制来实现共识,该机制最早于1998年在B-money设计中提出。

目前,Proof of X系列中比较出名的一致性协议包括PoW、PoS和DPoS等,都是通过经济惩罚来限制恶意参与。

4.1、工作量证明

工作量证明(PoW)通过计算来猜测一个数值(nonce),使得拼凑上交易数据后内容的Hash值满足规定的上限(来源于hashcash)。由于Hash难题在目前计算模型下需要大量的计算,这就保证在一段时间内系统中只能出现少数合法提案。反过来,能够提出合法提案,也证明提案者确实付出了一定的工作量。

同时,这些少量的合法提案会在网络中进行广播,收到的用户进行验证后,会在用户认为的最长链基础上继续难题的计算。因此,系统中可能出现链的分叉(fork),但最终会有一条链成为最长的链。

Hash问题具有不可逆的特点,因此,目前除了暴力计算外,还没有有效的算法进行解决。反之,如果获得符合要求的nonce,则说明在概率上付出了对应的算力。谁的算力多,谁最先解决问题的概率就越大。当掌握超过全网一半的算力时,从概率上就能控制网络中链的走向。这也是所谓51%攻击的由来。

参与PoW计算比赛的人,将付出不小的经济成本(硬件、电力、维护等)。当没有最终成为首个算出合法nonce值的“幸运儿”时,这些成本都将被沉没掉。这也保障了如果有人尝试恶意破坏,需要付出大量的经济成本。也有设计试图将后算出结果者的算力按照一定比例折合进下一轮比赛的考虑。

有一个很直观的超市付款的例子,可以说明为何这种经济博弈模式会确保系统中最长链的唯一性。

假定超市只有一个出口,付款时需要排成一队,可能有人不守规矩插队。超市管理员会检查队伍,认为最长的一条队伍是合法的,并让不合法的分叉队伍重新排队。如图6-4所示。新到来的人只要足够理智,就会自觉选择最长的队伍进行排队。这是因为,看到多条链的参与者往往认为目前越长的链具备越大的胜出可能性,从而更倾向于选择长的链。



图6-4 PoW保证一致性

4.2、权益证明

权益证明(Proof of Stake,PoS)最早在2013年被提出,并在Peercoin系统中实现,类似于现实生活中的股东机制,拥有股份越多的人越容易获取记账权(同时越倾向于维护网络的正常工作)。

典型的过程是通过保证金(代币、资产、名声等具备价值属性的物品即可)来对赌一个合法的块成为新的区块,收益为抵押资本的利息和交易服务费。提供证明的保证金(例如通过转账货币记录)越多,则获得记账权的概率就越大。合法记账者可以获得收益。

PoS试图解决在PoW中大量资源被浪费的缺点,受到了广泛关注。恶意参与者将存在保证金被罚没的风险,即损失经济利益。

一般情况下,对于PoS来说,需要掌握超过全网1/3的资源,才有可能左右最终的结果。这也很容易理解:三个人投票,前两人分别支持一方,这时第三方的投票将决定最终结果。

PoS也有一些改进的算法,包括授权股权证明机制(DPoS),即股东们投票选出一个董事会,董事会成员才有权进行代理记账。

五、闪电网络

比特币的交易网络最为人诟病的一点便是交易性能:全网每秒7笔左右的交易速度,远低于传统的金融交易系统;同时,等待6个块的可信确认将导致约1个小时的最终确认时间。

为了提升性能,社区提出了闪电网络等创新的设计。

闪电网络的主要思路十分简单——将大量交易放到比特币区块链之外进行,只把关键环节放到链上进行确认。该设计最早于2015年2月在论文《The Bitcoin Lightning Network:Scalable Off-Chain Instant Payments》中提出。

比特币的区块链机制自身已经提供了很好的可信保障,但是相对较慢;另一方面,对于大量的小额交易来说,是否真需要这么高的可信性?

闪电网络主要通过引入智能合约的思想来完善链下的交易渠道。核心的概念主要有两个:RSMC(Recoverable Sequence Maturity Contract)和HTLC(Hashed TimeLock Contract)。前者解决了链下交易的确认问题,后者解决了支付通道的问题。下面先介绍这两个概念。

5.1、RSMC

RSMC即“可撤销的顺序成熟度合同”。这个词很绕,其实主要原理很简单,类似于资金池机制。

首先假定交易双方之间存在一个“微支付通道”(资金池)。交易双方先预存一部分资金到“微支付通道”里,初始情况下双方的分配方案等于预存的金额。每次发生交易,需要对交易后产生资金的分配结果共同进行确认,同时签字把旧版本的分配方案作废掉。任何一方需要提现时,可以将他手里双方签署过的交易结果写到区块链网络中,从而被确认。从这个过程中可以看到,只有在提现时才需要通过区块链。

任何一个版本的方案都需要经过双方的签名认证才合法。任何一方在任何时候都可以提出提现,提现时需要提供一个双方都签名过的资金分配方案(意味着肯定是某次交易后的结果,被双方确认过,但未必是最新的结果)。在一定时间内,如果另外一方拿出证明表明这个方案其实之前被作废了(非最新的交易结果),则资金罚没给质疑方;否则按照提出方的结果进行分配。罚没机制可以确保没人会故意拿一个旧的交易结果来提现。

另外,即使双方都确认了某次提现,首先提出提现一方的资金到账时间也要晚于对方,这就鼓励大家尽量在链外完成交易。通过RSMC,可以实现大量中间交易发生在链外。

5.2、HTLC

微支付通道是通过HTLC来实现的,中文意思是“哈希的带时钟的合约”。这其实就是限时转账。理解起来也很简单,通过智能合约,双方约定转账方先冻结一笔钱,并提供一个哈希值,如果在一定时间内有人能提出一个字符串,使得它哈希后的值与已知值匹配(实际上意味着转账方授权了接收方来提现),则这笔钱转给接收方。

举个不太恰当的例子,一定时间内有人知道了某个暗语(可以生成匹配的哈希值),就可以拿到指定的资金。

更进一步,甲想转账给丙,丙先发给甲一个哈希值。甲可以先跟乙签订一个合同:如果你在一定时间内能告诉我一个暗语,我就给你多少钱。乙于是跑去跟丙签订一个合同:如果你告诉我那个暗语,我就给你多少钱。丙于是告诉乙暗语,拿到乙的钱,乙又从甲拿到钱。最终结果是甲转账给丙。这样甲和丙之间似乎构成了一条完整的虚拟“支付通道”。

HTLC机制可以扩展到多个人的场景。

5.3、闪电网络的概念

RSMC保障了两个人之间的直接交易可以在链下完成,HTLC保障了任意两个人之间的转账都可以通过一条“支付”通道来完成。闪电网络整合这两种机制,就可以实现任意两个人之间的交易都在链下完成。

在整个交易中,智能合约起到了中介的重要角色,而区块链网络则确保最终的交易结果被确认。

六、侧链

侧链(sidechain)协议允许资产在比特币区块链(blockchain)和其他区块链之间互转。这一项目也来自比特币社区,最早是在2013年12月提出的,2014年4月立项,由Blockstream公司主导研发。侧链协议于2014年10月在白皮书《Enabling Blockchain Innovations with Pegged Sidechains》中公开。

侧链诞生前,众多“山寨币”的出现正在碎片化整个数字货币市场,再加上以太坊等项目的竞争,一些比特币开发者希望借助侧链的形式扩展比特币的底层协议。

简单来讲,以比特币区块链作为主链(parent chain),其他区块链作为侧链,二者通过双向挂钩(two-way peg),实现比特币从主链转移到侧链进行流通。

侧链可以是一个独立的区块链,有自己按需定制的账本、共识机制、交易类型、脚本和合约的支持等。侧链不能发行比特币,但可以通过支持与比特币区块链挂钩来引入和流通一定数量的比特币。当比特币在侧链流通时,主链上对应的比特币会被锁定,直到比特币从侧链回到主链。可以看到,侧链机制可将一些定制化或高频的交易放到比特币主链之外进行,实现了比特币区块链的扩展。如图6-5所示。



图6-5 比特币侧链

在描述侧链协议的工作原理前,首先介绍侧链中用到的简单支付验证证明(SPV Proof)。

6.1、SPV证明

如前面章节所述,在比特币系统中验证交易时,涉及交易合法性检查、双重花费检查、脚本检查等。由于验证过程需要完整的UTXO记录,通常要由运行着完整功能节点的矿工来完成。

而很多时候,用户只关心与自己相关的那些交易,比如当用户收到其他人发来的所谓比特币时,只希望能够知道交易是否合法、是否已在区块链中存在了足够的时间(即获得足够的确认),而不需要自己成为完整节点做出完整验证。

中本聪设计的简单支付验证(Simplified Payment Verification,SPV)可以实现这一点。SPV能够以较小的代价判断某个支付交易是否已经被验证过(存在于区块链中),以及得到了多少算力保护(定位包含该交易的区块在区块链中的位置)。SPV客户端只需要下载所有区块的区块头(block header),并进行简单的定位和计算工作,就可以给出验证结论。

侧链协议中,用SPV来证明一个动作确实已经在区块链中发生过,称为SPV证明(SPV Proof)。SPV证明包括两部分内容:一组区块头的列表,表示工作量证明;一个特定输出确实存在于某个区块中的密码学证明。

6.2、双向挂钩

侧链协议的设计难点在于如何让资产在主链和侧链之间安全流转。简而言之,接受资产的链必须确保发送资产的链上的币被可靠锁定。

具体来说,协议采用双向挂钩机制实现比特币向侧链的转移和返回。主链和侧链需要对对方的特定交易做SPV验证。完整过程如下(参见图6-6):



图6-6 侧链双向挂钩的过程

当用户要向侧链转移比特币时,首先在主链创建交易,待转移的比特币被发往一个特殊的输出,这些比特币在主链上被锁定;

等待一段确认期,使得上述交易获得足够的工作量确认;

用户在侧链创建交易提取比特币,需要在这笔交易的输入指明上述主链被锁定的输出,并提供足够的SPV证明;

等待一段竞争期,防止双重花费攻击;

比特币在侧链上自由流通;

当用户想让比特币返回主链时,采取类似的动作。首先在侧链创建交易,待返回的比特币被发往一个特殊的输出。等待一段确认期后,在主链用足够的对侧链输出的SPV证明来解锁最早被锁定的输出。等待一段竞争期后,主链比特币恢复流通。

6.3、最新进展

侧链技术最早由Blockstream公司进行探索,于2015年10月联合合作伙伴发布了基于侧链的商业化应用Liquid。

经过一年多的探索,Blockstream于2017年1月发表文章《Strong Federations:An Interoperable Blockchain Solution to Centralized Third Party Risks》,被称为对侧链早期白皮书的补充和改良。白皮书中着重描述了联合挂钩(Federated Peg)的相关概念和应用。

此外,还有一些其他公司或组织也在探索如何合理地应用侧链技术,包括ConsenSys、Rootstock、Lisk等。

七、热点问题

7.1、设计中的权衡

比特币的设计目标在于支持一套安全、开放、分布式的数字货币系统。围绕这一目标,比特币协议的设计中很多地方都体现了权衡(trade-off)的思想。

区块容量:更大的区块容量可以带来更高的交易吞吐率,但会增加挖矿成本,带来中心化的风险,同时增大存储的代价。兼顾多方面的考虑,当前的区块容量上限设定为1MB。

出块间隔时间:更短的出块间隔可以缩短交易确认的时间,但也可能导致分叉增多,降低网络可用性。

脚本支持程度:更强大的脚本指令集可以带来更多的灵活性,但也会引入更多的安全风险。

7.2、分叉

比特币协议不会一成不变。当需要修复漏洞、扩展功能或调整结构时,比特币需要在全网的配合下进行升级。升级通常涉及更改交易的数据结构或区块的数据结构。

由于分布在全球的节点不可能同时完成升级来遵循新的协议,因此比特币区块链在升级时可能发生分叉。对于一次升级,如果把网络中升级的节点称为新节点,未升级的节点称为旧节点,根据新旧节点相互兼容性上的区别,可分为软分叉(soft fork)和硬分叉(hard fork)。

如果旧节点仍然能够验证接受新节点产生的交易和区块,则称为软分叉。旧节点可能不理解新节点产生的一部分数据,但不会拒绝。网络既向后又向前兼容,因此这类升级可以平稳进行;

如果旧节点不接受新节点产生的交易和区块,则称为硬分叉。网络只向后兼容,不向前兼容。这类升级往往引起一段时间内新旧节点所认可的区块不同,分出两条链,直到旧节点升级完成。

尽管通过硬分叉升级区块链协议的难度大于软分叉,但软分叉能做的事情毕竟有限,一些大胆的改动只能通过硬分叉完成。

7.3、交易延展性

交易延展性(Transaction Malleablility)是比特币的一个设计缺陷。简单来讲,是指当交易发起者对交易签名(sign)之后,交易ID仍然可能被改变。

下面是一个比特币交易的例子。发起者对交易的签名(scriptSig)位于交易的输入(vin)当中,属于交易内容的一部分。交易ID(txid)是整个交易内容的Hash值。这就造成了一个问题:攻击者(尤其是签名方)可以通过改变scriptSig来改变txid,而交易仍旧保持合法。例如,反转ECDSA签名过程中的S值,签名仍然合法,交易仍然能够被传播。代码如下:

{
"txid": "f200c37aa171e9687452a2c78f2537f134c307087001745edacb58304053db20",
"version": 1,
"locktime": 0,
"vin": [{
"txid": "21f10dbfb0ff49e2853629517fa176dc00d943f203aae3511288a7dd89280ac2",
"vout": 0,
"scriptSig": {
"asm": "304402204f7fb0b1e0d154db27dbdeeeb8db7b7d3b887a33e
712870503438d8be2d66a0102204782a2714215dc0d581e1d435b
41bc6eced2c213c9ba0f993e7fcf468bb5d311[ALL] 025840d511
c4bc6690916270a54a6e9290fab687f512c18eb2df0428fa69a26299",
"hex": "47304402204f7fb0b1e0d154db27dbdeeeb8db7b7d3b887a3
3e712870503438d8be2d66a0102204782a2714215dc0d581e1d43
5b41bc6eced2c213c9ba0f993e7fcf468bb5d3110121025840d51
1c4bc6690916270a54a6e9290fab687f512c18eb2df0428fa69a2
6299"
},
"sequence": 4294967295
}],
"vout": [{
"value": 0.00167995,
"n": 0,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 7c4338dea7964947b3f0954f61ef405
02fe8f791 OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a9147c4338dea7964947b3f0954f61ef40502fe8f79188ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"1CL3KTtkN8KgHAeWMMWfG9CPL3o5FSMU4P"
]
}
}]
}


这种延展性攻击能改变交易ID,但交易的输入和输出不会被改变,所以攻击者不会直接盗取比特币。这也是为什么这一问题能在比特币网络中存在如此之久而仍未被根治。

然而,延展性攻击仍然会带来一些问题。比如,在原始交易未被确认之前广播ID改变的交易可能误导相关方对交易状态的判断,甚至发动拒绝服务攻击;多重签名场景下,一个签名者有能力改变交易ID,会给其他签名者的资产带来潜在风险。同时,延展性问题也会阻碍闪电网络等比特币扩展方案的实施。

7.4、扩容之争

比特币当前将区块容量限制在1MB以下。如图6-7所示,随着用户和交易量的增加,这一限制已逐渐不能满足比特币的交易需求,使得交易日益拥堵,交易手续费不断上涨。



图6-7 日益增加的区块容量

关于比特币扩容的持续争论从2015年便已开始,期间有一系列方案被摆上台面,包括各种链上扩容提议、用侧链或闪电网络扩展比特币等。考虑到比特币复杂的社区环境,其扩容方案早已不是一方能说了算,而任何一个方案想要达成广泛共识都比较困难,不同的方案之间也很难调和。

当前,扩容之争主要集中在两派:代表核心开发者的Bitcoin Core团队主推的隔离见证方案,以及Bitcoin Unlimited团队推出的方案。

7.4.1、隔离见证方案

隔离见证(Segregated Witness,简称SegWit)是指将交易中的签名部分从交易的输入中隔离出来,放到交易末尾的被称为见证(Witness)的字段当中。

对交易ID的计算将不再包含这一签名部分,所以这也是延展性问题的一种解法,给引入闪电网络等第二层协议增强了安全性。

同时,隔离见证将区块容量上限理论上提高到4MB。对隔离见证的描述可详见五个比特币改进协议(Bitcoin Improvement Proposal):BIP 141~BIP 145。

7.4.2、比特币的监管和追踪

比特币的匿名特性,使得其交易的监管变得十分困难。

不少非法分子利用这一点,通过比特币转移资金。例如WannaCry网络病毒向受害者勒索比特币,短短三天时间里传播并影响到全球150多个国家。尽管这些不恰当的行为与比特币项目自身并无直接关系,但都或多或少地给比特币社区带来了负面影响。

实际上,认为通过比特币就可以实现完全匿名化并不现实。虽然交易账户自身是匿名的Hash地址,但一些研究成果(如《An analysis of anonymity in the bitcoin system》)表明,通过分析大量公开可得的交易记录,有很大概率可以追踪到比特币的实际转移路线,甚至可以追踪到真实用户。

八、相关工具

比特币相关工具包括客户端、钱包和矿机等。

8.1、客户端

比特币客户端用于和比特币网络进行交互,同时可以参与网络的维护。

客户端分为三种:完整客户端、轻量级客户端和在线客户端。说明如下:

完整客户端:存储所有的交易历史记录,功能完备;

轻量级客户端:不保存交易副本,交易需要向别人查询;

在线客户端:通过网页模式来浏览第三方服务器提供的服务。

比特币客户端可以从http://bitcoin.org/en/download下载。

基于比特币客户端,可以很容易地实现用户钱包功能。

8.2、钱包

比特币钱包可以存储和保护用户的私钥,并提供查询比特币余额、收发比特币等功能。根据私钥存储方式不同,钱包主要分为以下几种:

离线钱包:离线存储私钥,也称为“冷钱包”,安全性相对最强,但无法直接发送交易,便利性差;

本地钱包:用本地设备存储私钥,可直接向比特币网络发送交易,易用性强,但本地设备存在被攻击风险;

在线钱包:用钱包服务器存储经用户口令加密过的私钥,易用性强,但钱包服务器同样可能被攻击;

多重签名钱包:由多方共同管理一个钱包地址,比如2 of 3模式下,集合三位管理者中两位的私钥便可以发送交易。

比特币钱包可以从http://bitcoin.org/en/choose-your-wallet获取。

8.3、矿机

比特币矿机是专门为“挖矿”设计的硬件设备,目前主要包括基于GPU和ASIC芯片的专用矿机。这些矿机往往采用特殊的设计来加速挖矿过程中的计算处理。

矿机最重要的属性是可提供的算力(通常以每秒可进行Hash计算的次数来表示)和所需要的功耗。当算力足够大,可以在概率意义上挖到足够多的新区块来弥补电力费用时,该矿机是可以盈利的;当单位电力产生的算力不足以支付电力费用时,该矿机无法盈利,意味着只能被淘汰。

目前,比特币网络中的全网算力仍然在快速增长中,矿工需要综合考虑算力变化、比特币价格、功耗带来的电费等许多问题,需要算好经济账。

九、小结

本章介绍了比特币项目的相关知识,包括核心技术、工具、设计,以及最新的闪电网络、侧链和扩容讨论等进展。

比特币自身作为数字货币领域的重大突破,对分布式记账领域有着很深远的影响。尤其是其底层的区块链技术,已经受到金融和信息行业的重视,在许多场景下都得到应用。

通过本章的剖析可以看出,比特币网络系统中并没有完全从头进行技术的创新,而是有机地组合了密码学、博弈论、记账技术、分布式系统和网络、控制论等领域的已有成果。有人认为,比特币发明人对于这些技术的应用并没有达到十分专业的地步。但正是如此巧妙的组合,让比特币项目能完成这样一件了不起的创举,体现出了发明者堪比大师的境界。

摘自:区块链原理、设计与应用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: