区块链-BlockChain(完结)

最近大家可能被区块链的推送推的烦了,不只是“区块链”,还有这些名词:“炒币”、“挖矿”、“矿工”、“区块链”、“ICO”等。也许由于之前的勒索病毒的影响太大,使得它将用于其支付的比特币推向了白热化,各大媒体都去谈论比特币是什么,“区块链”技术渐渐从极客圈向大众圈扩散,加上比特币汇率的变化(截至写这篇博客BTC/CNY:86655.16),更让其走进了投资圈。我写这篇博客或许也是在蹭热点,但请往下看。

为什么写这篇博客

两片有意思的文章

我想往常一样浏览着文章,看到一个标题《区块链微信》(发布于woshipm.com,作者@A.J.软软熊),看着着实有意思,大概是微信像是一系列账本,再结合区块链技术得到一个不一样的分布式程序,作者还取了个名字BWeChat(BlockChainWeChat,区块链微信)。有趣归有趣,但看不太懂,因为很多专业名词之前都没听过,也不知道为啥区块链微信会有这些东西,这只能去看看区块链是什么才能够明白一点,于是我想着该去了解一些再来看看,理解了肯定更有意思。

我大概是个猫奴,虽然我没有猫(我一定会有个猫的)。“云养猫”是之前网上为了调侃没有猫却喜欢猫而且还撸不到现实中猫的人,比如说我,这里套用“云”,因为我们这类人喜欢看猫的图片、动画、视频,都是别人的猫。你可能以为我跑题了,不,并没有,我是为了引出我接下来要说的事(知识点,记下)。上文说到的“云养猫”大概属于低层次“云养猫”,来说说区块链养猫吧。也就是看到的第二篇文章《区块链养猫,我们时代的一个不和谐的符号》(发布于woshipm.com,作者@joeycidic),文中说到这是有Axiom Zen工作室开发的虚拟宠物养成社区游戏,玩家在区块链上买虚拟的猫,互相或者和别的玩家的猫进行繁殖,每只猫有256种基因,基于一定的算法,可以遗传到下一代。基因的组合和传递是不透明的,这吸引的玩家乐此不疲的买猫和生仔。太有趣了!我也要买一个!于是看了下价格,最贵的猫10万美元,均价130美元,我可能不适合这个游戏。文中介绍到这是一个有现金投资和收益的游戏,在用户能持续消费(生小猫)和交易(购买猫)的前提下,区块链猫变成了一种能产生现金流回报的资产。这片文章没过多说区块链的原理,包含哪些东西,而是主要来介绍这个游戏,因此比上一篇文章容易取看懂,这里介绍的多一点(或许是因为是说猫的我没刹住车),其实还有很多内容,这里就不赘述了,文末会放链接。

一本区块链的书

想去完整的了解一个东西,得找到合适的渠道。于是找到了《区块链:定义未来金融与经济新格局》(作者:火币网 张健),这是一本深入浅出,科学严谨的区块链专业著作,张健是火币技术副总裁、国内领先的区块链查询及数据服务平台“Qukuai.com”创始人。想从网上找到合适的书籍并不容易,看完这本,还是比较喜欢的,这本书涉及的领域非常宽泛,对于技术的深究还得去多学习,但去了解个大概,这本书是再合适不过了。这篇博客所涉及的区块链介绍及应用大多来自这本书,因此可以看出是对这本书的整理,文末会放上写这篇博客的思维导图。或许我也该把博客名字改成“一文看懂区块链”来博得大家的眼球,这太放肆了,只能算的上名词解释,不敢造次,因为自己还没明白。这篇博客的定位是一篇读书记录、一篇书籍的推荐文、一篇满足自己好奇心的文章。

微信公众号的推送

