最近区块链大热,走到哪儿都有人在讨论区块链和比特币,甚至于一些对密码学完全没有概念的人都开始大肆吹捧,不免让人嗤之以鼻。相信很多技术和非技术的朋友都希望能够更深层次地去了解它是如何工作的。本文将用不到四千字来尝试阐述区块链的实现原理:

为什么需要区块链这么复杂玩意儿?

For every complex problem there is an answer that is clear, simple, and wrong.” — H. L. Mencken

在这里不尝试去给区块链一个准确的定义,而是通过区块链可以被使用的地方去分析和深入理解这项技术可能给世界带来的改变。

可以想象一个场景,你的朋友Joe在国外旅行,在旅行将要结束的第五天,他打电话给你说自己需要借点钱。你在接到电话之后会通知银行进行转账到Joe的指定账户,银行客户经理审查你的账户余额是否足够之后打钱给指定的Joe的账户。然后银行会产生一条转账记录:

​ 在打帐成功之后,银行通知你钱已经转账到位然后你会通知Joe打帐成功让其确认。

这样的转账方式是我们目前乃至几个世纪之前一直使用的,我们需要一个第三方机构进行担保,才能在彼此之间建立一种信任。但是这样的方式往往机构是单一的,也就是说如果这个第三方机构产生腐化,那么造成的影响也是巨大的(金融次贷危机的屡次发生),这就需要很多的人力去维持机构的工作以及政府的有力监管(政企腐败难以监管)。同时还会面临可能出现的几个问题:

  • 如果这个第三方机构的数据在一次火灾中被烧毁或者数据库数据直接被篡改。
  • 又或者客户经理(第三方机构)在转账数额上动手脚,客户可能根本无法感知到(可以关注相关新闻)。

多年以来我们都将所有的鸡蛋放在第三方机构,并且建立了一种习惯上的信任。

那么我们是否可以自己去建立这种信任,而不是通过第三方…….

所以,区块链是如何工作的?

要达到不通过第三方的目的,我们需要聚集这些志同道合的人形成一个团队,以某种方式在内部建立一种信任机制。

一个空的文件夹

现在我们发给每个人一个空的文件夹,这个团队内部所有的交易都会被写到各自的文件夹中,这些所有文件夹的集合共同建立了一种信任机制。

发生转账事务

每个人都配有一支笔和空白页,当团队内部发生转账交易时,会记录在自己的纸上,纸张满了会将其存入文件夹。那么我们假设#2想转10美元给#9,然后2号大喊一声:“我要转10块钱给9号,所有人都写下这笔记录”。

然后每个人都去check一下2号是否有足够的钱去支持这笔转账,如果有的话每个人都写一份记录在自己的纸上。

持续产生转账记录

通过这样的方式团队中每个人想转账就喊一声让其他人记录下这次转账记录,假设一张纸可以写十条记录,那么十条记录写满之后就需要将这张纸存进文件夹,然后拿出一张新的纸开始循环第二步。

在我们将写满的一页加入文件夹时,我们需要考虑一个问题如何保证这张被记录的纸是可信任的(所有的记录都未被篡改,所有人的纸张内容不一定一致,即使通过非对称加密保证通讯的加密性也不能保证每个节点都是忠诚的为这个分布式系统服务),那么我们需要给这张纸的内容盖一个印章。盖这个章的目的:

  • 保证团队所有写入的记录都是未被篡改而且一致。
  • 保证团队从文件夹取出的历史记录未被篡改。

如何去进行签章

以前我们通过第三方/中间人建立信任,无条件信任第三方。在区块链这样的分布式和分散系统中,这个印章将会提供信任。在进行签章之前我们需要了解hash算法:

Given an output, it is extremely difficult to calculate the input, but given an input and output, it is pretty easy to verify if the input leads to the output.

  • 无冲突。任何一个a通过hash算法能生成一个唯一对应的b。
  • 不可逆。任何一个a通过hash算法生成的b是不可逆的,也就是知道b不能推出a。

那么我们可以用一种box的概念来描述这种算法:

一个input对应一个output,现在我们可以假设我们要得到的结果必须以三个零开头,得到这样的结果集算成功。

然后开始不停地计算和重试,挖矿的过程就是计算签章的过程,实际的过程比这更复杂,但是可以用这种方式类比。

经过无数次尝试可能得到结果:

大专栏  WTF is The BlockChain?进行签章?">如何利用hash算法去进行签章?

在hash算法的基础之上,我们需要关联纸张中的内容,通过下面的算法得到签章:

矿工帮我们计算好的到的签章数字为“21191”:

