摘要
首先中本聪在摘要中就指明了要建立的是一个去中心化的p2p支付系统,并且不引入第三方来解决双重支付(double-spending)问题。并且提出了解决方案思路,提及时间戳(Timestamps)、工作量证明(Proof-of-Work)等技术要点。
接下来看正文内容……
简介
当前互联网上的金融贸易,无不都借助于可信赖的第三方,如国家强制性机构(银行),超大企业(支付宝、微信)等,是一种“基于信用的模式(trust based model)”,不是说当下模式不好用,只是既然基于信用,则需要持续不断的维护信用,其成本非常巨大。
所以比特币出现了,它不再基于信用而是基于密码学原理,使得虚拟交易可以在双方达成一致,直接支付,不需要第三方参与。
由于直接支付,确认后无法更改,所以是对卖家的一种保护,而对买家的保护,中本聪则提出“在此环境下通常设立第三方担保机制也可谓轻松加愉快”。其实说白了,比特币系统在设计上对交易双方是不平等的,天平更倾向于卖家,就像淘宝上买东西,杜绝了买家买货后给差评拒不付款的情况。但同时由于比特币交易确认后无法更改,也从另一个方面导致买家付了款而卖家据不发货的漏洞。
这就是比特币给我们的另一个注意点,比特币网络其实是替代的中心化的信用机构,并不能保证交易双方的信用。就像上面说的买家拒不付款、卖家拒不发货此类情况,都是属于交易双方出现了信用问题,而由于此时没有第三方信用系统介入(淘宝、京东等),交易无法撤销,损失了就是损失了,这是比特币的优点也是它的痛点。
交易成功后无法更改其实是有条件的,就是俗称的51%攻击。原文中有写到“除非重新完成全部的工作量证明,形成的记录将不可更改”,比特币采用的是复杂的工作量证明机制,更改交易区块,需要从该区块以及之后所有区块都重新计算,需要大量运算,非常耗时,所以在客观上是形成不可更改的目的。
但是,试想,如果卖家买家达成一致,或者根据“多数人即正义”原则,有绝大数人同意修改呢?这是的的确确存在的比特币的缺陷,并且这个缺陷也给滥用留了空子。至今还记忆犹新的全球勒索病毒的爆发,勒索掉大量的比特币,这在全球绝大多数人眼里非正义行为,就可以在比特币的规则下,堂而皇之的钻空子,而我们却无力回滚其交易,因为比特币交易存在这客观不可更改。
交易
Transaction这一块内容是中本聪设计最核心也是最精妙的部分,让人赞叹。先奉上原图,注意是英文原版白皮书原图,不是网上流行的中文翻译版的图,中文图是错误的,整整误导了我很久。
首先搞懂白皮书里给出的coin的定义:”一枚电子货币(an electronic coin)是这样的一串数字签名“。首先比特币这个概念就很绕,即不跟现实货币相同,也和类似Q币这样的不同。Q币可以理解为线上流通的实体货币的代币,也会记录拥有者姓名、数量等信息。而比特币实际上根本不记录都有谁谁谁,谁拥有多少币,也没有户头概念,所有的这些都是通过交易记录反推得来。
例如,Q币的记录方式是A有100个Q币,B有50个Q币,A转给B10个Q币,则A户头上-10Q币,B户头上+10Q币,这是中心化的运作方式,包括银行都是这样。而比特币的记录可能就是一条“A给B10个比特币”,无数个这样的交易记录组成交易链,就形成来一个去中心化的,公开透明的公共账本。如果A想要知道自己有多少比特币,那么就援引所有他参与过的交易来反推出数量。
明白了这个原理,我们来看如何将比特币从一个人发给另一个人。
比如说一笔交易记录:张三发给李四5个比特币。
发送者(张三)要做的事情是:把这条交易信息和目标地址(李四的公钥)做个HSAH,然后用自己的私钥进行数字签名(即用张三的私钥加密这个哈希值),同时将这个数字签名附到这笔Tx(交易)里,然后通过p2p技术发送给李四。
李四收到这条消息后怎么做:拿着这笔交易里公布的张三的公钥来验证数据(公钥解密)得到哈希值x,同时,用自己的公钥和交易信息做哈希得到hash(data),然后对比x=hash(data),则可以判断出这笔交易来自于张三。因为公钥验证出的哈希值只有私钥才能生成,而拿张三的公钥验证的,必然是张三的私钥,私钥只会存在张三那里,抵赖是抵赖不掉的。这里就用到来非对称加密,私钥数字签名,公钥验证数据。公钥确定钱包地址,私钥确定所有权。
知识点一:非对称加密
公钥可以加密数据或验证数据,私钥可以解密数据或对数据签名。
公钥加密数据,只能用私钥解密。
私钥加密数据(这个过程叫数据签名),只能用公钥解密(验证数据)。
区块链在设计交易(Transaction)的时候,就是用不对称加密算法(SHA-256)。
既然是支付系统,逃不开的就是双花(double-spending)问题。
知识点二:双重花费问题
如果同一笔钱,被重复支付两次,这就是双花问题。
现实世界中你伪造一块黄金拿去交易,很容易被证伪,而虚拟世界中的物品被复制太容易了,一前一后用同一笔钱发起两笔交易,看似都没有任何问题,但这就存在双花问题。
中心化的支付系统(支付宝、银行等)并不是不存在双花问题,只是更好解决而已。例如银行转账,A户头转账100元到B户头,银行会开启事务,A户头-100,B户头+100。这个过程类比铸币厂来说,银行会先作废掉A户头的100,然后重新发行新的100给B户头。由于A户头上的100元被作废掉了,所以就解决了双花问题。
那么,比特币是怎么解决双花问题的呢?老样子,多数即正义。首先是要求所有交易对全网公开,所有人都可以追溯每一笔交易的来龙去脉,无法造假。二来每笔交易都有个时间戳,这样就能确定先后顺序,形成时间序列交易链。三是绝大多数的节点承认交易是首次出现的。这里就引出了下一章节的概念:时间戳服务器。
时间戳服务器
时间戳服务器通过对区块加盖时间戳,则能证明某些数据在某些特定时间是确实存在的。每个时间戳都会有前一个时间戳的信息,这样时间戳也形成一个链条,后一个时间戳就是对前一个的增强。这样就算有人想篡改某一个时间戳,则需要把其之后的所有时间戳都改掉,这个过程是有工作量证明的,将会大量耗时和算力,从而保证不可被篡改。
现在又出现思考,比特币不是说去中心化的么,怎么又出来个时间戳服务器,有服务器不就又成了中心化的。其实不是这样的,此服务器非彼服务器,还是那句话,多数即正义,时间取自于其他至少5个节点的时间的中位数,并且中位数跟本地时间相差不能超过70分钟。
知识点三:中位数
一个数学概念,统计学中的专有名词,代表一个样本、种群或概率分布中的一个数值,其可将数值集划分为相等的上下两个部分。
中位数是以它在所有标志值中所处的位置确定的全体单位标志值的代表值,不受分布数列的极大或极小值影响,从而在一定程度上提高了中位数对分布数列的代表性。
所以说中位数比平均数更不受极端值的影响,更能代表分布数列的中间值。
时间戳的运行机制就是两个区块产生间隔中所有交易进行Hash运算,加盖时间戳,我们就得到了一个按时间序列产生的交易记录了,这就是区块链。
工作量证明
工作量证明,就是俗称的“挖矿”。一来浪费电力,二来浪费算力,并且比特币并不是挖矿挖出来的货币,那么为什么还需要挖矿呢?
试想,有一笔交易产生了,并广播给全网,现在A、B、C三个人都收到了这个交易信息,都可以对交易进行加盖时间戳,然后打包区块到链上去。但是每个人接受到的交易信息不一样,并且接受的时间也不一样,那么产生的区块hash就千差万别。所以此时需要一个共识机制,在全网达成共识,就需要引入竞争机制。就如同长跑一样,谁第一个撞线,就给谁记账(加盖时间戳、打包区块)的权利。那怎么样制造一个所有人都参与长跑的场景呢,工作量证明(Proof-of-Work)机制就来了。
白皮书里定义了如何工作量证明,即借用CPU的算力进行穷举法,有概率性的碰撞出所需要的值,比如一串开头有N个0的hash值。这个过程是需要付出算力且耗时的,CPU算力的不同,A、B、C三人就有先后顺序了,第一个满足要求的人拥有下一个区块的记账权,这样就达成了共识。
此时再试想,如果A、B、C中三人B通过工作量证明脱颖而出,拿到了记账权,如果他这时篡改交易记录或者恶意构造交易实现双花怎么办?
由于有POW机制的存在,B拿到了记账权,同时他付出了电力成本、CPU算力成本,并且篡改比特币的某一笔交易,需要连带修改之后所有交易,其带来更大成本支出。当作恶成本远远大于篡改记录所得的利益时,就如同花100块钱的成本为了赚1块钱,他还会选择作恶么?
工作量证明机制简单来讲就是提升了作恶的成本,让作恶的投入产出比低于做诚实节点的投入产出比,这就是中本聪运用博弈论的点睛之笔。
另一个点,工作量证明的难度是随着时间而变化的,如果区块的产生速度过快,难度就会提升,从最初的CPU到GPU到矿池,挖矿成本一直在增加,难度是越来越大。所以日渐突出的一个问题就是,越来越多的普通CPU用户成为吃瓜群众,超大算力的CPU被矿池占据,不免让人担心纯POW的共识机制还能否继续完美保证比特币系统运行下去。所以后来也出现了像股权证明机制(POS)等新的共识机制来避免算力集中。
网络
前面几章依次讲述了比特币系统的交易、时间戳、工作量证明,到这里就讲述,比特币系统网络是怎么运行的,交易在网络中是怎么流转并打包成区块,并形成链的。
前面的步骤其实很好理解,继续顺着工作量证明之后往下说,打包成区块后,向全网广播,不是说这个区块在记账完成就是有效的,还是要经过“多数人即正义”的验证的,当且仅当包含在该区块中的所有交易都是有效的且之前未存在过的,其他节点才认同该区块的有效性。“所有交易都有效”,“之前未存在过”这两点就是指全网节点验证交易和验证时间戳,占据绝大多数都验证通过后,这个区块方可被承认。
全网接受了这个区块之后,接受的方法就是在这个区块末尾制造新区块,用以延长该区块。这个设计也很巧妙,目的就是促使生成一条最长链,并且最诚实,最正义,因为只有接受度最高的区块链才会被延长。
激励
前面一直说工作量证明,直到这里才真正说明工作量证明的刺激点,大家伙为什么拼了命的耗电耗时耗算力地去做呢?因为有激励机制,只有在去中心化的系统有提供激励机制,才能保证长久运行下去,所谓“从激情开始,用利益维持”说的就是这个。
比特币系统里的激励有两种。一是在“每个区块的第一笔交易进行特殊化处理,该交易产生一枚由该区块创造者拥有的新的电子货币”,这是用来补贴用于工作量证明的成本;二是交易费,“如果某笔交易的输出值小于输入值,那么差额就是交易费,该交易费将被增加到该区块的激励中”,这是用来补贴用于交易确认所产生的成本。
回收硬盘空间
这个解决的是存储问题,由于处于比特币网络中的每个节点都会同步全部的交易记录,这个体积是在不断膨胀的。白皮书提出的解决方案是,使用Merkel Hash Tree方式存储被消费过的交易信息,只把这个Tree的Root节点保存进区块。而Merkel Hash Tree则由一些IPFS、公共节点、信任度高的节点来保存。同时如果想回溯交易,只需去对于的Tree里下载回所有交易记录即可。
简化支付认证
这其实是回收硬盘空间所带出来的问题,当链上的节点保存的不再是完整的交易链信息时,必须要走一个简化的支付认证,这算是折衷方案。
当某个存储Merkel Hash Tree节点遭受攻击或发现异常,系统会提示用户下载这个节点存储的数据来保证整条链上的交易数据是不被篡改的。同时一些金融机构或着对全部交易数据敏感的节点会一直保存下所有的交易记录,而不进行回收硬盘空间的折衷。
组合和分割价值
这一块内容又是对交易的一个补充,同时它灌输了一种观念,比特币跟现实货币是完全不一样的,没有单位换算,只有差额,价值的组合和分割完全可以用加减法来实现。
最重要的一点是,明确来一个交易(Tx)包含多个Input和多个Output。
由于比特币系统不记户头帐,只记录交易信息,所以每个人的持有货币数量都是由交易反推的。同理,当进行一笔交易时,你需要援引一条甚至多条交易记录来凑出你的电子货币,所以由多条输入(Input)。
比特币系统交易还有一个特点,每次交易都把钱花光,意思就是Inputs=Outputs,所以输出一个是目标钱包的交易数量,另一个就是找零,找零全部返回付款方。
隐私
这个其实是大众很关心的问题,一方面比特币网络说是去中心化的,交易全透明的,另一方面又说比特币是匿名交易、不互信的,到底是怎么回事呢?
其实很简单,比特币网络里没有户头概念,只有钱包地址,钱包地址是由公钥hash得来,在这个环节上钱包公开,公钥匿名。公众可以看到有一个钱包地址发送一笔数目给另一个钱包地址,但是没有信息能把钱包地址于某个人联系在一起,这样就保证了用户的隐私。这就是只看到有交易在发生,但是不知道是谁在交易。
附录:
中本聪 《Bitcoin: A Peer-to-Peer Electronic Cash System》
大圣2017《(大鱼)精读比特币白皮书系列(1-6)》
godsex 《解密比特币白皮书(3) — 当你发送比特币,你在发送什么?》
金晓 《比特币白皮书 个人翻译+注解》
蒋宏伟 《比特币的交易-数字签名(一)》
aisen 《什么是“双重支付”问题,怎样解决?》
百度百科 《中位数》
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。