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

调用Solidity Transfer合约转账时出现invalid address错误求助

问题原因及解决方法

核心问题:参数不匹配

你的Solidity合约transfer函数需要三个业务参数:account1、account2、amount,但你在Node.js代码里调用时只传了两个业务参数(第三个是交易配置项),导致参数顺序完全错位:

  • 你传入的to被赋值给了合约的account1
  • 你传入的amount(数值100)被赋值给了合约的account2(要求是地址类型)
    这就直接触发了"invalid address"错误,因为100根本不是合法的以太坊地址格式。

另外要注意:你的合约逻辑是用合约自身余额给account1和account2各转amount的ETH,而Node.js里的transferFunds函数是从from发起交易,但交易发起方的余额不会被直接扣除,这点如果和你的预期不符需要调整。

修正后的Node.js代码

const Web3 = require('web3');
const contract = require('truffle-contract');
const TransferContract = contract(require('./build/contracts/Transfer.json'));

async function transferFunds(from, account1, account2, amount) {
  const provider = new Web3.providers.HttpProvider('http://127.0.0.1:8545');
  TransferContract.setProvider(provider);

  const instance = await TransferContract.deployed();

  // 严格按照合约函数的参数顺序传入:account1, account2, amount
  await instance.transfer(account1, account2, amount, { from: from });
}

// 调用时传入完整参数:发起交易的地址、第一个接收账户、第二个接收账户、转账金额
transferFunds(
  '0xDD6889bcc75510f66566d9f7Ea9C814a5C6043d8',
  '0xB197d9415Ed9A7ee55d35cAC889C99243c486976',
  '0x你的第二个接收账户地址', // 替换为实际的第二个接收地址
  100
);

额外注意事项

  • 确保合约已经预先存入足够的ETH(合约是用自身余额完成转账,不会从交易发起方from的账户扣钱)
  • 如果你的实际需求是从from账户直接给单个地址转ETH,当前合约逻辑不匹配,需要重新编写合约函数(比如改为从调用者地址转钱的逻辑)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:43:08