本文借阅多篇文章 总结内容 ^_^ 

作者:汪乐-LaiW3n
链接:https://www.zhihu.com/question/37290469/answer/107612456
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

-----正文-----

事情是这样的,最近我的室友Hasaki一直在问我区块链和比特币的事情,我尝试了很多种不通的姿势以求简单通俗形象生动地跟他解释什么是区块链技术,但是最后都失败了。因此我萌生了要写一篇BlockChain for Babies(又名:如何向你的弱智室友解释区块链)的想法,以求能简单直观生动形象地向对区块链技术不了解但是想知道区块链是什么的人介绍区块链技术或者比特币。

因为面向的读者是不想知道具体技术实现只想了解区块链的人群,因此本文避开了一些底层和算法细节,采用比较主观的方式来展示笔者对区块链技术的感性认识。如果你只是对区块链感兴趣,并没有深入学习的打算,或者只是想像我一样在别人问起来的时候装逼,本文应该是一篇很好的“导论”。

总览

区块链本质上是一个去中心化的分布式账本数据库(感谢

@程剑宇

指出:在与比特币相关的区块链应用中可使用这一术语,但区块链技术可能并不包含“账本”)。其本身是一串使用密码学相关联所产生的数据块,每一个数据块中包含了多次比特币网络交易有效确认的信息。

这是区块链的定义,因此要逐步了解区块链,我们需要一步步了解如下东西。

去中心化

先来考虑一个中心化集中式处理的过程。你要在某宝上买一部手机,交易流程是:你将钱打给支付宝-支付宝收款后通知卖家发货-卖家发货-你确认收货-支付宝把钱打给卖家。

图1: 中心化集中式交易模式

在这个过程中,虽然你是在和卖家交易,但是这笔交易还牵扯到了除了你和卖家的第三方,即支付宝,你和卖家的交易都是围绕支付宝展开。因此,如果支付宝系统出了问题便会造成这笔交易的失败。并且虽然你只是简单的买了一个手机,但是你和卖家都要向第三方提供多余的信息。因此考虑极端情况,如果支付宝跑路了或者是拿了钱不却不承认你的交易或者是支付宝所在的城市因为开G20把所有人都赶走了(?),那么你就悲剧了。

而去中心化的处理方式就要显得简单很多,你只需要和卖家交换钱和手机,然后双方都声称完成了这笔交易,就OK了。

可以看出在某些特定情况下,去中心化的处理方式会更便捷,同时也无须担心自己的与交易无关的信息泄漏。

其实如果只考虑两个人的交易并不能把去中心化的好处完全展示出来,设想如果有成千上万笔交易在进行,去中心化的处理方式会节约很多资源,使得整个交易自主化、简单化,并且排除了被中心化代理控制的风险。

去中心化是区块链技术的颠覆性特点,它无需中心化代理,实现了一种点对点的直接交互,使得高效率、大规模、无中心化代理的信息交互方式成为了现实。

当然,上述的例子有一个很大的潜在问题:没有了权威的中心化代理,怎样保证每笔交易的准确性和有效性呢?比如:如果没有了权威的中心化代理,张三某一天借了我100块钱,但是不还钱还不承认怎么办?这里就引出了区块链的其它特性。

两个基础难题

在去中心化以后,整个系统中没有了权威的中心化代理,信息的可信度和准确性便会面临问题。

问题1:类两军问题

第一次听说这个问题居然是在TCP的课上,大致说的是有两个相距很远的军队要传递信息,红军派遣一个信使去跟蓝军说:“你他娘的把意大利炮拿出来!”。蓝军收到信息后又派了一个信使去红军说:“收到指令!”。然后红军又派一个信使去蓝军说:“知道你收到指令了!”。然后蓝军又派一个信使去红军说:“知道你知道我收到指令了!”。然后红军又派一个信使去蓝军说:“知道你知道我知道你收到指令了!”……然后就没完没了了。

图2:在分布式计算中在异步系统和不可靠的通道上达到一致性是不可能的

在这种情况下,因为是点对点的通信,双方不可能在这种情况下达到信息的一致性。严谨一点,就是“在分布式计算上,试图在异步系统和不可靠的通道上达到一致性是不可能的”。

问题2:拜占庭将军问题

拜占庭罗马帝国在军事行动中,采取将军投票的策略来决定是进攻还是撤退,也就是说如果多数人决定进攻,就上去干。但是军队中如果有奸细(比如将军已经反水故意乱投票,或者传令官叛变擅自修改军令),那怎么保证最后投票的结果真正反映了忠诚的将军的意愿呢?

拜占庭将军问题反映到信息交换领域中来,可以理解为在一个去中心的系统中,有一些节点是坏掉的,它们可能向外界广播错误的信息或者不广播信息,在这种情况下如何验证数据传输的准确性。

区块链技术的诞生

现在让我们来一步一步在去中心化的系统中解决这些问题,见证区块链技术雏形的诞生。

1

我们先来建立一个去中心化的系统,为了方便理解,我们来看一个简单的去中心化借贷模型:如果A借了B 100块钱,这个时候,A在人群中大喊“我是A,我借给了B 100块钱!”,B也在人群中大喊“我是B,A借给了我100块钱!”,此时路人甲乙丙丁都听到了这些消息,因此所有人都在心中默默记下了“A借给了B100块钱”。你看,这个时候一个去中心化的系统就建立起来了,这个系统中不需要银行,也不需要借贷协议和收据,严格来说,甚至不需要人与人长久的信任关系(比如B突然又改口说“我不欠A钱!”,这个时候人民群众就会站出来说“不对,我的小本本上记录了你某天借了A100块钱!”)。

图3:去中心化借贷模型

2

可能你已经发现了,在上述的模型中,所谓的“100块钱”已经不重要了。换句话说,任何东西都可以在这个模型中交换,甚至你可以凭空杜撰一个东西,只要大家承认,你就可以让你杜撰的东西流通。比如:我在人群中高喊一声“我创造了10个查克拉!”,我甚至不需要知道查克拉是什么,也不需要关心世界上是不是真的有查克拉,只要大家都听到,然后在自己的小本本上记下“LaiW3n有10个查克拉”,于是我就真的有100个查克拉了。从此以后,我便可以声称我给了某人1个查克拉,只要路人甲乙丙丁都收到并且承认了这一信息,那我就算完成了这次交易,哪怕世界上没有查克拉。

你现在脑海中是不是浮现出了三个字——“比特币”?由于真正的区块链和比特币比我上述的模型复杂太多,细节也丰富太多,因此以下还是以查克拉举例,毕竟本文是Blockchain for Babies.(笑)

3

假设过了很长一段时间,我凭空创造的查克拉已经在这个系统中流通了起来,大家都开始认可了查克拉。但是这个系统中一共就只有10个查克拉,于是有人动了坏心思,他在人群中高呼“我有10个查克拉!”怎么办?大家是直接在本本上记下他有10个查克拉么,这样不是人人都可以伪造查克拉了么?

为了防止这种现象发生,我决定在我创造查克拉的时候给我的查克拉打上标记(更准确地说,我是给我喊的那句“我创造了10个查克拉”打上标记,比如标记为001),这样以后在每一笔交易的时候,我在高喊“我给了某某1个查克拉!”的时候,会附加上额外的一句话:“这1个查克拉的来源是记为001的那条记录,我的这句话标记为002!”。我们再抽象一点,某人喊话的内容的格式就变成了:“这句话编号xxx,上一句话的编号是yyy,我给了某某1个查克拉!”,这样就解决了伪造的问题。其实上述模型就变成一个简化的中本聪第一版比特币区块链协议:

图4:查克拉模型和中本聪第一版区块链协议对比图

好了,看到这里你基本已经能够生动形象又不涉及任何细节地向你的弱智室友解释区块链了。但是也许你的室友是一个有打破沙锅问到底精神求是学子,因此你最好继续准好回答以下这几个问题。

1. “凭啥?”

你室友可能会问:“凭啥你喊一句话我就帮你记?我的小本本不要钱么?”。为了激励大家帮我传话和记账,我决定给第一个听到我喊话并且记录在小本本上的人一些奖励:第一个听到我喊话并记录下来的人,你就凭空得到了1个查克拉,这个查克拉是整个系统对你幸苦记账的报酬,而你记录了这句话之后,要马上告诉其它人你已经记录好了,让别人放弃继续记录这句话,并给你自己的记录编号让别人有据可查,然后你再把我的话加上你的记录编号一起喊出来,供下一个人记账。

