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

Truffle Express Box调用智能合约写入数据报Invalid Address错误

问题原因

invalid address报错和合约层的createPatient逻辑、白名单校验无关,问题出在Web3调用层:

  • 你使用的旧版truffle-contract不会自动注入当前钱包账户作为交易发送方,调用写入类合约方法时如果没有显式指定from地址,web3的地址格式化模块会直接抛出校验错误。
  • 你传入的参数存在类型不匹配风险:Solidity定义的uint、bool类型参数如果传入字符串格式的值,也会导致参数解析错位,被web3误识别为地址字段触发报错。
修复方法

修改前端调用代码,在参数末尾追加交易配置对象显式指定发送地址,同时校验所有参数类型和合约定义匹配,修改后代码如下:

NewPatient: function(id,Pname,Pdob,bloodRes,GenderRes,SelectedCityValue,allergies,donor,Econtact){
    var self = this;
    var data;
    pdata.setProvider(self.web3.currentProvider);
    // 提前获取当前选中的账户地址
    const currentAccount = self.web3.eth.defaultAccount || self.web3.currentProvider.selectedAddress;

    pdata.deployed().then(function(instance){
      data = instance;
      return data.createPatient(
        Number(id), // 对应uint _SecretNum,转数字类型,数值过大请转BigNumber
        Pname,
        Number(Pdob), // 对应uint _dob,转数字类型
        bloodRes,
        GenderRes,
        SelectedCityValue,
        allergies,
        Boolean(donor), // 对应bool organDonor,确保传原生布尔值
        Econtact,
        { // 最后一位传交易配置,显式指定发送方
          from: currentAccount,
          gas: 3000000
        }
      )
    }).then(function(result){
      console.log('success', result);
    }).catch(function(e){
      console.log(e);
    })
  }
校验要点
  • 所有uint类型参数不要传字符串格式的数字,数值超过JS安全整数范围(2^53-1)时请转成web3提供的BigNumber类型传入
  • bool类型参数不要传字符串形式的"true"/"false",必须传入原生布尔值
  • 所有会修改链上状态的合约方法调用,都建议在参数最后显式传入包含from字段的交易配置对象,避免旧版web3自动解析地址失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:57:20