调用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
相关产品推荐
相关产品推荐

