Skip to content

Commit

Permalink
Reformat and update some files
Browse files Browse the repository at this point in the history
  • Loading branch information
pythonberg1997 committed Oct 31, 2021
1 parent a222d99 commit 9d43f88
Show file tree
Hide file tree
Showing 17 changed files with 481 additions and 485 deletions.
99 changes: 61 additions & 38 deletions basic/04-web3js-truffle/README.md
Original file line number Diff line number Diff line change
@@ -1,87 +1,103 @@
## Truffle 介绍
Truffle是基于Solidity语言的一套开发框架,它简化了去中心化应用(Dapp)的构建和管理流程。本身是采用Javascript编写,支持智能合约的编译、部署和测试。
- [Truffle 官网](https://www.trufflesuite.com/docs/truffle/quickstart)

truffle开发框架提供了很多功能,简化了我们的开发、编译、部署与调试过程:
Truffle 是基于 Solidity 语言的一套开发框架,它简化了去中心化应用(Dapp)的构建和管理流程。本身是采用 Javascript 编写,支持智能合约的编译、部署和测试。

- [Truffle 官网](https://www.trufflesuite.com/docs/truffle/quickstart)

- 内置了智能合约编译、链接、部署和二进制文件的管理
- 方便快速开发的合约自动化测试
- 方便扩展的、脚本化的部署与发布框架
- 方便的网络管理功能。不论是公有网络还是私有网络
- 基于erc190标准,使用EthPM & NPM进行依赖包管理
- 内置控制台功能。项目构建后,可以直接在命令行调用输出结果,方便了开发调试
- 可配的构建流程,支持持续集成。
- 支持外部脚本的执行
truffle 开发框架提供了很多功能,简化了我们的开发、编译、部署与调试过程:

- 内置了智能合约编译、链接、部署和二进制文件的管理
- 方便快速开发的合约自动化测试
- 方便扩展的、脚本化的部署与发布框架
- 方便的网络管理功能。不论是公有网络还是私有网络
- 基于 erc190 标准,使用 EthPM & NPM 进行依赖包管理
- 内置控制台功能。项目构建后,可以直接在命令行调用输出结果,方便了开发调试
- 可配的构建流程,支持持续集成。
- 支持外部脚本的执行

## 文件说明

### 目录结构
- contracts/: Solidity合约目录

- migrations/: 部署脚本文件目录
- contracts/: Solidity 合约目录

- migrations/: 部署脚本文件目录

- test/: 测试脚本目录,参考 如何测试应用?
- test/: 测试脚本目录,参考 如何测试应用?

- truffle-config.js: Truffle 配置文件
- truffle-config.js: Truffle 配置文件

### 各文件作用

1. contracts/SimpleToken.sol: 这是一个用 Solidity 编写的 erc20 代币 智能合约.
2. migrations/1_initial_migration.js: 这是一个部署脚本,用来部署 Migrations 合约,对应 Migrations.sol 文件。
3. truffle-config.js (之前是 truffle.js): Truffle 配置文件, 用来设置网络信息,和其他项目相关的设置。当我们使用内建的默认的Truffle命令时,这个文件留空也是可以的。
3. truffle-config.js (之前是 truffle.js): Truffle 配置文件, 用来设置网络信息,和其他项目相关的设置。当我们使用内建的默认的 Truffle 命令时,这个文件留空也是可以的。

## 测试流程
1) 安装 truffle
```

1. 安装 truffle

```bash
npm install -g truffle
```

2) 测试合约
```
2. 测试合约

```bash
truffle test
```

这里,使用 "truffle test" 后,truffle 会启动内置的 test 网络,同时执行 测试 test 目录下的所有脚本,如果想单独测试某个脚本,可以
执行 "truffle test ./test/simpletoken.js"

3) 编译合约
```
truffle compile
3. 编译合约

```bash
truffle compile
```

执行成功后,会输出类似如下信息。从输出信息可以看到, truffle 会把 contracts 目录下的所有合约进行编译
```

```bash
Compiling .\contracts\SimpleToken.sol...

Writing artifacts to .\build\contracts
```

