Skip to main content

Command Palette

Search for a command to run...

jLab:郭宇的Web3开发最佳实践阅读笔记-4

Published
1 min read

jLab:郭宇的最佳实践阅读笔记-4

概述

阅读大牛郭宇的文章

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

第三篇笔记见这里:here,主要是优秀应用、优秀合约库的推荐。

下面开始说一些实践,就是开发套路、流程(工作流程,单元测试)。

Hardhat:这个不用说了,大部分人都在用它做本地链的搭建和本地合约的部署、测试等。

特性包括:本地链创建部署、公开私钥调试、本地合约编译和本地测试网络,内存网络中运行单元测试;对接不同的区块链网络,部署合约到生成环境;fork某个特定高度区块链到本地来集成测试。

整合 Hardhat工作流

  1. 新建: npx hardhat,follow流程即可

  2. 已经初始化了,比如react或者其他模板初始化过,那就直接添加hardhat.config.js

    然后安装对应依赖 @nomiclabs/hardhat-waffle ethereum-waffle chai @nomiclabs/hardhat-ethers ethers

  3. hardhat主要依靠task,来编译,部署,测试,你的智能合约。

  4. 主要任务:npx hardhat node, npx hardhat deploy, 都在这里面:hardhat.config.js,测试可以用contractInstance.connect(signer)来更改调用用户。(推销下foundry,郭宇写的,测试起来更方便,有点学习成本)

  5. 因为测试需要,我们需要在每次 beforeEach 钩子中重新发布我们的合约并使其从零状态开始运行。反复发布会效率很低,推荐hardhat-deploy插件,支持使用evm_snapshot快速跳到特定区块高度,可以在在单元测试中维护测试前、中、后以及各种特定高度状态,极大地加快测试速度,Github.

  6. 安装插件需要注意,引入 hardhat-deploy 插件,需要修改对应的 @nomiclabs/hardhat-ethers 插件来源,这可能会导致在未来的 npm install 中带来版本冲突,如果你遇到了版本冲突,可以使用 npm install --force 跳过版本依赖检查,强制安装两者。

    "devDependencies": {
        "@nomiclabs/hardhat-ethers": "npm:hardhat-deploy-ethers",
        "hardhat-deploy": "^0.11.2",
        ...
    }
    

    hardhat-deploy 插件还提供了非常多的 HRE 实用函数, 例如支持在./deploy编写每个合约的发布脚本。但是也替代了默认脚本(npx hardhat run),详细大家权衡,参考插件的docs。

  7. 对权限敏感的合约,可以用execute函数立即修改发布后的合约状态:

   const { deploy, execute } = deployments;
   const shareGovernor = await deploy('ShareGovernor', {
       contract: 'TreasuryGovernor',
       from: deployer,
       args: [name + '-ShareGovernor', share.address, treasury.address, settings.share.governor],
       log: true,
     });

     // Setup governor roles
     // Both membership and share governance have PROPOSER_ROLE by default
     await execute(
       'Treasury',
       { from: deployer },
       'grantRole',
       PROPOSER_ROLE,
       membershipGovernor.address
     );

getNamedAccounts 能帮助我们命名本地测试账户,更多参考docs。

  1. 测试的覆盖和报告,推荐两个 hardhat 插件 hardhat-gas-reportersolidity-coveragehardhat-gas-reporter 插件帮助你了解运行单元测试中部署和执行合约方法消耗的 gas 费用,如果在本地环境变量中提供 COINMARKETCAP_API_KEY,它会自动将这些成本折算为美元或其他法币计价。

    img

    Github, Github

  2. 两个其他的使用插件,他们是 @nomiclabs/hardhat-etherscan@tenderly/hardhat-tenderly,注意,依赖第三方服务的 API Key!hardhat-etherscan 插件将 etherscan 网站的源码 verify 功能整合到发布工作流中,能够将所发布合约的源码和 ABI 都展示在合约地址页面,我自己在用,Github. hardhat-tenderly 插件整合了 Tenderly 工作流,后者是一个新兴的 CI/监控 平台,能够帮助我们监控线上合约的状态并提供 debug 建议,Websit,Github

  3. 终于到了Foundry,很棒的工具,学习曲线不陡峭,Site,Foundry 由它的命令行工具 Forgecast 组成,前者帮助我们安装第三方依赖组件(使用 git submodule 方式)运行测试,发布合约,后者帮助我们与合约进行 RPC 通信交互。思路是不再依赖Nodejs的技术体系。测试文件与合约源码在同一个文件夹中管理,通常以 ContractName.t.Sol 特殊后缀结尾。有一系列的测试套件工具帮助我们编写基于 Sol 的单元测试。包括可继承的 Test 合约,和一个特殊的,与 vm 通信的合约 Cheatcodes 帮助我们改变外部调用者地址,进行错误断言等等功能。

