科技程序员

原汁原味科普比特币(上)

2018-03-23  本文已影响650人  shengofbig

写在前面

写这篇文章的动机,缘于一次对比特币原理科普性质的分享。讲的过程中发现,想把比特币真正讲明白,是非常困难的。所以决定把分享的内容记录下来,也力求把比特币这一新事物讲清楚。对于比特币中用到很多专业技术,我也尽量用通俗的说法来解释。如果最后没能达到目的,就权当是自己的一次总结了吧。

最原始的比特币模型

从最简单的角度看,比特币的功能有点类似银行或者支付宝这类支付机构,它为每个账户记录了余额,并且提供了让大家相互转帐的功能。

在没有比特币之前,我们的支付机构是怎么做的呢?

然而在一些场景下,我们并不想要这样的一个“支付机构”。比如:

尽管这两个例子稍嫌极端,但它们仍旧提出了一个技术上非常务实的问题:“假如不依赖任何一个中介机构,构建在互联网上的转账系统是可行的吗?”

面对这一问题,许多先辈进行了不懈的努力。在2009年,随着比特币系统横空出世,这一问题总算才有了一个可行的解决方案。

那么比特币究竟是怎么解决这一问题的呢?概括来说,它的思路如下:

将“人群集体提供账本”这一想法展开,就可以勾勒出最雏形的比特币转账过程来:

那么这样的一种转账模型意味着什么呢?如果和纸币对比一下,我们更能看出比特币系统的不同来:

另外需要强调的是,上面在描述转账时,用的是“人群”“大喊”这样的方式来类比的。在真正的比特币网络中,这两种方式都是不存在的。所谓人群,其实是运行在世界各地的计算机节点;而所谓“人手一份的账本”,也是记录在计算机节点之上的电子文件;而“大喊”,则是对“利用互联网传播消息”的一种形象描述。在本文后面的内容中,这种比喻的形式仍旧会不时的出现,大家读到时,一定要对应到真正的计算机世界中去。

困难在哪里

在上面我们提到的模型中,有几个非常致命的问题必须得正视:

  1. 转账发起方的身份认证:当人群收到A的付款消息时,怎么确定是A本人发出的,而不是别人假冒的。
  2. 如何维持人群中每个记账人账本的一致,这点在前面也强调过。这种一致性体现在两个方面:每个人账户余额的一致和转账行为的一致。

对于保持一致的问题,重要性是不言而喻的。但初看一下,似乎也没有那么难:“A给B转10块,大家听到A的消息后,一起修改账本就行了嘛。”

但事实却是,这一问题的复杂程度,远非这句轻描淡写的“一起修改账本”可以概括。根本原因就在于,消息广播和记录都是发生在互联网世界的计算机节点上的。例如:

账本“一致性”的问题,上面我也只大致给了一部分场景。在真正实现和部署这样的一个计算机系统时,遇到的问题和挑战只会更多。概括来说的话,分布在世界各地的计算机节点对这样一个“账本”的一致性问题一般会分成两类:

此外,把“担保交给人群”的比特币系统还会有第三个问题:隐私性。因为人手一份账本,所以各个账户下余额多少自然是尽人皆知了。虽然和账户安全的问题比起来,这似乎并不算个事儿。可真正开了户后,我相信有钱人还是更喜欢低调做人的:-)

总的来看,对于比特币的模型,会有三类问题摆在系统设计者的面前:

身份认证

上面的几个问题中,身份认证是最容易解决的。就像我们平常用签名字迹来辨识人一样;在比特币系统中,我们通过“数字签名”来确认消息发起方的真伪。和字迹所不同的是,“数字签名”更可靠,更难以被伪造。

如果想真正弄明白数字签名的原理,需要涉及到一些数论和抽象代数的知识。作为一个科普性质的文章,我觉得还是很有义务把这些艰深的知识扔到一边的(虽然真正的原因,是我对这些知识也一知半解)。但既然科普的牛皮已经吹出去了,不管怎样还是得像模像样的找个例子来解释下的。

在我的例子里,我们需要首先把自己的数学水平下拉到三年级左右的层次。在这样的水平下,我们能读、写、理解很大的数字,也会做位数比较高的乘法,而对于最简单的除法,我们都没有任何概念。

那么,在这样的一个前提下,面对这样的计算任务:

31 × 32 = ?

我们能很快计算出结果992;而对于这样的计算任务:

? × 32 = 992

我们就近乎无能为力了。

如果每个人都只有三年级的数学水平,那么A就可以充分利用这一点进行转帐了:

形式化一下上面的过程就是:

这个验证过程为什么可行,也可以简单总结下了:

好,例子举完了。虽然和真正的数字签名谬以千里,但讲解其中的概念也足够了。概括来说,在数字签名中涉及的技术理念有如下这些:

把数字签名的技术应用到比特币系统中后,公钥就对应着我们的的账户地址,对所有人是公开可见的;而私钥则是我们的账户密码,只有我们自己知道。当给别人转账时,我们会拿密码来签名我们的转账消息,并且指定别人的账户地址。而别人想再次把这笔收到的款项转给别人时,也只有提供的出对应的签名才行

所以最后总结一下,一笔转账交易的几个重要部分如下:

虽然数字签名这一技术要比比特币本身古老得多,但把这一技术应用到这种非中心式的账本体系中时,我们仍能看到它和银行有多么的不同。在有银行的世界里,我们是完全相信银行的。去银行开通账号和设置密码后,我们个人和银行之间就分享了一个小秘密;在每次交易前,银行也通过验证这个共同的秘密来认证我们的身份。这颇有一点各种谍战剧中接头暗号的味道,整个过程所利用的,是交易参与者和攻击者之间信息上的不对称。而数字签名的交易过程则完全不同。除了交易发起者之外,身份验证方和攻击者之间拥有的信息是完全相同的。整个过程利用的,是签名交易和认证交易在计算上的不对称

这种形式上的转变,使得我们不用再信任其他的第三方机构,似乎非常美好。但坏处也显而易见:一旦私钥丢失了,想拿着自己的身份证去重置密码就是不可能的了。因为在整个交易环节中,除了私钥产生的签名,我们没有任何的手段可以证明“我就是我”;那个和私钥所匹配的公钥,既不是姓名,也不是身份证号,也不是住址,而是一串恰好和别人不一样的数字而已。更进一步看,一旦私钥泄露了出去,我们也不可能指望银行和公安机关来帮忙冻结交易以及追回损失了。

说到这里,你也许会认为比特币这种技术实在太过“冷冰冰”。但从另一个角度而言,这完全是“求仁得仁”:放弃了对第三方机构的信赖,也就得放弃这种信赖可能带来的好处。

中:原汁原味科普比特币(中)
下:原汁原味科普比特币(下)

上一篇下一篇

猜你喜欢

热点阅读