4) 部署合约
4. 部署合约

在 truffle-config.js 里面,可以配置 truffle 使用的以太网络,其中就包括 truffle test 使用的 "test" 网络。
这里,直接执行 truffle migrate 报没有找到 test 网络,因为 truffle 不会启动内置的 test 网络。所以这里我们使用 kovan 进行 truffle 合约部署
```

```bash
truffle migrate --network kovan
```

当多次执行 truffle migrate 的时候,可能会出 "Network update to date", 然后不执行合约部署的情况,这个时候需要执行如下的 truffle 命令
```

```bash
truffle migrate --network kovan --reset
```

## 在 infura 测试合约

在 test 目录下存在 sol 和 js 类型的文件,truffle 支持这两种类型的测试文件。但目前测试发现,如果连接的测试网络为 infura ,则执行
sol 的测试文件会报失败。所以,这里我们连接到 infura 进行测试时,只能使用 js 的测试文件。

- 修改 simpletoke.js
- 修改 simpletoke.js

修改 simpletoken.js 文件,把其中的 accounts[1] 修改为 "0x5DF22be367b95788Cd51C7dbdf7c7aB70fE856EE" ( 为例 ), 然后执行
如下命令。执行过程可能比较慢,需要耐心等待一下。
```

```bash
truffle test ./test/simpletoken.js --network kovan
```

## 在本地测试合约
运行truffle develop,系统会给出10个测试账号,包括钱包地址和私钥。
```

运行 truffle develop,系统会给出 10 个测试账号,包括钱包地址和私钥。

```bash
$ truffle develop
Truffle Develop started at http://127.0.0.1:9545/

Expand Down Expand Up @@ -110,25 +126,31 @@ Private Keys:
(9) 040cdda01e0b34c00c39877078af2015bd16125fb4fabf1d7153b679e209409f

```
选择任意一个私钥,将其放置在truffle-config.js中mnemonic变量中。

选择任意一个私钥,将其放置在 truffle-config.js 中 mnemonic 变量中。

例如,原代码是

- const mnemonic = fs.readFileSync('./sk.txt').toString().trim()

修改后的代码是

- const mnemonic = "0a8d9e2a470aedfabe279f16f629c5054a47d69b7d66d17ba65cdd7ca99876e1"

接下来配置本地网络参数,将下面network属性中development注释打开,host配置成本地,port配置成truffle develop给出的端口地址,如本例中端口是9545。network_id保留原状。
```
接下来配置本地网络参数,将下面 network 属性中 development 注释打开,host 配置成本地,port 配置成 truffle develop 给出的端口地址,如本例中端口是 9545。network_id 保留原状。

```js
development: {
host: "127.0.0.1",
port: 9545,
network_id: "*"
},
```
配置好以后即可运行truffle compile进行编译,truffle migrate进行部署,truffle test进行测试。

配置好以后即可运行 truffle compile 进行编译,truffle migrate 进行部署,truffle test 进行测试。
测试成功后可以看到
```

```bash
> Artifacts written to C:\Users\Highland\AppData\Local\Temp\test--33840-ApHyOzehxOdp
> Compiled successfully using:
- solc: 0.8.0+commit.c7dfd78e.Emscripten.clang
Expand All @@ -149,6 +171,7 @@ Private Keys:
```

## 参考资料
> https://learnblockchain.cn/docs/solidity/contracts.html

> https://solidity-cn.readthedocs.io/zh/develop/
- <https://learnblockchain.cn/docs/solidity/contracts.html>

- <https://solidity-cn.readthedocs.io/zh/develop/>
59 changes: 33 additions & 26 deletions basic/06-ethersjs-waffle/README.md
Original file line number Diff line number Diff line change
@@ -1,48 +1,55 @@
## 前言
Waffle 是一款适配 ehterjs 的智能合约测试库。本样例演示了使用 Waffle 进行测试的基本流程及使用方法.
Waffle 详细使用方法可以参考 [Waffle 官网](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html) ,
对于不熟悉 Waffle 测试框架的开发者, 可以根据本样例进行基础的操作, 阅读样例代码, 形成初步的流程概念, 之后再参考官网进行更加深入的了解.
## 合约介绍

