So rufen Sie die Solidity-Funktion auf, die ein Array von Adressen als Argument mit web3 hat

Angenommen, ich habe einen Vertrag wie folgt:

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

Wie rufe ich diese Funktion in meiner Frontend-Anwendung mit web3 auf. Ich habe versucht, ein Javascript-Array zu verwenden, aber es löst eine Revert-Ausnahme aus.

Irgendwelche Ideen ?

Ein JavaScript-Array ist der richtige Weg, dies über web3.js zu tun. Kannst du deinen Code teilen? (Teilen Sie auch den Rest des Vertragscodes mit, damit wir erraten können, wo der revertwar.)

Antworten (3)

Sie können nur Datentypen übergeben, die der Vertrag erkennt, daher ist die Übergabe eines Javascript-Arrays keine Option.

Wenn Sie ein Array aller Ihrer Adressen haben, können Sie versuchen, sie mit Javascript zu verbinden und die resultierende Zeichenfolge mit web3 zu übergeben. dh,

Wenn Sie haben

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

und das hast du gemacht

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

und übergeben Sie diese Zeichenfolge als "Array", dann könnte das den Trick machen

Dies ist für web3.js falsch. Ein JavaScript-Array ist der richtige Weg, um ein Array an einen Smart Contract zu übergeben.
Ich kann String- und Uint-Arrays übergeben, aber das Problem liegt bei address[]
könnten Sie den Javascript-Code teilen, den Sie verwendet haben, um die Funktion mit web3 aufzurufen?
was ist mit web3.py
Danke, das hat dazu geführt, dass es bei der manuellen Interaktion mit dem Vertrag im Web oder Remix funktioniert hat.

Sie können das Array wie folgt übergeben: -

  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});
Ich erhalte TypeError: mycontract.passAddress.getData ist keine Funktion
@Verwenden Sie irgendein Framework?
myContract.methods.passAddress(params).encodeABI();

Adoption ist mein intelligenter Vertrag. Auf diese Weise rufe ich die Funktion auf, die ein Array von Adressen als Argument enthält.

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);
});