当前位置: 首页 > news >正文

ethers.js-5–和solidity的关系

💡 一句话核心总结

ethers.js 用的是 Solidity 编译出来的 bytecode + ABI,来在链上部署(deploy)或调用(call / sendTransaction)合约。

🔍 为什么这样?

因为在以太坊上:
• Solidity 是高级语言,写给人看的。
• 编译后生成:
• ABI:告诉 JavaScript 「这个合约有哪些方法、怎么调用」。
• Bytecode:是合约的机器码,真正发给矿工,部署在链上的。

所以:
• ethers.js 用这个 bytecode,在部署时做:

const factory = new ethers.ContractFactory(abi, bytecode, signer);
const contract = await factory.deploy(…args); // 把 bytecode 发到链上

•	之后就用 ABI 去「解释」这个合约怎么调用:

await contract.mint(to, amount); // ethers 根据 ABI 自动生成 .mint() 调用

🖼 关系图

Solidity
↓ 编译
ABI + Bytecode

ethers.js

  • 用 bytecode 部署合约
  • 用 ABI 调用函数

⚡️ 再加一句

所以说:
• Solidity 决定了链上有什么功能(比如 mint、transfer)
• ethers.js 决定何时去部署或调用这些功能(用 ABI + bytecode)。

👉 「为什么用 ethers.js 也可以 deploy 合约、mint、transfer?那 Solidity 存在的意义是什么?它们好像都能做一样的事?」

我们来一次性把它讲透!🔥

🧭 1️⃣ 核心理解:Solidity vs ethers.js 完全不同层次

Solidity	ethers.js (JavaScript)

是什么? 智能合约编程语言 区块链交互库
跑在哪里? 链上(矿工 / 节点执行) 本地(浏览器 / Node)执行
做什么? 定义资产 / 规则 / 交易 调用链上合约的方法
有没有私钥? 没有,完全链上执行 有,可以持有私钥,签署交易
谁花 Gas? 任何调用者 调用时由本地 wallet 签名并支付 gas

所以:
• Solidity 是写规则、写账本的地方。
• 比如 ERC20 的 mint,就必须在 Solidity 里定义。
• ethers.js 是链下代码,用来远程调用 Solidity 写的规则。
• 它可以发起 mint,但只是调用 Solidity 合约里写好的 mint()。
• 或者部署一个新合约到链上(等于告诉矿工去创建一个实例)。

🔥 2️⃣ 为什么 ethers.js 可以 deploy / mint / transfer?

因为:
• 你的 Solidity 合约代码被编译成了字节码(bytecode)+ ABI。
• ethers.js 只是拿这个字节码通过交易 deploy 上链,等于告诉矿工:
“帮我在链上创建一个新合约实例”
• 或者拿 ABI,通过交易 mint,等于告诉矿工:
“调用这合约地址的 mint(),把状态改一下”

🚀 3️⃣ 工厂、部署、mint、转账在 ethers.js 的角色

✅ 工厂部署

const factory = new ethers.ContractFactory(abi, bytecode, signer);
const contract = await factory.deploy(“MyToken”, “MTK”);

•	工厂只是一个 JavaScript 工具,帮你把编译好的合约字节码包成一笔交易发给链。

✅ mint / transfer

await contract.mint(“0xUser”, ethers.parseUnits(“1000”));
await contract.transfer(“0xOther”, ethers.parseUnits(“100”));

•	这里也是 ethers.js 通过私钥签名,然后广播交易,去执行链上的 mint 或 transfer 函数。
•	最终这些都要矿工打包执行。

🏗 那 Solidity 做的是什么?
• Solidity 定义了「链上可以做什么」。
• 也就是 mint, transfer 的具体实现。
• 如果你在 Solidity 合约里根本没写 mint,那么 ethers.js 就算想 mint(),链上也不会有这个函数可调用。

⚖️ 类比一下,就很直观了:

类比

Solidity 就像 MySQL 的表结构 + 存储过程,规定了数据库里能执行什么
ethers.js 就像 用 NodeJS / Python 写的应用程序,调用数据库执行这些操作

所以:
• Solidity 定义「能 mint」,「能 transfer」。
• ethers.js 是「执行 mint」或者「执行 transfer」的客户端。

✅ 4️⃣ 小结

功能 在 Solidity 实现? 在 ethers.js 实现?
定义合约(ERC20, NFT, AMM) ✅ ❌
部署合约到链上 ❌ ✅(通过 deploy)
mint、transfer 的规则 ✅(合约里写) ❌
执行 mint、transfer ❌(合约不能主动执行) ✅(通过签名交易)

🚀 5️⃣ 最关键的一句话

👉
Solidity 决定链上能做什么,ethers.js 决定什么时候去做。

