开头:
最近因为项目需要,都在学习区块链,提到区块链,大家第一反应肯定是比特币,在我最刚开始学习的时候是去看的比特币的相关知识。这次先讲解大概的概念。后续再写详细的技术内容。
用具体的例子来说明:
小A,小B,小C是同一个公司的同事。所以他们每天中午一起吃饭。
1.
每次付钱时候因为大家没有那么多零钱,所以就说好了每天先让一个人帮忙付了饭钱。比如今天是小A付的饭钱,付了24块。然后回去后再平分,然后明天可能就是小B付了40块钱再平分。慢慢的,大家觉得这样也很烦了。说每天都要算账还钱,还不如一个月统一给一次。
2.
为了记账方便,大家就先说好,上面的欠钱记录先放在公司的公用服务器上面,在服务器的桌面上新建了一个文本记事本,这样三个人都可以去访问添加内容。
3.
但是上面这样会出现问题,当我们记账的内容过多的时候,我们会忘记中间某一天到底是谁付的,很正常,一个月哪里每天的记得住,这时候就存在漏洞了。三个人中的某个人可以去改中间某一天的数据
(假设小B最近手头比较紧,所以把别人付的饭钱写成了自己付的,让别人欠自己钱)。
修改前数据:
代码语言:javascript复制小B,小C 需给 小A 24元
小B,小C 需给 小A 30元
小A,小C 需给 小B 10元
小B,小C 需给 小A 10元
......
......
......
小A,小B 需给 小C 22元 (这一条被修改了)
复制代码
修改后数据:
代码语言:javascript复制小B,小C 需给 小A 24元
小B,小C 需给 小A 30元
小A,小C 需给 小B 10元
小B,小C 需给 小A 10元
......
......
......
小A,小C 需给 小B 22元 (这一条被修改了)
复制代码
4.
于是大家想要么弄个签名,对写过的数据进行加密,这样也就不怕会有上面的情况了。 于是决定用非对称加密方式来进行加密(PS:学习链接:(白话解释 对称加密算法 VS 非对称加密算法)) 这样,大家用自己的私钥来对写的内容加密,然后把自己的公钥公开,要检验的时候就直接可以用相应的公钥查看即可,如果可以成功查看,说明这个内容没有被修改过。这时候我们不怕内容被改过了。而我们的内容也变成了
代码语言:javascript复制asdflkajfkldjfas234ljkjdfs --->(相当于(小B,小C 需给 小A 24元) 小A的私钥 )
fdkalsjfasdjl34ljlsdflj --->(相当于(小B,小C 需给 小A 30元) 小A的私钥 )
jfldsajfkj1231lk --->(相当于(小A,小C 需给 小B 10元) 小B的私钥)
......
......
......
复制代码
5.
但是这样还会有个问题,我修改不行,我直接拷贝全部内容不就可以了。 修改前:
代码语言:javascript复制asdflkajfkldjfas234ljkjdfs --->(相当于(小B,小C 需给 小A 24元) 小A的私钥 )
fdkalsjfasdjl34ljlsdflj --->(相当于(小B,小C 需给 小A 30元) 小A的私钥 )
jfldsajfkj1231lk --->(相当于(小A,小C 需给 小B 10元) 小B的私钥) <这行被修改,直接替换上面的一行的全部内容>
......
......
......
复制代码
修改后:
代码语言:javascript复制asdflkajfkldjfas234ljkjdfs --->(相当于(小B,小C 需给 小A 24元) 小A的私钥 )
fdkalsjfasdjl34ljlsdflj --->(相当于(小B,小C 需给 小A 30元) 小A的私钥 )
fdkalsjfasdjl34ljlsdflj --->(相当于(小B,小C 需给 小A 30元) 小A的私钥 ) <这行被修改>
......
......
......
复制代码
这时候你用公钥去检查也是没有问题的,所以我们单纯内容加密不够,所以我们想到前面加上了日期,变成了
代码语言:javascript复制asdflkajfkldjfas234ljkjdfs --->(相当于(2月2号: 小B,小C 需给 小A 24元) 小A的私钥 )
fdkalsjfasdjl34ljlsdflj --->(相当于(2月3号: 小B,小C 需给 小A 30元) 小A的私钥 )
jfldsajfkj1231lk --->(相当于(2月4号: 小A,小C 需给 小B 10元) 小B的私钥)
......
......
......
复制代码
这时候就算你直接把上面一行拷贝覆盖下面的一行也没用了,因为不然就有二行的日期一样,明显作假了。
6.
因为每天都要自己去往服务器上的文件写东西,小A他们开始嫌太麻烦了,说我只要把(日期 内容 私钥)合并后的内容发出来,让别人去服务器上添加进去到记事本就好了。但是平白无故肯定没人愿意,所以他们对办公室其他同事说:你们谁帮我们记账,我们每个月会请你一瓶饮料,并且每帮忙记一笔账,我们会额外给你一笔记账费(比如记录了小A,小B需要给小C 40元,记录者可以拿中间的1元,小C只能拿到39元,类似手续费),于是好几个同事都踊跃参与,但是并不需要这么多人来记内容,毕竟人多了。请的饮料也就多了。所以决定让要记账的同事们自己来决赛,既然大家都是程序员,就用一个有难度的比赛,做数学题目,谁能最快的做出题目,谁就有资格来帮忙记内容。
7.
好不容易一个月到了,我们要开始结算饭钱了,结果小A需要给小B和小C各自200元,可是小A因为最近花销大,就双手一摊说反正我没钱,我就只能欠着你们了。小B和小C很生气,所以从第二个月开始,小A每次都要给小B和小C看过他的钱包。证明他有钱,他们二个才会愿意先付钱。
8.
一天公司的服务器坏了,而且已经这个月到了最后几天,已经记了二十几天了,我们记账的文本也看不到了,小A,小B,小C都傻眼了,他们三个终于知道了不要把鸡蛋放在一个篮子里面的道理了。事已至此,只能吃一堑长一智。在下个月记账的时候多备份几个地方。所以他们在公司的三台服务器上都放上了这个记事本,然后每次写新的内容,就三个地方都去写。
9.
因为大家都在一个记事本里面记,记一个月倒也还好,可是当小A,小B,小C用这种方式一起吃饭吃了N个月后,txt里面的内容就越来越多了。每次打开,都要往下翻好久才能继续记东西,于是他们就决定一个月用一个记事本,到了第二个月,就再新建一个记事本。
10.
因为大家为了更好的统计这个饭钱,所以在每个月结束后在上方写着这个月一共的饭钱,并且记住上个月吃了多少钱,方便比较。
代码语言:javascript复制饭钱小账1:
上个月一共吃了1000元
这个月一共吃了1200元
asdflkajfkldjfas234ljkjdfs --->(相当于(2月2号: 小B,小C 需给 小A 24元) 小A的私钥 )
fdkalsjfasdjl34ljlsdflj --->(相当于(2月3号: 小B,小C 需给 小A 30元) 小A的私钥 )
jfldsajfkj1231lk --->(相当于(2月4号: 小A,小C 需给 小B 10元) 小B的私钥)
......
......
......
复制代码
代码语言:javascript复制饭钱小账2:
上个月一共吃了1200元
这个月一共吃了1100元
asdflkajfkldjfas234ljkjdfs --->(相当于(3月2号: 小B,小C 需给 小A 24元) 小A的私钥 )
fdkalsjfasdjl34ljlsdflj --->(相当于(3月3号: 小B,小C 需给 小A 30元) 小A的私钥 )
jfldsajfkj1231lk --->(相当于(3月4号: 小A,小C 需给 小B 10元) 小B的私钥)
......
......
......
复制代码
然后我们这样中间一个账本因为某种原因被改了的话,这个月的总花费就变了,然后下个月上面记着的上个月的花费就对应不起来了,也就会发现中间某个账本应该被改动过了,出了问题。
这么长的一个故事看完后,我们比特币的大致基本概念也就懂了。具体的信息下次我再深入解释。
我们来看对比脑图:
结尾:
哪里不对,欢迎大家喷,哈哈,后续继续详细的讲解。