最近很火的区块链

1,372 阅读18分钟

最近无论是在技术论坛,还是群分享会,都在热火朝天地聊着区块链,那么今天我就自己的理解和大家分享一下什么是区块链。

不得不聊的比特币

这里写图片描述

之所以区块链突然火起来,是因为比特币在2017年年底突然暴涨,可以看到图中从11月份开始到12月份的暴涨,加剧了人们对比特币的认识,不过也因为投机的人多了,最近开始跌了。

可以点这里看看它值多少钱。

比特币其实就是一种流通于网络的虚拟货币。区块链是比特币的底层核心技术,因为对比特币关注增加,间接导致人们对区块链技术的兴趣探索。

接下来我们还是先从比特币源头聊起。

从最原始的交易谈起

问:如果两个陌生人要进行远距离交易,要怎么保证信任?

答:通过第三方——比如某宝。

这里写图片描述

买家转账给第三方,卖家发货,然后第三方付款给卖家。

这种需要第三方参与的交易模式成为“中心化交易模式”。

目前大部分的交易都是中心化模式的,比如银行转账,证券炒股,证明这种模式在现实世界确实是目前最优的解决方案,但是它也有缺点。

中心化交易模式的缺点

1.必须有个可靠的中心——如果中心不可靠,带着钱跑了怎么办?

2.中心要获取不必要的个人信息来构建信任——中心和不认识的甲乙双方也需要构建信任,这个信任就是你的个人信息(身份证,手机号等)。(而且这一过程也是一种资源的浪费)

3.受中心的制约——你给别人转帐,可能因为记帐机构放假而延迟几天到帐,可能因为记帐机构要盈利而付高额手续费,可能因为记帐机构作弊或系统崩溃而受到损失。

那么问题来了——

能否实现在不需要第三方的情况下完成交易呢?

有人就提出了一个新方案,中本聪在2008年11月1日发表了一篇论文《比特币白皮书:一种点对点的电子现金系统》,提出了一种完全通过点对点技术实现的电子现金系统,它使得在线支付能够直接由一方发起并支付给另外一方,中间不需要通过任何的金融机构。

这时候去中心化借贷模型就出现了。举个栗子——

这里写图片描述

A借了B 100块钱,这个时候,A在人群中大喊“我是A,我借给了B 100块钱!”,B也在人群中大喊“我是B,A借给了我100块钱!”,此时路人甲乙丙丁都听到了这些消息,因此所有人都在心中默默记下了“A借给了B100块钱”。

这个时候一个去中心化的系统就建立起来了,这个系统中不需要银行,也不需要借贷协议和收据,严格来说,甚至不需要人与人长久的信任关系(比如B突然又改口说“我不欠A钱!”,这个时候人民群众就会站出来说“不对,我的小本本上记录了你某天借了A100块钱!”)。

在上述的模型中,所谓的“100块钱”已经不重要了。换句话说,任何东西都可以在这个模型中交换,甚至你可以凭空杜撰一个东西,只要大家承认,你就可以让你杜撰的东西流通。

这里写图片描述

比如我在人群中高喊一声“我创造了1w个腾讯币!”,我甚至不需要知道腾讯币是什么,也不需要关心世界上是不是真的有腾讯币,只要大家都听到,然后在自己的小本本上记下“A有1w个腾讯币”,于是我就真的有1w个腾讯币了。

从此以后,我便可以声称我给了某人xxx个腾讯币,只要路人甲乙丙丁都收到并且承认了这一信息,那我就算完成了这次交易,哪怕世界上没有腾讯币。

没错,比特币也是这么来的。

甲乙丙丁就是网路上的其他结点地址。

AB君就是两个结点地址,任意两个结点发生交易都会广播给所有结点。

甲乙丙丁:我凭啥给你们记账???

你们可能会问:“凭啥你喊一句话我就帮你记?我不要面子的吗”。为了激励大家帮我传话和记账,我决定给第一个听到我喊话并且记录在小本本上的人一些奖励:你就凭空得到了50腾讯币,这个是整个系统对你幸苦记账的报酬,而你记录了这句话之后,要马上告诉其它人你已经记录好了,让别人放弃继续记录这句话,并给你自己的记录编号让别人有据可查,然后你再把我的话加上你的记录编号一起喊出来,供下一个人记账。 当这个规则定下以后,这个系统中一定会出现一批人,他们开始竖着耳朵监听周围发出的声音,以抢占第一个记账的权利。

