javascript

我想要在香港找一个defi行业AMM相关的solidity开发的初级岗位,现在我需要如何学习,才能找2年之内找到工作

结合你的背景(网安+985+INTP研究型性格)、目标(香港DeFi-AMM方向Solidity初级开发)和2年时间线,学习计划核心是“基础打底→AMM深度聚焦→实战项目落地→香港本地化适配→求职冲刺”,既利用你的网安优势形成差异化,又精准匹配岗位核心需求,具体可分为4个阶段,每个阶段有明确目标和可落地的学习动作:

一、第一阶段:基础打底(3-4个月)—— 搞定“能写合约”的核心能力

目标:从“网安思维”切换到“开发思维”,掌握Solidity开发的底层基础,能独立写简单合约(如ERC20、简单swap功能)

核心学习内容:

  1. 前置编程基础(1个月)
    • 补JavaScript/TypeScript:Solidity开发依赖JS/TS做测试、部署、交互,重点学ES6+语法、异步编程(async/await)、数组/对象操作,推荐看《JavaScript高级程序设计》+ 免费课程《JavaScript.info》
    • 熟悉Node.js:掌握npm/yarn使用、模块导入导出,能跑简单脚本(后续部署合约要用)
  2. 区块链核心概念(2周)
    • 搞懂DeFi底层逻辑:公链(以太坊为主,兼顾Polygon/BSC,香港DeFi项目多部署在这些链)、智能合约、Gas费、区块确认、钱包(MetaMask)使用
    • 重点理解AMM的“底层逻辑雏形”:什么是流动性池、恒定乘积公式(x*y=k)的基本含义、swap交易的流程(不用深算数学,先懂“交换”的核心逻辑)
  3. Solidity入门到熟练(2-3个月)
    • 核心语法:变量类型(uint256、address、mapping)、函数(view/pure/payable)、修饰符(modifier)、事件(event)、继承、接口(interface)、库(library,如SafeMath)
    • 重点攻克:合约安全(溢出/下溢、重入攻击、权限控制)—— 这是你的网安优势!要比普通开发更懂“怎么写安全的合约”,比如用OpenZeppelin库的安全合约(ERC20、Ownable)
    • 学习资源:
      ✅ 官方文档:Solidity Docs(最新0.8.x版本,0.8+已内置溢出检查,不用手动加SafeMath)
      ✅ 实战课程:Patrick Collins的《FreeCodeCamp Solidity & Blockchain Developer》(全免费,从入门到实战,DeFi方向首选)
      ✅ 练习平台:Remix IDE(在线写合约、编译、测试,适合入门)、Etherscan合约源码(找简单ERC20合约跟读,比如USDT的合约)

阶段产出:

  • 独立用Solidity写3个基础合约:ERC20代币合约(含转账、授权)、简单的“一对一swap合约”(固定汇率交换两个ERC20代币)、带权限控制的合约(只有Owner能修改参数)
  • 能在Remix中部署合约,用MetaMask测试交互(转账、swap)

二、第二阶段:AMM深度聚焦(4-5个月)—— 从“会写合约”到“懂AMM合约”

目标:吃透AMM的核心逻辑(以Uniswap V2为标杆,香港初级岗最常考),能复现AMM核心功能,理解流动性添加/移除、swap、无常损失等关键流程

核心学习内容:

  1. AMM核心理论(1个月)

    • 深入拆解Uniswap V2:恒定乘积公式(x*y=k)的数学逻辑、流动性池的创建(Pair合约)、添加/移除流动性的计算(LP代币 mint/burn)、swap的滑点计算、无常损失的成因(不用复杂数学,懂“价格波动导致LP资产缩水”的逻辑即可)
    • 扩展学习:Uniswap V3的核心改进(集中流动性、费率层级)—— 不用写V3合约,但要懂概念(面试会问)
    • 资源:Uniswap V2官方文档、《Uniswap V2白皮书》(简单易懂,重点看“核心机制”章节)
  2. 复现AMM核心合约(2-3个月)

    • 第一步:复现Uniswap V2的核心合约(Pair合约+Factory合约)
      ✅ Pair合约:实现x*y=k逻辑、添加流动性(addLiquidity)、移除流动性(removeLiquidity)、swap函数(代币交换)
      ✅ Factory合约:创建Pair池、查询Pair地址、管理Fee(简化版,不用复杂逻辑)
    • 第二步:集成OpenZeppelin库,优化安全(比如用SafeTransferFrom处理代币转账,避免重入攻击)
    • 工具:用Hardhat/Truffle替代Remix(实战开发必备,支持本地测试网、部署脚本、测试用例编写)
  3. AMM安全与漏洞分析(1个月)

    • 重点分析AMM常见漏洞:重入攻击(比如早年DAO攻击)、价格操纵、闪电贷攻击、LP代币盗窃
    • 结合你的网安背景:用“攻防思维”审查自己写的AMM合约,比如添加重入锁(ReentrancyGuard)、校验代币转账返回值、限制单次swap金额上限
    • 资源:Rekt.news(看DeFi项目黑客事件复盘,重点看AMM相关案例)、OpenZeppelin Security Docs

