Extrem einfacher Werksvertrag funktioniert auf testrpc/ganache-cli, aber nicht auf rinkeby

Dieses sehr einfache Fabrikmuster funktioniert aus irgendeinem Grund nicht auf Rinkeby. Mit Trüffel v3.4.5und Geth 1.7.3-stable. Hier die Verträge:

pragma solidity ^0.4.11;

contract Factory {

  address[] public pizzas;

  function Factory() {
    // constructor
  }

  function cookPizza() returns (address _pizza) {
    Pizza newPizza = new Pizza();
    pizzas.push(newPizza);
    return newPizza;
  }

  function getPizzas() public constant returns (address[]) {
    return pizzas;
  }
}

contract Pizza {
  function Pizza() {
    // constructor
  }
}

Wenn ich auf ganache-cli bereitstelle und ausführe:

truffle(development)> Factory.deployed().then(function(instance) { factory = instance})
undefined
truffle(development)> factory.cookPizza()
truffle(development)> factory.getPizzas()
[ '0xc4f8cf2d5a37e74981fffdab1b2108931822359a' ]

Es erstellt eine neue Adresse, hängt sie an und getPizzaszeigt mir die Adressen an. Wenn ich auf rinkeby mit folgendem einsetze:

Running migration: 1_initial_migration.js
  Deploying Migrations...
  Migrations: 0x42e40188763019dd09a6166b76805d329bd71111
Saving successful migration to network...
Saving artifacts...
Running migration: 2_deploy_contracts.js
  Deploying Factory...
  Factory: 0xb9d60d9ddf16e3af3bce774a1e9286ecf5614166
Saving successful migration to network...
Saving artifacts...

In der Konsole:

> sender = eth.accounts[0]
> abi = "abi"
> contract = eth.contract(abi)
> factory = contract.at("0xb9d60d9ddf16e3af3bce774a1e9286ecf5614166")
> factory.cookPizza({from:sender})
"0xf0ce6f4c0a9665f593d3d837eca4977b85d011dcb3620bf3a2428d25225db967"
> factory.getPizzas()
[]

Gar nichts. Was könnte dies verursachen?

Ist dein Vertrag abi gleich "abi" oder hast du das nur zur Vereinfachung gemacht?
Es ist vereinfacht :)
Wie hast du deine Konsole gestartet?
geth attach ipc:/Users/mokn1/Library/Ethereum/rinkeby/geth.ipc
und wie hast du deinen rinkeby node gestartet? verwendest du die Light-Version? Wenn ja, werden die Zustände nicht synchronisiert
geth --rinkeby --rpc --rpcapi web3,db,personal,eth,net

Antworten (1)

Ich habe Ihre Transaktion überprüft und sie ist fehlgeschlagen. https://rinkeby.etherscan.io/tx/0xf0ce6f4c0a9665f593d3d837eca4977b85d011dcb3620bf3a2428d25225db967

Deshalb gibt getPizzas() ein leeres Array zurück.

Fügen Sie Guthaben zu Konto[0] hinzu, entsperren Sie es und versuchen Sie es erneut. Es sollte funktionieren.

Mein Konto hat 23 eth rinkeby.etherscan.io/address/… . Können Sie mit dem Vertrag interagieren?
Ja. Ich habe Remix ausprobiert und es hat funktioniert. Mein lokaler Rinkeby-Knoten ist nicht synchronisiert und ich muss warten, bis ich die Geth-Konsole verwenden kann, um mit Ihrem Vertrag zu interagieren. Haben Sie Ihr Konto entsperrt, bevor Sie cookPizza() aufgerufen haben?
Ja, es ist freigeschaltet. Der tx geht durch, schlägt aber fehl.
Mein letzter Vorschlag wäre, mehr Gas zu geben. factory.cookPizza({from:sender , gas: 3000000 })
Das hat funktioniert! Ich hatte das Standardgas bei 2000000. Hätte reichen sollen?
Seltsam.. meine truffle.jsDatei hat folgendes: rinkeby: { host: "localhost", port: 8545, network_id: "4", from: "0xfc7846d06fab273c62cda0d29eac0936a22eeca4", gas: 2000000Es sollte funktionieren..
Gut! Aber Ihr Gaslimit war nicht 2.000.000. Es waren 90.000. Sie öffnen die fehlgeschlagene Transaktion und können das Feld "Gaslimit" überprüfen. Es sind 90.000. Geth hat einen Standardwert. github.com/ethereum/go-ethereum/blob/…