本文讲解一下 BitCoin 的技术原理。了解原理以后,BitCoin 能够解决什么问题,尚存什么缺陷,自然就一清二楚。剩下的问题,就是讨论随着 BitCoin 的发展,将会有什么机会。
我们不妨把 BitCoin 体系拆分为四个问题来谈,1. 交易(transaction), 2. 支付(payment), 3. 审计(audit), 4. 铸币(mintage)。
【1】 交易(transaction)
交易的基本诉求,是付款人(payer)汇款给收款人(payee)。技术挑战是加密(cryptography),目的是不让第三者截获甚至篡改汇款金额。
BitCoin 的交易加密方式沿用了现成的,基于公钥(public-key)私钥(private-key)的非对称加密体系(asymmetric cryptography)。这里没有什么创新。
[1] 第二节的图例中,最左侧的框,解释了 Owner0 给 Owner1 汇款的交易机制,截图如下。
- Owner0 先查到 Owner1 的公钥。用 Owner1 的公钥(Public Key)把汇款详情加密。这样,只有 Owner1 本人用自己的私钥(Private Key),才能打开加了密的汇款详情。在图例中,没有画汇款详情。不过这个小小的叙述的疏忽无妨大雅。
- 为了方便 Owner1 验证这笔汇款的确来自 Owner0,而不是别人,Owner0 发出的汇款单里,除了有加了密的汇款详情,还有 Owner0 的数字签名(Signature)。Owner1 拿到汇款时,为了验证这笔汇款的确来自 Owner0,他可以用 Owner0 的公钥,来验证汇款单中 Owner0 的数字签名。
- Owner0 发出汇款单时,汇款单不仅仅投递到 Owner1,而且还要广而告之,任何人只要愿意参与 BitCoin 审计,都可以收到全球所有人发出的所有汇款单。
- 沿用 1、2、3 的原理,Owner1 给 Owner2 汇款,然后 Owner2 给 Owner3 汇款。BitCoin 通过 Hash 机制,把涉及同一枚 BitCoin 的所有汇款交易(Tranaction)串连起来,目的是为了追查重复付款(double spending)的欺诈行为。
【2】 支付(payment)
当付款人(payer)向收款人(payee)发出汇款交易(transaction)后,支付过程(payment)并没有完成。直到收款人签收了汇款以后,支付过程才正式结束。
在收款人接受汇款以前,他必须确认汇款人没有重复付款(double spending)。这就类似于我们接受纸币前,最好验证一下纸币是不是假钞一样。
BitCoin 验证重复付款的办法,是靠群众检举。当收款人收到汇款时,他把汇款单广而告之。审计站点收到广而告之的汇款单时,会检查汇款单中涉及的 BitCoin,是否出现在其它汇款单中,是否被重复付款。如果出现这种重复付款,审计站点会检举,并通知收款人拒绝签收汇款。
BitCoin 保证重复付款的行为,能够被检举,但是不能保证能够被当场抓获。[2] 假设了一个场景,
- 骗子开设了两个账号,A 和 B。他先把一枚 BitCoin 由账号 A 汇款到账号 B,账号 B 立刻签收。账户 B 签收汇款前,没有把汇款单广而告之。
- 然后骗子去 C 的网店买东西,他把同一枚 BitCoin 由账号 A 汇款到账号 C。C 收到汇款单后,等待几秒钟,如果各个审计网站没有检举,C 就签收 A 的汇款,同时交付商品。
- 但是就在 C 等待的时候,骗子把从 A 到 B 的汇款单广而告之,并且这是一个已经被 B 签收了的汇款单。因为从 A 到 B 的汇款单是合法的,这个汇款单被各个审计站点接受。
- 等到 C 签收了 A 发来的汇款单,并广而告之时,各个审计网站会检举,说 A 到 C 的汇款单是重复付款,无效。虽然骗子被检举,但是 C 已经交付了商品,C 上当了。
为了防范重复付款,现行 BitCoin 的支付方式,有很多可以改进的地方。例如,可以强制付款人给收款人发汇款单时,必须把汇款单广而告之,这时汇款单尚未被签收。然后,当收款人签收汇款时,也必须再次广而告之,不过与第一次不同在于,第二次广而告之的,是已经被签收的汇款单。
但是似乎到目前为止,还没有发现一种数学上完全严谨的办法,能够彻底杜绝重复支付的发生。
【3】 审计(audit)
为了杜绝重复付款的欺诈行为,一个简单的办法是全球人民每次汇款时,先把汇款单提交给一个权威机构,例如支付宝。支付宝收下付款人汇来的 BitCoin,然后发另一枚 BitCoin 给实际收款人。这样做,可以保证收款人收到的 BitCoin 不会有诈,但是不能保证支付宝,从汇款人那里收到的 BitCoin,没有被重复支付。
举个例子,假如权威机构除了支付宝以外,还有 Paypal 等等,付款人用同一枚 BitCoin,向两个收款人汇款,汇款时分别经过支付宝和 Paypal。假如重复支付成功,两个收款人没有损失,但是支付宝和 Paypal 中,一定有一家机构被欺诈。
这种防范欺诈的机制,除了技术上有漏洞以外,依赖权威机构的做法,与 BitCoin 的群众路线的设计理念相违背。
BitCoin 的做法,是把任何一枚 BitCoin,从诞生到当下,每一次交易都记录在案,而且按时间顺序串联起来。这就像古董,通常要附带历史记录,从制作出售之初,每一次转手,都被记录下来,这样有利于防范被冒牌顶替。
BitCoin 的每次记录都被广而告之,并且记录下来,并且连缀成串。这样,每一次 BitCoin 的交易,不仅有付款人和收款人参与,而且有第三方审计人参与。审计人可以是专职机构,也可以是任何一台电脑。审计不仅能够及时发现违法操作,例如重复付款,而且即便当时漏网,事后也能回溯。
[1] 第八节的图例中,解释了 BitCoin 交易记录的串联的数据结构,截图如下。
有两点值得注意,
- 为了提高审计效率,BitCoin 把多个交易(Transaction)合并成一个块(Block),同时用 Merkle Tree(又称 Hash Tree)[3],把这些交易详情组织起来。 如果想检查一个 Block 里是否包含有某个 Transaction,最简单的办法是找到合适的私钥,把 Block,以及其中包含的 Transactions,解密打开,然后逐一核对。很显然,这样的做法,既浪费时间,又很不安全。 使用 Merkle Tree 的好处在于,不需要解密开包,只需要把 Transaction 也 Hash 一下,然后把哈希结果与 Merkle Tree 中各个中间节点的哈希值,依次对比,就能够很轻松地确定 Merkle Tree 中,是否包含着指定的 Transaction,如果有,它是哪一个叶子节点。
- 如果每次交易,只包含一枚 BitCoin,那么每枚 BitCoin 的历史记录,是一根单线。但是事实上,每次交易,可以涉及多枚 BitCoins,所以,交易的历史记录,不仅有单线,还有多根单线合并成一根线的情况。 不仅有合并,还有分叉,这种情况出现在 A 给 B 汇款了多枚 BitCoins,B 签收了这笔汇款交易后,又把多枚 BitCoins 转手分发给多个收款人。 不仅 BitCoin 的历史记录有多线合并成单线,又有单线分叉成多线。而且一枚 BitCoin 还可以分裂成多个小币。
【4】 铸币(mintage)
在 BitCoin 体系中,任何参与审计的人,都自动参与货币的生产。货币的生产,即铸币(mintage)的过程,在 BitCoin 体系中被称为挖金矿(gold mining)。
从技术上讲,审计和铸币完全是可以拆分的两件事情。把铸币权与参与审计绑定在一起,是游戏规则的设定,目的是发动群众,共同维护 BitCoin 的诚信体系。
另外,BitCoin 的总蕴藏量,被预先设定了上限。这样做的目的,是通过限制货币流通量,遏制通货膨胀。
从技术上来看,完全可以把 BitCoin 体系当成一个工具箱,用这些工具,配置不同的规则,从而创造另一种货币体系。
例如,
- 可以设定只有政府才有资格挖金矿,从而把铸币权收归政府。
- 不必设定货币流通上限,而是可以根据新增财富,来增加货币发行。
- 可以通过认证,给每个付款人设定信用值,用于加快支付签收速度。
- 也可以通过保险,让每一笔汇款交易的收款人,立刻签收汇款。如果出现重复付款,保险公司赔付。
- 虽然理论上每个人(实际上是每台电脑),都有资格成为审计员,实际上,必定会出现大型机构,凭借强大的计算和存储能力,成为专业审计机构。
文章来源:巴比特
发布时间:2015-10-05 23:56:00
原文地址:https://www.8btc.com/tutorial/2005