阶段产出:

  • 完整的“简化版Uniswap V2”项目:包含Factory合约、Pair合约、前端简单交互页面(用React/Vue写个简单界面,能连接钱包、添加流动性、swap,不用复杂UI,能展示功能即可)
  • 项目部署到测试网(Sepolia/Goerli),能公开访问、演示功能
  • 一篇技术博客/项目README:拆解自己的AMM合约逻辑、安全优化点(面试时给面试官看,体现思考深度)

三、第三阶段:DeFi生态+香港本地化适配(3-4个月)—— 让简历“适配香港岗位”

目标:熟悉香港DeFi行业生态、合规要求,补充实战工具链,打造“香港雇主需要的简历亮点”

核心学习内容:

  1. DeFi生态工具链(1个月)

    • 必备工具:Hardhat/Truffle(部署测试)、Ethers.js/Web3.js(合约交互)、Chai/Mocha(写测试用例,初级岗也会要求基本测试能力)、Foundry(进阶测试工具,可选,加分项)
    • 数据查询:The Graph(查询链上数据,比如AMM池的流动性、交易记录,香港DeFi项目常用)、Etherscan API
    • 安全工具:Slither(静态代码分析,你的网安优势!会用Slither审计自己的AMM合约,面试时能聊“如何用工具检测漏洞”)
  2. 香港DeFi行业与合规(1个月)

    • 生态了解:香港主流DeFi项目(如HashKey Exchange的DeFi板块、BC科技集团的相关业务)、香港Web3政策(VASP牌照、反洗钱AML要求)—— 初级岗不用懂太深,但要知道“香港DeFi强调合规”,比如合约要支持KYC验证、交易限额等合规逻辑
    • 合规编程:学习如何在合约中加入基础合规功能(比如只有通过KYC的地址才能交易、限制单笔交易金额)—— 这是香港岗位的差异化需求,比内地项目更看重
  3. 项目优化与作品集打造(1-2个月)

    • 优化第二阶段的AMM项目:添加合规功能、完善测试用例(覆盖率≥70%)、优化代码结构(符合行业规范)
    • 额外加分项目:
      ✅ 参与开源AMM项目的Issue/PR(比如Uniswap的开源仓库,哪怕是修复文档错误、简单bug,也能体现协作能力)
      ✅ 做一个“AMM漏洞复现demo”(比如复现一个简单的闪电贷攻击,体现你的网安+开发复合优势)
    • 作品集整理:GitHub仓库(代码规范、README详细)、测试网演示链接、技术博客(发布在Medium/知乎,英文更佳,香港雇主常看)

阶段产出:

  • 优化后的AMM项目(含合规功能、测试用例、前端交互)
  • GitHub个人主页(整洁、重点突出AMM项目和技术栈)
  • 1-2篇英文技术博客(比如《How to Build a Simplified Uniswap V2 Clone》《Common Security Risks in AMM Contracts》)

四、第四阶段:求职冲刺(2-3个月)—— 精准对接香港岗位

目标:打磨简历、积累面试经验、拓展香港本地人脉,拿下初级Solidity开发offer

