项目结构
在项目目录中,最终的结构应该如下所示:
text
sepolia-transfer/ │ ├── .env ├── recipients.txt └── transfer.js
-
创建项目目录 首先,创建一个新的项目目录并进入该目录: bash mkdir sepolia-transfer cd sepolia-transfer
-
初始化 npm 项目 初始化一个新的npm项目: bash npm init -y
-
安装所需库 安装Web3.js、dotenv和p-limit库,以便与以太坊区块链进行交互并管理环境变量: bash npm install web3 dotenv p-limit
-
创建环境变量文件 在项目目录中创建一个名为 .env 的文件,内容如下: text RPC_URL=https://sepolia.public-rpc.com # 或者使用其他公共RPC服务如Infura或Alchemy PRIVATE_KEY=0xYourPrivateKey1 # 替换为你的实际钱包私钥 GAS_LIMIT=21000 # 设置默认的Gas限制
-
创建接收者文件 在项目目录中创建一个名为 recipients.txt 的文件,内容如下: text 0xRecipientAddress1 0.01 0xRecipientAddress2 0.02 请将 0xRecipientAddress1 和 0.01 替换为你想要转账的实际接收者地址和金额(单位是ETH)。每一行格式为:接收者地址 空格 转账金额。
-
编写转账脚本 在项目目录中创建一个名为 transfer.js 的文件,并将以下代码粘贴到该文件中: javascript require('dotenv').config(); // 加载环境变量 const { Web3 } = require('web3'); // 使用解构赋值导入Web3库 const fs = require('fs'); // 导入文件系统模块
// 动态导入 p-limit 库 const pLimit = async () => { return (await import('p-limit')).default; // 使用动态导入获取 p-limit 的默认导出 };
// 初始化Web3实例和账户信息 const web3 = new Web3(process.env.RPC_URL); // 确保使用正确的构造函数调用方式 const account = web3.eth.accounts.privateKeyToAccount(process.env.PRIVATE_KEY); const senderAddress = account.address; const gasLimit = parseInt(process.env.GAS_LIMIT, 10);
// 从文件读取接收者信息并解析 const recipientsData = fs.readFileSync('recipients.txt', 'utf8').trim().split('\n'); const recipients = recipientsData.map(line => { const [address, amount] = line.split(' '); return { address, amount: web3.utils.toWei(amount, 'ether') }; // 确保金额转换为wei格式 });
// 验证接收者地址和金额的函数
function validateRecipients(recipients) {
for (const recipient of recipients) {
if (!web3.utils.isAddress(recipient.address)) {
throw new Error(无效的地址: ${recipient.address}
);
}
if (parseFloat(web3.utils.fromWei(recipient.amount, 'ether')) <= 0) {
throw new Error(无效的金额: ${recipient.amount}
);
}
}
}
// 获取当前 Gas Price,并增加一定比例以确保交易成功 async function getAdjustedGasPrice() { const gasPrice = await web3.eth.getGasPrice(); return Math.ceil(Number(gasPrice) * 1.1); // 确保将 gasPrice 转换为数字并增加10% }
// 发送交易的函数,处理 replacement transaction underpriced 错误 async function sendTransaction(to, value) { const nonce = await web3.eth.getTransactionCount(senderAddress); // 获取当前 nonce
const adjustedGasPrice = await getAdjustedGasPrice(); // 获取调整后的 gas price
const tx = {
from: senderAddress,
to: to,
value: value,
gas: gasLimit,
gasPrice: adjustedGasPrice.toString(), // 确保 gasPrice 是字符串类型
nonce: nonce,
};
try {
const signedTx = await account.signTransaction(tx);
return await web3.eth.sendSignedTransaction(signedTx.rawTransaction);
} catch (error) {
if (error.message.includes('replacement transaction underpriced')) {
console.error(`交易失败到 ${to}: 交易被认为是替代交易价格过低,尝试增加Gas Price并重试。`);
throw error; // 重新抛出错误以便后续处理,可能需要在外部捕获并重试逻辑。
}
console.error(`交易失败到 ${to}: ${error.message}`);
throw error; // 重新抛出错误以便后续处理
}
}
// 主函数,执行批量转账,使用顺序执行来确保每笔交易完成后再进行下一笔交易 (async () => { try { validateRecipients(recipients); // 验证接收者信息
for (const recipient of recipients) {
try {
const receipt = await sendTransaction(recipient.address, recipient.amount);
console.log(`从 ${senderAddress} 转账成功到 ${recipient.address}: ${receipt.transactionHash}`);
} catch (error) {
console.error(`从 ${senderAddress} 转账失败到 ${recipient.address}: ${error.message}`);
}
}
} catch (error) {
console.error(`验证失败: ${error.message}`);
}
})();
- 运行脚本 确保你已经保存了所有文件,然后在终端中运行以下命令: bash node transfer.js
项目说明 .env 文件:用于存储环境变量,包括RPC URL和私钥。确保这些信息的安全性。 recipients.txt 文件:包含每个转账的目标地址和金额,每行一个。 transfer.js 文件: 加载环境变量。 初始化Web3实例。 从 recipients.txt 中读取接收者信息。 验证地址和金额的有效性。 获取当前Gas价格,并适当调整以确保交易成功。 按顺序执行每笔转账,并在每次成功后输出结果。 注意事项 确保你的私钥和RPC URL是有效且安全的。 在测试网络上进行操作时,请确保你有足够的测试ETH用于支付Gas费用。 如果你遇到任何问题,请检查Node.js、npm和Web3.js的版本是否兼容,并确保依赖项正确安装。 通过这些步骤,你应该能够成功实现Sepolia网络上的批量转账。如果还有其他问题,请随时询问。
要解决“TypeError: Web3 is not a constructor”错误,并确保能够顺利使用Web3.js进行以太坊转账,以下是详细的步骤和代码优化。
- 安装和导入Web3.js 确保你已经正确安装了Web3.js库。可以通过以下命令安装: bash npm install web3