请扫描本文结尾的二维码关注我的微信公众号,或在微信搜索 极客起源 即可关注,每个工作日都有文章更新。
李宁老师的区块链与以太坊系列文章开张了,本系列文章将全面阐述区块链与以太坊的基本概念以及核心技术,包括挖矿、智能合约、以太坊、Solidity语言、Truffle、Ganache等技术,以及如何发布自己的数字货币和编写基于以太坊的云笔记。
这篇文章将带领大家进入区块链的世界,区块链是现今炙手可热的技术之一。那么到底什么是区块链呢?区块链有什么用呢?这些问题的答案将在本文揭晓。
本文的主要内容如下:
1. DApp的基本概念
2. 比特币的基本概念
3. 掌握什么是工作量证明(PoW)
4. 掌握什么是股权证明(PoS)
5.了解什么是51%攻击
6.了解区块链和以太坊的关系
7.了解超级账本项目
8.了解区块链的主要应用场景
基于区块链的应用与其他类型的应用不同。区块链应用涉及到很多概念,如果不了解这些概念,根本就无法理解相关代码,更别提自己编写程序了,因此,在正式探索区块链之前,先要了解一些必要的概念。
1 去中心化应用(DApp)
对于传统的网络应用,都会有一个服务端程序,然后多个客户端连接到这个服务端,这叫做中心化应用。中心化应用必须要保证服务端永远处于可连接的状态,一旦服务端挂掉,那么也就意味着整个网络应用将无法运行(客户端无法连接服务端)。
为了解决网络应用中过分依赖服务端的状况,出现了P2P应用,也就是点对点应用。在这类应用中并不存在对网络完全控制的中心节点,其中部分节点挂掉,并不影响整个P2P网络的运行,这类应用就称为去中心化应用(DApp)。在DApp网络中,任何节点都有可能为自己服务,而自己拥有的节点也可以为任何其他节点服务,真正实现了人人为我,我为人人的互联网精神。像迅雷下载客户端就属于这类应用。本系列文章主要介绍的区块链就是实现DApp的一种重要方法,而比特币就是实践了区块链技术的第一个成功案例。关于区块链和比特币的详细描述会在稍后的部分介绍。
理想是美好的,现实是骨感的。DApp的想法是非常好的,网络中所有的节点互为客户端和服务端。网络中所使用的数据会根据一定的算法将全部或部分数据存储在分布在网络中的各个节点上,在必要时会进行数据同步。但是,将数据保存到节点上,而非服务端统一管理,这就意味着数据有可能会遭到串改,某些节点也有可能会发布错误数据。如果是敏感数据,例如,比特币交易数据,一旦被串改,将会给相关各方造成相当大的损失。因此,发现和防止节点对应用数据进行非法篡改或者与其他节点分享错误信息是一个重要挑战,所以在节点之间需要对某个节点发布的数据是否正确达成共识。在DApp中并没有中心服务器来协调节点,或者决定什么是对、什么是错,因此,应对这个挑战的难度非常大。通常的做法是采用一致性协议(concensus protocol)解决这个问题。不同的DApp通常使用不同的数据结构类型的共识协议,例如,比特币使用工作量证明协议(PoW)来达成共识。
所有使用DApp的用户都需要一个客户端。不过客户端不能直接连接DApp网络,在使用DApp时,用户首先需要运行DApp中自己的节点,然后将客户端连接至节点。DApp的节点只提供应用程序编程接口,并允许开发者使用API开发多种客户端。一些DApp开发人员会提供一个官方的客户端。DApp官方客户端通常是开源的,可以下载使用,否则去中心化的想法就失败了。并且很多官方客户端不仅可以用来操作DApp,还可以作为服务,供像web3.js这样的库进行连接,通过这些库,可以开发出更强大的DApp客户端。
2. DApp的内部货币
对于中心化应用来说,所有者需要盈利才能长期维护应用的运行。这是因为中心化应用需要支付服务器维护费用、带宽费用、人员费用等。DApp虽然没有所有者,但与中心化应用一样,维持DApp节点的正常运行仍然需要一定的费用,如硬件、网络支援等。因此,DApp节点需要一些回报来维持运行,于是内部货币登场了。大多数DApp都有内置的内部货币,或者说成功的DApp都有内部货币,如比特币网络中的比特币就是最著名的内部货币。
那么,每个节点到底应该收多少内部货币呢,这由共识协议决定。根据共识协议,只有为维护DApp安全和运行做出贡献的那些节点可以赚取内部货币,只进行数据读取的节点没有回报。例如,在比特币网络中,只有矿工(miner)成功挖矿才能赚取比特币。
3. 比特币
比特币(bitcoin)是一种去中心化的货币,是最热门的DApp,它的成功充分展示了DApp的强大。比特币的成功大大鼓励了人们创建其他的DApp。在了解比特币的细节以及为什么人们认为它是一种货币之前,需要先了解两个概念:账本和区块链。
(1)账本
任何交易都需要记录,而用于记录比特币交易的就是账本(ledger)。那么账本与数据库有什么区别呢?在数据库中,我们可以添加、修改和删除交易。而在账本中,只能添加新的交易,不能修改和删除交易。数据库可以用来实现账本,反过来却不可以。
(2)区块链
区块链(blockchain)是用于创建去中心化账本的数据结构,也就是说,区块链与数据库类似,是用于存储数据的。区块链中的区块按序号排列。每一个区块都包含一个交易集合、前一个块的哈希码、时间戳(指明区块被创建的时间),块奖励,块序号等信息。由于每一个块都包含了前一个块的哈希码,因此可以创建一个互相连接的块链表,因此称为区块链。网络中每一个节点都会保存一份区块链的副本。
为了保证区块链的安全,工作量证明(PoW,Proof-of-work)和股权证明(PoS,Proof-of-stake),以及其他的一致性协议被应用于区块链。由于有这些协议的存在,在区块链中添加新的区块并不容易,例如,在PoW中,向区块链中添加区块的过程被称为挖矿,挖矿从技术上说就是解决复杂的计算难题,那么为什么要解决复杂的计算难题呢?通过PoW以及其他一致性协议是如何阻止某些节点对整个区块链进行攻击的呢?请读者继续往下面看。
4. 工作量证明(PoW)
工作量证明(PoW)就是在修改区块链之前先证明你没有对DApp网络进行攻击,那么怎么证明呢?就是在本地先完成一项艰巨的任务,然后将完成的结果上传到DApp网络进行验证。这项艰巨任务的要求是没有可以投机取巧的方式完成,必须用最原始、最暴力的方式一点一点完成,完全是拼体力。
那么可能有很多读者会问,完成任务和阻止攻击有什么关系呢?这就涉及到一个经济学的概念了:经济惩罚。大概的意思就是既然无法阻止攻击,那么就让攻击付出惨重的代价。
完成DApp网络交给你的任务是要付出代价的。通常的任务是要解决计算难题,这种解决计算难题的过程被称为挖矿。
在PoW中要解决的难题通常是计算一个哈希值。例如,给定的一个基本的字符串"Hello, world!",我们的任务是,可以在这个字符串后面添加一个名为nonce的整数值,对变更后的字符串进行SHA256哈希运算,如果得到的哈希结果(以十六进制的形式表示)是以"0000"开头的,则验证通过。为了达到这个工作量证明的目标。我们需要不停的变化nonce值,对得到的新字符串进行SHA256哈希运算。按照这个规则,我们需要经过4251次计算才能找到恰好前4位为0的哈希散列。我们会发现,随着0的个数增加,计算难度会以指数级增加。而且并没有算法可以一下子算出结果,但结果却是非常好验证的,所以要完成这项任务,就需要非常强的算力,也就是说,要想搞定这个任务,需要自己花钱买一大堆高性能的计算机。而且现在区块链分派的任务越来越艰巨,计算量越来越大,如果是以营利为目的的攻击,可能为了价值几百万的比特币,你要花几千万去购买计算机来完成相关的计算任务,完全是得不偿失。所以就很少有人去做这样的赔本攻击,因为攻击成本会远大于收益。
5. 股权证明(PoS)
PoS,简单来说,就是一个根据你持有货币的量和时间,给你发利息的一个制度,在股权证明模式下,有一个名词叫币龄,每个币每天产生1币龄,例如,你持有100个币,总共持有了30天,那么,此时你的币龄就为3000,这个时候,如果你发现了一个PoS区块,你的币龄就会被减去一定的值。你每减少365个币龄,你将会从区块中获得0.05个币的利息(可理解为年利率5%),那么在这个案例中,利息 = 3000 * 5% / 365 = 0.41个币。要注意的是, 5%的年利率仅仅是作者举例,并非每个PoS模式的币种都是5%,比如点点币PPCoin就是1%年利率。
6. 51%攻击
可能有很多人会想对策,由于区块链分配的任务难易程度不同,我不用那么大的计算量,少买点计算机,是否可以找到一个盈利的平衡点呢?其实一开始我也是这么想的,但根据PoW算法机制,如果你的计算量不够大,是无法控制区块链的走向的,也就是说,即使你投入了大量的成本用于完成任务,也不能保证自己成功。这就像花了数百万购买彩票,你只能保证比只花两元钱购买一张彩票的人的中奖几率要大,但并不能保证你一定能中奖。花几十万上百万就中袋洗衣粉,花2元中500万的也大有人在。彩票奖金的设置永远要远小于购买所有彩票的成本,所以你是无法采用穷举的方式保证100%中奖率的。区块链也是一样,即使你的算力非常强,也不能保证100%成功,只是成功的可能性更大而已。
前面说过,谁的算力多,谁最先解决问题的概率就越大。当掌握超过全网一半算力时,从概率上就能控制网络中链的走向。这就是所谓 51% 攻击。这也是区块链的弱点,如果谁掌握了超过全网一半的算力,谁就可以主导区块链网络,也就是说,区块链并非100%安全,但如果要蓄意攻击区块链网络,需要付出很大的代价,但从理论上来说,区块链可能会受到攻击。
7. 区块链
在前面已经多次提到了区块链,那么区块链到底是什么东西呢?
区块链是创建去中心化账本的数据结构。一个区块链由若干个序列化排列的区块组成。每一个区块都包含一个交易集合,前一个块的哈希码,时间戳(指明区块被创建的时间),块奖励,块序号等信息。由于每一个块都包含了前一个块的哈希码,所以可以创建一个互相连接的块链表,因此称为区块链。网络中每一个节点都会保存一份区块链的副本。
为了保证区块链的安全,工作量证明(PoW,Proof-of-work)和股权证明(PoS,Proof-of-stake),以及其他的共识协议被应用于区块链。由于有这些协议的存在,在区块链中添加新的区块并不容易,例如,在PoW中,向区块链中添加区块的过程被称为挖矿,挖矿从技术上说就是解决复杂的计算难题,这一点在前面已经讲过了。
8. 以太坊
以太坊是一个去中心的平台,允许在这个平台上运行DApp。DApp需要依赖智能合约,而智能合约要使用Solidity语言编写。一个或多个智能合约可以一起组成一个DApp。因此,运行在以太坊上的程序就是智能合约。
我们可以将以太坊比喻成Android系统,而智能合约就相当于运行在Android系统上的各种底层的库。后面的章节会讲解web3.js,这是用于调用智能合约的JavaScript接口,相当于Android SDK。也就是说,我们可以使用JavaScript编写客户端来调用智能合约程序。使用这个JavaScript接口编写的区块链客户端就相当于Android系统上的App。
智能合约之所以要运行在以太坊网络上,是因为运行在以太坊网络上的智能合约非常容易彼此交互,有了智能合约,开发人员并不需要为集成各种共识协议和其他东西而操心,这些以太坊都可以轻松为我们搞定。而开发人员只需要编写应用逻辑代码即可。
以太坊有一个内部货币,叫以太币(ether)。为了发布智能合约或执行智能合约中的方法,需要一定数量的以太币。
9. 超级账本项目
超级账本是一个项目,这个项目是首个面向企业应用场景的开源分布式账本平台。在Linux基金会的支持下,超级账本项目吸引了包括IBM、Intel、Cisco、摩根大通、腾讯等在内的众多科技和金融巨头的参与,以及在银行、供应链等领域的积极应用实践。超级账本社区在成立一年多时间以来,也得到了广泛的关注和飞速的发展,目经拥有超过140家企业会员。
加入超级账本的有很多项目,Fabric项目就是最早加入超级账本项目的顶级项目,Fabric由IBM、DAH等企业与底提交到社区。项目用Go语言实现,在github上已经有超过5000次提交。该项目的定位是面向企业的分布式账本平台,创新地引入了权限管理支持,设计上支持可插拔、可扩展,是首个面向联盟链场景的开源项目。
联盟区块链是指其共识过程受到预选节点控制的区块链。例如,不妨想象一个有15个金融机构组成的共同体,每个机构都运行着一个节点,而且为了使每个区块生效需要获得其中10个机构的确认(2/3确认)。区块链或许允许每个人都可读取,或者只受限于参与者,或走混合型路线,例如区块的根哈希及其API(应用程序接口)对外公开,API可允许外界用来作有限次数的查询和获取区块链状态的信息。这些区块链可视为“部分去中心化”。