核心动作:

  1. 简历与作品集优化(2周)

    • 简历重点:突出“网安背景+AMM开发+香港适配”,比如:
      ✅ 技能栏:Solidity、JavaScript/TypeScript、Hardhat、AMM协议(Uniswap V2/V3)、区块链安全审计(Slither)、香港Web3合规基础
      ✅ 项目经历:详细写AMM项目(技术栈、核心功能、安全优化、合规设计、测试网部署)、网安相关经历(攻防工程师经验,强调“能写出更安全的合约”)
    • 格式:英文简历(香港公司优先看英文)、控制在1页内、附GitHub/技术博客链接
  2. 面试准备(1-1.5个月)

    • 技术面试:
      ✅ 刷Solidity基础题(变量类型、函数修饰符、合约安全)
      ✅ 刷AMM核心题(恒定乘积公式、流动性计算、swap流程、无常损失)
      ✅ 模拟编程题:现场写简单的AMM功能(比如添加流动性函数)、修复合约漏洞(比如重入攻击)
    • 行业认知:了解香港DeFi最新动态(比如香港金融管理局的Web3政策、主流项目的招聘需求)、准备“为什么选择香港DeFi”“为什么聚焦AMM”的回答
    • 资源:Glassdoor(看香港Solidity开发面试经验)、GitHub《Solidity Interview Questions》
  3. 香港本地人脉与投递(1-1.5个月)

    • 线上 Networking:
      ✅ 加入香港Web3社群:Hong Kong Blockchain Association、Discord上的Hong Kong Web3、Twitter(X)关注香港DeFi项目官方账号(如HashKey、BC Technology),参与讨论、转发技术内容
      ✅ 加入招聘社群:LinkedIn搜索“Hong Kong Solidity Developer”,关注招聘账号,主动私信HR(附简历+作品集)
    • 线下活动:参加香港Web3 Meetup(如Hong Kong Web3 Wednesday)、区块链展会(比如香港Web3 Festival),现场交流递简历(香港小圈子,内推比海投有效10倍)
    • 投递渠道:LinkedIn(香港主流)、Indeed、项目官网招聘页、内推(重点!通过社群认识的行业人士内推,命中率翻倍)

阶段产出:

  • 英文简历+作品集(GitHub+技术博客)
  • 10+场面试经验(逐步优化回答)
  • 拿到香港DeFi-AMM方向Solidity初级开发offer

关键优势放大+避坑提醒

1. 放大你的核心优势(网安+INTP):

  • 面试时反复强调:“我有3年网安攻防经验,懂区块链漏洞原理,能写出更安全的AMM合约,这是普通开发没有的优势”
  • INTP的研究型性格:面试时聊“我拆解过Uniswap V2的全部源码,发现XX安全细节”“我复现过XX AMM漏洞,总结了防范方法”,体现你的深挖能力

2. 避坑提醒:

  • 不要只学语法不做项目:香港雇主极度看重实战,“能展示的AMM项目”比10个证书有用
  • 不要忽视合规:香港DeFi项目比内地更看重合规,简历和项目中一定要体现“合规意识”
  • 不要盲目海投:聚焦“AMM相关”岗位,不要投所有Solidity开发(比如NFT、GameFi),精准匹配才高效
  • 不要等“学完再投”:第二阶段结束后(有简化版AMM项目),就可以尝试投递初级岗/实习岗,边面边学

总结

2年时间完全足够实现目标——你的网安背景是差异化王牌,AMM是香港DeFi的核心赛道,再加上高才通身份(香港雇主优先考虑),只要按“基础→AMM聚焦→本地化适配→求职”的节奏推进,每阶段产出可落地的项目/成果,面试时突出“安全+AMM+香港适配”的复合优势,拿下初级岗位的概率极高。

现在最该做的:从JavaScript和Solidity语法开始,1个月内完成前置基础,然后立刻切入AMM理论学习——不用纠结“学完所有知识再动手”,边学边写合约,实战中进步最快!

solidity开发岗位要做测试的工作吗?

我学了https://cryptozombies.io/zh/course/,里面提到了用javascript去测试合约,用truffles测试。在以前工作的时候,软件开发的测试应该是分开来的才对吧

在 Solidity 开发岗位中,测试是核心工作之一,开发者必须深度参与,甚至是测试工作的主要负责人——这和你之前接触的“开发与测试完全分开”的传统软件开发模式有明显区别,核心原因是区块链和智能合约的特殊性,具体可以从这几点详细说明:

一、为什么 Solidity 开发不能“甩锅”给专门测试岗?