当这个规则定下以后,这个系统中一定会出现一批人,他们开始竖着耳朵监听周围发出的声音,以抢占第一个记账的权利。对的,你脑海中是不是又浮现出了“比特币挖矿”的字眼?

值得一提的是,关于比特币挖矿,

@玲珑邪僧

举了一个很形象的例子:

单身汪们要找女票,国民岳母说我有好多女儿,这样吧我给你们出点题目,解出一个就给其中一个姑娘的微信号。

单身汪们疯狂竞争,想破脑袋去解题。只要其中一只汪解出一道题,就立马得意洋洋地昭告天下,示威全部单身汪,这个姑娘是我的啦,你们放弃吧。其他单身汪们即使不服也没有办法,惆怅懊恼也不是个事儿啊,还是麻溜地立马去解下一道题目吧。这只喜赢姑娘的幸运小汪被岳母认可后还能得到25个货币单位的彩礼,简直人生赢家。

2. “听谁的?”

在这个系统中,如果我和另一个人C几乎同时地喊出一句:“为了艾泽拉斯!”。由于听众所处的位置不同,一定会有人先听到我说的那句话,而另外一些人则先听到C的那句话,如果我们规定只能有一个人说出这句话,那到底这句话是谁说的?

如果不加任何条件,那么上述的情况一定会这样发展:一部分人认为这句话是我说的,在听到这句话之后开始记账,之后他们所做的所有事情都是基于这个事实,并且随着这个信息一次次的传下去,这条信息链会越来越深;而另外一群认为是C先说这句话的人,也会按照这样的趋势发展。这样,原本是一条唯一的信息链,在我们喊出“为了艾泽拉斯”这句话之后,分叉了!?

图5:“区块链”分叉

这会导致怎样的情况呢?按照我们的设想,应该每个人的小本本上记录的东西都是一样的,都是一条可以把所有信息串联起来的链条。但是在这一刻,他们小本本上记录的东西不一样了!这还玩毛啊?以后还怎么确定交易和信息的真实性!?

为了解决这个问题,我又追加了新的规则:每个人在记录小本本的时候,需要脱鞋然后用脚拿笔,在小本本上用正楷体书写!有了这个规定,由于用脚写字难度很大,每个人至少需要10分钟才能写完,而且由于每个人用脚写字的熟练度不通,写完这句话所用的时间也不同,因此一定会有人先写完然后高呼“我写完了!那句话是LaiW3n喊的!”,这样其它正在写这句话的人便会停笔,然后在小本本上重新开始写“那句话是来文写的,上一句的编号是xxx”。

如果你对上述我的解决方法感兴趣,你可以对照我上面的比喻去了解以下知识:

“听谁的”——中本聪破解“拜占庭将军问题”的算法

“在小本本上记录”——比特币挖矿

“脱鞋用脚写字”——比特币挖矿难度

“脱鞋写字速度”——算力

“新的规则”——工作量证明链

3. “双花”问题

这个时候你的室友可能又要问:如果我同时宣布我给了A一个查克拉和我给了B一个查克拉,但是我只有一个查克拉,那咋整?是A和B都收到了查克拉还是咋地?

这个时候你只需要托起他的下巴,温柔地看着他的眼睛,用手刮刮他的鼻子,说:“小妖精,你把这种情况带到上面的规则中去试试?”

--------------

一些私信问题讨论:

1. 为何目前还鲜有区块链和实体商业业务对接的案例?

从理论上:区块链是一门新技术,保守大众(包括我)还处在观望阶段,只有少数激进或者目标明确的实体开始向区块链进军,而这些少数的实体在现阶段发声的强度还不够。

从应用上:区块链技术要与实体商业对接,在技术和规则上还需要进一步开拓,区块链解决的所谓“不信任”问题其对象也只局限于区块链上的数据。因此如果区块链要与实体业务对接,还需要进一步推动实体与数据之间跨域的“游戏规则”的建立。

2. 虚拟加密货币最终是否会走向庞氏骗局?

这个问题我也不太好回答,毕竟我是一个技术人员而非这个领域的弄潮儿。我个人的看法是:对于普通人,不建议长期持有某种数字货币,应将数字货币作为法币之间转换的桥梁;对于投机者,“炒币”需谨慎,应将风险控制在自己能够承受的范围内。PS:其实我真的不关心这个问题。

3. 为什么听你一讲,感觉区块链很弱智的样子?

我在文中已经说明,这只是一篇关于区块链技术的新人导论,其目的在于帮助你快速对区块链有一个感性的认识;如果真的想了解区块链技术细节,请阅读相关文献或访问区块链社区。

4. 工作机会

感谢各位热情的HR,但我现在暂无跳槽的打算。

5. 转载

个人可以转载,请注明来源并告知我一声;商业组织或作为商业用途,请私信。

作者:知乎用户
链接:https://www.zhihu.com/question/37290469/answer/293890531
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

友情提醒:比特币采用区块链技术,但是区块链并不等同于比特币;全篇基于比特币底层区块链技术讲述,所以,部分模型可能不适用于以太坊等。另外,由于文章采用了一定的抽象、类举的叙事方式,中间或多或少有些地方会跟区块链底层严谨的技术实现有出入,如果让你觉得困惑,可以在评论下方留言或者私信我一起探讨。最后,也是受限于自己知识结构的不完整,这篇文章会随着我对区块链更深入认识后,随时进行修订,最后更新时间可参考该回答下方的时间戳。

另外,作为一篇科普性文章,大家可以随意转载,注明这篇文章的出处和作者即可,无需再单独私信询问。

---

首先不要把区块链想的过于高深,他是一个分布在全球各地、能够协同运转的数据库存储系统,区别于传统数据库运作——读写权限掌握在一个公司或者一个集权手上(中心化的特征),区块链认为,任何有能力架设服务器节点的人都可以参与其中。来自全球各地的掘金者在当地部署了自己的节点,并连接到区块链网络中,成为这个分布式数据库存储系统中的一个节点;一旦加入,该节点享有同其他所有节点完全一样的权利与义务(去中心化、分布式的特征)。与此同时,对于在区块链上开展服务的人,可以往这个系统中的任意的节点进行读写操作,最后全世界所有节点会根据某种机制的完成一次又依次的同步,从而实现在区块链网络中所有节点的数据完全一致。

上图中,高亮的点就是区块链系统中分布在全球各地的一个个节点;而这些节点可以简单理解为一台服务器服务器集群

为了更简单的阐述那篇文章所构建的世界观,文中所讨论的节点全部粗暴的理解为官方参考实现节点,即最标准的一种节点类型,这些节点不仅可以参与挖矿共识、还可以数据存储和数据点对点传递;不涉及其他复杂的节点类型。关于节点的分类,可以阅读我的专栏文章《区块链节点与钱包的分类、边际和使命,看这篇文章就足够了》

# 问题的由来

我们反复提到区块链是一个去中心化的系统,确实,「去中心化」在区块链世界里面是一个很重要的概念,很多模型(比如账本的维护、货币的发行、时间戳的设计、网络的维护、节点间的竞争等等等等)的设计都依赖于这个中心思想,那到底什么是去中心化呢?在解释真正去中心化之前,我们还是先简单了解下什么是中心化吧。

中心化?

回忆一下你在网上购买一本书的流程:

  1. 第一步,你下单并把钱打给支付宝
  2. 第二步,支付宝收款后通知卖家可以发货了;
  3. 第三步,卖家收到支付宝通知之后给你发货;
  4. 第四步,你收到书之后,觉得满意,在支付宝上选择确认收货;
  5. 第五步,支付宝收到通知,把款项打给卖家。流程结束。

你会发现,虽然你是在跟卖家做交易,但是,所有的关键流程都是在跟支付宝打交道。这样的好处在于:万一哪个环节出问题,卖家和买家都可以通过支付宝寻求帮助,让支付宝做出仲裁。这就是一个最简单的基于中心化思维构建的交易模型,它的价值显著,就是建立权威,通过权威背书来获得多方的信任,同时依赖权威方背后的资本和技术实力确保数据的可靠安全。

你一定会摆出一个巨大的问号脸 ⊙.⊙?——“通过权威背书来获得多方的信任,同时依赖权威方背后的资本和技术实力确保数据的可靠安全”,真的可以嘛?!