这个模块是有顺序的,先看到有趣的文章,再去了解,最后是接收到关于区块链的公众号推送。乍一看,很想是AI智能推荐,你在看什么,我就给你推送什么(这里只是顺带吐槽)。我确认我使用的是两个不同的软件,不同的账号,二者没有任何关联,另外公众号的推送属于全投放,大多数阅读类公众号为提高阅读量,并不会将消息推送给特定用户群体,而且也不知道我平时干了啥,于是得出结论,是最近区块链过热了(以上说的都是屁话)。刚刚经过一波毫无意义的分析,得出了一个早就显现的结论,我们为作者(安阳)鼓个掌增加其创作的动力,然后作者准备说正文了。微信公众号推送的关于区块链的文章太多了,开始我也看,后来我发现大多就那几个版本,就说什么区块链技术、数字货币的本质,还会配上“一文看懂区块链”,“你真的了解区块链”等等等等的标题(这个上节有提到过,毕竟很多标题党都这么来欺骗无知的少年,我就被套路过不下N次),再尴尬的是好几个公众号(小规模)推送的内容是一样的,以阮一峰系列为主,因此看一两个就够了,别浪费自己时间。当然也不全是,有的知名的公众号还是会出一些分析报告,像是目前国内哪些公司使用区块链以及其应用,这些还是可以的。是真的被推烦了,就怕自己手贱再去点开,于是,我决定自己也要写一篇!然后点我自己的。如果能找到那些公众号的作者我就把他们拉个群然后把我的文章链接发给他,一天发两次,最好还能@全体。(突然扯了好多,我是要介绍区块链的男人啊!罪过罪过)

区块链和其相关的概念

区块链的定义

关于区块链的定义网上有很多了,这里抛几个。

狭义来讲,区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构, 并以密码学方式保证的不可篡改和不可伪造的分布式账本。
广义来讲,区块链技术是利用块链式数据结构来验证与存储数据、利用分布式节点共识算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算范式。–百度百科

区块链(这里特指比特币区块链)的本质是一种去中心化的记账系统,而比特币正是这个系统上承载的“以数字形式存在”的货币。 –《区块链:定义未来金融与经济新格局》(以下简称《区块链》)

区块链或者说比特币什么时候出现的呢?这里有一个背景,2008年9月,金融危机在美国爆发并席卷全世界。同年10月31日下午,在一个普通的密码学机构邮件列表中,几百个成员均收到了自称是“中本聪”的人发送的电子邮件。他在邮件里描述了一个全新的,不依赖任何机构、政府,完全网络化的货币体系。一个月后,中本聪放出了比特币系统最原始的版本。

去中心化、竞争记账、POW

区块链诞生了,不管从哪里看到的定义,都有一个核心的概念—去中心化。在我们现在的生活中,为了保证所记录的数据是唯一的,比如说账本,因此就导致了记账是一种天然的中心化行为。这样的例子还有很多,我们在办理某个事情的时候,经常需要开一些证明,证明我是我(公安局里证明)、证明我有这么多钱(银行系统),证明婚姻关系(民政局)等等,我们有很多第三方组织或机构来证明我们以及我们所拥有的存在,而这些不过只是数据库里的数据罢了。我们可以看到这些中心化的记录方式有显而易见的弱点:一旦这个中心出现问题,如被篡改、被损坏,整个系统就会面临危机乃至崩溃,到那时我们还存在么?因此我们能不能构建一个不依赖任何中心或者第三方但可靠的系统呢?事实上,这比想象的要复杂的多(以记账为例),账本数据存储要去中心化(所有的参与方都平等地拥有保存账本的能力),记账行为去中心化(参与方平等的拥有记录账务数据的权利)。这就出现了一个悖论,不同节点缺乏信任的前提下数据的一致性难以保证。

这个看似不可能解决的问题,由区块链解决了。从字面意思,区块链就是由区块组成的链条,《区块链》有一个比喻,如果区块链是一个账本,那么区块就相当于账本中的一页。当前时代负责记账的自然是计算机,每个计算机就是一个节点,每个节点竞争记账(以每个节点的计算能力来竞争记账权的机制),这就是区块链的架构设计。计算能力(算力)只能决定赢得的概率,就像你买多张彩票可以增加获奖的概率,但你不一定会中奖。区块链通过“工作量证明(Proof Of Work,POW)”来实现竞争记账,你完成了该做的工作量(一般是一个人人都可验证的结果),那你就可以记账了。

在中本聪的设计里引入竞争的同时解决了货币发行的问题,每轮竞争胜出并完成记账的节点会获得系统给予的比特币奖励。比特币生产总量被限制在2100万枚,总量一定,这个像是黄金开采过程,于是被人们称为“挖矿”,干这活的就是“矿工”了。