Waffle 是一款适配 ehter.js 的智能合约测试库。本样例演示了使用 Waffle 进行测试的基本流程及使用方法.
Waffle 详细使用方法可以参考 [Waffle 官网](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html) , 对于不熟悉 Waffle 测试框架的开发者, 可以根据本样例进行基础的操作, 阅读样例代码, 形成初步的流程概念, 之后再参考官网进行更加深入的了解.

## 合约介绍

- contract/SimpleToken.sol
一个标准的 ERC20 合约, 实现了 ERC20 的所有接口, 用户可以使用这个合约进行 ERC20 代币的发放

## 脚本介绍
一个标准的 ERC20 合约, 实现了 ERC20 的所有接口, 用户可以使用这个合约进行 ERC20 代币的发放


## 脚本介绍

- test/simpleTokenTest.js
SimpleToken.sol 合约的单元测试代码. 这里只写了一个测试脚本, 实际开发中, 可以在 test 目录下, 针对不同的合约, 编写多个单元测试脚本, 之后使用 yarn test 命令即可执行 test 目录下所有的单元测试脚本.
在 simpleTokenTest.js 脚本中, 对 SimpleToken.sol 合约的各个接口进行简单的测试, 可以参考此样例编写其他合约的单元测试代码.
SimpleToken.sol 合约的单元测试代码. 这里只写了一个测试脚本, 实际开发中, 可以在 test 目录下, 针对不同的合约, 编写多个单元测试脚本, 之后使用 yarn test 命令即可执行 test 目录下所有的单元测试脚本.
在 simpleTokenTest.js 脚本中, 对 SimpleToken.sol 合约的各个接口进行简单的测试, 可以参考此样例编写其他合约的单元测试代码.

- index.js
外部合约, 需要单独进行调用. 对应实际生产环境中, 当单元测试通过后, 就可以调用此脚本进行实际的生成操作.
此脚本名字自行进行定义, 这里是使用 index.js 进行指定
外部合约, 需要单独进行调用. 对应实际生产环境中, 当单元测试通过后, 就可以调用此脚本进行实际的生成操作.
此脚本名字自行进行定义, 这里是使用 index.js 进行指定

## 操作步骤

## 操作步骤
- 1 安装依赖
```

```bash
yarn install
```

- 2 编译合约:
```

```bash
yarn build
```

- 3 执行测试
```
yarn test
```
- 3 执行测试

- 4 测试 index.js
```bash
yarn test
```

- 4 测试 index.js

```bash
node index.js
```

## 参考文档
waffle 官方文档:
https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html

ehterjs 官方文档:
https://docs.ethers.io/v4/api-providers.html
https://docs.ethers.io/v5/getting-started/#getting-started--contracts
- waffle 官方文档: <https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html>

- ehterjs 官方文档: <https://docs.ethers.io/v4/api-providers.html>
<https://docs.ethers.io/v5/getting-started/#getting-started--contracts>

中文文档:
https://learnblockchain.cn/docs/ethers.js/api-providers.html
- 中文文档: <https://learnblockchain.cn/docs/ethers.js/api-providers.html>
26 changes: 13 additions & 13 deletions basic/07-hardhat/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,13 +117,13 @@ require('@nomiclabs/hardhat-waffle'); // hardhat waffle 插件

windows:

```
```bash
copy .env.example .env
```

/ linux:
linux:

```
```bash
cp .env.example .env
```

Expand Down Expand Up @@ -210,13 +210,13 @@ npx hardhat accounts

### console

hardhat的控制台模式,实时与链上交互。默认会启动hardhat内置网络
hardhat 的控制台模式,实时与链上交互。默认会启动 hardhat 内置网络

```sh
npx hardhat console
```

控制内置ethers和web3库,可以直接使用,无须引入。
控制内置 ethers 和 web3 库,可以直接使用,无须引入。