假如说,支付宝程序发生重大BUG,导致一段时间内的转账记录全部丢失,或者更彻底一点,支付宝的服务器被ISIS恐怖组织的一个导弹全部炸毁了。而我刚刚转出去的100元找谁说理去,这个时候,你就成了刀殂上的鱼肉;支付宝有良心,会勉为其难承认你刚刚转账的事实,但他不承认你也没辙,因为确实连他自己也不知道这笔转账是否真实存在。

上述就是中心化最大的弊端——过分依赖中心和权威,也就意味着逐渐丧失自己的话语权。

去中心化?

那么去中心化的形态是什么样子呢?还是拿刚才那个例子继续,我们构建一个极简的去中心化的交易系统,看看我们是如何在网络上从不认识的卖家手里买到一本书的。

  1. 第一步,你下单并把钱打给卖家;
  2. 第二步,你将这条转账信息记录在自己账本上;
  3. 第三步,你将这条转账信息广播出去;
  4. 第四步,卖家和支付宝在收到你的转账信息之后,在他们自己的账本上分别记录;
  5. 第五步,卖家发货,同时将发货的事实记录在自己的账本上;
  6. 第六步,卖家把这条事实记录广播出去;
  7. 第七步,你和支付宝收到这条事实记录,在自己的账本上分别记录;
  8. 第八步,你收到书籍。至此,交易流程走完。

刚才“人为刀俎我为鱼肉”的情况在这个体系下就比较难发生,因为所有人的账本上都有着完全一样的交易记录,支付宝的账本服务器坏了,对不起卖家的账本还存在,我的账本还存在;这些都是这笔交易真实发生的铁证。

当然,在这套极简的交易系统中,你已经发现了诸多漏洞和不理解,比如说三方当中有一个是坏人,他故意记录了对他更有利的转账信息怎么办;又比如说消息在传递过程中被黑客篡改了怎么办等等等等。这在以往的计算机概论或者计算机网络书本上中可能都有提及到——“类两军”和“拜占庭将军”问题。这里就不打算赘述,因为暂时跟主线不相关,感兴趣的同学可以去Google或者百度一下,你只需要知道,在我们下面即将展开讲到的区块链系统中,通过巧妙的设计,足以解决上述存在的BUG。

既然话已说到这份上,相信了解一点技术、特别是有运维背景的同学大概能够从极简交易系统中窥视到了更多区块链的一些影子——

  1. 分布式存储,通过多地备份,制造数据冗余
  2. 让所有人都有能力都去维护共同一份数据库
  3. 让所有人都有能力彼此监督维护数据库的行为

在我看来,你猜测的基本上没错。其实这些就是区块链技术最核心的东西,外人看起来高大上、深不可测,但探究其根本发现就是这么简单和淳朴。当然,这里面肯定会有很多很多很多细枝末节的技术需要重构。

如果你差不多认同上面的观点,那我们应该基本上可以达成共识,分布式部署肯定是构建去中心化网络理所当然的解决方向——通过P2P协议将全世界所有节点计算机彼此相互连接,形成一张密密麻麻的网络;以巧妙的机制,通过节点之间的交易数据同步来保证全球计算机节点的数据共享和一致。

哈哈,说的轻巧,“交易数据这么重要的东西,在一个完全不信任的P2P网络节点中以一种错综复杂的方式传递,数据的一致性和安全性谁来保证,如果说互相监督,他们到底怎么做到?”

好了,不卖关子了,下面让我们围绕这个最最最最直接的问题开始进入到真正区块链的世界,抽丝剥茧看看它到底是如何一步一步形成的,又是如何一步一步稳定运转。

# 从全球节点到交易数据

这张图的制作的意义为的是帮助你在宏观上先快速理解区块链中所涉及到的相关名词以及他们的层级关系。同时,文章的知识结构和设计思路也大抵上也会按照:

  1. 首先,将区块作为最小单位体,讲述极简区块链系统是如何运转的;
  2. 接着,进入到比区块更小单位体——交易记录,理解区块链是如何处理数据的;
  3. 最后,将所有知识点柔和在一起,重回到区块和区块链,完整讲述整个工作流程。

希望你在这个引导和结构下有一个比较好的阅读体验。Let's go~

# 区块,混沌世界的起源

既然已经达成共识,所以,我们事先构建好了一个去中心化的P2P网络;同时,为了让读者朋友们听起来更轻松,我先粗暴的规定在这个极简的区块链系统里,每十分钟有且仅产生一笔交易。

故事继续,在节点的视野里,大概每十分钟会凭空产生一个建立在自己平行宇宙世界的神奇区块(你可以将区块想象为一个盒子),这个区块里放着一些数字货币以及一张小纸条,小纸条上记录了这十分钟内产生的那唯一一笔交易信息,比如说——“小A转账给了小B100元”;当然,这段信息肯定是被加密处理过的,为的就是保证只有小A和小B(通过他们手上的钥匙)才有能力解读里面真正的内容。

这个神奇的区块被创造出来之后,很快被埋在了地底下,至于埋在哪里?没有一个人知道,所以需要所有计算机节点一起参与进来掘地三尺后才有可能找到(找到一个有效的工作量证明)。显然,这是一件工作量巨大、成果随机的事件。但是呢,对于计算机节点来说,一旦从地底下挖出这个区块,他将获得区块内价值不菲的数字货币,以及“小A转账给了小B100元”过程中小A所支付的小费。同时,对于这个节点来说,也只有他才有权利真正记录小纸条里的内容,这是一份荣耀,而其他节点相当于只能使用它的复制品,一个已经没有数字货币加持的副本。当然这个神奇的区块还有一些其他很特别的地方,后面我们会再细细聊。

为了更好的描述,我们将计算机节点从地底下挖出区块的过程叫做「挖矿」,刚才说了,这是一件工作量巨大、运气成分较多、但收益丰厚的事儿。

过了一会儿,来自中国上海浦东新区张衡路上的一个节点突然跳出来很兴奋的说:“ 我挖到区块了!里面的小纸条都是有效的!奖励归我!” 。虽然此刻张衡路节点已经拿到了数字货币,但对于其他计算机节点来说,因为这里面还涉及到其他一些利益瓜葛,他们不会选择默认相信张衡路节点所说的话;基于陌生节点彼此不信任的原则,他们拿过张衡路节点所谓挖到的区块(副本),开始校验区块内的小纸条信息是否真实有效等等。在区块链世界里,节点们正是通过校验小纸条信息的准确性,或间接或直接判断成功挖出区块的节点是否撒谎。(如何定义小纸条信息真实有效,后面会讲解,这里暂不做赘述)。

在校验过程中,各个节点们会直接通过下面两个行为表达自己对张衡路节点的认同(准确无误)和态度:

  • 停止已经进行了一半甚至99.99%的挖矿进程;
  • 将张衡路节点成功挖出的区块(副本)追加到自己区块链的末尾。

你可以稍微有点困惑:停止可能已经执行了99.99%的挖矿行为,那之前99.99%的工作不是就白做了嘛?!然后,区块链的末尾又是个什么鬼东西?

对于第一个困惑。我想说,你说的一点没错,但是没办法,现实就是这么残酷,即便工作做了99.99%,那也得放弃,这99.99%的工作劳苦几乎可以视为无用功,绝对的伤财劳众。第二个困惑,区块链和区块链的末尾是什么鬼?这里因为事先并没有讲清楚,但是你可以简单想象一下:区块是周期性不断的产生和不断的被挖出来,一个计算机节点可能事先已经执行了N次“从别人手上拿过区块 -> 校验小纸条有效性”的流程,肯定在自己的节点上早已经存放了N个区块,这些区块会按照时间顺序整齐的一字排列成为一个链状。没错,这个链条,就是你一直以来认为的那个区块链。如果你还是不能够理解,没关系,文章后面还会有很多次机会深入研究。

# 走进区块内,探索消息的本质

上面我们构建了一个最简单的区块链世界的模型,相信大多数同学都已经轻松掌握了。但是别骄傲也别着急,这还只是一些皮毛中的皮毛,坐好,下面我们准备开车了。

前面我们说到“大概每十分钟会凭空产生一个神奇的区块,这个区块里放了一张小纸条,上面记录了这十分钟内产生的这唯一一笔交易信息”。显然,十分钟内产生的交易肯定远不止一条,可能是上万条,这上万条数据在区块链世界是如何组织和处理的呢?另外,为什么在纸条上记录的只是某一次的交易信息,而不是某一个人的余额?余额好像更符合我们现实世界的理解才对。

