区块链技术入门理解

2018-03-07  本文已影响0人  shi_qinfeng

背景

想象一个场景, Joe是你最好的朋友。他正在海外旅游。他给你一个电话, “Dude,我把钱花光了,江湖救急。” 你回答”马上汇款“然后挂掉电话。然后你打电话给你银行账户的经理,”请从我的账户转1000美元到Joe的账户上“。你的账户经理回复,”收到,先生“。他打开账簿,查看你的账户以确定你有足够的余额转出1000美元给Joe。因为你是个土豪,账上还有大量余额,因此,他在账簿上登记了一个条目,像这样:

image

你打电话给Joe,告诉他,“我已经转账了。下一次你去银行的时候,你就可以取出我刚刚转过去的1000美元。”

上面的过程中, 你和Joe都委托银行来管理你们的钱。并没有物理票据的实际流动来转移你们的钱。所需的一切不过是账簿上的一个条目。或者更准确一点,账簿上的一个既不受你和Joe控制、也不被你们所拥有的条目。

这就是现有体系的问题。

为了在我们之间建立互信,我们依赖于独立第三方。

你也许会问,“依赖他们有什么毛病?” 毛病在于,它们清一色只是数字。如果其中第三方的一个人或者一个机构有意识地或无意识地走向贪腐堕落, 即可在社会上引发一场混乱。

提出问题

会有这样一个系统吗,在那里我们无需银行就可以转账?

想一下,转账意味着什么?只是账簿上的一个条目而已。那么更好的问题将是——是否有某种手段,可以在我们中间维护那本账簿,而不是让其他人来为我们操作?

它就是一种在我们中间维护账簿而非依赖其他人来为我们代劳的方法。这一方法的要求是:必须有足够的人不想依赖第三方。只有这样,这群人才能靠自己来维护他们的账簿。

多少人才算是够?至少要3个。打个比方,我们假设有10个人想抛弃银行以及任何第三方。根据相互之间的协议,他们可以一直拥有彼此的账号信息——但不知道其他人的真实身份。

在没有独立第三方情况下,需要一个去中心化的系统,这个系统保证不能轻易被攻击,才能保证资产是安全的。这样的去中心化系统对用户来说是一个去中介化的安全可靠的系统。

解决问题的思路

通过一个记账簿的例子,可以大致看出区块链的实现原理。

  1. 一开始的时候,每个人都掌握着一个空文件夹。正如我们要进行的那样,这10个人都将持续向他们的当前的文件夹中添加纸张。而这些纸张的集合将形成追踪交易的账簿。每个人都准备着记录下该系统内部发生的任何交易。

文件夹代表chain,纸张代表一个block

  1. 假设#2想要转10美元 给#9。为了完成这次交易,#2吼了一嗓子,告诉每个人,“我想转10美元给#9。大家都在自己的小本本上记下来!”

生成交易并广播

  1. 每个人都瞄一下#2是不是有足够的余额可以转10美元给#9。如果她有足够的钱,每个人都在自己的空白页上为这笔交易做了一个记录。
image

所有参与者检查交易是否有效,并记录到本地交易池

  1. 这样,一笔转账就被认为是成功发起。
  2. 这个网络中的更多人想要转账给其他人。无论什么时候他们想要做一笔交易,他们就向其他所有人宣告这笔交易。无论是谁,一听到这个宣言,就在他/她自己的纸张上写下来。这样的实践持续进行,直到每个人都用完了他们当前页的空间。假设1页纸可以记录10笔交易,一旦10笔交易完成,每个人就都用完了空间。纸张被写满的时候, 那么,是时候该将这页纸存到文件夹里面,然后拿出一张新的纸、重复上述步骤2了。

写满的纸张组成一个block,准备全网确认封存

  1. 在你将这页纸存入我们的文件夹之前,我们需要使用该网络中每个人都同意的唯一一把钥匙来密封它。通过密封,我们可以保证,一旦该页纸的备份已经被存入每一个人的文件夹,没有人能够对它作出任何更改——不止今天,不止明天,也不止是一年以后。

这把钥匙可以看做是交易的metkle证明,密封表示将block写入chain

  1. 一旦放入文件夹中,它将永远呆在文件夹里面——被封存起来。而且,如果每个人都信任这个封条,那么每个人都会相信该页纸中的内容。而这页纸的封存手法,就是这一方法的关键。

早些时候,第三方/中介为我们赋予信任,其形式是:无论它们在账簿上已经写了什么,都永远不可变更。在一个分散式的、去中心化的系统中,就像上述我们的系统一样,这种封条将提供信任替代。

没有中介的系统,谁也不信任对方,找谁来封存?选定封存者后他不愿意做这个人事怎么办?什么样的封存方法可以保证已封存的数据几乎不可能被修改?

解决问题的工程实现

要解决上面的问题,需要涉及一些技术上的概念:

  1. hash算法:比如sha3. 对明文进行数字摘要,得到一串无法逆向破解的hash数据, hash算法可以证明明文没有被修改, 或者无法被修改, 因为一旦被修改就无法得到相同的hash数据.
  2. hash算法另一个特点是输入数据只要稍有变化(比如一个1变成了0)则将得到一个千差万别的结果,且结果无法事先预知; 那么, 要想得到三个0开头的一串hash数据, 怎么得到他的明文是什么?
  3. 以目前密码学技术,以及计算机的算力, 只有一个笨方法,就是一个接一个地遍历宇宙中所有数字,直到我们得到一个三个0开头的一串字符. 经过几千次尝试之后,我们最终会得到将在右边产生要求的输出值的一个数字。
  4. 虽然要找到这样的明文不容易, 但是要验证这个明文是否符合hash数据是3个0开头是非常容易的: 再进行一次sha3运算即可.