然后我们将签章通知团队中所有的人,他们会各自验证,这个签章的值+纸张内容值的hash结果是不是符合000开头的标准。只要大多数通过,那么这个数值有效,挖出这个数值的矿工会获得相应的奖励,最后所有人都签上这个签章,然后将记录存储在文件夹中:

在矿工工作的过程中,也可能产生欺诈行为,错误的签章数字不能通过团队其他人的校验。其他人如果内容记录被修改过也不能通过校验,这样就保证了被存储的记录永远是可信任的(通过大多数人一致的原则保证)。在挖矿的过程中会消耗“燃料”,这个成本和电力的消耗是巨大的,团队中每个人必须签上章,签章校验不过可能的原因:

  • 节点可能误听了网络中的交易。
  • 节点可能错写了网络中的交易。
  • 节点可能试图盗取或者欺骗网络中的其他节点。

当然无论出于何种原因,校验不通过的节点只能从其他节点中拷贝一份账本到自己的文件夹中。

为什么要建立一种竞争机制

我们可能有个疑问,为什么花费大量的资源去计算这个签章值,建立在竞争机制下的计算出了第一个算力的结果值是有效的。其他的算力都是在产生浪费,之前新加坡一家区块链公司针对比特币产生的大量资源浪费提出了分块计算进行资源利用的优化,但是并没有消除这种竞争,那么我们为什么需要这种竞争?

这就是我们需要了解的激励机制,每个区块链中的节点都可以去竞争这个奖励。第一个计算出来签章的会获得一定的奖励(在消耗大量cpu和电力资源的前提下)。

假设五号计算出了这个签章值,它会获得这个奖励可能是1bitcorn,它的账户余额也会相应增加。这就是比特币以及大多区块链一致存在的原因,不断会有新的节点加入挖矿,成为分布式账本中的一员参与竞争。只有足够多的节点加入,这个区块链才能建立一种更为健全的共识机制。

当有足够的人拥有比特币时,他们的价值就会增长,使其他人想要比特币;使比特币进一步增长;使更多的人想要比特币;使其进一步增长;等等

激励机制使网络中所有节点都在努力工作。

在此之前我并没有提到过一个问题,想象一下如果我们现在的文件夹已经存储了五页纸张,都被签上了各自的签章。那么如果我找到第二页并且企图去修改一次交易信息?签章会保证这次修改再取出的时候被检测到被修改对吧?但是如果我同时计算一个新的签章,并且替换掉旧的签章呢,我可以修改一个就可以修改网络节点中其他的节点,当超过百分之五十的节点都被篡改了签章,那么这页数据也就被成功篡改,网络的共识机制无法感知。所以我们的区块链设计有漏洞?

如何防止签章被篡改

我们其实很容易想到,在上面产生签章的模型中我们用了页面的内容和一个未知值作为input,实际上如果要防止签章数字被篡改。我们可以在input中增加一个数值,将上一页的签章数值作为这一页数值计算的输入:

当我们通过这样的方式将每一页的数据关联在一起的时候,如果有人试图去篡改某一页的签章,那么它需要篡改之前连续很多页的签章和内容,这样的代价是极大的,修改一个节点数据的代价是完全创造一份新的数据,然后为了破坏共识机制还需要修改网络中大于一半的节点数据。

也就是说基于现在区块链的设计,你需要不断去产生新的区块,篡改节点全部的数据,通过计算不断去篡改,但是一个人的篡改速度远远没有其他节点继续计算和不断回写数据的速度。即使是针对同一个节点,最长的链也永远是最可信的:

Longest chain is the honest chain.

绿色的部分是篡改者企图想要开启的一条篡改的链路,红色的部分是正常发展的链路,下面的链路计算能力永远大于上面链路的计算能力,基于共识机制团队中大部分人都是诚实的。

团队中超过半数的人不诚实?

这就是区块链如果可能会崩溃的唯一脆弱的原因。 要知道,这是不太可能发生的,但我们都必须知道系统的弱点。 它建立在大多数人群总是诚实的假设之上。

总结

本文希望给大家一个对区块链较为深入的了解。区块链是如何达到去中心化的目的的,明白了共识机制以及共识机制的基本条件,我们可以尝试去理解区块链能够如何改变我们的生活。其实不难发现,区块链的设计并没有那么复杂,将所有的节点理解为区块,每个区块都是链接起来的账本数据。

向创造区块链思想的中本聪致敬,我们需要从不同的角度去思考现在的生活,正如乔布斯所说,世界上没有一种设计是理所当然的。也许有一天我们不再需要键盘来操作电脑,于是苹果设计了触摸板,至今没有用过比这更有创意的快捷操作。