既然存在这样那样的疑问。现在我们就把视线暂时从“区块”、“区块链”这些看起来似乎较大实体的物质中移开,进入到区块内更微观的世界里一探究竟,看看小纸条到底是怎么一回事,它的产生以及它终其一生的使命:

  1. 发起交易的时候,发起人会收到一张小纸条,他需要将交易记录比如说“盗盗转账给张三40元”写在纸上。说来也神奇,当写完的那一刹那,在小纸条的背面会自动将这段交易记录格式化成至少包含了“输入值”和“输出值”这两个重要字段;“输入值”用于记录数字货币的有效来源,“输出值”记录着数字货币发往的对象。
  2. 刚刚创建的小纸条立马被标记成为“未确认”的小纸条。从地下成功挖出区块并最终连接到区块链里的小纸条一开始会被标记为“有效”。若这条有效的小纸条作为其他交易的输入值被使用,那么,这个有效的小纸条很快会被标记为“无效”。因为各种原因,区块从链上断开、丢弃,曾经这个区块内被标记为“有效”的小纸条会被重新标记为“未确认”。
  3. 区块链里面没有账户余额的概念,你真正拥有的数字资产实际上是一段交易信息;通过简单的加减法运算获知你数字钱包里的余额。

上面的1、2、3仅仅作为结论一开始强行灌输给你的知识点,其中有几个描述可能会有点绕,让你觉得云里雾里,没有关系,因为我们立刻、马上就开始会细说里面的细枝末节。

上图,是区块内,盗盗在一张小纸条上记录下的交易信息,后被格式化的呈现

上图就是从无数打包进区块内的小纸条中,抽取出来的一张,以及它最终被格式化后的缩影。单看右侧的图可能很容易产生误会,虽然看起来有多行,但实际上就是“盗盗转账给张三40个比特币”这一条交易数据另外的一种呈现形态。因为区块链世界里面这么规定,每一条交易记录,必须有能力追溯到交易发起者 发起这笔交易、其中所涉及金额的上一笔全部交易信息;即这笔钱从何而来的问题。这其实很容易理解,在去中心化的网络中,通过建立交易链、和通过交易链上的可溯源性间接保证数据安全和有效。

我们继续看,在区块链世界里,我们是如何仅通过“盗盗转账给张三40个比特币” 这条交易信息完成转账流程的。其实跟现实中你在路边买一个包子的流程大抵上相同。

第一步:判断是否有足够的余额完成交易

这里我们再一次重申,在比特币的区块链世界里是没有余额的概念(以太坊的底层区块链有余额概念),余额是通过简单数字的加减最终获得,你拥有所谓的数字货币实际上是因为你拥一条交易记录,即 “盗盗转账给张三40个比特币”!这里,我们还是拿这条记录说事:

追溯“输出值”是“盗盗”相关的全部有效交易记录作为,对有效交易中的数字进行简单求和,判断是否大于等于40,如果确实大于等于,则将这些有效的交易记录合并形成一条新的交易记录(如下图)。如果小于40,其实可以不需要再继续往下探讨。

就上图的例子,我们追溯到曾经转账给盗盗的有效交易记录有“小A转账给盗盗10 btc”、“小B转账给盗盗20 btc”、“小C转账给盗盗 25 btc”,我们需要将这三条交易记录合并成一条更复杂描述的交易记录,即 “( 小A转账给盗盗10 btc + 小B转账给盗盗20 btc + 小C转账给盗盗 25 btc ) 转账给张三40 btc ”

第二步:判断是否需要找零

对追溯到的有效交易数字求和,如果发现大于需要支付的金额,需要将多出的数字重新支付给自己,相当于找零。对应生成了一条全新的交易记录(如下图)。

就上图例子来说,我们最后合并成的交易记录 “( 小A转账给盗盗10 btc + 小B转账给盗盗20 btc + 小C转账给盗盗 25 btc + 盗盗转账给盗盗15 btc ) 转账给张三40 btc ” 事实上等同于“盗盗转账给张三40 btc”。其中“盗盗转账给盗盗15 btc”就可以理解找零。

第三步:发出去,让全球节点认同和备份小纸条

这条内部重新处理过的复杂交易记录被塞进区块,埋到地下,等待节点挖出来,一旦区块被挖矿成功,并且该区块最终被连在了区块链的主链上。张三将最终拥有了这条交易记录,而先前的“小A转账给盗盗10 btc” 、“小B转账给盗盗20 btc” 、“小C转账给盗盗25 btc”都将被视为已经使用过的交易记录——从此被贴上“无效”的标签,意味着这些交易记录将永远不会再被追溯到。

我们最后一次重申,只是希望让你加深印象:拥有数字货币=拥有交易记录!

通过设计巧妙的精巧密码学保证数据安全

记录着交易信息的小纸条借助区块这个载体,在分布式的网络中以不同的轨迹错综复杂的传递,我们前面说了,你真正拥有的数字资产实际上是一段交易信息,而不是你常规意义上理解的货币。所以这个过程就需要重点解决两个问题:

  • 接受到的这条交易记录在传输过程没有被其他人所篡改
  • 接受到的这条交易记录确实是由发起交易的人所创造

在这里,我们需要事先引入两个知识点,可能稍微有点难消化,但都是计算机领域较为成熟的和基础的概念。

第一个知识点:SHA256()函数。你只需要知道,任意长度的字符串、甚至文件体本身经过SHA256函数工厂的加工,都会输出一个固定长度的字符串;同时,输入的字符串或者文件稍微做一丢丢的改动,SHA256() 函数给出的输出结果都将发生翻天覆地的改变。注意,SHA256()函数是公开的,任何人都能使用。

上图,仅仅一个小数点的变化,输出的结果已经翻天覆地

第二个知识点:非对称加密。你也只需要了解,任何人手里都有两把钥匙,其中一把只有自己知道,叫做“私钥”,以及一把可以公布于众,叫做“公钥”;通过私钥加密的信息,必须通过公钥才能解密,连自己的私钥也无解。公钥可以通过私钥生成多把。

有了这些知识点的加持,上面两个问题开始变得有解。下面我们来看下内部是如何扭转和工作的吧,这里拿“小A 转账给了小B 100元钱” 举例:

  1. 第一步:小A会先用SHA256函数对自己的小纸条进行处理,得到一个固定长度的字符串,这个字符串就等价于这张小纸条。
  2. 第二步:小A使用只有自己知道的那一把私钥,对上面固定长度的字符串进行再加密,生成一份名叫数字签名的字符串,这份数字签名能够充分证明是基于这张小纸条的。你可以这么理解,在现实中,你需要对某一份合同的签署,万一有人拿你曾经在其他地方留下的签名复制粘贴过来怎么办?!最好的办法,就是在你每一次签名的时候,故意在字迹当中留下一些同这份合同存在某种信息关联的小细节,通过对小细节的观察可以知道这个签名有没有被移花接木。步骤一和步骤二的结合就是为了生成这样一份有且仅针对这条小纸条有效的签名。
  3. 第三步:小A将「明文的小纸条」、刚刚加密成功的「数字签名」,以及自己那把可以公布于众的「公钥」打包一起发给小B。
  4. 第四步:当小B收这三样东西,首先会将明文的小纸条进行SHA256()处理,得到一个字符串,我们将其命名为“字符串2”。然后,小B使用小A公布的公钥,对发过来的数字签名进行解密,得到另外一个“字符串1”。通过比对“字符串1”和“字符串2”的一致性,便可充分证明:小B接受到的小纸条就是小A发出来的小纸条,这张小纸条在中途没有被其他人所篡改;且这张小纸条确实是由小A所编辑。

可以看得出来,加解密的过程几乎是一环套一环,中途任何环节被篡改,结果都是大相径庭。借助这一连串的机制,其实已经能够很好的在公开、匿名、彼此不信任的分布式网络环境中解决数字交易过程中可能遇到的很多问题。这个环节可能确实有点难理解,现在,我需要你停下来,静下心,花上几分钟闭目慢慢回味其中设计精湛的地方。

掌握了这部分知识以后,我们在这里回答一下前面没有解释清楚的问题,「节点对区块的检验」检验的到底是什么?实际上就是:

  • 检验区块内的交易记录签名是否准确(是否被篡改)
  • 检验区块内的交易记录输入值是否“有效”(是否使用过)
  • 检验区块内的交易记录输入值的数字之和是否大于等于输出值的数字