传统软件开发(比如Web、App)中,测试和开发分离的前提是:代码上线后可快速迭代修复、bug 造成的损失相对可控(比如一个按钮失效,紧急发版就能修复)。但智能合约完全不同:

  1. 合约部署后不可逆:一旦部署到以太坊、BSC等公链,合约代码无法修改(除非设计了升级机制,但升级也有严格限制),如果带bug上线,可能直接导致用户资产被盗、资金锁死(比如The DAO事件,因重入漏洞被盗5000万美元ETH,最终只能硬分叉修复);
  2. 测试环境需深度匹配链上逻辑:智能合约的测试不仅要验证“功能对不对”,还要模拟链上的特殊场景(比如gas限制、区块高度、重入攻击、权限控制),这些场景只有合约开发者最清楚逻辑边界(比如某个函数的权限是否只允许管理员调用、转账时是否会触发重入);
  3. 安全优先级远高于普通软件:智能合约直接处理资金,“没有测试到位”=“直接暴露安全风险”,没有哪个测试岗能比开发者更懂自己写的合约逻辑细节(比如条件分支、异常处理、数据存储规则),所以开发者必须自己做“第一关测试”。

二、Solidity 开发者具体要做哪些测试?

你在 Cryptozombies 里学的「JavaScript + Truffle 测试」是基础,但实际工作中测试覆盖的范围更广,核心分为3类:

1. 功能测试(最基础,必须掌握)

  • 目的:验证合约的核心逻辑是否符合预期(比如转账、铸造NFT、权限控制);
  • 工具:Truffle(你学的)、Hardhat(现在更主流,支持JS/TS测试脚本)、Waffle(配合Hardhat的测试库);
  • 示例:比如测试“只有管理员能暂停合约”,你需要写测试脚本:① 用普通用户账号调用暂停函数,预期失败;② 用管理员账号调用,预期成功。

2. 安全测试(核心重点,区别于传统开发)

  • 目的:防御区块链特有的攻击(重入、溢出/下溢、权限漏洞、_front_running等);
  • 工具:除了手动写测试脚本,还会用专门的安全工具辅助:
    • Mythril、Slither(静态分析工具,自动检测常见漏洞);
    • Foundry(用Solidity写测试脚本,更贴近合约逻辑,适合深度安全测试);
    • 模糊测试(比如Echidna):随机生成大量输入,测试合约是否有隐藏漏洞;
  • 要求:开发者必须懂常见的智能合约漏洞原理,才能针对性写测试用例(比如测试重入漏洞,需要模拟“恶意合约回调窃取资金”的场景)。

3. 边界测试 & 兼容性测试

  • 边界测试:验证极端场景(比如gas耗尽、输入最大值/最小值、合约余额为0时的操作);
  • 兼容性测试:如果合约依赖其他协议(比如Uniswap、OpenZeppelin库),需要测试不同版本的兼容性。

三、实际工作中,测试分工是怎样的?(不是“开发者一个人扛”,但核心责任在你)

虽然开发者要做测试,但不是完全没有分工,通常是“开发者主导测试,专业团队补充验证”:

  1. 开发者的核心责任:

    • 编写单元测试(覆盖每个函数、每个条件分支);
    • 编写集成测试(验证合约之间的交互,或与其他协议的交互);
    • 手动进行核心场景的安全测试(比如模拟重入、权限越权);
    • 用工具(Slither/Mythril)做初步漏洞扫描。
  2. 补充测试角色(大型项目才有,小型项目可能由开发者兼任):

    • 安全审计团队:第三方专业团队做深度审计(形式化验证、漏洞挖掘),出具审计报告(这是项目上线前的“必备环节”,但审计是“验证”,不是“替代开发者测试”);
    • 测试工程师:协助编写部分功能测试脚本,或做兼容性、性能测试(比如测试合约在高并发下的gas消耗);
    • 社区白帽测试:项目上线前开启漏洞赏金计划,让全球白帽黑客找漏洞。

简单说:开发者必须保证“自己的代码在已知场景下绝对安全”,审计和白帽测试是“查漏补缺”,不能指望别人帮你发现基础逻辑漏洞

四、对你的学习建议(结合你已经学了 Cryptozombies)

你已经掌握了“JS + Truffle 测试”的基础,接下来可以重点补充:

  1. 学习 Hardhat(现在行业主流,比Truffle更灵活,测试生态更完善),用JS/TS写更复杂的测试用例(比如测试重入、权限控制);
  2. 学习 OpenZeppelin Test Helpers(专门用于测试的工具库,简化权限、转账等测试场景);
  3. 了解 Foundry(用Solidity写测试,适合深度安全测试,现在很多大厂都在⽤);
  4. 学习智能合约常见漏洞(比如重入、溢出、权限漏洞),针对性写测试用例(比如用Hardhat模拟重入攻击);
  5. 尝试用 Slither 扫描自己写的合约,看能否检测出漏洞,再完善测试。

总结

