图片发自简书App
有一个叫Goofy的人。我学习的这本《区块链:技术推动金融》(中信出版社)上翻译成“高飞”,我百度了一下,中文网站上竟然没有他的传说,英文网站我又上不了,所以他的来历我讲不了,其实我觉得翻译成“戈菲”要好一点。
这位老兄创造了一种“加密货币”,即比特币出现前的一种网上虚拟货币,业内称为“高飞币”。它应该是我们能想到的最简单的加密货币,因为Goofy先生只为它设定了两个规则。
第一个规则:指定Goofy先生可以随时创建新币,且这些新创建的币都归他自己所有。类似于我们村的王铁匠,捣鼓了一堆小铁饼,宣布这是一种可以买东西的钱。而且只有他才能做这个铁饼,这些钱(铁饼)都是他家的。唉,这想法,我也有过!
村民们围观这个疯子,村民杨二问他,隔壁的张铁匠也会做铁饼,我怎么知道这个钱是不是你做的啊。这就是“高飞币”遇到的一个问题,叫“可验证的有效性”。就象一张“百元钞票”,我们对着光一照,哦,有水印,有金属条,是央行发行的真币,可以收。虚拟货币也必须能够验证是真币,不能伪造,才能有信用。
Goofy先生想到的办法是“数字签名”,类似王铁匠在他的铁饼上整一个独特的记号。等等,数字签名是什么东东?这是一个计算机技术问题,愁死我这个“文科男”了,本来,我以为学习比特币,对技术只要大概了解就行,谁知道就是一些浅显的技术,对我来说也是一个大难题。但又必须了解,因为比特币仅仅是基于这些技术、思想众多应用中最著名的一种,还有其他如以太币之类的应用,只有了解了这些运行机制,才能准确判断,层出不穷的新应用是否靠谱。好吧,我试着看能讲清楚不,欢迎技术高手批评指正。
什么是数字签名
Digital signatures,本书中翻译为“数字签名”。其实就是数字模拟我们平常工作中在纸上的手写签名。你看,Goofy先生的想法还是来源于现实嘛。我们知道,之所以我们手写签名,要达到两个目的:
第一,只有我可以签我自己的名字,而且任何看到这个签名的人,都可以验证其有效性。熟悉我的人一看,哦,这是XXX的签字,不熟悉的人也可以通过一些技术手段鉴定;
第二,我还希望签名只与某一特定文件发生关联。也就是说,如果有人拿到一份我签署的文件,把我的名字剪下来,贴到一份我从未见过的文件下方,声称是我签署的。这是绝对不行的。模仿我的笔迹也不行,可以申请签名鉴定。
图片发自简书App
在网络上怎么实现这两个目的呢?
有一个网络佚名人士,我们就叫他“马克”吧,想到了采取用户名与密码的方法。
这种方法最流行的应用你肯定体验过,当你想上“X宝”剁手的时候,假设你是第一次,你需要做的是:想一个比较酷的“用户名”,在系统里注册成功;系统还会要求你想一段“密码”,密码的长度有要求,有些还会请你在密码中同时有数字和字母(这是一个随机性来源是否良好的问题,呆会也会说说为什么)。“用户名”就是你在X宝上的身份证,所有的人都可以看到,就在网页右上方你的头像旁,显示着“欢迎你,一只会飞的猪”之类的;“密码”就只有你知道,连X宝后台人员都不会知道(这又涉及到Hash函数,稍后讲)。其实密码就相当于你的特殊记号或“电子签名”。闲话少说,我们继续看看“数字签名”。
“马克”设计了一种“数字签名方案”,大概是这样:
计算机有一种算法(Algorithm),叫 generateKeys,字面意思大概是“生成钥匙”,输入一个keysize,就会产生一对“公钥”(pk,public key)和“私钥”(sk,secret key,好象也有叫private key,这样两个都是pk,不好区分,其实字面上看前者应该叫“密钥”,后者才是“私钥”)。公钥pk是人人都可以看到的,拿到它,主要是可以用来验证签名。注意,这是一种计算机的算法,后台处理的,我们看不到。
还有一种算法,叫 sign,字面意义就是签名(动词)。把一段消息(相当于你要签署的文件)和私钥sk,作为输入值,算法sign就会算出一个结果,这个结果计算机专业人员叫“输出”,也叫“签名消息”。这就是签名的过程。此刻,成都,窗外电闪雷鸣,狂风大作,天昏地暗,大雨倾盆,不会是因为我一个文科生泄漏了计算机界的秘密吧……
不管了,数字签名用到的最后一个算法,叫 verify,字面上是“核实、验证“之类的意思。验证过程是这样的,把公钥pk、你得到的消息段以及“签名消息”三者作为“输入”,如结果为真,就说明你得到的这段消息是真的;反之,则证明消息是假的。
你看,这个方案是这样的,先用 generate-Keys 生成 pk 和 sk,再把 sk 与一段你要签名的消息(message)输入 sign ,计算出“ sig(签名消息)”。这时候,其他人的已知条件是,你的pk ,你的“签名消息”,以及一段需要验证的消息三个条件。他把这三个条件输入 verify,就可以验证这段消息是真是假了。打个比方吧:
有一个人,他拿到一份号称你签名的文件,但不知道真假。然后他查到了你的“姓名(pk)”,还找到了一个你之前签名的字迹(签名消息,sig),因为这个是公开的,可查的。他就把两份文件放在一起比对(verify),一致的话,这文件就是真的,不一致的话,这文件就是假的。擦把汗先,好难说清楚啊。
好,数字签名说到这,回过头来,继续说我们的Goofy先生的造币梦想。Goofy 先用计算机生成一个唯一的,以前从未有过的货币编号(uniqueCoinID, unique是“唯一”的意思,coin, “硬币”,ID, “身份、身份证、识别”之类的意思),并建立一段字符“Create-Coin[uniqueCoinID]。 然后用我们上面讲到的“数字签名方案”计算这个字符串的“数字签名”,该字符串与“数字签名”就构成了一个单位的货币。这就是Goofy先生的造币过程。任何人都可以验证新币包含了Goofy有效签名,符合“可验证的有效性”,为有效货币。
图片发自简书App
以上说到的是“GoofyCoin”的第一个规则,没问题,Goofy先生造出来的币,符合货币特性。
Goofy先生设置的第二个规则是,拥有此币的人可以将其转给其他人。其实就是流通规则,这是当然,要不Goofy先生把币用出去,其他人又不能用,谁会收啊。但是,请别忘记,这是网络虚拟货币呢,要做到这一点,也不简单。我们来看看Goofy先生怎么解决的:
我们知道,Goofy先生已经至少有一个币了,假如他要把这个币支付给马克。在网络上,他需要创建一个声明:“将此币支付给马克”。这个声明,在网络中以“字符串”的形式存在,字符串含有“将此币支付给马克”这些信息。其中“此币”信息,是一个“Hash poin-ter(哈希指针)”;“马克”是马克先生的一个公钥,即马克的网络身份证。然后Goofy先生签署该字符串。现在,这个由Goofy签署的代表他的交易的“数据结构”就存在于网络中,马克就拥有了这个币(GoofyCoin高飞币)。
图片发自简书App
当马克在村里的酒吧里吹嘘,他有一个高飞币的时候,他要展示一下上面讲的那个有G-oofy先生有效签名的“数据结构”,这个“数据结构”里的那个“Hash pointer(哈希指针)”,也会指向Goofy先生造币的那个数据记录,说明这个币确实是Goofy先生造出来的。因此,在系统里,这个币的有效性和所有权都很明确了。
这里有一个新概念出现了,“Hash pointer(哈希指针)”,我们下一期再说。