区块链最近几年成为了一个很热门的课题,很多人知道区块链源自比特币。
- 何为区块链呢?我们来演义一下:
-
小张在银行里存了笔钱100块,小明在银行里也开了个户。某天小张转给小明80块,于是小张只有20块,小明有了80块。
为了记录这些数据,银行开了2张表,1张是账户信息表(姓名,余额),另一张是转账表(转账人,收帐人,金额,时间)。原本只用第1张表就够了,因为每个人手头余额就行了,但是发现系统是不可信的,万一转账时,小张-80,但是小明+80时没有执行成功怎么办呢?不就丢了这80块么。于是出现了第二张表,又称对帐表、账本,当账不平时,就可以拿出这个记录来说事来核算 。
问题又来了,一些人说,这银行也不可靠,会不会有人来串改这个账本?公信问题受到挑战。
于是有人在想,这样吧,能不能把这个账本记录在多个地方,多台电脑上。也就是说,你不信我,可以,你自己拿台电脑来,转账时把相关转账信息同时存于多台电脑上,也放你电脑上了份。如果要对账时,先看看所有电脑上的账本是否一致再说。这样可信度就高了。
要设计这样的系统变得复杂多了,首先传统的MIS表已经不再适用,因为除了追加转账记录,还需要核对等各种操作,于是设计成这样:
把每一次转账记录当成一个区块,然后通过链条将其串起来,每一个区块除了记录本次交易信息,还记录前一个区块的编号。这样的话,追加很容易,删除比较困难。
然后整个架构如上图,每个结点中,保存着同一套账本链。这样也就实现了将对来以银行为中心的系统,变成了分散的小中心。也是所说的去中心化。
每操作一笔交易时,需要通知所有加入到该区块链中的服务器,各服务器把账本链进行调整,所有一致通过后,交易才能完成。
就这么简单么?——事情远没有这么简单。如果就这样设计的系统,首先就是一个低可用么。如果服务器群中,任意一个结点挂了,那么交易失败,这样的稳定性是没有接受的。
于是协商,如果有机器挂了,那么我们就在剩下的机器中完成交易,然后等那台机好了后,再自动从其他机器上把该账本同步过来。
完美了吗?——No,某次交易刚好出现下面的情况:
好巧不巧,当小张和小李交易时,出现了上面的情况,结点123突然与结点45不通了。这情况又叫做脑裂。
小张通过123结点,向小李转账100块。可小红连接上结点45向小李转了10块,同时小李本事好黑进了网络,将小张20块转到自己帐上来,并小在各自的小网络中都执行成功了。
好了,突然间,这两个网络又通了。这里这个结果怎么处理?有的交易是正常的,如小红转的,有的是非正常的,比如小李控制的,因为按理小张的余额是不足以支持第二次转账了的。
- 这里碰到的问题很像拜占庭将军问题,中间信息存在不可靠,如何最终决策。但我们知道这个问题是没有精准解的。只能设计一套在某种情况下合理解决方案。
-
这里的解决办法是,合并时比较哪边的链长,并把短的一边进行抛弃。那么小李有没有办法真正的黑到这笔费用呢?有办法,在自己小规模的网络里进行N笔交易,并且长度超过主网中的。但这样的话他将花费更多成本,终合来说这种情况在情理上不存在。故认为这样的整体架构是可信的。
以上就是区块链的基本情况。那么比特币又是怎么一回事呢?可以理解为一种特殊的电子货币在区块链上进行交易的特殊应用。 - 交易可以理解,按之前交易描述并不多,无非一些数字。那电子货币又是什么。我们先看一下实物货币,有几大特性:
- 第一、实物货币给你我就没有,我给了你,我就没有,但电子的容易复制,怎么办呢?——实际上采用了非对称加密技术,每个人保留私钥,用自己的私钥加密,同时在服务器上进行交换加密处理,阻止了复制操作。
-
第二、实物货币会有一定的工作量的,比如古代拿贝壳当货币,那也一定会提出这种可以当货币的贝壳得有一定的条件,否则自己到海边随便捡些有就,那就乱了。那电子货币如何也能产生一定工作量,要得到得花功夫呢?——方式就是出道算术题,解出来的东西当成比特币。那什么题目这么神奇?答案是hash。题目就是找到一个字符串,要求它的hash值(64位)满足一定条件,前面12位全是0。
为什么选这题?我们知道hash是一个很神奇,当前有某个字符串已经有11个0了,你想改变这字符串中任意一个字符,将会导致这个hash变得面目全非。也就是说我们不能通过计算、或递推等方式来很轻松的得到这个满足条件的hash值。找这个字符串的过程叫做挖矿。而且总的位数有限,故总比特币数量有限。当你找到一个字符串满足要求后,还得去服务器上比较,有没有别人已经挖到,已经有的就不算,所以挖矿将会越来越难。