
[摘要]:本文提出了一种完全通过点对点技术实现的电子现金系统,它使得在线支付能够直接由一方发起并支付给另外一方,中间不需要通过任何的金融机构。虽然数字签名(Digital signatures)部分解决了这个问题,但是如果仍然需要第三方的支持才能防止双重支付(double-spending)的话,那么这种系统也就失去了存在的价值。我们(we)在此提出一种解决方案,使现金系统在点对点的环境下运行,并防止双重支付问题。该网络通过随机散列(hashing)对全部交易加上时间戳(timestamps),将它们合并入一个不断延伸的基于随机散列的工作量证明(proof-of-work)的链条作为交易记录,除非重新完成全部的工作量证明,形成的交易记录将不可更改。最长的链条不仅将作为被观察到的事件序列(sequence)的证明,而且被看做是来自CPU计算能力最大的池(pool)。只要大多数的CPU计算能力都没有打算合作起来对全网进行攻击,那么诚实的节点将会生成最长的、超过攻击者的链条。这个系统本身需要的基础设施非常少。信息尽最大努力在全网传播即可,节点(nodes)可以随时离开和重新加入网络,并将最长的工作量证明链条作为在该节点离线期间发生的交易的证明。
---以上节选自《比特币白皮书》
解读:通过摘要我们就知道了,比特币系统要解决的两个主要问题,一个是去中心化的p2p系统,一个是支付要解决的双重支付问题,所以整个白皮书提到的技术方案都是围绕这两个问题展开的。其实中本聪在写这篇论文时,有关去中心化的p2p系统已经有比较完善的解决方案了,所以白皮书的重点都放在如何通过p2p系统解决双重支付问题(双重支付简单一点说就是一笔钱花两次。就是你拿着币,在A商店买了瓶水,在B商店买了包瓜子。两个交易几乎同时发生,那么可能A或B商店最后有一家没有能收到币,那么就发生了一次双重支付)。
要解决双重支付问题就必须记账核对,那么如何在一个没有中心的p2p系统中记账受到认同呢,比特币引入了基于时间戳的随机散列,并且让其形成前后文相关的序列,这样以来,每笔交易就有可追溯的时间记录,双重支付的问题得以解决。
1. 简介(Introduction)
互联网上的贸易,几乎都需要借助金融机构作为可资信赖的第三方来处理电子支付信息。虽然这类系统在绝大多数情况下都运作良好,但是这类系统仍然内生性地受制于“基于信用的模式”(trust based model)的弱点。我们无法实现完全不可逆的交易,因为金融机构总是不可避免地会出面协调争端。而金融中介的存在,也会增加交易的成本,并且限制了实际可行的最小交易规模,也限制了日常的小额支付交易。并且潜在的损失还在于,很多商品和服务本身是无法退货的,如果缺乏不可逆的支付手段,互联网的贸易就大大受限。因为有潜在的退款的可能,就需要交易双方拥有信任。而商家也必须提防自己的客户,因此会向客户索取完全不必要的个人信息。而实际的商业行为中,一定比例的欺诈性客户也被认为是不可避免的,相关损失视作销售费用处理。而在使用物理现金的情况下,这些销售费用和支付问题上的不确定性却是可以避免的,因为此时没有第三方信用中介的存在。
所以,我们非常需要这样一种电子支付系统,它基于密码学原理而不基于信用,使得任何达成一致的双方,能够直接进行支付,从而不需要第三方中介的参与。杜绝回滚(reverse)支付交易的可能,这就可以保护特定的卖家免于欺诈;而对于想要保护买家的人来说,在此环境下设立通常的第三方担保机制也可谓轻松加愉快。在这篇论文中,我们将提出一种通过点对点分布式的时间戳服务器来生成依照时间前后排列并加以记录的电子交易证明,从而解决双重支付问题。只要诚实的节点所控制的计算能力的总和,大于有合作关系的(cooperating)攻击者的计算能力的总和,该系统就是安全的。
---以上摘选自《比特币白皮书》
银禾解读:比特币的核心就是去中心化,可以简单理解为去中介化。现在线上商业大多有个可信的第三方中介平台(比如微信、支付宝),有第三方就会有第三方仲裁(比如你投诉淘宝卖家要求退款)之类的事情,这增加了系统的成本。这个成本使得小规模交易不可能。因为有仲裁,存在钱可能被退回去的风险,所以卖家会特别谨慎,这个谨慎增加了体系对于信任的要求,又增加了成本。可如果存在有人故意找茬,要求退钱的现象(比如职业差评师),商家还花出更多心思鉴别客户是否是专业差评师,这又是一笔很大的成本。线下大家都付现金就没问题,不需要第三方,我也不担心被逼退钱,可是线上一直没有这种选项存在。
所以呢,我们需要一个新的付款方式,就像现金系统一样,不需要第三方担保,也不需要在你我之间建立信任,就可以直接交易。付过的款不会被退回,这样卖方就安心了。实在要保护买方的话,传统的监管机制(类似支付宝)也还可以用。在白皮书中,中本聪提出一方法可以解决双重支付问题,比特币系统采用一个分布式的时间戳服务器来记录交易解决这个问题。而只要系统中大多数节点是诚实可信的,整个系统运转就是可信的。
2. 交易(Transactions)
我们定义,一枚电子货币(an electronic coin)是这样的一串数字签名:每一位所有者通过对前一次交易和下一位拥有者的公钥(Public key) 签署一个随机散列的数字签名,并将这个签名附加在这枚电子货币的末尾,电子货币就发送给了下一位所有者。而收款人通过对签名进行检验,就能够验证该链条的所有者。

