# DAPP开发教程

## 合约准备

Remix是一个开源的[Solidity](https://solidity.readthedocs.io/en/develop/)智能合约开发环境，提供基本的编译、部署至本地或测试网络、执行合约等功能。Solidity是以太零官方支持的开发语言，专门用于编写智能合约。http://remix.etherzero.org ，Remix作为在线的开发环境，不需要安裝，可以直接在任何浏览器启动[Remix](http://remix.etherzero.org)。网站第一次打开加载能容较多，需要耐心等待一段时间，之后打开会很快。

下面将介绍基于Remix的以太零Dapp的开发过程，描述如何在以太零正式网络上部署测试智能合约。

### **使用 Remix编译合约**

点右上角 + 新增一个合约

名称任意只要扩展名是 “.sol”。

以一个简单合约为例，编写相应的代码內容到该合约并编译。合约使用的solidity语法学习可以参考官方学习网站[http://solidity.readthedocs.io/en/v0.4.24/](http://solidity.readthedocs.io/en/v0.4.24/)。

Remix默认设置会自动编译，只要旁边没有弹出红色的 error 提示就代表编译成功。

![](https://153593762-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LP94keYaE-d-gp2r4-_%2F-LWAuxrm76vRZQBfJJAW%2F-LWAv0QfPREJfijZvMH8%2F1547461680103.jpg?alt=media\&token=2da7accb-e654-40a6-8751-f5c5feaba7f3)

### **以太零智能合约部署**

打开GoETZ，默认连接上以太零主网，可以显示你账户中的ETZ余额。

![](https://153593762-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LP94keYaE-d-gp2r4-_%2F-LWAeWyvXqINVQAubf2c%2F-LWAfNnq-VSzWjc0gGcb%2FWechatIMG52.png?alt=media\&token=5b3a481d-089b-4faa-b77f-4387fe45e736)

代码编译没有错误，在Remix中选择Injected Web3，会自动将GoETZ插件钱包中的地址导入进来。

![](https://153593762-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LP94keYaE-d-gp2r4-_%2F-LWAuxrm76vRZQBfJJAW%2F-LWAv3aBSmBOqK802dav%2F2222222.jpg?alt=media\&token=5a5a5449-6791-451d-aaba-068e7b1e8ce8)

点击Deploy发送交易，就可以将合约部署到以太零网络。稍等片刻，部署成功后合约的使用界面就会出来，这样你就完成了一个以太零平台智能合约的部署，是不是很简单。

### **合约部署问题**

如果点击Deploy发送交易后，remix报如下错误，则表示该交易的Power值不够，这种情况下，可以将发送交易的GasPrice调低，比如调整为1或者2，再进行尝试。

在网络拥堵的情况下，较低的GasPrice可能需要等待较长的时间，这时候也可以通过增加账户以太零余额的方式来满足要求。

![](https://153593762-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LP94keYaE-d-gp2r4-_%2F-LWAfiEwvhzx7xs2pR_a%2F-LWAfsHVdXXDKgiAGRTO%2F22223434.jpg?alt=media\&token=0d9657d8-f5a5-4260-b88e-e334f890266d)

## 应用代码

web3对区块链功能进行了封装.目前以太零的web3与以太坊的web3除power功能外接口是一致的,可以使用以太坊的web3与以太零节点进行交互.现在web3有python、java、JavaScript等实现,下面以使用比较广泛的web3.js作为例子.

### node.js使用web3

首先需要在项目中引入web3库

```
npm i -S web3
```

引入后就可以通过下面代码实例化web3对象,填入的url地址可以使用自己搭建的节点地址.下面这种方式实例化的web3是通过http协议与节点通信的,事件监听等功能会有限制,可以使用ws或者ipc的方式连接保证相应功能使用.

```
var Web3 = require('web3');
var web3 = new Web3("HTTP://etzrpc.org");
```

引入web3后就可以通过web3对象的与节点通信,以及使用一些以太零相关的加解密功能,具体可以参照web3文档.

### 浏览器环境使用web3

安装了goetz的话浏览器会有一个web3的全局对象,可以直接使用,但是一般不建议这么做,一方面goetz提供的web3对象是0.20版本,落后与当前版本(1.0.0.37),另一方面这个web3对象仅仅是goetz自身使用的一个代理对象,不保证其中行为,所以最好在页面中引入自己的web3(可从github上下载).dist/web3.min.js更换成自己的web3文件路径.

```
<script src="dist/web3.min.js" charset="utf-8"></script>
```

引入完成后浏览器会带有Web3这个类,接下来通过实例化这个类重新创建web3对象.

```
var web3 = new Web3(web3_etz.givenProvider);  //goetz
var web3 = new Web3(ethereum);           //metamask
```

接下来就可以调用web3的api进行开发了.

## 参考文档

solidity: [https://solidity.readthedocs.io/en/v0.5.2/](https://solidity.readthedocs.io/en/v0.5.2/)

web3文档: [https://web3js.readthedocs.io/en/1.0/](https://web3js.readthedocs.io/en/1.0/)