```js
// hardhat console mode:
Expand All @@ -226,7 +226,7 @@ npx hardhat console

### console.log debug

hardhat 提供了一个 `console.log()` 方法,可以在合约运行时打印日志,方便调试和测试。**此方法仅在hardhat内置网络中运行有效**
hardhat 提供了一个 `console.log()` 方法,可以在合约运行时打印日志,方便调试和测试。**此方法仅在 hardhat 内置网络中运行有效**

在合约中引入 `hardhat/console.sol` 即可使用:

Expand Down Expand Up @@ -256,27 +256,27 @@ Changing greeting from 'Hello, world!' to 'hello Dapp-Learning!'

1. 编译合约

```
```bash
npx hardhat compile
```

2. 批量运行测试脚本

```
```bash
npx hardhat test
```

3. 部署到测试网:

```
```bash
npx hardhat run scripts/deploy.js --network <network-name>
```

这里的 `network-name` 替换成你指定的网络名称,这里可以换成 `rinkeby`,对应配置文件中的网络名称。

## 参考文档

- hardhat 官方文档: https://hardhat.org/guides/project-setup.html
- hardhat 中文文档: https://learnblockchain.cn/docs/hardhat/getting-started/
- ethers.js 和 hardhat 基础使用讲解: (https://www.bilibili.com/video/BV1Pv411s7Nb)
- https://rahulsethuram.medium.com/the-new-solidity-dev-stack-buidler-ethers-waffle-typescript-tutorial-f07917de48ae
- hardhat 官方文档: <https://hardhat.org/guides/project-setup.html>
- hardhat 中文文档: <https://learnblockchain.cn/docs/hardhat/getting-started/>
- ethers.js 和 hardhat 基础使用讲解: <https://www.bilibili.com/video/BV1Pv411s7Nb>
- <https://rahulsethuram.medium.com/the-new-solidity-dev-stack-buidler-ethers-waffle-typescript-tutorial-f07917de48ae>
31 changes: 10 additions & 21 deletions basic/07-hardhat/hardhat.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,8 @@ task('accounts', 'Prints the list of accounts', async () => {
}
});


function mnemonic() {

return process.env.PRIVATE_KEY;

return process.env.PRIVATE_KEY;
}

/**
Expand All @@ -26,35 +23,27 @@ module.exports = {
networks: {
localhost: {
url: 'http://localhost:8545',
//gasPrice: 125000000000,//you can adjust gasPrice locally to see how much it will cost on production
//gasPrice: 125000000000, // you can adjust gasPrice locally to see how much it will cost on production
/*
notice no mnemonic here? it will just use account 0 of the hardhat node to deploy
(you can put in a mnemonic here to set the deployer locally)
*/
},
rinkeby: {
url: "https://rinkeby.infura.io/v3/" + process.env.INFURA_ID, //<---- YOUR INFURA ID! (or it won't work)
accounts: [
mnemonic()
],
url: 'https://rinkeby.infura.io/v3/' + process.env.INFURA_ID, //<---- YOUR INFURA ID! (or it won't work)
accounts: [mnemonic()],
},
kovan: {
url: "https://kovan.infura.io/v3/" + process.env.INFURA_ID, //<---- YOUR INFURA ID! (or it won't work)
accounts: [
mnemonic()
],
url: 'https://kovan.infura.io/v3/' + process.env.INFURA_ID, //<---- YOUR INFURA ID! (or it won't work)
accounts: [mnemonic()],
},
mainnet: {
url: "https://mainnet.infura.io/v3/" + process.env.INFURA_ID, //<---- YOUR INFURA ID! (or it won't work)
accounts: [
mnemonic()
],
url: 'https://mainnet.infura.io/v3/' + process.env.INFURA_ID, //<---- YOUR INFURA ID! (or it won't work)
accounts: [mnemonic()],
},
ropsten: {
url: "https://ropsten.infura.io/v3/" + process.env.INFURA_ID, //<---- YOUR INFURA ID! (or it won't work)
accounts: [
mnemonic()
],
url: 'https://ropsten.infura.io/v3/' + process.env.INFURA_ID, //<---- YOUR INFURA ID! (or it won't work)
accounts: [mnemonic()],
},
},
};
Loading

0 comments on commit 9d43f88

Please sign in to comment.