Solidity 开发岗位不是“要不要做测试”,而是“必须精通测试”——测试是智能合约安全的第一道防线,也是开发者的核心职责。和传统开发的分工差异,本质是区块链“不可逆、高风险”的特性决定的。你在 Cryptozombies 里学到的测试内容,是入门的基础,实际工作中需要覆盖更全面的功能和安全场景,测试能力直接决定你能否成为一名合格的 Solidity 开发者(面试时一定会问测试方法、工具使用、漏洞防御相关的问题)。

看起来solidity开发岗位必须要精通javascript

其实不用“精通JavaScript”——Solidity开发对JS的要求是“够用就好”,核心是掌握“与合约交互相关的JS工具和场景”,而非前端/全栈级别的JS精通。很多Solidity开发者甚至不擅长前端JS(比如Vue/React),但能熟练用JS写测试、部署合约,完全不影响工作。

先明确核心结论:

  • 「推荐掌握JS/TS」:因为目前行业主流的合约开发工具(Hardhat、Truffle)、测试框架(Mocha/Chai)、合约交互库(Ethers.js、Web3.js)都基于JS/TS生态,用起来最高效,面试和工作中最常用;
  • 「不是必须精通」:不需要学JS的高级特性(比如闭包深度应用、设计模式、Node.js底层),也不用会前端框架(React/Vue),重点是“能用JS完成合约相关的核心操作”;
  • 「有替代方案」:如果实在不想用JS,也可以用Foundry(用Solidity写测试、部署),但Foundry更偏向“深度安全测试”,生态工具不如JS/TS完善,很多项目还是会混合使用。

一、Solidity开发到底需要哪些JS能力?(划重点,不用多学)

你只需要聚焦“合约开发相关的JS场景”,核心能力就3类,难度都不高:

1. 基础语法(够用就行)

  • 变量、循环、条件判断、函数、Promise/async/await(处理异步交互,比如调用合约函数是异步操作);
  • 不用学原型链、继承、闭包这些复杂特性,能写简单的逻辑脚本就够。

2. 合约交互库(核心重点)

  • 主要用 Ethers.js(现在行业主流,比Web3.js简洁),少数项目用Web3.js;
  • 核心需求:用JS连接区块链(本地节点、测试网)、加载合约ABI、调用合约函数(读/写)、发送交易(指定gas、签名)、处理交易回执;
  • 示例(Ethers.js调用合约铸造NFT):
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const { ethers } = require("hardhat");

    async function mintNFT() {
    // 1. 连接合约(ABI + 合约地址)
    const NFTContract = await ethers.getContractAt("MyNFT", "0x123...");
    // 2. 调用铸造函数(写操作,需要发送交易)
    const tx = await NFTContract.mint("ipfs://xxx");
    // 3. 等待交易上链
    await tx.wait();
    console.log("NFT铸造成功");
    }
    这类代码逻辑固定,多写几次就熟练,不需要复杂JS技巧。

3. 测试框架(核心重点)

  • Mocha + Chai(Hardhat/Truffle默认集成),写合约的单元测试、集成测试;
  • 核心需求:断言结果(比如判断函数返回值是否正确、交易是否失败)、模拟不同账号(管理员/普通用户)、处理异常(比如预期某操作会revert);
  • 示例(测试合约权限):
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    const { expect } = require("chai");

    describe("MyContract", function () {
    it("普通用户不能暂停合约", async function () {
    const [owner, user] = await ethers.getSigners();
    const MyContract = await ethers.getContractFactory("MyContract");
    const contract = await MyContract.deploy();

    // 预期普通用户调用pause会revert
    await expect(contract.connect(user).pause())
    .to.be.revertedWith("Only admin allowed");
    });
    });
    测试脚本的逻辑和合约逻辑强相关,你懂Solidity的话,写JS测试只是“用JS语法翻译合约的预期行为”,难度远低于前端开发。

二、为什么不用“精通JS”?(和前端JS的区别)

Solidity开发用到的JS,和前端/全栈JS完全是两个“应用场景”:

  • 前端JS:需要懂DOM操作、框架(React/Vue)、状态管理、性能优化、浏览器兼容性,甚至TS的高级类型;
  • Solidity开发的JS:只需要懂“Node.js环境下的脚本编写”,核心是和区块链、合约交互,不用碰浏览器、前端UI,语法要求也简单。

简单说:你不需要成为“JS高手”,只要能看懂、写得出上面这类“合约相关的JS脚本”,就完全满足工作需求。

