Как вызвать функцию солидности, которая имеет массив адресов в качестве аргумента, используя web3

Скажем, у меня есть контракт следующим образом:

contract A {
  function passAddress(address[] _addr) {
    // do something
  }
}

Как мне вызвать эту функцию в моем внешнем приложении, используя web3. Я пытался использовать массив javascript, но он выдает исключение возврата.

Есть идеи ?

Массив JavaScript — правильный способ сделать это через web3.js. Можете ли вы поделиться своим кодом? (Также поделитесь остальной частью кода контракта, чтобы мы могли догадаться, где он revertбыл.)

Ответы (3)

Вы можете передавать только те типы данных, которые распознает контракт, поэтому передача массива javascript невозможна.

Если у вас есть массив всех ваших адресов, вы можете попробовать соединить их с помощью javascript и передать полученную строку с помощью web3. т.е.,

если у вас есть

array = [0x0,0x0,0x0];

и ты сделал это

string = '["0x0","0x0","0x0"]'

и передайте эту строку как «массив», тогда это может помочь

Это неверно для web3.js. Массив JavaScript — это правильный способ передать массив в смарт-контракт.
Я могу передавать массивы строк и uint, но проблема с адресом []
не могли бы вы поделиться кодом javascript, который вы использовали для вызова функции с помощью web3?
как насчет web3.py
Спасибо, именно это заставило работать при взаимодействии с контрактом вручную в вебе или ремиксе.

Вы можете передать массив следующим образом: -

  var contractAbi = eth.contract(AbiOfContract);
  var myContract = contractAbi.at(contractAddress);
  var getData = myContract.passAddress.getData([address1,address2,address3]);
  // var getData = myContract.passAddress.getData(["0x0","0x0","0x0"]);
  web3.eth.sendTransaction({to:Contractaddress, from:Accountaddress, data: getData});
Я получаю TypeError: mycontract.passAddress.getData не является функцией
@ Используете ли вы какой-либо фреймворк?
myContract.methods.passAddress(params).encodeABI();

Усыновление — это мой смарт-контракт. Я использую этот способ для вызова функции, массив адресов которой является аргументом.

App.contracts.Adoption.deployed().then(function(instance) {
  adoptionInstance = instance;
  return adoptionInstance.passAddress("address1, address2,...");
}).then(function(adopters) {
  console.log("function success");
}).catch(function(err) {
  console.log("function error" + err.message);
});