banner
leaf

leaf

It is better to manage the army than to manage the people. And the enemy.
follow
substack
tg_channel

以太坊之DApp开发实战

什么是 DApp(去中心化应用)#

目前常见的 Web 应用如微博、豆瓣、百度都是基于客户端 - 服务器的模式,所有的资源都由中心服务器控制。以访问微博为例,在浏览器中输入 www.weibo.com 这个 URL 地址,由 DNS 服务器解析 URL 并返回微博服务器的 IP 地址给浏览器,浏览器通过这个 IP 地址发送请求给微博服务器,微博服务器将对应的内容返回给浏览器,浏览器收到内容后展示返回结果给用户。这一过程中微博服务器发挥着主要作用,客户端(浏览器)只是起到连接服务器和展示的作用。中心服务器对客户端来说是不透明的,客户端无法知道服务器端的行为,容易造成个人隐私和数据的泄露,加上中心服务器运行产生的高额成本最终还是需要用户承担,而且一旦中心服务器出现问题就可能导致整个系统的应用无法正常使用。为了规避中心服务器的弊端,去中心化应用的概念应运而生。

去中心化应用(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 的结构如图

image

其中,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 的图形化的主界面,如图

image

如图所示,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 的主界面。

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

image

MetaMask 的主界面

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

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

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

image

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

image

image

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

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

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

image

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

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.