该过程的问题在于,收款人将难以检验,之前的某位所有者,是否对这枚电子货币进行了双重支付。通常的解决方案,就是引入信得过的第三方权威,或者类似于造币厂(mint)的机构,来对每一笔交易进行检验,以防止双重支付。在每一笔交易结束后,这枚电子货币就要被造币厂回收,而造币厂将发行一枚新的电子货币;而只有造币厂直接发行的电子货币,才算作有效,这样就能够防止双重支付。可是该解决方案的问题在于,整个货币系统的命运完全依赖于运作造币厂的公司,因为每一笔交易都要经过该造币厂的确认,而该造币厂就好比是一家银行。 我们需要收款人有某种方法,能够确保之前的所有者没有对更早发生的交易实施签名。从逻辑上看,为了达到目的,实际上我们需要关注的只是于本交易之前发生的交易,而不需要关注这笔交易发生之后是否会有双重支付的尝试。为了确保某一次交易是不存在的,那么唯一的方法就是获悉之前发生过的所有交易。在造币厂模型里面,造币厂获悉所有的交易,并且决定了交易完成的先后顺序。如果想要在电子系统中排除第三方中介机构,那么交易信息就应当被公开宣布(publicly announced),我们需要整个系统内的所有参与者,都有唯一公认的历史交易序列。收款人需要确保在交易期间绝大多数的节点都认同该交易是首次出现。
--以上节选自《比特币白皮书》
银禾解读:比特币不同于现实中的钞票,生活中,我们给别人钱是给了他一张纸,所以从狭义的角度去理解『钱』或者『币』就是一个实际存在的等值量化的交易等价物。
比特币也不同于支付宝和微信钱包,在网络上,我们通过支付平台给别人打钱的时候,并没有物理上给他什么东西,而仅仅是平台方对这笔交易进行了记账。
比如Mars用支付宝给Mango打100块钱,支付宝并不会把什么东西从Mars那里挪动到Mango那里,而是会在Mars名下账户里记账『减去100块』,而在Mango那里记账『加上100块』。我们的钱在平台上只是一串数字,平台根据其数字来兑付人民币进而赋予其价值。这是站在支付宝的角度思考,以人类为中心来记账,如果我们站在这100块钱的角度以它为主角记账呢?则应该第一天记录为『我出生啦,在中国人民银行』,然后记录它一系列的遭遇流转——『我从人民银行到招商银行账户啦』、『我从招商银行账户到了一个叫做今夜酒店特价的公司财务账上啦』,『我从财务账户到了一个叫Lei的人手上啦』……『我从XX手上到了一个叫做Mars的人手上啦』、『我从Mars手上到了Mango手上啦』……
在数字世界里,我们让每个人在转钱给别人时签个名才能转成,那么这一系列的签名『人民银行』、『招商银行』、『今夜酒店特价』、『Lei』……『Mars』、『Mango』……其实就代表着这张钞票的前世今生,也就是这张钞票本身——最后一个所有者要把它给谁的话,签个名转给对方,把对方的签名也加到这一串名字里就好。这也就是比特币的简单逻辑。接着,A同学要转钱给B同学怎么办呢?简单,他把上一个『转账交易』和B同学的公钥放在一块儿,签名哈希一下,贴到他所有的那个币的链尾上,就搞定啦。收款人可以通过检查签名来验证这个链的所有权。但要证明信息是有效的又不允许中心化从存在,那么只有一个办法了,就是发动所有的人参与这项活动,进行“多数人的正义”,所以原文中“那么交易信息就应当被公开宣布(publicly announced)”。
比特币采用非对称加密技术来保证其安全性。对外行人来说加密就是在文件上加个密码,谁有密码谁就能打开文件。比如A问B要涉密的文件,但是又怕别人看见内容,就打电话给B电话说『你把文件加密传给我,密码就是123456』,A这边就将文件加密,,然后微信发送加密后的文件给B,B回家输入123456就可以看了。可是,如果有人监听电话那么这个密码就失去了保护文件的作用,那么有什么办法可以让我们更安全——就算别人既截获到了文件,又偷听了电话密码,却还是打不开文件?
非对称加密就可以做到,每次他会生成一对『公钥』和『私钥』。所有用『公钥』加密的文件只能用『私钥』解码,所有用『私钥』加密的文件只能用『公钥』解码。下面举个例子说明非对称加密的工作原理,如图所示:

1、乙方生成一对密钥(公钥和私钥)并将公钥向其它方公开。
2、得到该公钥的甲方使用该密钥对机密信息进行加密后再发送给乙方。
3、乙方再用自己保存的另一把专用密钥(私钥)对加密后的信息进行解密。乙方只能用其专用密钥(私钥)解密由对应的公钥加密后的信息。
在传输过程中,即使攻击者截获了传输的密文,并得到了乙的公钥,也无法破解密文,因为只有乙的私钥才能解密密文。
同样,如果乙要回复加密信息给甲,那么需要甲先公布甲的公钥给乙用于加密,甲自己保存甲的私钥用于解密。