这个就是比特币去中心化的运作机制,当全网任意结点发生交易时,都会有其他结点帮忙记账。

争取第一个记账并获得奖励的行为称为“挖矿”

  • 一般十分钟可以挖出一个区块,这个区块是1M容量大小,用来记着十分钟里的所有交易(如果没记下来的就延后)
  • 最开始挖矿奖励50个
  • 每产生21万个区块(大约每四年)挖矿奖励减半一次
  • 按上述规则计算,币总量不超过2100万个,预计2140年挖完(这也是比特币保值的原因,不会有通货膨胀的问题)
  • 最近一次减半在2016年7月9日,2017年流通的有1600万+
  • 用于挖矿的设备称为“矿机”,运作的人称为“矿工”

谁都可以说“我”有一万个腾讯币咯?

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

这里写图片描述

为了防止这种现象发生,我决定在我创造腾讯币的时候给我喊的那句“我创造了1W个腾讯币”打上标记,比如标记为001),这样以后在每一笔交易的时候,我在高喊“我给了某某1个腾讯币!”的时候,会附加上额外的一句话:“这1个腾讯币的来源是记为001的那条记录,我的这句话标记为002!”。我们再抽象一点,某人喊话的内容的格式就变成了:“这句话编号xxx,上一句话的编号是yyy,我给了某某1个腾讯币!”,这样就解决了伪造的问题。

这里写图片描述

其实上述模型就变成一个简化的中本聪第一版比特币区块链协议。

比特币的诞生

2009年1月3日,中本聪创造了第一个区块——创世区块,里面有50比特币。并附带了一句话:

“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks”,这一句话是当天泰晤士报的头版文章标题,确认了比特币的诞生时间。

这里写图片描述

甲乙丙丁:第一个由谁记帐谁说了算?

那你们又要问了,大家都说自己是第一个记账的怎么办?

于是一种新的规则——共识算法产生了。

列举两种方法:

工作量证明:我规定,只有做对一套五年模拟、三年高考试卷的第一名,才有权利记账。

工作量证明机制是算出答案很困难,但是检验答案很容易的一种机制。

比特币使用的是工作量证明,让每个想要挖矿的计算机结点先去做一道有难度的计算题,先算出来的有权利记账。计算难度大概使得需要花费10分钟才能算出来。这就是为什么前面说每10分钟挖出一个区块。

但是工作量证明的毛病是带来不必要的消耗,因为只有一个人是第一名,其他人完成的工作量都是徒劳的。

因此有人提出了权益证明:

权益证明:我规定,持有腾讯币最多且持有天数最多的人,才有权利记账。

这个也有问题,就是强者越强的问题。

工作量证明(Proof-of-Work)

挖矿的人需要求出一个随机值,使得:SHA256( 随机值 + H( 区块头 ) ) < 某目标值

这里写图片描述

系统每产生 2,016 个区块,会动态调整目标值(难度),使得每产生一个区块需要约十分钟。

难度值公式可以想象成:

新难度值 = 旧难度值 * ( 20160 分钟 / 过去2016个区块花费时长 )


目标值的计算公式可以想象成:

1.目标值 = 最大目标值 / 难度值

2.其中最大目标值为一个恒定值: 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

目标值可以想象成: 0x00000000000000000000000000000000000000000000000017268d8a21a

难度的调整是在每个完整节点中独立自动发生的。每2016个区块,所有节点都会按统一的公式自动调整难度,这个公式是由最新2016个区块的花费时长与期望时长(期望时长为20160分钟即两周,是按每10分钟一个区块的产生速率计算出的总时长)比较得出的,根据实际时长与期望时长的比值,进行相应调整(或变难或变易)。也就是说,如果区块产生的速率比10分钟快则增加难度,比10分钟慢则降低难度。