More from this blog

让你的私钥随时更换,可以四处旅行

是的基于社交恢复和社区运行的TEE KMS,普通个体的私钥可以依赖多层安全机制:passkey+Email+社区KMS(硬件安全)+AA多签(可适配多种签名机制,增加抗量子签名模块)。听起来非常棒!是人类数字未来中需要的东西。下面是我的一个研究项目,进行中,有经验的大牛可以指点一下(嵌入式和硬件钱包开发、TEE、抗量子等等)。 STM32MP157F-DK2 Development Project STM32MP157F-DK2 开发项目 🇬🇧 Jump to English Vers...

Jan 25, 20263 min read

人性之光-以自由之名

以自由之名 v0.1.5 有点怪怪的标题,原谅理工男的简单和直接。 先分享一点感触和认知:某个角度看,人性是想象力、创造力和情感,是人类独有的特质。 人性是区别于AI和机器人,以及其他生命和造物的独有内核。人性是一种对自由的追求:发挥你的想象力、创造力,拥有自己的情感,是人存在的一种方式,这种方式,称为自由。 作为普通个体,想在人类社会拥有自由,除去国家和法律赋予的基础保障和基本权利之外,哈耶克有个观点是时间、空间和选择的范围,是自由的基础保障;而福柯则反向给出了规训的方式:时间空间和力量(并非...

Jan 25, 20261 min read

How to play with AI vibe coding?

我们要和 AI 沟通,要总结几个经验,供大家参考(血泪教学,迭代无数次): 三个重点 重设计、三层文档体系、渐进式开发。 第一点 最重要就是设计一定要占据你开发时间的一半以上,包括研究,包括和 AI 的交互讨论,包括提取一些专题,然后跟其他的 AI 交流生成深度的报告,包括自己阅读相关的报告和分析,以及一些范例的 repository。 第二点 要完整的文档体系,不管哪一种,都要跟随文档体系来去不断地迭代你的和 AI 交互的过程;我现在使用的是,嗯,三层的文档管理体系。第一层呢是backlog...

Aug 17, 20252 min read

It is Fun for me.

jFlow: from research to production 创新之路:最有趣的探索之路。 创新之路 Road of Exploration Research Input=Idea:描述你的 idea,进行严谨的论证过程,逻辑结构类似于缩小版本的 SCI 论文。通过分析论证,得出结论,是真正有价值创新。 output=Solution:定义你的产品,包括产品定位、目标用户、核心功能、商业模式,让团队、社区、早期投资者、用户、合作伙伴等,都快速了解你的产品的价值所在。 Devel...

Aug 12, 20251 min read

我的AI小助手:RAG 本地测试记录(updating...)

预期: 数据: 本地个人计划和隐私、正常论文相关的科研、业界跟踪和研究分析,三大类都存储在本地,不要流出个人电脑。 初步的7B模型(本人MiniMac的上限)进行大体分析。 可以使用外部deepseek和grok,claude等外部API,但沟通内容是隔离和脱敏的,最简单就是7B分析的结论,进行隐私脱敏(自行设定脱敏规则)和单独目录存储(独立知识库),这个动作是离线断网进行。 然后针对沟通外部的独立知识库,可以充分利用外部大模型能力。 个人计划是使用雷电连接mac book和mac m...

Mar 15, 20251 min read

jLab

69 posts

It is my Lab for curiosity!