序言
如何学习以太坊? -> 从以太坊的白皮书和黄皮书开始/Building Blockchain Projects
通过有趣的现实世界案例,将了解到如何编写完全按照程序运行、没有欺诈、没有中心机构或者第三方干预的智能合约,并学习如何创建端到端的区块链应用。
将介绍加密货币中的密码学、以太币安全、挖矿、智能合约和Solidity等概念
实例代码下载地址:http://www.packtpub.com
第一章 去中心化应用
1.1 什么是Dapp
目前几乎所有互联网应用都是中心化,每个应用的服务端由一个特定的企业或者个人所有,开发者在开发中心化应用,用户也一直在使用中心化应用。
但是中心化应用存在一些问题:不透明、单点故障、不能防止网络审查。几乎不可能创建某些特定类型的应用
为了解决这一问题,去中心化应用诞生了,它创建以网络为基础的去中心化应用Dapp
Dapp是一种互联网应用,其后端在去中心化的点对点的网络上运行,且源代码是开源的,网络中不存在能够完全控制的Dapp节点
不同的Dapp使用不同的数据接口来存储应用数据,比特币Dapp使用区块链数据接口
- 一致性协议。Dapp中没有一个中心服务器来协调节点或者决定什么是对的什么是错的,一致性协议可用于解决这个问题(concensus protocol),不同的Dapp通常使用不同额数据结构类型的共识协议,比特币使用 工作量证明协议(PoW来达成共识
为了让用户使用Dapp,每个Dapp都需要一个客户端,使用时,用户首先要运行Dapp中自己的节点服务端,然后将客户端连接至节点服务器。
Dapp的节点只是提供API,并允许开发者社区使用API开发多种客户端
建立客户端架构比较麻烦,因此客户端通常作为服务或节点形式出现
Dapp的优点
- Dapp能容错,没有单点故障,默认分布式
- 防止某单一机构的干扰
- 用户容易相信该应用
Dapp的缺点
- 修改bug或者更新Dapp很困男,因为网络中每一个节点都需要更新其节点软件
- 一些应用要求验证用户身份(KYC),却没有中心化的机构来验证用户身份,开发时会遇到问题
- 创建去中心化应用比较困难,因为他们应用复杂的协议达成共识,并且必须从最開是就自行创建并扩大规模,所以不能仅仅实现一个想法,然后不断添加功能
- 应用通常独立于第三方API,以获取或者存储数据。Dapp不能依赖中心化应用的API,但是可以依赖其他Dapp,目前Dapp生态圈不大,所以创建起来比较困难,在实践中紧密融合Dapp也比较困难
1.2 去中心化自治组织
Decentralized Autononmous Organization (DAO) 由计算机程序代表的组织(即组织根据程序中写明的规则运行),完全透明、完全由股东控制,不受政府影响。
为了达到这个目标,需要把DAO作为DApp来开发,可以说DAO是Dapp的一个子类
1.3 Dapp中的用户身份
Dapp主要优点是它一般能保证用户的匿名性,但是许多应用要求用户必须经过身份验证才能使用,因为Dapp没有中央机构,验证身份是一项挑战
KYC Know Your Customer
Dapp不能理解和验证扫描文档,也不能发送短信,因此需要用户提供哪些他们可以理解和验证的数字标识,问题是几乎没有Dapp有数字标识,用户也不知道如何得到数字身份
数字身份有多种形式,目前最受推崇最热门的形式是数字证书(一个用来证明公钥所有权的电子文档)
基本上一个用户拥有私钥、公钥和数字证书
数字证书由用户可以信任的授权机构颁发
目前可供选择的方案:由提供客户端的公司派人手动验证用户身份,比如创建一个比特币账户不需要验证身份,但是当提现的时候交易所去验证
在应用中验证身份的想法是使一些用户在进行一些欺诈行为之后难以逃脱,让用户难以伪装成其他人,并收集足够的数据跟踪用户,证明该用户进行了一些欺诈行为
1.4 Dapp中的用户账户
有多种实现方式,现在最热门的是公钥-私钥来代表一个账户。公钥的哈希是账户的唯一身份,为了改变账户中的数据,用户需要私钥签名
1.5 访问中心化应用
Dapp不能依赖于中心化应用,原因是存在单点故障,但是在一些情况下Dapp需要从中心化应用中抓取数据,但是主要问题是Dapp如何知道一个域名中抓取的数据有没有被中间人篡改,数据是否还是真实的响应。
根据Dapp架构的不同,解决办法也有所不同,在以太坊中,智能合约不能直接发出HTTP请求,为了访问中心化API,可以使用Oraclize服务作为中间人,Oraclize为从中心化服务智能合约中的数据提供TLSNotart验证
1.6 Dapp中的内部货币
中心化应用的所有者需要有盈利才能长期维护应用的运行,Dapp虽然没有所有者,但是和中心化应用一样,Dapp节点需要硬件和网路资源才能维持运行。
Dapp节点需要一些有用的回报来维持运行,于是内部货币登场了,大多数Dapp都有内置内部货币。
共识协议决定节点收取多少的内部货币。
根据共识协议,只有为维护Dapp安全和运行做出贡献的哪些特定节点可以赚取货币,只进行数据读取的节点没有回报,也就是指挖矿。
- Dapp内部货币的缺点
Dapp不能再免费使用了,免费是中心化应用占上风的原因之,因为中心化应用可以通过广告赚钱,为第三方应用提供优质API,所以可以对用户免费。在Dapp中不能加入广告,因为没有人去检查广告尺度,客户端还可能不展示广告,因为展示广告对他们没有好处。
1.7 什么是授权Dapp
授权的Dapp并不对所有人开放。授权的Dapp继承了面权限Dapp的全部属性,但是需要权限才能参与到网络中去。授权的Dppp与免权限的Dapp的共识协议是不同的,授权的Dapp没有内部货币。
1.8 热门的Dapp
- 比特币
账本: 本质上是一个交易列表。数据库与账本不同,在账本中我们只能添加新的交易;在数据库中我们可以CURD,数据库可以用来实现账本。
区块链: 是用于创建区中心化账本的数据结构,区块链中的区块按序号排列。区块包含一系列的交易、前一个区块的哈希、时间戳、区块回报、区块序号等。
每一个区块包含前一个区块的哈希,由此创建了区块彼此相连的链,网络中的每一个节点都保留区块链的一个备份
工作量证明和权益证明等是用于保障区块链安全性的多种共识协议
在工作量证明中,通过挖矿创建区块,这让区块链保持安全。
在工作量证明协议中,挖矿涉及解决复杂问题。
为什么使用比特币:可以在世界上任何地方快速便捷地发送和接收支付、比特币交易费低于在线支付交易费。黑客可以从商户哪里窃取支付信息,但是在比特币情况下,窃取了比特币的地址是完全没用的,必须使用相关私钥签名
- 以太坊
是一个去中心化平台,可以在其上运行使用智能合约编写的Dapp
以太坊智能合约完全按照程序运行,杜绝了停机、去中心化操控、欺诈和第三方能干涉的可能性。
使用以太坊运行智能合约的主要优点是方面智能合约彼此交互,而且不需要担心整合共识协议等事情,只需编写应用所需逻辑即可。
以太坊有一种内部货币叫做以太币ether,部署只能合约或者执行只能合约函数需要用到以太币。
- 超级账本
超级账本项目致力于开发创建授权的Dapp技术,Hyperledger fabric是Hyperledger项目的一个实现。
fabric是一个区中心化的授权平台,它允许在其上运行授权的Dapp。fabric是即插即用系统,可以方便地即插即用多种公式协议和功能。
- IPFS
星际文件存储系统是一个去中心化的文件系统。使用分布式哈希表和Merkle有向无环图数据结构。它使用类似于BitTorrent比特流的协议来决定如何在网络中移动数据。
在文件系统中,所存储的内筒会一直保留到被删除之前每一个节点并不存储全部文件,存储的是需要的文件。
如果一个文件不那么受欢迎,许多节点就没有这个文件,那么该文件很有可能从网络中消失。
- Namecoin
Namecoin是一个去中心化的键值数据库,它的内部货币叫做域名币。使用区块链数据结构和工作量证明共识协议。
- 达世币
达世币是一种类似于比特币的去中心化货币,使用区块链数据结构和工作量证明共识协议,并解决了比特币面临的一些主要问题。
- BigChainDB
允许用户部署自己的、授权的或者免权限去中心化数据库,使用区块链数据结构以及其他多种特定数据库数据结构。
- OpenBazaar
是一个去中心化的电子商务平台,可以在其上买卖物品,用户不是匿名的,因为IP被记录了,节点可以是买方、卖方或者中间人。
使用Kademlia分布式哈希表数据结构。
- Ripple
瑞波是一个去中心化的转账平台,允许兑换货币、数字货币和大宗商品。使用区块链数据结构,并且有自己的共识协议。在Ripple相关文档中,找不到区块、区块链等词汇,用账本来代替。
瑞波币不是由挖矿生成的,最初就有1000亿个瑞波币,最初由Ripple公司拥有,是手动供给的。