我们也可以简单理解成,比特币工作量证明的过程,就是通过不停的变换区块头(即尝试不同的nouce值)作为输入进行SHA256哈希运算,找出一个特定格式哈希值的过程(即要求有一定数量的前导0)。而要求的前导0的个数越多,代表难度越大。

区块头部结构

这里写图片描述

区块头里面包含了版本号,父块的哈希值,还有Merkle根,还有时间戳,还有难度值,还有nonce(number once,只有一次的数字,密码学专用名词)……

等等,Merkle根是什么??

Merkle(默克尔树 or 梅克尔根)

这里写图片描述

Merkle是一种二叉树,在每个区块中有若干交易,将每个交易做一次Hash0,然后每两个交易的Hash0再合并Hash1,再把两个合并的Hash1再合并Hash2……用上图举例,就是交易1和2各自哈希后再合并哈希变成Hash12,再和Hash34合并哈希变成Hash1234,再和Hash5678合并哈希变成Hash1-8……

特点:

  1. 快速比较大量数据:当两个默克尔树根相同时,则意味着所代表的数据必然相同。

  2. 快速定位修改:例如上例中,如果 N4 中数据被修改,会影响到 N34,N1234 和 Root。因此,沿着 Root —>N1234 —>N34,可以快速定位到发生改变的 D1;

  3. 零知识证明:例如如何证明某个数据(H1-8)中包括给定内容 交易6,很简单,构造一个默克尔树,公布 H1-8,H5678,H56,H6,交易6 拥有者可以很容易检测 交易6 存在,但不知道其它内容。

算力

我们最开始说了比特币这么值钱,而且谁都可以去挖矿,那我们是不是现在就可以回家挖矿了呢?

理论上是的,实际上,要考虑计算机的算力(计算能力),前面我们也说了挖矿的难度很大……淘宝搜一下挖矿机,你看到的会是这样的。

1T算力 = 1秒钟内进行1012次数的运算

但是确实有人不干别的,就挖矿,有的公司雇人专门维护这些矿机的正常运行。这些矿机的电力消耗可能就要几十万。

分叉问题

「中国上海浦东新区张衡路」上的节点和「美国纽约曼哈顿第五大道」上的节点异口同声喊出来:“我挖到区块了!里面的交易都是有效的!奖励归我!”。其他节点也几乎同时参与了对这两个区块的校验,结果发现这俩都没毛病。

这里写图片描述

这已经严重违背了区块链世界里第一大最基本原则——所有节点共同维护同一份数据。所以,为了解决这个问题,区块链世界引入了一条新的规则——

拥有最多区块的支链将被认可,较短的支链将会被直接弃掉。

我们大伙都知道挖矿的过程存在巨大的工作量,并且在计算机的硅基世界里,不可能出现所谓 “同时” 的概念,哪怕纳秒的差别,那也总是会有先后顺序。所以理论上,“分叉”的这种僵局很快会在下一个区块被挖掘出来(以及校验区块)的时候被打破,实在不行下下个,或者下下下个……总之机制可以让整个分叉的区块链世界迅速稳定下来。

这里写图片描述

另外,同一时间,较短分支上的区块会立即丢弃,而里面的交易也会随之释放出来,被重新标记上“未确认”。

双花问题和51%攻击

从前,有一个很有钱也很聪明的人——X-Man,他说:“

我是X-Man,我很有钱,拥有一个强大算力的计算机群。

我先从某个区块创造了一条独立的含有多个区块的链条,然后里面记录着我转给自己1000个比特币。

这条独立的区块链先不广播给全网。然后我找到张三,给了他1000比特币买他1000万人民币,

当这笔交易被三次确认后(三个区块被挖出),张三给了我1000万。

这个时候我再把我独立的区块链条广播出去,我的链变成了最长链,我和张三的交易就被弃掉了,但是我却拿到了他的1000万。”

这里写图片描述

这个就是双花问题——即利用系统漏洞来使得货币重复花费。

X-Man的想法确实可行,但是他的计算机群要对抗的是全世界的计算机,除非 X-Man 拥有全网 51% 的算力,否则构想不可能实现。这就是51%攻击,拥有51%算力已经是不太可能的事情了。

但即便 X-Man 真拥有全网 51% 的算力,在真实世界中,用这 51% 算力做其他事(比如挖矿或者其他算力服务)都比攻击比特币系统划算。