# 重回“区块”和“区块链”的世界

好了,对小纸条和交易记录的研究我们点到为止,其实信息量已经是巨大的了,让我们合上盖子,重回较大的实体、继续聊聊“区块”和“区块链”的话题。还记得,咱们在一开始讲到关于区块的特征吗?区块创造后被埋在地下,需要经过节点们马不停蹄的挖采、而且是凭运气的挖采才有可能获得——不仅仅如此,事实上他还有其他很多神奇的地方,比如说:

  1. 凭空产生的区块在刚刚创建的时候会形成一股强大的黑洞效应,它会尝试将这段时间全世界各个节点上产生的所有小纸条(交易记录)统统吸进来;在合上区块盖子之前,同时会在区块内放上一些数字货币以及其他一些东西。
  2. 区块拥有一个唯一的ID,但它只会在这个区块被节点成功从地下挖出来之后创建。这个ID至少会跟「区块内所有小纸条的集合」、「即将与之相连的上一个区块ID」以及「挖矿节点的运气值」等因素相关。既然前面我们已经简单了解了“SHA256()函数”这个东西,这里不妨透露给大家:“区块ID = SHA256(‘区块内所有小纸条的集合’+’即将与之相连的上一个区块ID’+‘挖矿节点的运气值’+’…’)” ;基于先前掌握的知识,然后你应该知道区块内任意一张小纸条的信息稍微做改动、或者节点挖矿运气好一点坏一点等等,当前区块的ID都会 “ biu~ ”的发生改变。

基于上述1、2点,如果阅读足够仔细的同学可能会有些头大。在文章开头为了更好的描述,我在设计简化区块链系统的时候故意模棱两可了几个概念,这也许已经误导到了部分同学。这里不得不停下来和你一起修正下之前在你大脑中已经构建的区块链世界观。我们前面讲道,“在节点的视野里,大概每十分钟会凭空产生一个建立在自己平行宇宙世界的神奇区块”。如何正确去理解这句话呢?——拥有上帝之眼的你,可以这么拆解问题、看待问题:

  1. 同一个周期内,全网并不是产生唯一的一个区块等待挖掘;每个节点事实上都在周期性的创造区块和挖出区块;只是在某一个节点的视野里,它不能感知到另外一个节点上区块的产生。为何这里要特别强调“在某一个节点的视野里”,就是因为我们刚刚讲到,从区块的视角来说,区块的凭空产生,是基于即将与之相连的上一个区块ID;而从节点的视角来看,区块的凭空产生是基于当前节点区块链末尾的那个区块ID产生的。
  2. 全网会尽力控制在一个周期内只有一个节点能够成功挖出区块,但是不能够完全避免多个节点同时挖出区块的可能性;如何尽力控制?比如说,当大伙挖矿的热情高涨、工作效率提高,区块会被埋在更深更广的地方等。简而言之,通过提高工作难度,来维持这个平衡。另外,值得注意的:产生区块、挖出区块、校验区块,他们的时间周期近乎相同。

对于想从技术角度更加深入理解“区块”、“挖矿”本质的同学们,你们可以移步至我的专栏《探索比特币“挖矿”和“区块”的数学本质》,其中涉及到一些比较复杂的数学和技术细节,相信阅读完那部分内容之后,你对区块链会有更加透彻的认知。当然,对于绝大多数的吃瓜群众,看完那边内容可能会让你更加困惑,如果你不是十分的喜欢追根究底的话,我建议你还是直接选择跳过那块吧。至少在我看来,即便少了那部分内容,也不影响我们去理解区块链的魅力。

分叉

现在,我们终于对“区块”这个概念有了更全面的认识,文章开头讲的故事就可以继续展开来絮叨絮叨:

假如几乎同一时间,「中国上海浦东新区张衡路」上的节点和「美国纽约曼哈顿第五大道」上的节点异口同声喊出来:“我挖到区块了!里面的小纸条都是有效的!奖励归我!”。其他节点也几乎同时参与了对这两个区块的校验,结果发现这俩都没毛病,各节点也开始犯困,因为在他们的视野里他们并不清楚最后哪一个区块应该会被主链接纳。算了!都连在自己区块链尾巴上吧,这时尴尬了,区块链硬生生的被分叉了!

产生分叉

你肯定在想,那还得了,这种情况继续下去,每个节点的区块以及他们整理维护的小纸条都将变得不一样,这已经严重违背了区块链世界里第一大最基本原则——所有节点共同维护同一份数据。所以,为了解决这个问题,区块链世界引入了一条新的规则——拥有最多区块的支链将是真正被认可有价值的,较短的支链将会被直接Kill掉。

我们大伙都知道挖矿的过程存在巨大的工作量(如果没有任何难度,把区块扔在人群中,必然同一时间发现区块的节点数量将大大增加,也就会产生无数的支链,通过这个例子,你大概也就能够明白,比特币的区块链世界为什么需要设置工作难度了吧),并且在计算机的硅基世界里,不可能出现所谓 “同时” 的概念,哪怕纳秒的差别,那也总是会有先后顺序。所以理论上,“分叉”的这种僵局很快会在下一个区块被挖掘出来(以及校验区块)的时候被打破,实在不行下下个,或者下下下个……总之机制可以让整个分叉的区块链世界迅速稳定下来。

“分叉”这种僵局在确认下一个区块(以及校验小纸条)的时候被打破,从而整个区块链世界迅速稳定下来

就上图而言,所有基于张衡路节点挖矿获得的区块以及后续区块的那条分支被视为有价值,最终会全部保留了下来;其他节点会统一效仿那个拥有更长分支链的节点所做的决策。另外,值得一提的是,同一时间,较短分支上的区块会立即丢弃,而里面的小纸条也会随之释放出来,被重新标记上“未确认”。

“双花”与“51%攻击”

你可能已经开始困惑或者有点兴奋,末尾几个区块的排序在修复过程中,因为时间差肯定会产生一些模棱两可的地方,这往往会给数据安全埋下一颗雷。一个最简单的假设——我记录的一张小纸条很不巧地被归在了一条较短的支链上,这条支链在竞争过程中理所当然输掉了比赛,区块被丢弃、小纸条被无情的贴上“未确认”的标签。在等待下次区块重新确认的过程中,这个时间差内,我,好像、似乎可以做点什么坏事 ԅ(¯﹃¯ԅ) ,就比如说“双花”(双花,花两次,双重支付的意思)

你脑海中也许很快浮过的这样的构想,可不可能通过下面这种方法触发双花问题的产生,从而让我不劳而获:

  1. 假设有一个名叫X-Man的坏家伙,他控制了一个计算机节点,这个节点拥有比地球上任何一个节点算力都强大的计算机集群。
  2. 首先,X-Man事先创造了一条独立的(不去广而告之)、含有比较多区块的链条。其中一个区块里放着“X-Man转账给X-Man 1000元”的纸条。
  3. 接着,X-Man跟张三购买了一部手机,他在小纸条上记录下“X-Man转账给张三1000元”。张三已经比一般的卖家谨慎了,他在这条信息被三次确认后(即三个区块被真实挖出、校验和连接)才将手机给了X-Man。按照我们之前的理解,这条交易记录已经板上钉钉永远无法被串改。
  4. X-Man拿到手机之后,按下机房的开关,试图将先前已经创造的区块链条连接在自己这个节点区块链的末尾。
  5. 大功告成,X-Man拥有了一条更长的区块链条,那些较短、存放着“X-Man转账给张三1000元”的区块链,以及在区块链世界里那则真实转账行为被一同成功销毁。(???)

事实真的如此吗?在这里我可以很负责任的说,too young too simple,区块链世界规则的制定远比我们想象的要健全很多,还记得我们之前讲的“区块的ID至少会跟区块内所有小纸条的集合、即将与之相连的上一个区块ID、当前产生区块的时间戳以及挖矿节点的运气值等因素相关”。 在这里,正是因为打算连接到主链的过程中,主链会立马意识到,那条事先准备的链子(的第一个区块)的时间戳存在异常,不属于当前区块链世界里线性增长的时间戳,于是马上意识到这个事先准备的链子(的第一个区块)是无效的,需要重新计算。