共识机制与价值载体

有那么多的节点,在去中心化的结构中如何保证你的记录被其他所有节点认可呢?这里要说到两个关键,共识机制与价值载体。传统的中心化结构中,系统的共识有中心决定,参与方服从即可。去中心化的结构中,可就没这么简单,比特币区块链通过工作量证明来实现共识机制,大家一起竞争,满足条件即可记账,反之不满足条件的记录是不被大家认可的,这里的条件是大家都认可的结果(目前是采用通过哈希计算的值以多少个0开头,这里只是简单的提一下,肯定没说的这么简单),这样大家就达成了一致(可以看出区块链制造的是信任)。区块链的发展潜力体现在这个系统上所能承载的各种价值形式,说的有点迷糊,其实就是区块链不仅可以记账,对于任何可以用数字定义的资产都可以在区块链上记录,如今我们是信息时代,我们存在的证明大多都是数字了,那么我们就可以以数字形式进行价值存储或转移任何东西。

智能合约

智能合约的理念可以追溯到1994年,几乎与互联网同时出现。智能合约就像是一段逻辑代码,类似我们经常写的if…else,当发生什么情况而执行该情况下的代码,这个对我们来说很好理解,好歹是个程序员啊。我们现在会用合同来制定双方该各自遵守的条件,纸质合同也好,电子合同也好,都是需要人来去执行的,如某一方违约,那么按合同上的条款来执行。而智能合约就是把合同以代码的形式搬到区块链上,不需要任何人来监督执行,出现问题会触发条款自动执行,只要先预编好执行代码就行,这个交易智能化的以后一定会产生巨大影响。目前的比特币的脚本语言并不是图灵完备(图灵不完备的语言常常是因为循环或递归受限,无法实现特定的数据结构,可写的程序有限<可以看看网上的介绍>)的,所以在扩展性上比特币区块链所支持的资产定义和交易模式还比较有限,因此,业内有些人开始尝试开发支持图灵完备脚本语言的区块链,其中以太坊(Ethereum,可以自己去查一下,数字货币市值排名第二)就是个典型的例子。

区块链技术原理

区块链中的密码学

在比特币区块链的整个体系中大量使用了公开的加密算法,比如Merkle Tree哈希树算法、椭圆曲线算法、SHA-256哈希算法、对称加密算法以及一些编码算法,如Base58编码、Verlnt编码、DER编码等。

这里说几个。比特币使用了基于secp256k1椭圆曲线数学的公钥密码学算法,它包含公钥和私钥,交易发出方用私钥进行签名,并将签名与原始数据发送给整个比特币网络,网络中所有节点则用公钥对交易有效性进行验证。签名算法保证了交易是由拥有对应私钥的人所发出的,核心就在于证明数据是签名者发出的、不可抵赖的,不是待签名数据本身的保密性。再说一个SHA-256哈希算法,SHA是安全散列算法(Secure Hash Algorithm)的缩写,是一个密码散列函数家族,由美国国家安全局(NSA)设计,美国国家标准与技术研究院(NIST)发布的,包括SHA-1、SHA-224、SHA-256、SHA-384和SHA-512五种变体,主要用于数字签名标准,其中SHA-256是输出值为256位的哈希算法。

区块链组成

区块链数据由地址、交易、区块、网络组成。比特币用地址来表示标识一笔交易的支出方与接收方。交易最终需要被记录到有区块确认并完成的统一的账本上,每一个区块的产生都会被打上时间戳,最终生成的就是交易证明了。可以这么理解,所有的交易记录都是一条数据,也就是交易凭证,你所含有的资产其实也就是一条记录,只是大家都认可。每个独立节点之间又通过比特币网络来建立联系,这样就组成了一个去中心化的、分布式的电子交易记录时间戳服务器系统。

地址

地址其实是公钥的另一种表现形式,可以理解为公钥的摘要。生生过程如下:

  • 1.生成椭圆曲线私钥与公钥。
  • 2.将公钥通过SHA-256哈希算法处理,得到32字节的哈希值。
  • 3.对于得到的哈希值,通过RIPEMD-160算法来得到20字节的哈希值——Hash160。
  • 4.把由版本号+Hash160组成的21字节数据进行双次SHA-256哈希运算,得到的哈希值的前4字节作为校验和,放置在21字节数据的末尾。
  • 5.对组成的25字节数组进行Base58编码,就可得到地址。