说了那么多,区块链到底是什么?

区块链(Blockchain)是一种防篡改、共享的、可追溯的分布式账本数据库技术

防篡改:单点的修改,必须通过其他多个节点共识认可后,才能成功 可追溯:区块链账本,只允许写入,不允许删除 共享:账本对参与节点透明

这里写图片描述

为什么叫“区块链”?

比特币网络里,每十分钟诞生一个新的区块,区块里打包了网络里最近十分钟内产生的交易。某一个矿工做Hash运算获得这个区块的记录权,同步到其他矿工节点去。

每个区块都添加在上一个区块的后面,形成一条长链条,所以称为“区块链”。

这里写图片描述

区块链的技术分类

公有链: 1、无官方组织及管理机构维护 2、所有节点权限一致 3、自由加入和退出

典型应用:比特币、以太坊

(公有链有它的价值,但是太极端了,于是产生了稍微弱中心化一点的联盟链。)

联盟链: 1、由若干机构联合进行发起和维护 2、节点权限通常是混合型 3、通过授权加入和退出

典型应用:腾讯区块链(trustSQL)

区块链应用价值举例——公益寻人

公益寻人平台众多,就鹅厂都不止如下:

这里写图片描述

存在的问题:

同步不及时 重复报案 & 多方撤案 解决方案:使用区块链让大家共用一个链条,信息同步快,一方报案,多方广播。

这里写图片描述

区块链游戏价值举例——以太坊撸猫

这里写图片描述

最近在币圈,有一款撸猫的游戏在网络也很火(我们之所以没有感觉到是因为这是个土豪的游戏,我们玩不起)。

如何开始玩:玩家用ETH作为“货币”来买卖猫,先去市场上买一只猫。先挑便宜的买,买猫需要手续费(为了防止以太坊区块链拥堵)。

这里写图片描述

买了两只后:就可以让它俩生小猫。每只猫都有256个属性,控制着毛色、花纹、胡须、牙齿等等,可以理解成256种不同的基因。两只猫繁殖的时候,基因以一定的概率遗传。基因也会突变,如果遇到基因突变,就会生出奇形怪状的小猫。

这里写图片描述

这些小猫由于基因突变,往往能卖出高价。

每次生完小猫后,父母就会进入Cooldown模式,必须“恢复”一段时间才能继续繁殖小猫。每只猫恢复的时间有长有短,而且越生得多恢复的时间就越长。恢复时间长短也是影响猫价的一个因素。

如果只有一只猫,想跟别人的猫配种,也可以到市场上看看。玩家1可以标一个“配种价”,玩家2如果想配种,需要支付给玩家1这个价格,生下来的猫归玩家2所有。基因优秀的猫可以在配种市场上标个高价。

配种成功后,生育也需要一段时间(几个小时不等)。小猫出生后,就可以在My Kitties页面看到新出生的小猫。

每只猫都有Gen标识,Gen 0表示这是创世猫,Gen 1是第一代,Gen 2是第二代,以此类推。每隔大约15分钟,会产生一只Gen 0的创世猫,并通过合约自动拍卖,拍卖所得进入开发商的钱包。

区块链撸猫和云撸猫有啥区别?

最大的区别是,游戏规则确立后,你的猫永远是你的猫,开发商无权也无法剥夺任何人的猫。而云撸猫是一个中心化的游戏,所有的猫都登记在开发商的数据库中,开发商可以随时篡改、剥夺任何人的猫,开发商也可以任意给自己创建高价猫。想想看,在线游戏中的道具不过就是开发商自己创建并拿来出售的数字资产,没有任何方式可以保证开发商不作弊。


Refrences:

《区块链是什么,如何简单易懂地介绍区块链?》- 知乎

《区块链(Blockchain)和比特币(Bitcoin)是什么关系?》- 知乎

《比特币》-维基百科

《分布式一致性与共识算法》

《揭秘比特币和区块链(一):什么是区块链?》- InfoQ

《深度解读区块链撸猫》- 廖雪峰

《工作量证明 | Proof Of Work》- 《 Bitcoin Developer Guide》中文版