在区块链的世界,重新计算的行为等同于把自己(节点)置身于同一个起跑线,跟世界上其他所有的节点一同竞争挖矿。你会说,我拥有更强大的计算能力,但是对不起,跟你竞争的对象并不是第五大道、南京西路、香榭丽舍大道上的某一个节点,而是全球所有算力的集合,在这个集合中,你拥有的算力永远都只是一个很小的子集。所以,根据区块链算力民主、少数服从多数的基本原则,这个构想将永远不会成立。

除非....

你控制着全球51%的算力,这也就是区块链世界里另外一个著名的概念,叫做“51%攻击”,但这也仅仅是一个理论值,在真实世界里这样的攻击我个人觉得是很难发动起来的,这里面就牵涉到很多经济、哲学甚至政治的因素。举个最简单的例子:X-Man为了回滚刚刚发生的一笔交易记录,成功发起了51%攻击,这意味着很快整个区块链系统将会崩盘,因为这次攻击已经严重伤害到人们对这套系统的信任,接着比特币开始暴跌至几乎一文不值;但是这个拥有51%算力的X-Man原本完完全全可以通过挖矿的方式获取更多收益,购买无数的iPhone手机。那他不是脑袋不是坏了还能是啥?对51%攻击话题感兴趣的同学可以阅读这篇文章《什么是比特币51%攻击?》。

至此,我觉得区块链最基础、最核心的知识已经全部讲完了(除了挖矿内部实现原理,作为一个遗憾留在这里,有时间会完善掉),相信你已经对它有了一个宏观的认识。另外,由于这篇文章采用了适当抽象、类举的叙事方式,中间或多或少有些地方会跟区块链底层严谨的技术实现有出入,欢迎大家来纠错。另外,也是受限于自己知识结构的缺失,这篇文章会随着我对区块链更深入认识后,随时进行修订,最后更新时间可参考该回答下方的时间戳。

--

问答部分

去中心化的系统中,到底是谁在发行货币?是无限量发行吗?

比特币的货币是通过挖矿(工作量证明)来发行的,总数量是通过程序写死了2100万个,而第一笔区块奖励也是硬编码写死的。矿工挖出一个区块所获得的奖励,每隔21万个区块将减少一半,按照平均10分钟挖出一个区块的执行效率,也就就说差不多每四年会锐减一次。2009年1月起每个区块奖励50个比特币,2012年11月减半为每个区块25个比特币,2016年7月减半为12.5个比特币。基于这个规则,到2140年,所有比特币(20,999,999,980)将全部发行完毕,之后不会再有新的比特币产生。

矿工节点的收益除了挖出区块以外还有哪些?

矿工节点的收益主要由两部分组成:1)挖出新区块的奖励;2)挖出新区块内所含交易的交易费。但就目前来说,一个区块内的交易费大概只占到矿工总收入的0.5%甚至更少,大部分收益主要还是来自于挖矿所得的比特币奖励。然而,随着挖矿奖励的递减,以及每个区块中包含的交易数量增加,交易费在矿工收益中所占的比重将会逐渐增加。在2140年之后,所有的矿工收益将完全由交易费构成。

是不是只有成为节点才能进行交易?、钱包、尤其是轻钱包是不是也可以挖矿?

这个问题是读者问出的,可能之前也有同学提出过类似的问题,但是没有引起我足够的重视,后来发现其实我也把概念混淆了。我一并去查阅了相关资料,对节点和钱包有一些更完整的理解和定义。详细请阅读我的专栏文章《区块链节点与钱包的分类、边际和使命,看这篇文章就足够了》

参考

  • 中心化与去中心化 https://www.douban.com/note/624421270/
  • 图说区块链 https://book.douban.com/subject/27084306/
  • 区块链是什么,如何简单易懂地介绍区块链? https://www.zhihu.com/question/37290469
  • 什么是比特币51%攻击? http://8btc.com/article-1949-1.html
  • 区块链与新经济:数字货币2.0时代 https://book.douban.com/subject/26804497/
  • 詳解比特幣原理和運行機制 https://www.youtube.com/watch?v=P4seQcP77H4
  • 区块链是什么:从技术架构到哲学核心 https://v.qq.com/x/page/x0518nuh2z7_0.html
  • 区块链核心算法解析 https://book.douban.com/subject/27081206/
  • 深入理解比特幣的安全性及程式交易安全性與相關的密碼學原理 https://www.youtube.com/watch?v=3w1Tg3B_oKQ
  • 深度了解区块链——拜占庭将军问题深入探讨 https://wallstreetcn.com/articles/338061
  • 精通比特币-挖矿与共识 http://zhibimo.com/read/wang-miao/mastering-bitcoin/Chapter08.html

编辑于 2018-07-10

作者:maxdeath
链接:https://www.zhihu.com/question/37290469/answer/167477833
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

首先要搞清一个问题——比特币是区块链,但是区块链并不是比特币。

于是,在区块链的这个问题回答里,提到“矿工”,“挖矿”,“最长链”,“分叉”等等词的,其实都不准确。

写一点上个月讲课的内容——个人觉得大部分的回答,包括google搜出来的或者wiki的,都不能很好地解释区块链是个什么东西。因为讲比特币的人很多,懂比特币的人也很多,但是具体到区块链,现在并没有一个很清楚的定义说什么是区块链,基本上所有的介绍里都是这样的:

比特币——〉区块链是比特币的底层技术。

或者

比特币——〉比特币是一种区块链。

具体到什么是区块链的问题,目前没有看到很好的定义和介绍,更多的是大而化之地讲区块链的意义在哪里的空泛文章,要不然就是一水的矿工和挖矿。所以我来从纯理论角度说一下我个人对区块链的定义:

1,区块链是一个放在非安全环境中的分布式数据库(系统)。

2,区块链采用密码学的方法来保证已有数据不可能被篡改。

3,区块链采用共识算法来对于新增数据达成共识。

具有以上三个性质的系统,就是区块链。

1,区块链是一个放在非安全环境中的分布式数据库(系统)。

这里的要点有两个:(1)分布式,(2)非安全环境。

首先,这是一个分布式的,去中心化的系统。所以,有一个中心服务器或者节点的,不是区块链。节点都是安全的,无恶意的,那这不是区块链。同理,从应用的角度讲,如果你的应用必须要使用中心节点(例如要用超级计算机做深度学习)或者没必要考虑节点不安全的情况(例如某个安全的工厂里的传感器),那么并不需要考虑区块链技术。

至于后面的词“数据库”,目前大部分成熟的区块链都是数据库,例如比特币就是一个分布式账本,而账本其实就是数据。然后,根据数据的格式,又可以分三种——1,数据是完全不相关的,只是达成的共识,没有有效无效之分;2,数据有某些逻辑结构,例如账本中,一笔交易实际上除了金额,还有输入和输出,连接到之前的交易,这些数据需要通过逻辑验证(例如交易中,节点需要验证输入的交易是否有效);3,数据拥有图灵完备的逻辑,而验证的时候需要通过节点使用算力运算,每笔交易可以有不同的输出和状态,每个节点要做的不仅仅是验证交易的真实性和输入的正确性,还要根据交易里的逻辑读入数值,进行验算然后再验证结果。

比特币的系统就是第二种,又叫分布式账本;以太坊是第三种。第三种可以支持智能合约。

用比特币举例的话,1,它是一个完全去中心化的系统,2,它放在一个非安全的环境,它并不要求所有使用比特币的人都没有恶意。

2,区块链采用密码学的方法来保证已有数据不可能被篡改。

这个是误解最多的部分,因为很多人一提到区块链就只觉得是这个。诚然,这部分很重要,而且确实区块链也因此得名,但这只是区块链的定义的一部分。

这个部分的两个核心要点是:(1)密码学哈希函数,(2)非对称加密。

两个都是密码学的基础概念,网上都有非常清晰的定义,我只简单说下:

(密码学)哈希函数:一个函数Y=H(X),有如下性质:1,有X可以很容易算出Y;2,有Y不可能算出X;3,有Y不可能找到另一个X'使得H(X')=Y;3.5,如果X和X'相差很小,H(X)和H(X')则完全不相关。

这东西主要用于验证信息完整性——在一个信息后面放上这个信息的哈希值,这个值很小,例如256bit,而且计算方便。收到信息之后收信人再算一遍哈希值,对比两者就知道这条信息是否被篡改过了。如果被篡改过,哪怕只有一bit,整个哈希值也会截然不同。而根据哈希函数的性质,没有人能够伪造出另一个消息具有同样的哈希值,也就是说篡改过的数据完全不可能通过哈希校验。

