Kann ich eine Funktion innerhalb eines erstellten Vertrags aufrufen?

Ich habe eine ähnliche Struktur wie diese typische Fabrik.

contract Factory {
  bytes32[] Names;
  address[] newContracts;

  function createContract (bytes32 name) {
      address newContract = new Contract(name);
      newContracts.push(newContract);
  } 

  function getName (uint i) {
      Contract con = Contract(newContracts[i]);
      Names[i] = con.Name();
  }
}

contract Contract {
  bytes32 public Name;
  string public numberString;

  function Contract (bytes32 name) {
      Name = name;
  }

  function setNumberString (string time){
      numberString = time;      
  }
}

setNumberStringIch habe dieser Struktur die Funktion und die Variable hinzugefügt numberString, mit Web3 js habe ich dies definiert:

myContract = web3.eth.contract(ABIArray).at(contractAddress);
myContract.setNumberString(state, function(error, result){
 if(!error)
     console.log(result)
 else
     console.error(error);
 })

Die ABIArrayund contractAddresswerden von „contract Contract“ erstellt, und wenn ich versuche die Funktion aufzurufen, erhalte ich diese Meldung im Browser der Dapp:

Uncaught TypeError: myContract.setNumberString is not a function

Wenn ich versuche, dies mit einem normalen Vertrag zu tun, habe ich kein Problem, was mache ich falsch? Ist es möglich, die Funktion dieses erstellten Vertrags aufzurufen?

Antworten (1)

Dies kann vorkommen, weil setNumberStringin Ihrer ABI nicht definiert ist.

Versuchen Sie, dies zu verwenden

ABIArray=[{"constant":false,"inputs":[{"name":"time","type":"string"}],"name":"setNumberString","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"Name","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"numberString","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"inputs":[{"name":"name","type":"bytes32"}],"payable":false,"type":"constructor"}];
Schön behoben, mein ABIArray war falsch. Ich kann zugreifen string public numberString; ? mit myContract.numberString? oder muss ich das ABI-Array erneut ändern?
Greifen Sie darauf mit myContract.numberString() zu