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

