You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:42:10