# jLab：郭宇的Web3开发最佳实践阅读笔记-6

### jLab：郭宇的最佳实践阅读笔记-6

### 概述

阅读大牛郭宇的文章

https://guoyu.mirror.xyz/RD-xkpoxasAU7x5MIJmiCX4gll3Cs0pAd5iM258S1Ek

第五篇笔记见这里：[here](https://blog.jlab.tech/jlab-web3-fullstack-engineer-5)，主要是合约开发的全流程实践。

本篇聊下客户端开发和后面的开发、测试以及生产环境调试。

这里大家应该更熟悉一些，在Web2已经很稳定了，例如React Native（跨平台）Flutter（跨平台）Swift（iOS）和 Java (Android)，无论哪个方案，都有多个依赖库可选。

郭宇建议：

[Flutter](https://ethereum.org/en/developers/docs/programming-languages/dart)直接推荐了dart，另外[web3dart](https://pub.dev/packages/web3dart),十一个dart package，与relay进行通信。

个人关注了下Flutter，跨越六个主流平台，虽然还未支持交叉编译，但一次编码六次部署，也很便捷了。

对于[Swift]，推荐了[web3.swift](https://github.com/argentlabs/web3.swift)。

Java有[Web3j](https://github.com/web3j/web3j)。

以上，实际上我们依然遵循开头给出的DApp模式，实际上，是有可能突破的，不过，需要摸索和创新。

下面聊下所有软件工程都要面对的三个环境：开发、测试、生产。

研发过程的阶段不同，目标不同，流程操作不同，因此环境配置会有不同。

1. 开发环境

因为DApp和传统软件不同，架构不是BS或者CS等，而是经过了几层周折，有一定成本。

以`hardhat`为例，每次修改合约，都需要重新部署合约并且生成新合约地址，以及变更后的ABI的json文件。方式两种，1.使用插件，2.自己添加task进行复制。

`hardhat-deploy` 插件使用 `--export-all` 导出所有被发布的合约 ABI（包含地址信息）为一个完整的 json 文件。

```
{
  "31337": [
    {
      "name": "localhost",
      "chainId": "31337",
      "contracts": {
         "Membership": { address: "...", abi: [...] }
         ...
    }
  ]
}
```

一个由 Chain ID（31337 是 hardhat Chain ID）索引的合约 ABI 清单,获取文件后可以动态构建合约调用。

注意：`Provider/Signer`连接的网络，是哪个测试，还是正式网络，要进行判定。

hardhat是实时出块，实际网络有延时、队列，详细参考手册修改模拟。

2. 测试和生产环境

本地网络开发方便快捷，完成业务开发，内测后，可以发布到几个线上测试网，Rinkeby, Kovan, Ropsten （以上几个合并后会逐步废弃、关闭）或者 Goerli （未来合并后，一段时间内会只有Goerli）。

```
npx hardhat deploy --network rinkeby
```

注意：测试目标是为了确保业务安全、符合预期、稳定流转，而发布线上测试网络，所有状态只能通过ABI调用，任何人都可以使用，因此确保你在发布之前使用了特殊的权限管理或是地址硬编码。（例如测试阶段只允许你的地址调用，或者需要授权等）

另外一个方式：

```
hardhat node --fork URI
```

 fork 主网状态充当测试环境，因为在本地，又模拟了线上，可管理、安全保密且快速。参考这里：[详细指南](https://hardhat.org/hardhat-network/guides/mainnet-forking.html)



如果和外部第三方合约交互，1. 需要再三确认调用的地址是否正确。 2. 大部分流行的协议或者 DEX 在几大公开测试网络都提供了测试合约，包括 [OpenSea](https://testnets.opensea.io/) 在内。

水龙头：[Multi](https://faucet.paradigm.xyz/),[Rinkeby](https://rinkebyfaucet.com/)

------

### 
