区块链这个词我想大家都略有耳闻了,而且也听了很久了。恐怕还有不少人参加了区块链资产的交易,参加了曾经热火朝天,可以一夜暴富的ico。那究竟什么是区块链?我想很多人还是说不上来。
用一句话解释:区块链就是分布式账本。
简单,明了。但是这句话是一句非常正确的废话,因为不知道的人看了还是不知道。
那我再摘一段来自巴比特网站对区块链的解释
好吧,这段我压根就没有看完。
在我学习了《极简区块链实现》之前,我对此也是一知半解。感觉好像知道了,但是仔细一探究又好像不那么清楚。所有这一切的原因就在于,所有关于区块链的概念都是听说的,从来就没有亲眼实实在在看见过。
老话说得好,眼见为实,耳听为虚。那今天我就带你来看看最原始的区块链样子,希望能够让你抛弃那些天花乱坠超级难懂的名词,从感性上对区块链有深入的认识。
加密
区块链采用了非对称加密的方式来保护信息。理论比较复杂,我们也没有必要研究这么深刻。我们知道怎么使用就可以了。
非对称加密中有两个重要的概念
- 公钥
- 私钥
私钥是拿在自己手里的,而公钥是给别人的。我做一个不是特别恰当的比喻,希望能帮助大家理解。
- 公钥 -- 登陆密码
- 私钥 -- 支付密码
也就是我用公钥能够访问你的账户,并确认你确实有这么多钱。但是我没有办法用公钥把钱转走,必须要使用私钥才能转账。所以你一定要保管好自己的私钥,否则你的钱就会一分不剩了。
好了,讲解了一下概念,我们亲眼来看看公钥和私钥,增加一些感性认识。
很丑,根本看不懂。也是,原本就不是给人看的-_-!
想传达的意思就是私钥随机生成,而公钥通过私钥计算得出,且不可逆。
地址
在区块链中,地址就是账户。每一笔交易都是从某个地址发出,流向另一个地址。
为了给大家一个感性的认识,给大家看看一个比特币创世区块中地址的样子:
1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
是不是长得有点难看?那你说我们可以随便写一串作为地址吗?答案是不行。因为地址是由非对称加密中的公钥经过一定的算法计算得到,你终于知道为什么之前要说公钥私钥了吧。
那我们就来看看,如何得到上一小节中生成的公钥对应的地址。
瞧,咱也有地址了,而且是正儿八经的比特币地址哟。
你说咱不信,那来验证一下。但是这个算法是不可逆的,所以我们只能验证一个地址是否有效,或者从地址中获得公钥对应的哈希。
还是拿创世区块的地址来说事儿。这是blockchain网站上对应地址1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa的截图,其中框选出的就是该地址对应公钥的哈希。
接下来我们来验证一下,比特币中公钥哈希算法和我们自己程序中的算法计算的结果是否一致。
Bingo~,这两个红框内的值是一摸一样的。你也可以随意生成比特币地址了哟。当然了,生成也没有,因为里面没钱!
交易
从某种数据结构的角度看,区块链更像是交易链,或者更准确点叫交易树。有一定编程基础的朋友对此可能就更容易理解一些。如果你不懂编程,也没关系。看我给你慢慢道来。
区块链的第一个应用是比特币,所以这里的交易可以理解为金融系统中的交易。只是区块链中的交易和我们常见的交易格式有点不同。
普通的交易:
A账户->B账户 X元
区块链的交易:
上一次交易的输出 -> A输出 X元 + B输出 Y元
这么一看是不是觉得头晕了?这么简单的普通交易,怎么到了区块链的世界就成这么复杂了?而且连账户都没了,都不知道这钱从哪里来,到哪里去。
我尝试用现实世界的例子来解释一下,希望能够帮助大家理解。
假设我现在是在古代,金融产业还相当不发达的时候。听说京城机会多,我打算进京发展。因为当时没什么转账技术,我必须取出在当地钱庄所有的十两银子带到京城。在京城落脚后,我花了二两银子租了间房,把剩下的八两银子存在了京城的票号。
在这么一个瞎编的例子中
- 从当地钱庄取出的是两银子就是上一次的交易输出
- 京城租房的一两银子就是A输出 X元
- 存入京城票号的九两银子就是B输出 Y元
可以看到,在金融行业不发达的时候,交易的形式和区块链中体现的形式是一样的。而我们现在通常看到的交易形式是进化的版本。那区块链为什么还要采用那种原始的方式呢?匿名账户可能是原因之一吧。
做了这么多解释,该是亲眼看一下了。
这就是刚才那个瞎编的例子对应的一个区块链交易。
- Input 0: 也就是我带来的那十两银子
- Output 0: 也就是我租屋用掉的二两银子(Value: 2)
- Output 1:也就是我把剩下的八两银子存入票号(Value: 8)
Input是如何来的,我在这里先卖一个关子。先来看看我们如何把这几个输入输出对应到某个“账户”上。
仔细看途中用红线画出的部分。在输入中,表示来源;在输出中,表示目的。而且第一个地址和第三个地址的值是一样的。也就是表明了,这个交易先从第一个账户中取出了钱,然后分别转了二两给别人,又转回了八两给自己。你说既然要转给自己,那干脆只标明转给别人的不就行了。哎,抱歉,比特币中的交易就是这么设计的。这点您请记住了。
区块
在比特币中,区块是交易的集合。学过财务报表的可能理解起来比较容易。也就是一段时间内的账务的总结。或者类似于银行每天的结算。而在区块链中,单位时间内所有交易的一个集合就叫做区块。
不卖关子了,还是来看看一个区块的样子吧。
在这个截图中的区块中包含了两个交易。一个是给挖矿人的奖励,一个则是上节中出现的交易。
好了,就是这么简单。
区块链
区块链 = 区块 + 链
顾名思义把区块叠加在一起就行了。就好像是公司几年的账本落在一起。在通常意义的财务报表中,我们通常关注的是上一年的报表。而在区块链中我们必须要关注之前所有的区块,而不仅仅是当前的一个。
来给大家看一个例子,或许会帮助大家理解。为了看得清楚,我省略了输出中一些不必要的内容。
用红线画出的交易ID是一致的。也证实了之前对交易的定义:
上一次交易的输出 -> A输出 X元 + B输出 Y元
这样我们就能看清楚,在上头的那个交易的输入,来自于下面那个交易的第0个输出。
好了,讲完了,就是这么简单~