总结上面的hash算法: “给定一个输出值,要算出输入值是极端困难的。但是,给定输入值和输出值,要检验该输入是否会导致该输出,却是非常容易的。”

  1. 如何用上面的hash算法来加密一份文件?想象我给你了一页纸。写着数字20893。然后我问你,“你能不能找出一个数字,加上数字20893以后,进行hash运算,最终会给我们一个以三个0开头的字符?”,我们已经知道,算出这样一个数字的唯一方法就是穷举整个宇宙中每一个可能的数字。又是几千次尝试之后,我们会偶然发现一个数字21191符合我们要求.

这个“碰运气”的过程就是“挖矿”的过程,注意:以太坊的挖矿不仅要求计算,还对内存大小有要求,因为他要生成一个很大的DAG数据,在里面找这个幸运随机数字。

  1. 为了密封这个(比如:使得没有人能更改这页纸上的内容),我们将盖一个带有标签‘21191’的徽章在上面。一旦密封数字(比如:21191)被戳在纸上,这个纸就被密封了。

密封数字又被称为“工作量证明”,意思是,这一数字证明了为了计算出它来已经付出的努力。盖戳的过程就是对这个block生成一个hash的过程。

  1. 盖戳后这页纸(该block)就可以广播给网络中的其他人了。代表宣称我已经找到幸运数字了。
  2. 任何人想验证这页纸是否已经被替换了,他需要做的一切不过是——这页纸上的内容与密封数字加在一起、把和值进行hash计算。如果给出了一串三个0开头的字符,那么内容就没有被改变。如果出现的字符不能满足我们的要求,我们就可以丢掉这页纸了,因为它的内容已经有了水分,没有任何用处了。

上述计算工程也是一个验证的过程。

  1. 在网络中,每个人都进行这个计算,而最早算出密封数字的那个人会向其他所有人宣布这个数字。听到密封数字之后,每个人都立即验证它是否能产生要求的输出值。如果是的,每个人都为他们的纸张标上这个数字,然后把纸张放入文件夹中。

验证无误后, 将该block链接到链上:取链上最新的block的hash作为本block的父hash。

  1. 但是,如果对某人,比如#7来说,那个被宣布的密封数字无法产生要求的输出值,怎么办?这种情形可并不少见。可能的原因有:

无论原因是什么,#7只有一个选择——放弃他的记录、从其他人处获得拷贝,以使他也可以将纸张放入文件夹。除非他不将他的纸张放入文件夹,他也就无法继续记录进一步的交易,这会因此禁止他成为网络中的一员。

大部分人同意的密封数字,无论是它是什么,都会成为那个可信的密封数字。谁放弃带这个密封数字的block,他将无法继续“挖矿”。因为封存下一个block时需要链上最新block的hash。

上面的过程解决了第一个问题:找谁来封存,答案是谁先找到幸运数字就是谁来封存。

  1. 可是, 如果他们知道其他人会算出它然后宣布它,为什么每个人都要耗费资源来进行计算呢? 为什么不坐视不理、等着抱大腿呢?这就是激励加入的原因。每一个区块链的成员都有资格获得奖励。第一个计算出密封数字的人将得到免费的金钱作为对他的努力(比如:付出的CPU算力和电力)的奖励。
  2. 这就是比特币变为现实的方式。它是在区块链(比如:分散式的账簿)上被用来交易的第一种货币。同时,人们被奖励以比特币作为回报,以使在网络上计算密封数字的努力会继续进行。

有了激励,很多人愿意成为矿工投入到挖矿行列,这就解决了挖矿动机问题:“无利不起早”。

  1. 上面没有提到的一个点是: 想象文件夹中已经有5页纸——都被一个密封数字加密了。如果我回溯到第二页纸、改动交易记录以谋私,为修改后的交易记录计算出了一个新的密封数字, 会怎么样?密封数字会让任何人察觉到交易记录中的矛盾吗?
  2. 首先来看一下这个密封数字是怎么生成的。这个密封数字不仅包含一个随机数字, 还包括上一页纸的输出数据, 有了这个优雅的小心机,我们可以保证,每一页纸张都依赖于它之前的纸张。因此,如果有人要修改一张历史记录,他将同样必须改变该页以后所有纸张的内容和密封数字,以使这条链保持一致。
  3. 如果某个人,不属于我们在一开始设想的10个人,试图作弊,修改区块链(保存了所有交易记录清单纸张的文件夹)中的内容,他将不得不调整多页纸张、为所有这些纸张计算新的密封数字。我们都知道计算密封数字有多么困难。因此,这网络中的一个坏蛋欺负不了九个老实人
  4. 实际上,从这个不诚实的家伙尝试作弊的那一夜开始,他将要在这网络中创造另一个区块链,但那个区块链将永远无法赶上可信的区块链——仅仅因为一个家伙的努力和速度不可能战胜九个人积累起来的努力和速度。因此,这保证了在一个网络中,最长的链就是可信的链
  5. 万一,不是一个,而是六个人搞事情呢?在这种情况下,这个协议将会落空,流于表面。它就是人们所知的“51%攻击”。如果该网络中的大部分人决定变得不诚实并且欺骗网络中剩下的人,这个协议将无法实现它的目标。这就是其脆弱性的唯一原因。知道了这一点,它也就不太可能发生了。但是,我们所有人都必须知道这个系统的这个弱点。它建立在这样的假设之上:一群人中的大部分都总是诚实的

上面为方便理解,使用人数进行攻击说明, 实际上51%的攻击指的是全网计算机的算力。上面的假设就是著名的“拜占庭容错”。

这种以block的hash为纽带将全部block链接在一起的链结构,保证了已封存的数据几乎不可能被修改,至此, 解决了上面的全部3个问题。

上一篇下一篇

猜你喜欢

热点阅读