Я получаю эту ошибку при попытке вызвать getUsers
функцию получения из контракта ниже: Invalid number of arguments to Solidity function
. Запуск на Truffle в режиме разработки.
mapping (address => User) Users;
address[] usersByAddress;
struct User {
string handle;
bytes32 city;
bytes32 state;
bytes32 country;
}
function registerNewUser(string handle, bytes32 city, bytes32 state, bytes32 country) returns (bool success) {
address thisNewAddress = msg.sender;
if(bytes(Users[msg.sender].handle).length == 0 && bytes(handle).length != 0){
Users[thisNewAddress].handle = handle;
Users[thisNewAddress].city = city;
Users[thisNewAddress].state = state;
Users[thisNewAddress].country = country;
usersByAddress.push(thisNewAddress);
return true;
} else {
return false;
}
}
//getters
function getUsers() view returns (address[]) { return usersByAddress; }
function getUser(address userAddress) view returns (string, bytes32, bytes32, bytes32) {
return (Users[userAddress].handle, Users[userAddress].city, Users[userAddress].state, Users[userAddress].country);
}
Допустим, вы развернули этот контракт в тестовой сети Truffle development и получили экземпляр объекта x
. Я могу создать пользователя, отправив транзакцию x.registerNewUser("Bob123","Orlando","FL","USA")
. Затем я запускаю x.getUser(web3.eth.accounts[0])
и получаю следующий массив:
['BOB123', '0x4F726C616E646F00000000000000000000000000000000000000000000000000', '0x464C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f00000000000000f00000000000000f0000000000000000000000f00000000000000f0000000000000000000000f000000000000000000f00000000000000f00000000000000000000f000000000000000000000000f0000000000000000f00000000000000000000f0000000000000000000000000000та000000000000000000000000ff что
Это ожидается, поскольку последние 3 элемента в массиве имеют тип bytes32
. Я ожидаю, x.getUsers
что или x.getUsers.call()
вернут массив из одного адреса (мой адрес в web3.eth.accounts[0]
), но вместо этого получаю invalid Solidity arguments
сообщение об ошибке, даже если в getUsers
.
Попробуй это:
x.getUser.call(web3.eth.accounts[0],{from: 'YOUR ADDRESS'}, function (error, result) {
console.log('error ' + error);
console.log('result ' + result);
});
getUser()
. Как указано в моем вопросе, это файл getUsers()
. Единственный способ, с помощью которого я мог заставить его работать, заключался в том, что @benjaminion предложил удалить артефакты в /build, migrate --reset, и новые артефакты будут записаны в /build, что затем предотвращает появление ошибок при вызове getUsers()
.
Итерация 122442
УВД
getUser
иgetUsers
.Бенджаминион
УВД