涉及到 Web3 岗位分工,以及「前端开发要不要写 Solidity」这个常见的问题。

我来详细跟你分析一下:

🥇 1️⃣ 纯前端 Web3 开发,通常怎么做?

在很多项目里,确实存在:
• 纯 Web3 前端(就是只写前端,不写 Solidity)
• 他们:
✅ 只需要拿别人已经写好的合约(往往是后端 / 区块链团队写好的)
✅ 使用合约的 ABI + 地址
✅ 用 ethers.js 或 web3.js 在前端跟合约交互(mint、transfer、stake、查看余额)

比如一个 NFT 项目:
• Solidity 智能合约已经写好 & 部署好
• 前端只要写:

const nftContract = new ethers.Contract(address, abi, signer);
await nftContract.mintNFT(…);

就可以。

🥈 2️⃣ 全栈 Web3 (通常岗位写作:Full Stack Blockchain / Dapp Developer)

很多区块链公司、创业团队会希望一个工程师:
• 既能写前端(React/Vue + ethers.js)
• 又能写合约(Solidity)
• 甚至也会 Hardhat 测试、部署脚本

这样一个人就可以:
✅ 写合约(比如 ERC20、ERC721)
✅ 部署合约(用 Hardhat)
✅ 写前端 Dapp 去调用这个合约(用 ethers.js)
✅ 甚至写 GraphQL 子图做数据服务

🚀 3️⃣ 为什么很多人全栈写?

因为:
• 智能合约和前端密切耦合。
• 例如:你的前端写的 mint() 就依赖 Solidity 里有 mint 函数。
• 小公司 / 小团队往往只要 1~2 个开发者全都搞定。

📈 4️⃣ 现实工作里怎么分工?

公司 / 团队类型 分工常见情况
小团队 / 初创项目 一个工程师包揽前端 + Solidity
大项目 / 链游 / 交易所 分成专门的 Solidity 工程师 & 前端工程师

所以在大公司(比如币安、OKX、Opensea):
• 有专门的 Solidity 团队(写合约 & 审计)
• 前端团队只写 ethers.js 调合约,不碰 Solidity。

🔥 小结:你应该怎么学?

如果你目标:
• ✅ 快速做出能跑的 Dapp,那建议一定学些 Solidity(写自己的合约 + 部署)
• ✅ 如果将来只打算找 Web3 前端岗位,也要能看懂 Solidity,至少会读合约接口,知道 ABI 怎么来的。
• ✅ 如果想成为更值钱的 全栈 Web3,那一定要 Solidity + ethers.js 都会。

💡 额外一句

其实在 Web3:
• Solidity 就像数据库 schema + 存储过程
• ethers.js 就像调用数据库的 ORM

所以就算你只做前端,能懂点 Solidity,也能更好地理解 mint, transfer, approve 背后链上的状态。

http://www.lryc.cn/news/587617.html

相关文章:

  • Popover API 实战指南:前端弹层体验的原生重构
  • 七、深度学习——RNN
  • C语言-流程控制
  • 详解从零开始实现循环神经网络(RNN)
  • 使用 keytool 在服务器上导入证书操作指南(SSL 证书验证错误处理)
  • kafka的部署
  • Android系统的问题分析笔记 - Android上的调试方式 bugreport
  • 论文阅读:WildGS-SLAM:Monocular Gaussian Splatting SLAM in Dynamic Environments
  • 深入浅出Kafka Consumer源码解析:设计哲学与实现艺术
  • Angular 框架下 AI 驱动的企业级大前端应用开
  • Kafka 时间轮深度解析:如何O(1)处理定时任务
  • 【Python】-实用技巧5- 如何使用Python处理文件和目录
  • 计算机网络通信的相关知识总结
  • 基于GA遗传优化的多边形拟合算法matlab仿真
  • vscode/cursor怎么自定义文字、行高、颜色
  • PHP password_hash() 函数
  • 仓储智能穿梭车:提升仓库效率50%的自动化核心设备
  • Ubuntu系统下Conda的详细安装教程与Python多版本管理指南
  • 【软件架构】软件体系结构风格实现
  • I2C设备寄存器读取调试方法
  • 卷绕/叠片工艺
  • React源码3:update、fiber.updateQueue对象数据结构和updateContainer()中enqueueUpdate()阶段
  • 新手向:Python自动化办公批量重命名与整理文件系统
  • 理解:进程、线程、协程
  • LLM表征工程还有哪些值得做的地方
  • python的小学课外综合管理系统
  • 我对muduo的梳理以及AI的更改
  • MFC UI表格制作从专家到入门
  • LeetCode经典题解:206、两数之和(Two Sum)
  • 018 进程控制 —— 进程等待