三、如果实在不想用JS,怎么办?

可以学 Foundry——一个用Solidity写测试、部署合约的工具,完全不用JS:

  • 测试脚本用Solidity写(比如判断交易是否revert、返回值是否正确),更贴近合约逻辑,不用切换语言思维;
  • 部署、交互也可以用Solidity脚本或命令行完成;
  • 缺点:生态比JS/TS弱(比如部分第三方工具、兼容性测试工具只支持JS),很多项目会“Foundry做安全测试 + JS/TS做功能测试/部署”,混合使用。

所以,Foundry是“补充方案”,不是“替代方案”,建议还是先掌握JS/TS,再按需学Foundry。

四、对你的学习建议(结合你已学的Cryptozombies)

你已经学了“JS + Truffle”的基础,接下来不用深钻JS,重点聚焦“合约相关的JS应用”:

  1. 优先学 Ethers.js + Hardhat(替代Truffle,现在行业主流):
    • 跟着Hardhat官方文档,写几个合约的测试脚本(覆盖功能测试、权限测试、异常处理);
    • 重点练“用Ethers.js调用合约、发送交易、处理回执”,这是工作中最常用的;
  2. 不用学JS的高级特性:比如原型链、闭包、设计模式、Node.js底层,够用就好;
  3. 按需学Foundry:如果觉得JS写测试别扭,或者想做深度安全测试,可以补充Foundry,不用一开始就啃;
  4. 目标:能独立用JS完成“合约测试 + 部署 + 简单交互”,就够应对面试和入门工作了。

总结

Solidity开发岗位「不需要精通JavaScript」,但「需要掌握合约相关的JS工具和场景」(Ethers.js、Hardhat、Mocha),这部分能力门槛不高,重点是“实用”而非“深入”。

JS/TS是目前最高效的合约开发生态,掌握它能让你更快找到工作、适配大部分项目;如果实在不想用JS,也可以用Foundry补充,但不建议完全放弃JS/TS。对你来说,最性价比的路径是:基于已学的JS基础,聚焦Hardhat + Ethers.js,练熟测试和部署脚本,不用在JS本身上花过多精力,把核心放在合约逻辑和安全上。

如何快速掌握Solidity开发所需的JavaScript知识?

要快速掌握 Solidity 开发所需的 JS 知识,核心逻辑是「聚焦核心场景、跳过冗余内容、边练边学」—— 只学“合约测试、部署、交互”相关的 JS 技能,不碰前端、Node.js 底层等无关内容,7-10 天就能达到“满足工作需求”的水平。以下是具体可落地的步骤和资源:

一、先明确:只学这些,其余全跳过(节省 80% 时间)

必学的 3 个核心场景(Solidity 开发唯一用到 JS 的地方)

  1. 合约测试(Mocha + Chai + Ethers.js)
  2. 合约部署脚本(Hardhat 环境)
  3. 合约交互(调用函数、发送交易、处理回执)

完全不用学的 JS 内容(直接放弃)

  • 前端相关:DOM 操作、React/Vue、浏览器兼容性、CSS/HTML 结合
  • JS 高级特性:原型链、闭包、继承、设计模式、Generator、Proxy
  • Node.js 底层:Event Loop 原理、流(Stream)、文件系统深度操作
  • TS 高级:泛型复杂用法、类型体操、装饰器

简单说:只要能写“Node.js 环境下的简单脚本,能调用 Ethers.js 与合约交互”,就够了

二、快速学习路径(7 天版,每天 2-3 小时)

Day 1:JS 基础(只学“够用的最小集”)

不用看厚重教程,聚焦“能写测试/部署脚本”的基础语法:

  1. 变量/数据类型:let/const、字符串、数字、对象(重点)、数组
  2. 流程控制:if-elsefor 循环(遍历测试用例)、try/catch(捕获合约异常)
  3. 函数:普通函数、箭头函数(写测试回调)
  4. 异步编程(核心中的核心):Promise 基础、async/await(合约交互全是异步,必须掌握)

✅ 学习资源(1-2 小时搞定):

✅ 小练习(巩固异步):
写一个简单的 async 函数,模拟“调用合约→等待结果”的流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 模拟合约调用(异步操作)
function fakeContractCall() {
return new Promise((resolve) => {
setTimeout(() => resolve("合约调用成功"), 1000);
});
}

// 用 async/await 处理异步
async function test() {
console.log("开始调用合约");
const result = await fakeContractCall(); // 等待异步结果
console.log(result); // 输出:合约调用成功
}

