2018-04-09 07:29

15分钟读懂中本聪比特币白皮书开始装逼(2)

2.9万

上次说到如果你在发送文件『波多野结衣教学视频第二讲第三小节』时,用哈希函数做一个摘要(可以理解为『压缩』),把『波多野结衣教学视频第二讲第三小节』压缩成『波视节』三个字,然后用你的私钥XXOO把『波视节』三个字加密成『ABP』这3个字母,把『ABP』这3个字母放在你发出去的文件旁边,这3个字母就能证明这个文件是你签署的。

bitcoin

为什么呢?

因为私钥加密的东西只有公钥能解密,所以如果我收到了你发给我的一个包裹,里面包括两个文件,一个写着『原文件』,一个写着『我用私钥加密过』,我用你的公钥解密后者,得到了和『原文件』一样的东东,我就可相信这个东西是你发的了,对么?

回到上面说的例子,我用你的公钥123456解密『ABP』,得到了『波视节』三个字。然后再同样把你发给我的『波多野结衣教学视频第二讲第三小节』用哈希函数做一个摘要,也得到了『波视节』三个字。居然一样!那我相信这东西就是你做的!

就这样,这个莫名其妙的『ABP』在这件事情上就成为了你的数字签名,可以证明这事儿是你认的。

可是,可是,发个文件,这样做没问题,你把『波多野结衣教学视频第二讲第三小节』发给张三和我,皆大欢喜。可如果这是100块钱呢?你只有100块,可是你发给张三之后,又发给我,我们俩都查了你的数字签名也查不出错,你就可以把100块钱花两遍!这就是经典的『双花』问题(记得装逼时要说是『双花』,这样别人听不懂会显得技术更高深一点哈)。

一般的解决办法就是引入一个第三方,你给我100块的时候其实是把钱打给它,它重新印张新钱打给我,有第三方管着,这样就使得你100块钱只能花一次。

我们不搞第三方,直接用这个nb的去中心化网络搞定。我们就认定『先发生的交易为大』——如果你先给张三钱,再给我钱,整个网络就会把钱给张三。那么我们需要解决的问题就变成了:网络怎么知道哪笔交易先发生呢?答案是『都记下来』。

每一笔交易都必须全网广播,所有参与的节点必须就所有交易的『先来后到』达成共识,形成一个大家都认可的历史账本。而每个人在收钱的时候,则需要网络中大部分节点给他确认说『对对对,这钱是首先打给你的,之前没打给过别人』。

你给任何人的每一分钱,都必须昭告天下,然后全天下都拿出小本本把这事儿记下来,同时还看一下表把发生的时间记下来。因为可能有人离你近,有人离你远,所以每个人记下来的时间还不一样,最后他们自己会去对答案,少数服从多数,把大家的记录统一起来。

好了,到这里……我们也仅仅是把几个名词解释了一下,还是没有说这一小节(真的是一小节,中本聪论文里半页纸而已)的核心:『A同学要转钱给B同学怎么办呢?简单,他把上一个『转账交易』和B同学的公钥放在一块儿,签名哈希一下,贴到他所有的那个币的链尾上,就搞定啦。收款人可以通过检查签名来验证这个链的所有权。』

 

还记得上一篇说的么——『我们管一串数字签名链条叫做一个数字币』。

最开始的时候,币是中本聪同学的。如果他要把钱转给你,应该怎么办呢?他会在这个钱上加一个数字签名,写上『这个钱我给XXX了』,然后把这句话广播出去,让所有人都记下来。

具体怎么做呢?他会把『中本聪的钱』这个信息,加上你的公钥123456,一起哈希成一个摘要——比如哈希成了『ABC』,然后用自己的私钥把『ABC』加密——比如加密成了『KYC』,然后把『KYC』贴到『中本聪的钱』这个链的尾巴上,就好了。

因为中本聪同学的公钥也是公开的(比如是246789),所以所有人都可以拿着246789去解密KYC,得到ABC。然后任何人都可以把『中本聪的钱』和你的公钥123456拼到一起哈希压缩一下得到ABC。两个都是ABC,大家就觉额这事儿没错,中本聪确实把钱给了你。

之后你怎么把钱给我呢?你全网吆喝一声『我把这钱给Mars啦』,然后用把『中本聪给钱给XX』(上一个交易)和我的公钥(假设是112233)放一块儿哈希压缩成KYF三个字母,再用自己私钥OOXX把字母加密成KKY三个字母,把KKY放在『我把这钱给Mars啦』这句话旁边当做签名。所有人都可以拿着你的公钥123456去检查,用123456解密KKY,得到KYF。大家只需要看把『中本聪给钱给XX』和112233放一块是不是也能得到KYF三个字母,就能验证这笔付款是不是经过了你授权。

担心还是写太复杂了(没办法呀,要把加密原理说清楚的话……),再通俗简单一点讲一遍吧。比特币世界里的钱,可以理解为一个活页本,第一页写的是『中本聪的钱』,第二页写的是『中本聪把钱给XXX啦』和中本聪的亲笔签名,第三页写的是『XXX把钱给YYY啦』和『XXX』的签名……每次交易都会在这个活页本上再加上一页,让这个钱的上一个主人写上把钱给了谁,以及附加上签名,这样就使得钞票得以流转起来。

如果有坏人想作弊,他自己copy一个活页本,在给我的本子上加一页『我把钱给Mars啦』然后签名;在给你的本子上加一页『我把钱给XXX啦』然后签名。我们怎么发现这笔钱被花了两遍呢?

中本聪同学给出的方法是『让网络中所有人都来做记录和见证』,当坏人给我的本子上加上一页『我把钱给Mars啦』然后签名时,系统会把这张活页纸发给网络中所有的人,并且问他们『这个签名对么?』&『他之前把这个钱给过别人么』,网络中所有人各自查自己的账本给出答案,最后得出共识结论说『签名对』&『钱之前没花过』,然后我就收到了这个钱,所有人也都把这张活页纸copy一份存到自己的账簿中。

等坏人再给你同一张钱时,系统会再次把这张写着『我把钱给XXX啦』的活页纸发给网络中所有人,网络中大部分人已经收到并且保存过『钱给Mars』的前一张活页纸,所以都反馈说『签名真的,可这个已经在更早的时候花过啦!』拒绝接受这个交易。这样你就不会收到钱,也不会给坏人发货之类的,不会有损失。

 

本文链接:https://www.8btc.com/article/189290
转载请注明文章出处

评论(2)
登录 账号发表你的看法,还没有账号?立即免费 注册
安装usdt钱包 2018-09-01
剪不断 理还乱 是离愁
安装usdt钱包 2018-09-01
真是剪不断理还乱
下载
分享
收藏
阅读
评论
2
点赞
上一篇
下一篇