交易

关于交易。中本聪的白皮书里,比特币被定义为一个链式的数字签名串。每一位电子货币的所有者通过这样的方式将它转移给下一位所有者:对前一个交易和下一位所有者的公钥签署一个数字签名,并将这个签名附加在交易的末尾。收款人通过验证签名,就可以验证电子货币的所有者链条。交易的本质是一个包含交易发送方、接收方、资产转移等相关信息的数据结构,其数据结构如下:

  • 版本(version),这笔交易参照的规则,4字节
  • 输入数量(IN-counter),交易输入(TxIn)列表的数量,1~9字节
  • 输入列表,一个或多个交易输入,大小不定
  • 输出数量(Out-counter),交易输出(TxOut)列表的数量,1~9字节
  • 输入列表,一个或多个交易输出,大小不定
  • 锁定时间(Lock time),4字节

UTXO

UTXO(Unspent Transaction Outputs)结构。UTXO是未花费的交易输出,这是比特币交易生成及验证的一个核心概念。比特币规定每一笔新交易的输入必须是某笔交易未花费的输出。至此,比特币的交易输入有3种:标准输入、花费挖矿奖励、产生挖矿奖励(上文说到,对于记账成功的节点会获得比特币奖励)。

脚本

脚本是交易里另一个比较重要的技术。每一笔交易的每一项输出,严格意义上讲并不是指向一个地址,而是指向一个脚本。脚本类似于一套规则,它约束着接收方怎样才能花掉这个输出上锁定的资产。目前常用的比特币脚本主要分为两种,一种是普通的P2PKH类型(Pay-to-Public-Key-Hash),即支付给公钥的哈希值是地址,接收方只需要使用地址对应的私钥对该输出进行签名,即可花掉该输出。另一种是P2SH(Pay-to-Script-Hash),支付脚本的哈希值。拿多重签名来举例,它要求该输出要有N把私钥中的M把私钥(M≤N)同时签名才能花掉该资产,它类似于现实生活中需要多把钥匙才能同时打开的保险柜,只是更加灵活。
比如在比特币中,P2PKH的脚本规则如下:

Pubkey script:OP_DUP OP_HASH160 <PubkeyHash> OP_CHECKSIG
Signature script:<sig><pubkey>

P2SH脚本规则如下:

Pubkey script:OP_HASH160 <Hash160 (redeemScript) > OP_EQUAL
Signature script:<sig>[sig][sig...] <redeemScript>

这个脚本我也不懂,放出来给大家观赏,可以看出P2SH中多重签名的概念,脚本执行很类似于Java执行再JVM中,”VM”来解析指令。脚本的存在,近实现了区块链可编程。但是,比特币区块链的脚本机制相对简单,是非图灵完备的,目前以太坊实现了一个支持图灵完备脚本语言的区块链平台。

区块

区块结构如下(Merkle Tree基本特点请百度):

  • 魔术码:固定值0xD9B4BEF9,4字节
  • 区块大小:用字节表示该段之后的区块大小,1~9字节
  • 区块头:包含6个字段,80字节(由4字节的版本、32字节的上一个区块的哈希值、32字节的Merkle Root Hash、4字节的时间戳、4字节的档期难度值、4字节的随机数组成)
  • 交易数量:交易列表长度,1~9字节
  • 交易列表:记录到区块的交易信息列表中,大小不定

网络

比特币网络的相关功能如下:

  • 1.新交易广播(使用洪水算法Flooding,是时候把大学的课本搬出来了)到全网的节点,每个节点会收到交易消息。
  • 2.每个(挖矿)节点将新交易收集到节点的内存,并组装成区块。
  • 3.每个(挖矿)节点都尝试在自己的区块中找到一个具有足够难度的工作量证明。
  • 4.(挖矿)节点找到一个工作量证明,把有效的区块数据向全网进行广播。
  • 5.当且仅当包含在该区块中的交易都是有效的,并验证其完成了工作量证明,其他节点才认同该区块的有效性。
  • 6.其他(挖矿)节点表示接受该区块,并在该区块的末尾制造新的区块以延长整个区块的链条。