test();

Day 2-3:Hardhat + Ethers.js(核心工具,Solidity 开发的 JS 核心)

Hardhat 是现在行业主流的合约开发工具,内置了 Ethers.js、Mocha/Chai,不用单独配置,直接聚焦“用工具做事”。

第一步:搭建环境(30 分钟)
  1. 安装 Node.js(v16+,官网下载:https://nodejs.org/)
  2. 初始化 Hardhat 项目:
    1
    2
    3
    4
    mkdir solidity-js-test && cd solidity-js-test
    npm init -y
    npm install --save-dev hardhat @nomiclabs/hardhat-ethers ethers chai @nomiclabs/hardhat-waffle
    npx hardhat init # 选 Create a JavaScript project,一路回车
  3. 熟悉项目结构:重点关注 test/(测试脚本)、scripts/(部署脚本)、contracts/(合约文件)
第二步:Ethers.js 核心 API(1 天,只学常用的,不用全记)

Ethers.js 是和合约交互的库,只需要掌握以下 5 个高频操作,其余用到再查文档:

  1. 连接区块链(本地节点/Hardhat 内置节点)
  2. 获取账号(ethers.getSigners()
  3. 加载合约(getContractFactory 部署时用,getContractAt 已部署合约用)
  4. 调用合约函数(读操作:直接调用;写操作:await 发送交易 + tx.wait() 等上链)
  5. 处理交易回执(tx.hashtx.gasUsed

✅ 官方极简教程(直接抄代码练):https://docs.ethers.org/v5/getting-started/
✅ 常用 API 示例(直接复制到 Hardhat 脚本中运行):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 1. 获取账号(测试/部署时用)
const [owner, user1, user2] = await ethers.getSigners(); // owner 是部署者

// 2. 部署合约(scripts/deploy.js 中)
const MyContract = await ethers.getContractFactory("MyContract"); // 加载合约工厂
const contract = await MyContract.deploy(); // 部署
await contract.deployed(); // 等待部署完成
console.log("合约地址:", contract.address);

// 3. 调用合约读函数(不需要交易)
const balance = await contract.balanceOf(owner.address); // 读余额

// 4. 调用合约写函数(需要发送交易)
const tx = await contract.transfer(user1.address, 100); // 转账
await tx.wait(); // 等待上链
console.log("交易哈希:", tx.hash);

// 5. 模拟不同账号调用(测试权限用)
await contract.connect(user1).transfer(user2.address, 50); // 用 user1 调用
第三步:Mocha + Chai 测试语法(1 天,够用就好)

Hardhat 内置了 Mocha(测试框架)和 Chai(断言库),只需要掌握 3 个核心用法:

  1. 测试结构:describe()(测试套件)、it()(测试用例)
  2. 断言:expect(结果).to.equal(预期)(判断值相等)、expect(操作).to.be.revertedWith("错误信息")(判断合约 revert)
  3. 测试前置/后置:beforeEach()(每个用例前部署合约,避免重复代码)

✅ 测试脚本示例(test/MyContract.test.js):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const { expect } = require("chai");

// 测试套件(对应一个合约)
describe("MyContract", function () {
let MyContract;
let contract;
let owner, user1;

// 每个测试用例前执行(部署合约,获取账号)
beforeEach(async function () {
[owner, user1] = await ethers.getSigners();
MyContract = await ethers.getContractFactory("MyContract");
contract = await MyContract.deploy();
await contract.deployed();
});

// 测试用例 1:部署后 owner 余额正确
it("should set the right owner balance", async function () {
const balance = await contract.balanceOf(owner.address);
expect(balance).to.equal(ethers.utils.parseEther("1000")); // 预期初始余额 1000
});

// 测试用例 2:普通用户不能调用管理员函数
it("should reject non-owner calls to admin function", async function () {
// 预期 user1 调用 adminFunction 会 revert,错误信息是 "Only owner"
await expect(contract.connect(user1).adminFunction())
.to.be.revertedWith("Only owner");
});
});

✅ 运行测试:npx hardhat test,看是否全部通过,学会根据报错修改脚本。

Day 4-5:实战小项目(把 JS 技能串起来)

光看没用,必须动手练!用一个简单合约(比如“可转账的代币合约”),完成“写合约→JS 测试→JS 部署→JS 交互”全流程:

步骤 1:写一个简单合约(contracts/MyToken.sol)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract MyToken {
string public name = "MyToken";
mapping(address => uint256) public balanceOf;

constructor() {
balanceOf[msg.sender] = 1000; // 部署者初始 1000 代币
}

function transfer(address to, uint256 amount) public {
require(balanceOf[msg.sender] >= amount, "Insufficient balance");
balanceOf[msg.sender] -= amount;
balanceOf[to] += amount;
}
}
步骤 2:写 JS 测试脚本(test/MyToken.test.js)

覆盖 3 个核心场景:

  1. 部署后部署者余额是 1000;
  2. 转账功能正常(A 转 B 后余额变化正确);
  3. 余额不足时转账会 revert。
步骤 3:写 JS 部署脚本(scripts/deploy.js)

部署到 Hardhat 本地测试网,输出合约地址。

步骤 4:写 JS 交互脚本(scripts/interact.js)

加载已部署的合约,调用 transfer 函数,查询余额。

✅ 运行命令练手:

1
2
3
4
npx hardhat node # 启动本地测试网
npx hardhat test # 运行测试(验证 JS 测试脚本)
npx hardhat run scripts/deploy.js --network localhost # 部署到本地网
npx hardhat run scripts/interact.js --network localhost # 交互测试

通过这个小项目,你会发现“JS 与合约交互”的逻辑非常固定,练 2-3 遍就形成肌肉记忆了。

Day 6-7:补充工具和避坑指南(提升效率)

1. OpenZeppelin Test Helpers(简化测试)

很多测试场景(比如判断权限、时间锁定)不用自己写 JS 逻辑,直接用现成工具:

1
npm install --save-dev @openzeppelin/test-helpers

示例(测试权限):

1
2
3
4
5
6
const { expectRevert } = require("@openzeppelin/test-helpers");
// 替代之前的 revert 断言,更简洁
await expectRevert(
contract.connect(user1).adminFunction(),
"Only owner"
);
2. 常见坑和解决方案(避免踩雷)
  • 坑 1:忘记 await 异步操作(比如 const tx = contract.transfer(...) 没加 await,导致 tx 是 Promise 对象)→ 解决方案:所有合约调用、交易都加 await
  • 坑 2:数值单位问题(Solidity 中是 wei,JS 中直接传数字会出错)→ 解决方案:用 ethers.utils.parseEther("1.0") 转 wei,ethers.utils.formatEther(balance) 转 ETH;
  • 坑 3:测试时合约状态污染(一个用例影响另一个)→ 解决方案:用 beforeEach() 每个用例前重新部署合约;
  • 坑 4:不知道如何模拟链上场景(比如区块高度、gas 限制)→ 解决方案:Hardhat 内置 evm_increaseTime 等方法,查官方文档即可。
3. 查文档的正确姿势(不用死记硬背)

遇到不懂的 API 不用慌,直接查以下文档(不用通读,按需搜索):

三、判断是否“达标”的 3 个标准(能做到就够面试/工作了)

  1. 能独立用 JS 写测试脚本:覆盖合约所有函数,包括正常流程、异常场景(revert)、权限控制;
  2. 能独立用 JS 写部署脚本:部署合约到测试网(比如 Goerli),处理部署后的初始化(比如设置管理员);
  3. 能独立用 JS 写交互脚本:调用已部署合约的读/写函数,处理交易回执,查询结果。

四、推荐轻量资源(拒绝厚重教程)

  1. Hardhat 官方入门教程(必看):https://hardhat.org/tutorial
  2. Ethers.js 快速入门:https://docs.ethers.org/v5/getting-started/
  3. 测试脚本示例(直接抄):https://github.com/NomicFoundation/hardhat-examples/tree/main/testing-with-ethers
  4. 视频教程(可选,适合喜欢看视频的):B站“Hardhat + Ethers.js 智能合约开发”(搜关键词,找 1-2 小时的短教程,不用看长系列)

总结

快速掌握的关键是「不贪多、不深钻、重实战」—— 跳过所有和“合约交互、测试、部署”无关的 JS 内容,聚焦 Hardhat + Ethers.js + Mocha/Chai,用一个小项目把所有技能串起来,7 天就能达到“满足 Solidity 开发需求”的水平。

你已经有 Cryptozombies 的 JS 基础,现在只需要把“Truffle 换成 Hardhat”,重点练测试和部署脚本,不用在 JS 本身上花过多时间,核心还是要回归 Solidity 合约逻辑和安全,但 JS 作为工具,练熟这些就足够支撑你开展工作了。