编者注:本文原文写作于2016年7月。对于已然了解的人来说,文章中的内容可能已极为稀松平常,犹如九九乘法表。但也许还有人会需要它,所以我们还是在做着。
区块链技术大概是继互联网之后最伟大的发明了。它使得人们在无需信任且去中心化的情况下也能进行价值交换。假设我们之间打了一个,旧金山明天天气,注是50美元。我明天会是晴天,而你认为会是雨天。如今我们有三种方式来实现这一约:
我们可以信任彼此。无论是下雨还是放晴,输家都支付给赢家50美元。如果我们是朋友,这当然是一种实现约的好方法。然而,无论我们是朋友还是陌生人,输家都有一万种方法拒不支付。
我们可以将约转化为合同。一旦签订一份合同,双方都有义务去履行约,支付注。然而,若是输家决定拒绝履行,赢家就得支付额外的报酬并且花费很多时间以通过法律手段谋求其正当权利。尤其是对于小额注而言,这看起来并不是一种最优的实现方式。
我们还可以邀请中立第三方。参与注的玩家各支付50美元给第三方,而第三方会将这100美元支付给赢家。然而,这位所谓的第三方也有可能做出卷款潜逃的行为。因此,这种方法与前两种方法并没有本质差别:要么相互信任,要么诉诸合同。
最佳的解决办法既非信任亦非合同:我们没法信任陌生人,同时签订合同需要花费很多金钱和时间。区块链技术在这一方面惹人注目,正是因为它给了我们第三个选择,兼具安全、快捷、以及便宜三种特性。
区块链使我们能够写几行代码并在链上运行一个程序,双方分别向该程序发送50美元。这一程序将会确保这100美元的安全,并根据多种数据来源自动查询明天的天气情况。无论是放晴还是下雨,它都会自动将这笔钱转移到赢家名下。任何一方都有权利检查合约逻辑,一旦程序开始在链上运行,就不能被更改或中止。也许这对于50美元的约来说是小题大做,但对于房屋买卖以及公司间交易来说,这是一种合乎常理的选择。
编者注:就目前而言,上面这一段对区块链功能的描述有点夸大其词了,实际上并不能做到。但这并不影响本文后续部分的价值,而且我相信,详细阅读后文之后,读者自己也能理解,为什么上面这一段不太可行,但区块链依然有其价值。
本文不会深入讨论技术细节,只会释放为了理解这一技术的底层逻辑和机制而必须具有的知识。
比特币基础知识
-图片由作者提供-
区块链最为众所周知和受到广泛讨论的应用是比特币,它是一种可用于产品和服务交易的数字货币,正如美元、欧元、人民币和其他国家货币一样。让我们通过区块链技术的第一次应用来学习它的工作方式。
“比特币让我们有了从未有过的体验——使互联网用户可以向另一位用户转让一笔独一无二的数字资产,并且确保这笔转账安全可靠,同时所有人都知道这笔转账发生,但没有人可以挑战转账的合法性。我几乎无法用言语来赞美这一开创性成果。”
——MarcAndreessen
bitcoin是比特币这一数字货币的基本单位。正如美元一样,比特币本身没有使用价值;它拥有价值是因为人们同意用其支付货物和服务以换取更多的该币种,同时也相信其他人也会这样做。
为了记录我们每个人所拥有的比特币数量,区块链使用一种账本,一份记录了所有比特币交易的数字文件。
-图1.简化的比特币账本数字文件-
帐本文件并不存储在某个中央处理器中,如一家银行或一家数据中心。它通过私人计算机网络储存在世界各地,经由这些计算机储存数据并完成计算。每一台计算机都代表区块链网络的“节点”,并拥有账本文件的副本。
假如David希望将比特币支付给Sandra,他便在网络中进行广播,宣称David本人账户中的比特币将会减少5枚比特币,而Sandra账户中的比特币将会增加相同数目。网络中的每一节点都会收到这条消息并将这一交易请求覆写到其账本副本上,并更新双方帐户余额。
-图2.简化的交易请求讯息-
鉴于账本由一群相互连通的计算机而非诸如银行这类中心化的实体来维护,区块链有以下几个特点:
在我们的银行系统中每个人仅仅了解发生在自己身上的交易和账户余额;而在区块链中每个人都能知道其他所有人的交易。
尽管你通常可以信任你的银行,但比特币网络是分布式的,如果出现问题,你并没有服务台可以咨询也没人能让你起诉。
区块链本身的设计方式使得人们无需相互信任,而是通过特定的数学函数和代码来保证其安全性和可靠性。
我们可以这样定义区块链:让一组相互连接的电脑可以维护一个安全账本、且账本可以不断更新的系统。为了在区块链上完成交易,你需要一个钱包——一个让你储存并交易比特币的程序。由于每个人的比特币应该只能由自己花掉,每个钱包都受到一种特殊的密码学技术的保护,这种技术要用到一对不同但互相关联的密钥:私钥和公钥。
编者注:使用两把不同但相互关联的私钥的办法来自于非对称密码学,即在加密和解密过程中使用两把不同密钥的密码学技术。在这种模式中,私钥即PrivateKey,指由行动者自己保管、可以推导出公钥并且不该公开给任何人的密钥,公钥即PublicKey,是由私钥推导出来的、可以公开给任何人的密钥。
公钥密码学一般有两种用途。一种是加密通信,发送者使用接收者的公钥来加密,接收者使用自己的私钥来解密,这样就能保证机密性;另一种是数字签名,签名者用自己的私钥来签名,验证者用签名者的公钥来校验,这样就能保证签名的身份同一性。
……。当David想要支付比特币时,他需要广播一条经由他钱包中私钥加密过的信息。由于David是唯一一个知道解锁钱包对应的私钥的人,所以他是唯一一个可以花费他持有的比特币的人。网络中的任意节点都可以通过使用David钱包对应的公钥解密信息,从而检查交易请求是否确实来自David本人。
当你使用你钱包中的私钥来加密一条交易请求信息时,你也生成了一个数字签名,区块链中的计算机通过检验该签名来判断交易请求的来源和真实性。这一数字签名是由你的交易请求和私钥共同生成的一串文本;因此它不能被用于其他交易。如果你更改了交易请求信息中的任何一个字符,那么数字签名就会变得不一样,因此任何攻击者都不能更改交易请求或交易额。
-图3.简化的数字签名-
鉴于交易请求信息需要使用私钥加密,也就是说在支付比特币之前,你总是需要证明你是你的钱包私钥的所有者。由于信息总在加密后才会广播,因此你永远不会泄露你的私钥。
追踪你的钱包余额
区块链中的每个节点都保存了账本副本。那么,某个节点是怎样知道你账户余额的呢?区块链系统本身并不会追踪余额;它仅仅记录每一笔经过确认与验证的交易。事实上,账本也不会追踪余额,而仅仅追踪比特币网络内广播的每笔交易。要确定你的钱包余额,你需要分析并验证整个网络内与你的钱包有关联的每一笔交易。
-图4.区块链账本-
“余额”的验证基于先前进行的交易。要向John支付10枚比特币,Mary需要生成一个交易请求,这一请求包含了Mary先前收到比特币合计至少10枚的交易链接。这些链接被称为“输入”。网络中的节点会确认交易额并确保这些“输入”暂未被花费。事实上,每当你在交易中纳入某些“输入”时,它们在这次交易之后的交易中就会变得无效。上述这些内容会自动在Mary的钱包中完成,并通过比特币网络的节点进行二次确认;她只是通过John的公钥向他的钱包支付了10枚比特币。
编者注:上面谈到的只是比特币等使用UTXO形式来表示资金的区块链的特点。并非所有区块链都是如此的,比如以太坊就不是这样。
-图5.区块链交易请求结构-
那么,系统如何确认这些交易的输入是有效的?它会通过查询“输入”来检查所有与你用于支付的钱包相关的交易。为了使得这一检查更加快捷,网络节点会保留未花费货币的记录。多亏了这种安全检查,我们才能确保比特币不能被双花。
拥有比特币也就意味着比特币账本中的一些交易指向你的钱包地址,并且它们暂时还没有被用作“输入”。在比特币网络上所有用于执行交易的代码都是开源的;也就是说,任何一台联网的笔记本电脑的持有者都可以进行交易。然而,一旦用于广播交易请求信息的代码存在任何问题,与交易相关的比特币就会永远消失。
编者注:就实际而言,上面这段话的最后一句是错的。因为只要代码没有破坏掉账本,全网就有无数个副本;记录在账本上的钱,只要没花掉,自然也就不会少。但是会不会有一些软件漏洞会让比特币完全失去价值呢?可以看看下面这篇文章的讨论:
《比特币与社会契约》
请记住,由于网络是分布式的,客服电话是不存在的,也没有人可以帮助你找回消失的交易或遗忘的密码。因此,如果你对比特币网络交易感兴趣,最好使用比特币钱包的官方开源版本,并把你的钱包密码和私钥保存在一个固若金汤的保险柜里。
放在比特币钱包里的钱真的安全吗?“区块链”的名字来源说~
人人都能够匿名连接比特币网络,而且收发交易的过程都只需公开公钥。如果有人总是使用同一公钥,人们只要通过他的公钥,就可以查询到他所有的交易了。但是人们可以创建很多个钱包,每个钱包的私钥各不相同,这样用户就可以用不同的钱包接收转账了。除非你把所有比特币都转到一个钱包,否则,其他人无论如何也不可能知道哪些钱包地址是你的。
比特币地址的总数有2160个,或者说1461501637330902918203684832716283019655932542976个。
比特币钱包地址数量之大,使得每个用户都能拥有自己的钱包,又无需担心被攻击者破解。
尽管有了这一设置,但还有一个安全漏洞未解决——撤回已经花掉的比特币。因为交易是在节点间随机传递的,因此两单交易的在节点间传输的顺序可能会有所不同。攻击者可以先发送交易指令,等到交易对手方发货之后,就立马发送相反的交易指令到他自己的账户。在这种情况下,一些节点可能赶在接受到第一交易指令前早已收到了第二交易指令,故把第一支付交易指令视作无效。可此时,交易输入项已然显示为“完成”。那么,问题来了——人们究竟怎么检验哪个交易指令为先呢?用时间戳给各单交易进行排序是极其不安全的,因为时间戳很容易被人伪造。所以,并没有任何办法辨别交易的先后顺序;这就出现了欺诈的可能。
如果真的有人恶意撤回交易,网络中的节点接收到的交易顺序就会不一致。因此,区块链系统有意设计得需要节点达成一致,以此来防止上面所说的事件。
比特币网络把各单交易分进不同的区块来给它们排序,每个区块包含确定数量的交易和该区块与前一区块的链接。如此一来,区块就一个接着一个地按时间排列。区块也因此变成了时间顺序的链条,故而得其名曰:区块链。
-图6.简化的区块链排序结构-
在同一区块内的交易被认为同时发生,而还没被纳入区块的交易都是未确认交易。每个节点都可以将交易打包进一个数据块,并广播到网络中、建议其它节点接受该数据块作为最新区块。可是,按照这意思,任意节点都可以提议新区块,面对众多的答案,系统中节点应该怎么就下一个区块达成共识呢?
每一区块必须解开由不可逆的密码学哈希函数设置的复杂数学问题,才可成为区块链中的一员。解决这复杂数学问题的唯一方法是——结合着上一个区块的内容,不断地猜测随机数,直至找到一个符合定义的结果。一台普通电脑大约需要花近一年的时间来猜对这个数字。这个数字听起来很大,但大家不要忘了网络中有千千万万台电脑在猜数字,平均每10分钟就会产生一个区块。解决数学难题的节点会获得广播该区块并要求大家把该块当作最新区块的权利。
编者注:这么说可能更顺一点。在设计上,每个区块都必须指定自己要承接的上一个区块;结合着这上一个区块的内容,我们可以用密码学哈希函数设计出一种计算难题:要求通过改变输入来使得哈希函数的结果符合一定的形式要求。因为哈希函数的结果是随机的,而且在计算上是单向的,因此,找出符合要求的解的唯一方法就是暴力运算。找出了这样的一个解之后,找到解的节点就可以广播相应的区块、要求其它节点接受了。
而上面这个“10分钟”,即是比特币的“区块间隔”。不同的区块链往往有不同的出块时间。
关于密码学哈希函数,可看:《Emoji表情带你秒懂哈希函数》
这时,可能会有善于提问题的同学举起小手手问:要是碰到两个节点同时解决了问题,并把他们的块都发送到网络,这时可怎么办?
在这种情况下,两个区块都广播到网络中了,其他节点就在自己先收到的区块上开始继续加块。但是,比特币协议要求每一个节点都在其可见的最长链上加块,因此,若不清楚哪一个是最新区块,一旦某一个区块后面的区块得以挖出,根据最长链规则,该问题即可解决。
-图7.链顶端的模糊性解决逻辑-
由于同时挖出区块的可能性很低,也几乎不可能在每一个高度都有多个区块同时挖出。所以,整个区块链就会在一条每个节点都同意的链上迅速稳定下来。
但“哪个区块是区块链的顶端”的分歧又给了者可乘之机。如果交易恰好在非最长链中,一旦挖出了下一区块,在该区块中的这单交易和其他交易将复归为“未确定的交易”。
数学竞赛保护着在比特币区块链的系统中的交易,简言之,每个攻击者无疑都在单挑整个网络。
让我们来看看这个例子,玛丽是怎么利用链条顶端的模糊性进行“双花攻击”的。玛丽转一些钱给约翰,约翰知道后就发货给玛丽。因为节点总采用最长链规则来确认交易,所以,如果玛丽能够挖出一条更长的链,同时撤回上述交易,那么约翰就会钱货两空。
-图8.玛丽的“双花攻击”-
那系统怎么预防这种的呢?每个区块会引用前一区块的区块ID。前一区块的ID也是密码学谜题的一个元素,节点要解决这个难题才能将后续区块上链。因为解一个难题并把新区块放上链需要大量随机的猜测,所以预先计算一连串区块是极其困难的。在这个数学竞赛中,以一敌众的玛丽暂时抢先放置了下一个区块,不过,离她的如意算盘还早着了——她几乎不可能连续地解决第二个、第三个、第四个......毕竟她的对手是整个网络呀!
如果玛丽用跑得超级快的电脑和整个网络杠呢?答案还是一样滴。由于网络上有千千万万个对手,不管玛丽用的是多么多么快的电脑,玛丽在进行双花攻击时,需要接二连三地解决数学题,这还真滴不太可能。
玛丽需要控制全网络50%的计算能力,才有50%可能性赶在其他节点之前解开一个区块。即使在这种情况下,她也仅有25%可能性可以连续出两个区块。简单地说,她需要连续出的区块越多,她成功的可能性就越小。再敲一下小黑板——在比特币区块链系统中的交易受这种数学竞赛“护体”,攻击者无疑是以卵击石。
因此,随着时间推移,交易也会更为安全。举个例子,那些一小时前确认并保存在区块中的交易比十分钟前确认的交易更加的安全。由于区块平均每十分钟会增加一个,那么在一小时前保存在区块当中的交易早已确认,变得不可逆了。
-图9.区块链的交易安全性-
比特币挖矿
要发送比特币的时候,你需要引用一笔接收者为你的钱包的资金。这适用于网络中的每一交易。
编者注:这就是所谓的“UTXO”,即在比特币系统中,钱不像我们的银行账户那样是以数字的形式存在的,而是以一张票据的形式存在的。当你要转账时,你等于是要把票据拆成一笔特定数额的票据,然后用只有提供接收者私钥才能解锁的方式给这笔资金上锁。接收方日后要花这笔钱的时候也是如此:用自己的私钥解锁。
以太坊则相反,使用的是账户模式,很像我们的银行账户。详情可见:
《关于UTXO的思考》
那么,我们此时会问——比特币最初是从哪里来的呢?
作为一种平衡比特币通缩特性的方式,每当人们解决一个区块的数学题,就会得到相应的奖励。这种为了得到比特币奖励而运行比特币软件的行为,我们称之为——“挖矿”,这其实蛮像淘金的。
激励个人去运作节点的主要动机是奖励,这种激励措施也为保证交易正常运行和区块链网络稳定性提供必要的计算能力。我们之前也提过了,普通的电脑要解出一个区块需要将近一年的时间,所以,节点们一般都会组队,以减少每个节点需要猜的数字。成群结队可以加快猜对数字而得到奖励的速度,之后可以再在组内分享收益。我们把这些小组称之为——“矿池”。
有些矿池非常大,集中了全网多于20%的计算能力。如此庞大的计算能力貌似对网络的安全性提出了挑战,我们可以从上述所说的双花攻击的例子中即可看出。但即使有些矿池可能集中到了全网络50%的计算能力,区块在链上的深度越高,交易安全性就越高。
值得一提的是,有些拥有强大计算能力的矿池已经决定为保全整个网络的安全自觉地限制了自己的成员数量。
随着科学技术创新和节点的数量增多,整个网络的计算能力很可能会越来越强,比特币协议也会重新校准解题难度,以保证仍旧平均每十分钟增加一个区块。这保证了网络的稳定性和整体安全性。
另外,区块奖励会每四年减半一次,所以对于人们来说,挖矿不会一直那么有吸引力。为了鼓励节点保持运行,每笔交易都可以附加小额的手续费。这些奖励会进入成功挖出区块的矿工囊中。有了这种机制,那些有高额手续费的交易通常会比那些有较少手续费的交易更快得到打包。这样,想让交易尽快确认呢?还是想节省一点交易费?任君选择。目前来看,比特币网中的交易费用比银行的交易费用还是低很多的,此外,比特币的交易费与交易金额并无关联。
比特币的优势和它面临的挑战
读到文章此处,你对区块链的运行有了总体的了解。我们现在再快速复习一下为什么区块链如此地有趣吧~
区块链技术显著的优势在于:
你可以牢牢地把控住自己资产的价值,没有其他第三方可以控制你的资产或者限制你对你的资产的获取权限。
全球转移价值的成本变得非常低廉,使小额支付可行。
可以在几分钟内传递价值,且在短短几小时后,我们就可以认定转账的确定性,而不是传统节奏上按天或者按周来计算。
所有人在所有时候都可以验证在区块链上发生的每一单交易,这确保了交易的透明化。
我们还可以利用区块链技术构建去中心化应用程序,这些应用能够管理信息,且快速安全地传递价值。
然而,区块链仍然存在着一些需要解决的挑战:
可以匿名发送和接收交易。这虽然保护了用户的隐私,但是也允许了网络上的不法活动。
尽管越来越多交易平台涌现出来,电子货币也越来越受欢迎,但是把比特币用于商品和服务交易还不算容易。
和其他加密货币一样,比特币的价格波动还很大。在市面上,并没有很多流通的比特币,且人们对比特币的需求变化莫测。比特币的价格很大程度上也会受行业中的大事件影响。
总体来说,从广告到能源分配,区块链有潜力革新许多行业。去中心化的属性和消除人们对信任的需求是它最神奇的魔力了。
新的使用案例每时每刻都在增加,比如:一个可以运行智能合约的完全去中心化平台——以太坊。但是,需要我们记住的是:这项技术依然处在早期阶段。日复一日,随着有助于提高区块链安全性的新工具不断研发出来,区块链的技术可以覆盖更广泛的功能、工具和服务。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。