非对称加密:这东西很好理解——对称加密就是有个密钥,可以理解成保险箱钥匙,你把消息加密变成密文,没有人能看懂这是啥,然后同一把钥匙解密成原来的消息。

非对称加密就是有两把钥匙,一把叫公钥,一把叫私钥,用其中一把加密的话,只能用另一把解密,反之亦然。另一个重要的性质是,给你密文,明文和其中一把钥匙,你还是解不出来另一把钥匙是啥。原理基本上是基于一些困难数学问题,例如因数分解和离散对数,常用的有RSA,Diffie-Hellman和ECC(椭圆曲线),比特币用的是椭圆曲线。

非对称加密除了和对称加密一样用于信息加密之外,还有另一个用途,就是身份验证。因为通常情况我们假设一对公私钥,公钥是公开的,而私钥只有本人有,于是一个人如果有对应的私钥,我们就可以认定他是本人。其中一个重要的应用就是数字签名——某个消息后面,发信人对这个消息做哈希运算,然后用私钥加密。接着收信人首先对消息进行哈希运算,接着用相应的公钥解密数字签名,再对比两个哈希值,如果相同,就代表这个消息是本人发出的而且没有被篡改过。

以上是基础知识,至于区块链怎么实现的,很简单:

交易(数据)写在区块里。

第一个区块叫创世区块,写啥都行。

从第二个区块开始,每个区块的第一部分有前一区块的哈希值。此外,区块里的每一笔交易(数据),都有发起人的数字签名来保证真实性和合法性。于是,先前区块里的任何数据都不可被篡改,原因见上。

到这为止有人可能会问:为什么要弄个链啊?直接所有数据加个哈希值不就行了?

因为——这个数据库并不是静止的啊。

数据库的数据是会增加的,而每次增加的数据,就是一个区块,于是这些生成时间不同的区块,就以这种形式链在一起了。

至于如何增加区块,就涉及到第三个部分——共识算法。

3,区块链采用共识算法来对于新增数据达成共识。

共识算法的目的,就是让所有节点对于新增区块达成共识,也就是说,所有人都要认可新增的区块。对于有中心的系统,这事很简单,中心说什么大家同意就好了,但是放到去中心化系统里,尤其是当有些节点有恶意的时候,这东西非常复杂,计算机科学里有个相应的问题,叫做“拜占庭将军问题”或者“拜占庭容错”(BFT)。

有很多用Lamport给出的那个例子来讲BFT的东西,我在这里换一个角度。

Lamport大神当年提出这个问题的时候在斯坦福研究中心给NASA做项目,他提出这个问题的原因并不是考虑类似比特币的应用场景(整个互联网成千上万个用户),而是考虑特殊背景下的一个简单的系统——

航天飞机的控制系统。

如果有航空背景的同学可能知道,飞机有三套独立的控制系统,为什么呢?因为任何系统都不可能完全不出故障,就算飞机控制系统的故障率已经极低了,还是有飞到一半这东西坏了的可能。于是我们可以弄两套独立的系统,同时坏掉的几率就会大大降低。

可是两套独立的系统还是不足以容下一个系统的错误——一架飞机迎面飞来,两套系统一个说要躲,一个说不躲,那到底是躲还是不躲呢?所以我们需要三台独立的系统,这样,如果有一个系统有故障了,还有两台能正常工作,能少数服从多数给出正确的结果。学过纠错码的同学对这个应该不陌生,这个系统的输出之间的汉明间距是3,所以可以纠正一位的错误。

然而,对于航天飞机,在冷战的背景下,万一某个系统不是坏掉了,而是被敌人控制了呢?三套系统还够吗?

答案是否定的,因为不同于单纯只是坏掉的节点,恶意节点可以做一些别的事来阻止整个系统达成共识。

这个部分略复杂要讲的话要单开一帖,所以我们只说最简单的情况(无签名同步系统)。

我们管三个系统叫ABC,正常工作流程是三个人每次得出结果就互相告诉一下,然后每个人选多数人同意的结果。这是个没有中央节点的分布式系统,也就是说三人不能聚在一起开个会啥的,仨人只能两两通信。这个时候,假设C有恶意,它的目标是破坏这个系统。于是,假设正确的读数是1,A和B都得出了1这个结果,这个时候C这个小婊砸告诉A说“我的结果是0,B也觉得是0”,同时打个电话跟B说“哎我觉得是0,A也这么说”,于是A和B就懵逼了。假设你是A,你听到了两个不同版本的B的答案,B说自己选了1,C说B选了0,可是A这个时候没法知道B和C谁才是那个骗了自己的小婊砸,因为如果B真的告诉A选了1然后告诉C是0,他听到的结果和现在是一模一样的。

于是结论是,拜占庭容错,也就是需要容下一个恶意系统而非错误系统,需要4个独立系统。

(当然,签名可以解决这个问题,但是这只是同步系统的情况,在异步系统里这问题会变得更加复杂,原因是正常节点的回答有延迟,而恶意节点可以不回复,所以,正常节点一方面要等另一个节点的回复,但是它又不知道对方会不会回复因为对方有可能会有恶意,而在收到回复之前,它完全没法判断对方是正常节点还是恶意节点,这个问题叫异步BFT,也是BFT的最复杂的情况,这里不再做更多的解释,下文提到的BFT算法,其实都是异步BFT的算法)

Lamport提出这个问题之后,有无数的算法被提出来,统称BFT(拜占庭容错)算法,其中最有代表性的叫PBFT,然后由于最近区块链的热度,无数针对区块链应用场景优化过的BFT算法也涌现出来,但是一个重要的问题是,所有目前的BFT算法,都只能应用在小型网络里。原因很简单——因为BFT这个问题是设计给类似于航天飞机控制系统这样的场景的,早期的算法考虑的也主要是这种场景。PBFT论文里考虑的就是一个5个节点的系统。就算算上新提出的BFT算法,也最多应用在不超过100个节点的网络里。

这个问题被搁置了很久,直到比特币的诞生——中本聪从某种意义上简化了这个问题,在比特币中,同样是共识问题,中本聪引入了一个重要的假设——奖励,他之所以能这样做的原因是,他考虑的是一个数字货币,也就是说共识这个东西是有价值的。

于是在这样的系统上,他提出了工作证明机制。

所有挖矿,矿工,最长链,分叉等等等等,都可以归结为一句话:

说话是要有代价的,说真话是有好处的,说假话是要扣钱的……

这就是目前两类共识算法的核心区别:

BFT共识模型:恶意节点可以干任何事。

比特币共识模型:模型中有公认的“价值”,每个节点说话都需要一定代价,诚实节点会受到奖励,而恶意节点由于只付出代价而收不到奖励,变相受到了惩罚。

也就是说,BFT共识模型其实涵盖了比特币共识模型的场景,比特币共识其实放宽了BFT共识模型的限制。

比特币共识对于BFT的优势在于,由于给恶意节点的能力做了限制,恶意节点所能造成的破坏大大降低了,尤其是对于异步系统——BFT共识里恶意节点可以一直拒绝相应而诚实节点还需要一直等它(因为不知道它是不是恶意的),而对于比特币共识,随你便,你不响应就没有奖励可拿。于是,比特币共识算法可以应用于成千上万个节点,而且,任何人随时都可以加入,不需要预先在网络里注册自己的身份(而BFT算法里,网络中节点的数量和身份都必须是已知的)。

但比特币共识的缺陷在于,首先,得有个有价值的东西,也就是说放在比特币里这东西还行,以太坊的话现在可能也凑合,但是其他数字货币嘛……BFT共识有个严格的限定,就是恶意节点不能超过总数的1/3,然而其实比特币共识没有这样的限制,唯一的限制就是假定大部分节点都是理性的,是逐利的,也就是会采用最佳的策略来赚取最大的价值。所以,严格来说,自私挖矿这种行为在比特币共识里是允许的,而多数攻击,其实也算不上一种攻击,因为这些都没有突破比特币共识的框架——如果这个价值无限大,比特币共识是非常可靠的。然而这并不是事实,因为并不是每个虚拟货币都和比特币一样值钱,而在价值不高的情况下,比特币共识的前提就站不住脚了——当损失可能是几千上万块钱的时候,假定每个人都是理性的是合理,但是如果损失就几分钱这个假设就相当扯淡了,事实上也发生过一个比特币矿池跑到另一个货币恶意挖矿搞垮对手的情况。

