使用ethers.js部署合约报错:TypeError: ethers.Wallet.fromEncryptedJsonSync不是构造函数
Ethers.js部署合约时
fromEncryptedJsonSync报错问题 问题描述
运行以下部署智能合约的代码时:
const ethers = require("ethers"); const fs = require("fs-extra"); require("dotenv").config(); async function main() { const provider = new ethers.ethers.JsonRpcProvider(process.env.RPC_URL); // 读取加密的私钥文件 const encryptedJson = fs.readFileSync("./.encryptedKey.json", "utf-8"); // ========= 报错代码段 ============ let wallet = new ethers.Wallet.fromEncryptedJsonSync( encryptedJson, process.env.PRIVATE_KEY_PASSWORD ); // ========= 报错代码段结束 ============ wallet = await wallet.connect(provider); const abi = fs.readFileSync("./SimpleStorage_sol_SimpleStorage.abi", "utf-8"); const binary = fs.readFileSync( "./SimpleStorage_sol_SimpleStorage.bin", "utf-8" ); const contractFactory = new ethers.ContractFactory(abi, binary, wallet); console.log("Deploying, please wait..."); const contract = await contractFactory.deploy({ gasPrice: 1000000000000 }); } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); });
控制台抛出错误:
TypeError: ethers.Wallet.fromEncryptedJsonSync is not a constructor at main (/home/vituz01/hh/ethers-simple-storage/deploy.js:36:16) at Object.<anonymous> (/home/vituz01/hh/ethers-simple-storage/deploy.js:90:1) at Module._compile (node:internal/modules/cjs/loader:1239:14) at Module._extensions..js (node:internal/modules/cjs/loader:1293:10) at Module.load (node:internal/modules/cjs/loader:1096:32) at Module._load (node:internal/modules/cjs/loader:935:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:84:12) at node:internal/main/run_main_module:23:47
错误原因
你按照Ethers.js v5文档编写代码,但实际安装的是Ethers.js v6版本。v6对API做了大幅重构:
fromEncryptedJsonSync不再是ethers.Wallet的静态方法,也不需要用new关键字调用(它是普通函数,不是构造器)- v6中
JsonRpcProvider的导入路径也发生了变化,不再嵌套在ethers.ethers下
解决方案
方案1:降级到Ethers.js v5
执行命令回退到v5版本:
npm uninstall ethers && npm install ethers@5
同时修改代码中的Provider初始化(v5中Provider在ethers.providers模块下):
// 替换原来的provider初始化代码 const provider = new ethers.providers.JsonRpcProvider(process.env.RPC_URL);
方案2:适配Ethers.js v6写法
修改代码以兼容v6的API规范:
const ethers = require("ethers"); const fs = require("fs-extra"); require("dotenv").config(); async function main() { // v6中直接使用ethers.JsonRpcProvider const provider = new ethers.JsonRpcProvider(process.env.RPC_URL); const encryptedJson = fs.readFileSync("./.encryptedKey.json", "utf-8"); // v6中fromEncryptedJsonSync是ethers顶级函数,无需new let wallet = ethers.fromEncryptedJsonSync( encryptedJson, process.env.PRIVATE_KEY_PASSWORD ); wallet = wallet.connect(provider); const abi = fs.readFileSync("./SimpleStorage_sol_SimpleStorage.abi", "utf-8"); const binary = fs.readFileSync( "./SimpleStorage_sol_SimpleStorage.bin", "utf-8" ); const contractFactory = new ethers.ContractFactory(abi, binary, wallet); console.log("Deploying, please wait..."); const contract = await contractFactory.deploy({ gasPrice: 1000000000000 }); } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); });
内容的提问来源于stack exchange,提问作者Vito Martiradonna
相关产品推荐
相关产品推荐