共识算法

毕竟是个去中心化的系统,得保证整个P2P网络数据是一样的,还得保证对大家都是公平的,那就得有一套规约,也就是大家都遵守的协议,这里叫共识算法。两大核心:工作量证明与最长链机制。

工作量证明

工作量证明(POW)可简单地理解为一份证明,用来确认你做过一定量的工作。说说比特币网了中的POW,如果想生成一个新的区块并写入区块链,则必须解出比特币网络出的工作量证明的迷题。这道题的3个关键要素是工作量证明函数、区块及难度值。其中难度值是用来调控的,就是在不管你有多大的挖矿能力,新区块的产生速率都保持在10分钟一个。计算公式如下:

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

另外POW需要有一个目标值,极计算公式如下:

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

其中最大目标值为一个恒定值:0x00000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,目标值的大小与难度值成反比,比特币工作量证明的达成条件就是矿工计算出来的区块哈希值必须小于目标值

解题步骤大致如下:

  • 1.生成coinbase交易,并与其他所有准备打包进区块的交易组成交易列表,通过Merkle Tree算法生成Merkle Root Hash。
  • 2.把Merkle Root Hash及其他相关字段组装成区块头,将区块头的80字节数据作为工作量证明的输入。
  • 3.不停地变更区块头中的随机数(即nonce的数值),并对每次变更后的区块头做双重SHA-256运算(即SHA256 (SHA 256(Block_Header))),将结果值哈希反转并与当前网络的目标值对应的十进制字符串做对比,如果小于目标值,则解题成功,工作量证明完成。

最长链机制

比特币网络要求所有节点都遵循一个协议(共识),所有保存到本地的区块链必须是被本地节点验证通过的最长链。由于区块链的每个区块必须引用它的前一个区块,所以最长链是最难推翻的。

算力攻击

当攻击者拥有的算力超过全网算力的51%时,可以用这些算力来重新计算已经确认过的区块,实现攻击,业内形象的称为51%算力攻击。中本聪在白皮书里做了个数学推算来证明比特币区块链体系的安全性,此计算证明比特币体系在设计上已经大大降低了双重支付(双花)的可能,另外对于51%算力攻击也被证明需要花费较高的攻击成本,而且也由于社区的理性选择,让攻击的成功率很低。(证明流程什么的就不赘述了,也说不好,请移步度娘谷哥)

其他

至此,也介绍了比特币区块链的大部分概念,也就说个大概,对每个点说的并不是很全。还有像区块链的应用、侧链技术及其应用、货币、信用什么的就不说了,也说不好,这本书涉及的东西太多,也是刚了解可能思绪还比较乱能力也较差,肚子里有很多话想表达,可真的说也很难一一说全(可能找到了初恋的感觉),还是建议大家去读读这本书然后有自己的认识。现在就觉得,当遇到不懂的就去找本书看,也不用被各种的推送看的一头雾水,你只有去看看更完善的东西,才有自己的理解,一篇文章是看不出啥的。共勉。

我从区块链中得到了什么

这部分就写下,我看这本书写下的想法吧。

区块链是一个对人性悲观却非常真诚的协议。

作为一个程序员,我不得不感叹区块链的技术,但我更喜欢的是区块链背后的哲学。区块链背后的思想是很伟大的,接受人性,善也好恶也罢,是对人性的悲观检测,考虑到你可能出现的所有情况,每个人活的都像自己,并不会因为你像自己而对他人造成损失。虽说是去中心化,但也有一套规约,像共识机制,与中心化不同的是我们的行为是对现有制度的屈服(不是来自于个人意志),区块链想做到的是你的决定都是来自你自己理性的判断,你是“自私”的,你会去考虑投入与损失,知道自己该做什么而使自己的利益最大化,是对自由的向往。

For freedom!!!

附录

本文脑图地址:《区块链》

相关文章:
区块链微信:对不起,你言而无信!
区块链养猫,我们时代的一个不和谐的符号

书籍(电子版可在微信读书app搜索):
《区块链:定义未来金融与经济新格局》(作者:火币网 张健)


2018.01.27 00:36 - 完

Licensed under CC BY-NC-SA 4.0
本文链接:http://JohnneyAnn.github.io/2018/01/27/区块链-BlockChain/