# 以太坊之DApp开发实战

By [leaf](https://paragraph.com/@leaf-6) · 2022-12-04

---

什么是DApp（去中心化应用）
===============

目前常见的Web应用如微博、豆瓣、百度都是基于客户端-服务器的模式，所有的资源都由中心服务器控制。以访问微博为例，在浏览器中输入[www.weibo.com这个URL地址，由DNS服务器解析URL并返回微博服务器的IP地址给浏览器，浏览器通过这个IP地址发送请求给微博服务器，微博服务器将对应的内容返回给浏览器，浏览器收到内容后展示返回结果给用户。这一过程中微博服务器发挥着主要作用，客户端（浏览器）只是起到连接服务器和展示的作用。中心服务器对客户端来说是不透明的，客户端无法知道服务器端的行为，容易造成个人隐私和数据的泄露，加上中心服务器运行产生的高额成本最终还是需要用户承担，而且一旦中心服务器出现问题就可能导致整个系统的应用无法正常使用。为了规避中心服务器的弊端，去中心化应用的概念应运而生。](http://www.weibo.com%E8%BF%99%E4%B8%AAURL%E5%9C%B0%E5%9D%80%EF%BC%8C%E7%94%B1DNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%A7%A3%E6%9E%90URL%E5%B9%B6%E8%BF%94%E5%9B%9E%E5%BE%AE%E5%8D%9A%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84IP%E5%9C%B0%E5%9D%80%E7%BB%99%E6%B5%8F%E8%A7%88%E5%99%A8%EF%BC%8C%E6%B5%8F%E8%A7%88%E5%99%A8%E9%80%9A%E8%BF%87%E8%BF%99%E4%B8%AAIP%E5%9C%B0%E5%9D%80%E5%8F%91%E9%80%81%E8%AF%B7%E6%B1%82%E7%BB%99%E5%BE%AE%E5%8D%9A%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%8C%E5%BE%AE%E5%8D%9A%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%B0%86%E5%AF%B9%E5%BA%94%E7%9A%84%E5%86%85%E5%AE%B9%E8%BF%94%E5%9B%9E%E7%BB%99%E6%B5%8F%E8%A7%88%E5%99%A8%EF%BC%8C%E6%B5%8F%E8%A7%88%E5%99%A8%E6%94%B6%E5%88%B0%E5%86%85%E5%AE%B9%E5%90%8E%E5%B1%95%E7%A4%BA%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C%E7%BB%99%E7%94%A8%E6%88%B7%E3%80%82%E8%BF%99%E4%B8%80%E8%BF%87%E7%A8%8B%E4%B8%AD%E5%BE%AE%E5%8D%9A%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8F%91%E6%8C%A5%E7%9D%80%E4%B8%BB%E8%A6%81%E4%BD%9C%E7%94%A8%EF%BC%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%EF%BC%88%E6%B5%8F%E8%A7%88%E5%99%A8%EF%BC%89%E5%8F%AA%E6%98%AF%E8%B5%B7%E5%88%B0%E8%BF%9E%E6%8E%A5%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%92%8C%E5%B1%95%E7%A4%BA%E7%9A%84%E4%BD%9C%E7%94%A8%E3%80%82%E4%B8%AD%E5%BF%83%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AF%B9%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%9D%A5%E8%AF%B4%E6%98%AF%E4%B8%8D%E9%80%8F%E6%98%8E%E7%9A%84%EF%BC%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%97%A0%E6%B3%95%E7%9F%A5%E9%81%93%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E7%9A%84%E8%A1%8C%E4%B8%BA%EF%BC%8C%E5%AE%B9%E6%98%93%E9%80%A0%E6%88%90%E4%B8%AA%E4%BA%BA%E9%9A%90%E7%A7%81%E5%92%8C%E6%95%B0%E6%8D%AE%E7%9A%84%E6%B3%84%E9%9C%B2%EF%BC%8C%E5%8A%A0%E4%B8%8A%E4%B8%AD%E5%BF%83%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%BF%90%E8%A1%8C%E4%BA%A7%E7%94%9F%E7%9A%84%E9%AB%98%E9%A2%9D%E6%88%90%E6%9C%AC%E6%9C%80%E7%BB%88%E8%BF%98%E6%98%AF%E9%9C%80%E8%A6%81%E7%94%A8%E6%88%B7%E6%89%BF%E6%8B%85%EF%BC%8C%E8%80%8C%E4%B8%94%E4%B8%80%E6%97%A6%E4%B8%AD%E5%BF%83%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%87%BA%E7%8E%B0%E9%97%AE%E9%A2%98%E5%B0%B1%E5%8F%AF%E8%83%BD%E5%AF%BC%E8%87%B4%E6%95%B4%E4%B8%AA%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%BA%94%E7%94%A8%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E4%BD%BF%E7%94%A8%E3%80%82%E4%B8%BA%E4%BA%86%E8%A7%84%E9%81%BF%E4%B8%AD%E5%BF%83%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E5%BC%8A%E7%AB%AF%EF%BC%8C%E5%8E%BB%E4%B8%AD%E5%BF%83%E5%8C%96%E5%BA%94%E7%94%A8%E7%9A%84%E6%A6%82%E5%BF%B5%E5%BA%94%E8%BF%90%E8%80%8C%E7%94%9F%E3%80%82)

去中心化应用（Decentralized Application，DApp），是运行在去中心化网络上的应用。不同于传统App依赖于中心服务器，DApp的运行依赖于区块链以及在区块链上的智能合约。当前DApp主要基于以太坊、EOS、Steem、TRON等区块链平台进行开发。另外，DApp需要在具有钱包功能（详见3.2.2节钱包简介）的环境中运行。比如基于以太坊开发的DApp，可以在以太坊浏览器Mist、以太坊客户端Parity、手机端浏览器Status，以及安装有MetaMask钱包插件的浏览器中运行。

DApp由智能合约和用户界面（UI）组成。其中智能合约是运行在区块链上的代码，负责与区块链交互，而UI是由HTML和JavaScript实现的前端页面，供用户进行操作。在以太坊中，用户界面可以通过Web3.js库对智能合约进行调用，DApp的结构如图

![](https://storage.googleapis.com/papyrus_images/2e91481fa9870837bf0ebcf55b3ea3a34713c0330ed4c54e9799c7b83f7a1d64.png)

其中，Mist和Parity等是上面提到的支持DApp的钱包。EVM（Ethereum Virtual Machine）以太坊虚拟机，是以太坊中智能合约的运行环境，类似于Java虚拟机（JVM）用于执行Java程序，EVM用来执行智能合约。在DApp运行的过程中可能需要消耗以太坊上的加密数字货币——以太币。由于以太币的价格变动较大，为了保证执行费用相对稳定，以太坊上使用了另一个计量单位，叫作Gas。所以在DApp的开发过程中提到Gas这个词时，它指代的就是以太币。HTML和JavaScript就是开发网页的语言，Web3.js是以太坊提供的一个JavaScript库，它封装了以太坊的JSON RPC API，提供了一系列与区块链交互的JavaScript对象和函数，包括查看网络状态、查看本地账户、查看交易和区块、发送交易、编译/部署智能合约以及调用智能合约等，其中最重要的是与智能合约交互的API

DApp的特点
=======

与常见的中心化应用不同，DApp通常具有以下特点。

●公开透明、去信任。DApp底层一般依赖于区块链技术，其数据也和区块链一样具有公开透明、去信任的特点。

●无中心故障点。由于DApp是去中心化的，没有中心服务器，故不会由于单个结点的故障导致应用无法正常运行。

●共识机制。在中心化应用中，数据的更新和生效都是由中心服务器决定的。而运行于区块链技术之上的DApp，整个区块链中所有结点根据共识机制共同决定哪些数据有效，哪些数据无效，单个结点无法让数据在整个区块链中更新生效。

●奖励机制。在区块链中，整个系统是由所有结点一起生成和维护的。在DApp中也是如此，所以运行DApp还能获得一定的加密数字货币奖励

知名的DApp
=======

基于这些特点，开发者们在以太坊上创建了大量的DApp。这里列举几个比较知名且应用比较广泛的DApp，如Augur、Golem和Aragon。

1.Augur

Augur可以被视为一个去中心化的市场预测平台，允许用户对潜在交易的收益进行预测。与现实世界中的专家预测相比，Augur利用的是“人群的智慧”来进行真实世界事件的预测，有时该应用程序预测的结果比专家的预测更为准确。用户在对事件做出正确预测时，平台会给予一定奖励。此外，市场创建者、报告事件的用户也会得到一定报酬，Augur的官网首页如图5-2所示.

2.Golem

Golem利用计算机和数据中心，创建能够对外出租的超级计算机，全球任何人都可以申请租用。该项目不依赖任何中央服务器群，而是将计算负荷分配至愿意出租其计算机进行工作的“提供商”。这些提供商通过共享计算机资源，以换取加密数字货币奖励。与集中式的项目相比，Golem这种分布式的算力提供方式计算速度更快，费用更低。Golem的官网首页如图

3.Aragon

Aragon是以太坊上的一个应用，用来管理去中心化的自治组织。它允许用户创建和管理一个去中心化组织，由Aragon基金会管理。创建该平台是为了构建和管理DAO（去中心化自治组织），该应用可以通过加密数字货币来投票决定产品的未来发展方向。Aragon的去中心化特性可用于任何组织或公司，甚至是非营利的基金会，它实现了股东名册、代币转账、投票、职位任命、融资、会计等组织机构的基础功能。在Aragon上创建的组织的行为可以通过修改章程来自定义。另外，Aragon还可以通过智能合约扩展其他需要的功能。Aragon的官网首页

DApp的应用还有很多，用途日趋广泛、发展潜力巨大，掌握DApp的开发能力非常有价值。接下来就开始学习DApp的开发。首先是智能合约的开发及使用。

以太坊有基于Python、Go、C++、Java等多种语言的版本。不管基于什么语言开发，以太坊区块链架构都是由核心库、通讯库和客户端三大部分组

成。

●核心库：核心库的主要功能是区块链、EVM（以太坊虚拟机）以及共识机制的实现。其中Python版本的核心库对应的程序为pyethereum，Go语言版本对应的是go-ethereum，C++版本对应的是cpp-ethereum，Java版本对应的是ethereumj。

●通讯库：通讯库是一个P2P的网络库，主要功能是实现结点间的发现、连接和数据同步，实现去中心化网络中的数据传输服务。Python版本对应的通讯库程序为pydevp2p，而Go语言版本的通讯库已经打包到了go-ethereum的P2P模块之中。

●客户端：客户端的作用是连接到以太坊并与之进行交互，包括获取以太坊区块链网络的数据，向网络上发送交易、部署合约甚至编译智能合约等。客户端通过JSONRPC对外开放端口保持监听，在收到消息后进行相应的操作。Python版本客户端对应的程序为pyethapp，默认监听4000端口；Go语言对应的程序为geth，默认监听8545端口。

这里要搭建的智能合约开发环境，其实就是选择一个合适的客户端连接到以太坊网络中，由于在以太坊公链上做操作需要消耗以太币（ETH），成本不低，所以对于开发者来说，很有必要在本地自行搭建一个以太坊区块链网络的测试环境进行开发。

本地以太坊环境的搭建
==========

以太坊社区已经提供了一系列工具帮助开发者快速搭建一套本地的以太坊开发环境。这里选择Ganache（之前叫testRPC）搭建本地以太坊测试环境。

发的DApp是如何运作的以及以太坊的状态变化，包括查看账户余额、合约及Gas成本。可以调整Ganache的采矿控制来更好地适应自己开发的DApp。Ganache的安装步骤如下。

首先下载并安装Ganache。Ganache的下载地址是https：//truffleframework.org/ganache/，Ganache的主页

选择与自己的操作系统对应的版本下载Ganache软件安装包，下载完成后双击打开安装包进行安装即可。依照提示顺序安装完成后，双击打开生成的Ganache图标可以看到Ganache的图形化的主界面，如图

![](https://storage.googleapis.com/papyrus_images/a3e5318fddee8579a48bf534d17ae21059abf47d8a742ac276f8ef56e5594769.png)

如图所示，Ganache主界面上有4个标签，依次为账户信息、区块信息、交易信息和日志信息。Ganache启动后会监听在本地的7545端口，并自动创建10个测试账号，每个测试账号均有100个以太币供测试开发。单击“BLOCKS”图标切换到区块信息，可以看到当前区块链只有一个区块，即创世区块，如图

2.安装和使用以太坊钱包
============

这里使用插件MetaMask作为以太坊钱包。MetaMask是一款浏览器中使用的、插件类型的以太坊数字钱包，该钱包不需要下载，只需要在浏览器添加对应的扩展程序即可，使用起来非常方便（目前支持火狐浏览器和谷歌浏览器）。可访问MetaMask官网进行安装，在浏览器中输入网址：https：//metamask.io/，打开MetaMask的官网首页，

进入MetaMask官网首页后单击获取插件即可跳转到对应浏览器的插件库中进行安装。安装完成后可以在浏览器上看到MetaMask的狐狸图标，单击该图标打开MetaMask。第1次使用时会出一个隐私提示，选择“Accept”接受条款，进入登录页面，如图5-11所示。

这里有两个入口，第1个入口是创建新的DEN——CREATE按钮（DEN是在MetaMask用密码加密存储的钱包格式），第2个入口是导入已有的DEN——Import Existing DEN链接。这里以创建新的DEN为例，在上面的密码框输入密码，并在下面一行输入框中再次输入进行确认，然后单击“CREATE”

按钮，就成功创建了一个MetaMask钱包。MetaMask会默认为用户创建12个英文助记词，这些助记词一定要保存好，建议复制保存到安全的地方，助记词是确认钱包账户所有者的凭证，在其他钱包导入这个新创建的账户时或者修改时有可能要用到这些助记词。也可以直接单击“SAVE SEED WORDS AS FILE”按钮，会自动生成一份助记词文件保存在本地。单击“I'VE COPYED SOMEWHERE SAFE”按钮就进入MetaMask的主界面。

进入主界面后，可以单击右上角的图标进行登出、切换账户、创建账户、导入账户和其他设置，如图

![](https://storage.googleapis.com/papyrus_images/34e4129eb69bf1bae823e543e39311766d58267dcdbb86224dff974fcc7bc95f.png)

MetaMask的主界面

MetaMask自动为用户创建了一个钱包地址，钱包余额为0个以太币，单击账户左侧的菜单按钮，可以看到账户的详细信息和地址，如图5-13所示。

MetaMask默认连接的是以太坊的主网络，这里把网络切换到Ganache的本地网络。单击MetaMask页面顶端Main Etherum Network右边的下拉按钮，选择“Custom RPC”选项，如图5-14所示。

在新弹出的界面中输入本地RPC地址http：//127.0.0.1：7545，然后单击“Save”按钮，如图5所示。此时已连接到本地的以太坊测试环境

![](https://storage.googleapis.com/papyrus_images/bc1880059950ce4030702630e0865147ac6c26663afff1f97612dd52bc7bd59a.png)

切换到Ganache的账户界面，单击账户后面的钥匙图标，可以看到该账户的私钥信息

![](https://storage.googleapis.com/papyrus_images/a885b1aae074f45b419cfa8423581cd3f1a248e308cd20bf2a0803d0fc912fe1.png)

![](https://storage.googleapis.com/papyrus_images/212ae1e1450659f11456b6e5d846ff9710899897bf2e1d19d0631b92d59a7018.png)

将上述私钥复制下来，再次打开MetaMask，选择“Import Account”，如图所示将刚复制的私钥粘贴到私钥的输入框中，如图5-19所示。导入成功后即切换到新的账户Account 3，新的账户有100个以太币，如图所示。

至此，以太坊的测试环境搭建完成。下面即可开始智能合约的开发。

智能合约的开发可以使用多种语言，如Solidity（语法类似JavaScript）、Serpernt（语法类似Python）、LLL（语法类似Lisp）等。其中现在最流行的是Solidity，Solidity是智能合约官方编程语言，所以，接下来用Solidity语言进行智能合约的开发。

![](https://storage.googleapis.com/papyrus_images/89beb3e47179b42e628ef9edb4386fb8a61aa1323935cda924e1d9ed21b1862e.png)

Solidity是一种用于编写智能合约的高级语言，运行在以太坊虚拟机（EVM）上。它的语法接近于JavaScript，是一种面向对象的语言。熟悉JavaScript的读者应该可以很快学会。下面对Solidity的基本语法进行讲解.

---

*Originally published on [leaf](https://paragraph.com/@leaf-6/dapp)*