最后,希望我们都能想孩童一样去思考,创造一个不一样的世界。

WTF is The BlockChain?的更多相关文章

  1. 区块链(Blockchain)

    一 .什么是区块链? 区块链(Blockchain)是由节点参与的分布式数据库系统[1],它的特点是不可更改,不可伪造,也可以将其理解为账簿系统(ledger).它是比特币的一个重要概念,完整比特币区 ...

  2. (转) WTF is computer vision?

        WTF is computer vision? Posted Nov 13, 2016 by Devin Coldewey, Contributor   Next Story   Someon ...

  3. WTF Forms – 使用 CSS 实现用户体验更好的表单

    WTF forms 借助 CSS 提供友好的 HTML 表单控件,专为 IE9+ 以及最新的 Chrome.Safari 和 Firefox 浏览器.以文件输入控件的改进,使用 label 包裹在 i ...

  4. BitCoin - BlockChain

    BitCoin 比特币, 参考: BlockChain 区块链, 参考: 参考

  5. WTF,这到底是在做什么?

    1 <?php 2 $data = "<soap:Envelope>[...]</soap:Envelope>"; 3 $tuCurl = curl_ ...

  6. Ubuntu配置Open BlockChain

    /* 以前只是听说过BlockChain,没怎么了解过,最近导师在搞Blockchain,让我配一下Open BlockChain的环境,于是就硬着头皮配了一下,还挺顺利的. 由于没接触过BlockC ...

  7. Blockchain概述--转

    编者按:著名投资人 Fred Wilson 的同事 Joel Monegro 近日参加了纽约比特币 workshop HackBit聚会,其间他们讨论了比特币式的思维方式对未来十年世界的影响,而这种影 ...

  8. BlockChain:Py实现区块链简单场景应用:程序猿记录在区块里的收入记录图——Jason niu

    # -*- coding: utf-8 -*- ''' Created on 2018年3月11日 @author: Jason niu ''' import hashlib #该模块实现了诸多安全哈 ...

  9. project3 blockchain

    [概念] 做服务的时候main里面不能单独有东西,都得包起来. Identifier expected是因为没有main函数 雾草,task3还要加proxy, add再干别的.难受!妈的,什么代理模 ...

随机推荐

  1. 新年在家学java之基础篇-高级类的特性

    继承 extends 子类的共性代码都是继承自父类的,每个子类只要写自己特有的代码 class 子类 extends 父类 继承提高了代码的复用性,提供了多态的前提,但是不要为了某个功能去继承 子类不 ...

  2. AUTOSAR-Specification of Watchdog Manager 阅读

    一.开门狗管理有三种机制 1.定周期任务实时监控 2.非定周期任务执行时间监控 3.逻辑监控,执行顺序. 二.受监控的实体和检查点 Watchdog Manager监督软件的执行.监督的逻辑单位是受监 ...

  3. 你知道你对 JSON Web Token 的认识存在误解吗

    1.前言 JSON Web Token (JWT) 其实目前已经广为软件开发者所熟知了,但是 JOSE (Javascript Object Signing and Encryption) 却鲜有人知 ...

  4. JS中的7种设计模式

    第九章Refactoring to OOP Patterns 重构为OOP模式 7种设计模式: 1,模版方法模式(template method) 2,策略模式(strategy) 3,状态模式(st ...

  5. spark mllib lda 中文分词、主题聚合基本样例

    github https://github.com/cclient/spark-lda-example spark mllib lda example 官方示例较为精简 在官方lda示例的基础上,给合 ...

  6. 吴裕雄--天生自然python学习笔记:python 用pygame模块基本绘图

    绘制几何图形是游戏包的基本功能,很多游戏角色都是由基本图形组合而成的 . 绘制矩形: pygame.draw.rect Pygam巳绘制矩形的语法为: 用基本绘图绘制一个人脸 用基本绘图功能绘制人脸 ...

  7. LeetCode No.88,89,90

    No.88 Merge 合并两个有序数组 题目 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 ...

  8. springboot学习笔记:12.解决springboot打成可执行jar在linux上启动慢的问题

    有时候,当你把你的springboot项目打成可执行的jar,放在linux上启动时,发现启动超级慢: 这往往是因为springboot内置tomcat启动时实例化SecureRandom对象随机数策 ...

  9. Spring Boot Admin最佳实践

    本文不进行Spring Boot Admin入门知识点说明 在Spring Boot Actuator中提供很多像health.metrics等实时监控接口,可以方便我们随时跟踪服务的性能指标.Spr ...

  10. jenkins-自定义工作空间目录