
2.3 什么是DApp
2.3.1 DApp概述
DApp的英文全称是“Decentralized Application”,对应的中文解释是:去中心化应用,又称分布式应用。
关于分布式应用可分为传统的DApp和区块链DApp,下面我们看一下这类分布式应用的不同。
1. 传统的分布式应用
在区块链出现之前,DApp已经存在了,我们可把这种DApp称为传统的分布式应用。我们以所熟悉的C/S(Client/Server,客户端/服务器端,亦称为客户机/服务器)结构来看一下这种分布式应用的特点。我们知道,一个Server是可以服务于多个Client的,如果不考虑各个Server之间的通信,那么这种一对多的形式可看作如图2-5所示的简单交互形式。

图2-5 客户端和服务器端交互的示意图
在这种C/S结构中,相同功能的Server允许有多个,它们可以被放置在不同的地方,如果多个Server之间可以相互通信,我们就称Server部分为分布式集群,如图2-6所示。

图2-6 分布式集群的大概模型
图2-6这种Server分布式集群只是一个大概的模型,事实上还会有其他中间件穿插其间,如图2-7所示。在这类传统的分布式应用中,往往是多个Server与同一个数据源交互,即多个Server进行数据的读写操作。注意,这是一个重要的差异,即传统的分布式应用DApp,它的数据存储源总是相同的,即使数据源做了分布式集群,也依然不是去中心化的,同时,系统管理员也可以访问数据源。

图2-7 中间件穿插其间的分布式集群
2. 区块链去中心化分布式应用
区块链去中心化分布式应用DApp与传统的分布式应用DApp的最大不同点在于,前者是完全去中心化的,特别是数据存储部分。在区块链这种分布式应用中,Server被重新命名为节点,名称改变了,但其本质没变,依然是为Client提供服务的,只是每个节点由不同的组织管理,并对应有自己的数据存储区域。
去中心化DApp每个节点都有自己的数据存储地,而且节点之间可以彼此相互通信却又不依赖其他节点(因为互不信任),例如A节点无法直接访问B节点的数据库。在这种互不信任的体系中,各个节点通过共同遵循共识算法来达到数据同步的目的,同时各个节点之间又维护了一条区块链。它们的交互形式大致如图2-8所示。

图2-8 区块链节点去中心化集群
本书所要阐述的DApp就是这种区块链去中心化分布式应用。
2.3.2 以太坊上的DApp
以太坊拥有图灵完备的智能合约模块,使得开发者可以先编写好智能合约代码,再到它上面部署智能合约,最终变为合约应用,也就是DApp。
智能合约被部署到链上后是能够被访问的。为了完善DApp的功能,开发者可以采用计算机语言(例如Java或者Go)来编写对应于当前所发布的智能合约的访问接口,用户通过访问接口访问链上的合约,得到输出的数据。
这其实也就是当前基于以太坊所开发的DApp的工作流程。一个DApp中包含多个角色,每个角色都有其各自的功能,具体说明如下:
•智能合约应用,布置在链上,负责链上数据的处理。
•中继服务器,布置在开发者的物理服务器上,负责接收用户的请求和访问链上的智能合约应用,再将数据结果返回给用户。
•以太坊公链,是智能合约的集成运行环境以及实现去中心化等区块链功能的核心支撑。
图2-9是目前以太坊DApp的常见交互模型图。

图2-9 以太坊DApp的交互模型图