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

如何使用Node.js为每个不同钱包循环执行合约部署函数?

多钱包合约批量部署解决方案

你的代码问题在于web3.eth.accounts.privateKeyToAccount仅支持单个私钥参数,传入多个私钥时只会处理第一个,导致程序只完成一次部署就终止。以下是修改后的代码,实现每个私钥对应部署一个独立合约:

const Web3 = require("web3");
const fs = require("fs");
require("dotenv").config();

// 加载合约ABI和字节码
const { abi, bytecode } = JSON.parse(fs.readFileSync("Demo.json"));

// 定义要使用的私钥数组
const privateKeys = ["PRIVATEKEY1", "PRIVATEKEY2", "PRIVATEKEY3"];

// 提取部署逻辑为独立可复用函数
async function deployContract(web3, privateKey) {
  // 创建当前私钥对应的签名账户
  const signer = web3.eth.accounts.privateKeyToAccount(privateKey);
  web3.eth.accounts.wallet.add(signer);

  // 初始化合约实例并部署
  const contract = new web3.eth.Contract(abi);
  contract.options.data = bytecode;
  const deployTx = contract.deploy();
  
  const deployedContract = await deployTx
    .send({
      from: signer.address,
      gas: await deployTx.estimateGas(),
    })
    .once("transactionHash", (txhash) => {
      const network = process.env.ETHEREUM_NETWORK;
      console.log(`[${signer.address}] 正在挖矿部署交易...`);
      console.log(`[${signer.address}] 交易哈希: https://${network}.etherscan.io/tx/${txhash}`);
    });

  // 输出部署结果
  console.log(`[${signer.address}] 合约部署完成,地址: ${deployedContract.options.address}`);
  console.log(`[${signer.address}] 建议将此地址存入.env文件: DEMO_CONTRACT_${signer.address.slice(0,6)}=${deployedContract.options.address}\n`);
  
  return deployedContract.options.address;
}

async function main() {
  // 配置以太坊节点连接
  const network = process.env.ETHEREUM_NETWORK;
  const web3 = new Web3(
    new Web3.providers.HttpProvider(
      `https://${network}.infura.io/v3/${process.env.INFURA_API_KEY}`
    )
  );

  // 遍历私钥数组,逐个部署合约(串行执行,避免节点压力)
  for (const privateKey of privateKeys) {
    await deployContract(web3, privateKey);
  }

  console.log("所有合约部署任务完成");
}

main().catch((err) => {
  console.error("部署过程出错:", err);
  process.exit(1);
});

关键修改说明

  • 私钥数组化:把多个私钥存入数组,方便遍历处理
  • 部署逻辑封装:将单个合约的部署流程封装成函数,提高代码复用性
  • 循环遍历执行:使用for...of串行遍历私钥,确保每个部署完成后再执行下一个(如果需要并行部署,可改用Promise.all(privateKeys.map(key => deployContract(web3, key))),但需注意节点的请求频率限制)
  • 账户隔离:每个循环内单独创建对应私钥的签名账户,保证部署操作的独立性
  • 增强日志:在日志中添加钱包地址前缀,方便区分不同钱包的部署结果

内容的提问来源于stack exchange,提问作者Nafisa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:42:47