此外,比特币共识是最长链共识,也就是说最长链-->大多数-->理性,于是分叉是允许的。于是导致了一些附带的问题,例如,如果网络有延迟,你怎么知道你手里那条链是整个网络里当前的最长链呢?于是,如果需要传输的数据多,那么延迟加大。延迟加大,那么越多的人手里的链并不是全网络的最长链。于是,全网络的最长链,就没法代表大多数。这就打破了比特币共识的根本,这也是为什么比特币区块频率是10分钟一块的原因。比特币目前有个著名的7币交易每秒的上限,而现在扩容闹得很厉害,以太坊的交易格式不同,也用了新的工作证明,想要改成权益证明,但这些都不本质。真正本质的是,在目前的网络条件下,如果适用全网的话,比特币共识的交易量基本上超不过100笔交易每秒这个量级。

上面这几段有可能太深了,简单来说,BFT共识和比特币共识的区别可以这么理解:

BFT共识:来,大家开个会讨论一下集思广益啊,讨论出大家都满意的结果为止。

问题:开会的效率大家都懂,人越多越不容易出结果。只能用于少数节点,用于上千个节点的话……大家想象一下一天开一次人大的场景。

比特币共识:你的诗念得不错,组织已经决定了,今天就你来当领导了,做得好有奖,做不好扣钱。

问题:奖励几千块钱还好,奖励几分钱谁好好干?

而区块链也就因此被分成了泾渭分明的两类,很多人都听过什么公有链私有链联盟链,但是,如果你们以为这是根据应用区分的就大错特错,其实,这两种区块链最本质的区别,还是因为共识模型或者说算法不同——BFT算法没法应用于大量节点,所以用BFT算法的就没法做公有链。而比特币共识得有个价值体系,这东西去做私有链联盟链就很不靠谱,因为一个单纯逐利的人的假设还算靠谱,但是如果对象是公司的话,公司的利益就太复杂了,不能简单认为他们只追逐区块链上那点价值。

1,公有链,以比特币,以太坊和所有虚拟货币为代表,都采用比特币共识,共识算法基本上都采用工作证明机制,也就是挖矿那些,这种机制其他回答里已经讲得够清楚了,就略过。工作证明一切都好,除了费电……费多少电呢?比特币的话,差不多和一个百万人级别的城市那么多。此外以太坊的创始人特别喜欢权益证明,似乎很快要小范围投入使用(100个区块里一个用权益证明)。但是目前为止,大家对这东西的可靠性还持观望态度。

2,私有链和联盟链。以IBM的hyperledger-fabric,以及一大堆其他的类似于tendermint,甚至R3 corda和ripple为代表,都用BFT共识。其实这方面的应用已经很多了,问题是,1,目前基本上所有应用给人的感觉都还是为了做区块链而区块链,真的觉得这东西好到不可或缺的应用还基本没有。2,由于为了区块链而区块链,其实很多场景的安全性和可靠性还值得怀疑,这点经常被被公有链的支持者诟病。

嘛,以上就是个人定义的区块链了,顺带概述一下现在区块链领域的发展。

之所以写这个帖子,就是因为发现明明是问区块链的问题,所有人都在讲比特币,都在讲挖矿,都在讲工作证明……工作证明不能说过时,也的确是现在公有链唯一可靠的共识算法,但是这东西确实是业界除了比特币死忠之外谁都不想要的东西好吗……

文章借阅网络总结使用

区块链是什么,如何简单易懂地介绍区块链?相关推荐

  1. 区块链入门:如何简单易懂地介绍区块链(图文)

    原标题:区块链是什么,如何简单易懂地介绍区块链? 区块链目前就处于一个人人都谈区块链,却无法感知其实际技术魅力的阶段,正是因为此,做出区块链的杀手级应用就至关重要,要做到这一点就需要进行各种场景的探索 ...

  2. 【转】区块链是什么,如何简单易懂地介绍区块链?

    作者:知乎用户 链接:https://www.zhihu.com/question/37290469 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 友情提醒:比特币 ...

  3. 区块链是什么,如何简单易懂地介绍区块链

    作者:汪乐-LaiW3n 链接:https://www.zhihu.com/question/37290469/answer/107612456 来源:知乎 著作权归作者所有.商业转载请联系作者获得授 ...

  4. BTC:简单易懂比特币之比特币的神奇——区块链技术的体现

    BTC:简单易懂比特币之比特币的神奇--区块链技术的体现 目录 BTC的七大特殊之处 BTC的七大特殊之处 1.一个没有CEO的公司,管理几十万员工: 2.每个员工自私自利,争权夺利,公司运作9年风生 ...

  5. 关于区块链的解读和简单Python实现

    概念解读 区块链几乎是数日间成为人尽皆知的名词,这个名词也勾起了我强烈的兴趣,但是通过在网上搜罗资料,多方阅读,发现很多介绍区块链的文献要么模棱两可,要么作者本身的理解也很有限,导致很多关键的问题叙述 ...

  6. 大数据、Java、Python、区块链、人工智能前景简单对比

    文章目录 前言 大数据的发展前景 Java的发展前景 Python的发展前景 区块链的发展前景 人工智能的发展前景 前言 在这个信息时代高速发展的情况下,很多人会对自己该往哪个方向发展感到迷茫,下面我 ...

  7. 【区块链】Go 实现简单区块链

    本文主要利用 Go 语言对区块链模型进行了简单的实现,通过 GoLand 创建链式结构和一个简单的 http server,对外暴露读写接口,运行 rpc 并以地址访问形式向区块链发送数据和读取数据. ...

  8. 简单介绍区块链的联盟链

    单群组FISCO BCOS联盟链 联盟链是区块链里面的一种, 简介: :区块链跟传统的B/S,C/S,项目的架构来说不同, 1:传统项目中心化(你付钱→淘宝收款→通知店铺发货→你确认收货→淘宝把钱打给 ...

  9. 如何简单快速的了解区块链技术(结尾有惊喜)

    女主宣言 "区块链"这一前沿的技术正在悄悄的改变着这个世界,比特币的疯狂已经足以证明这一概念所带来的恐怖级效应.相信未来会有更多的行业和领域会被它所影响,可是"区块链&q ...

  10. 区块链是什么?简单理解区块链

    区块链是一种由计算机网络维护的,去中心化的在线记录保存系统(即账本),世界上第一个真正可运行的区块链是2009年诞生的比特币.而在比特币白皮书中却并未出现"区块链"这一词,而是分别 ...

最新文章

  1. 如何配置Spring Boot Tomcat
  2. 6-Qt6对象树及内存管理
  3. zookeeper 源码阅读(2)
  4. MySQL 索引优化全攻略
  5. Humble Numbers USCAO chapter 3.1
  6. html怎样让列表向下移动,Html无序列表ul控件实现行上下移动.
  7. tcp丢包一定会断线吗_有遗传就一定会脱发吗
  8. 浅谈css样式(border、background、table)
  9. synchronized的使用(一)
  10. 容器技术Docker K8s 23 容器服务ACK基础与进阶-日志管理
  11. HDU4747 MEX(dp ,递推)
  12. 新冠疫情全球数据可视化
  13. watchOS7.2新增“心适能功能” 监测和分类心肺适能水平
  14. 电脑显示器连接主机 没反应 no signal!!
  15. 无线通信模块定点传输-点对点的具体传输应用
  16. 12枚硬币中取1枚假币的问题
  17. selenium 处理多浏览器测试
  18. java定义接口必用关键字_Java中定义接口的关键字是什么
  19. QT自定义精美换肤界面
  20. qiankun微应用之间、主微应用之间相互跳转方式总结与实践

热门文章

  1. html语言字体大小修改,html怎么修改字体大小
  2. excel vba 数据分析
  3. GPU共享方案 显卡无用了
  4. 2022强网杯re——find_basic
  5. win10安装打印机操作无法完成0x0000007e找不到指定模块
  6. 手动更新HomeAssistant版本
  7. codeforces-379C. New Year Ratings Change
  8. Leetcode-714. 买卖股票的最佳时机含手续费
  9. 三个线程顺序执行依次输出123123123.....
  10. Linux中E45:'readonly' option is set错误原因的分析