"Message: invalid data; odd-length - 0x0"错误、坚固性或 JavaScript 错误



我们用Solidity语言编写了一个智能合约。它有一个函数,将字符串作为参数之一。我们还为这些函数编写了单元测试。刚才提到的一个函数的单元测试给出了如下错误:

Message: invalid data; odd-length - 0x0.

我们如何解决这个问题?

我们可以肯定它给出错误,因为这个参数是string,因为调用根本没有进入固体函数;我们执行了console.log(),但它没有记录日志。我们正在开发Remix编译器。

//我从js测试代码调用,user_account2是一个地址:

await mygov.connect(user_account2).submitSurvey("abc", 21e6 , 3 , 2);

//solidity智能合约的功能:

function submitSurvey(string memory ipfshash,uint surveydeadline,uint numchoices, uint atmostchoice) public returns (uint surveyid) {
User storage owner = users[msg.sender]; 
require(isMember(owner), "1");
require(owner.myGovTokens >=2, "2");
require(owner.myGovTokens >2  || owner.myGovTokensLockedUntil <= block.timestamp, "3"); 
uint[] memory results = new uint[](numchoices) ; 

Survey memory mysurvey = Survey({
Ipfshash : ipfshash,
Owner: msg.sender,
Deadline: surveydeadline,
SurveyId: surveyid,
AtmostChoice: atmostchoice,
NumChoices: numchoices,
NumTaken : 0,
Results : results         
});

transferToken(address(this), 2);  
address payable to_sc = payable(address(this));

transfer(to_sc, surveyCreationFee); 
donatedWei += surveyCreationFee; 
surveys.push(mysurvey);
surveyid = surveys.length - 1 ; 
mysurvey.SurveyId = surveyid;
return (surveyid);
}

当我遇到同样的问题时,解决方案是使用签名者实例而不是地址:

const provider = new ethers.providers.Web3Provider(web3Provider);
const owner = provider.getSigner(0);
const user_account2 = provider.getSigner(1);

根据文档:

原型。Connect (signer) =>创建一个新的ContractFactory的实例,连接到新的签名者。

最新更新