Wie erhalte ich eine bereitgestellte Vertragsinstanz in der Truffle-Konsole, die ohne Migration bereitgestellt wurde?

Ich habe einen Vertrag, der mit Truffle in einem lokalen testrpc-Testnet bereitgestellt wird. Dieser Vertrag hat eine Funktion, die einen neuen Vertrag bereitstellt.

Bei diesem neuen Vertrag kann ich die Adresse in der testrpc-Konsole ähnlich wie folgt überprüfen:

  Transaction: 0x85a7f17406536dd9618c6647d7d0595a2cee7e7e065ffc08a99e58aa5473ab71
  Contract created: 0x1104c5adf4476aec333ee687c725eacc8d417a7c
  Gas usage: 2642382
  Block Number: 7
  Block Time: Mon Feb 26 2018 19:27:25 GMT+0900 (JST)

Aber wie kann ich mit diesem neuen Vertrag in der Trüffelkonsole interagieren? Die JSON-Datei des Vertrags (die ABI usw.) wurde im Truffle- buildVerzeichnis erstellt, aber da der Vertrag nicht migriert wird, kann ich diesen Befehl nicht verwenden:

MyNewContract.deployed().then(_app => { app = _app })
app.showMeTheMoney()

Weiß jemand, wie ich in der Truffle-Konsole mit Verträgen interagieren kann, die über andere Verträge bereitgestellt werden?

Antworten (2)

Sie könnten die Vertragsdatei im Build-Verzeichnis manuell ändern, um die Adresse aufzunehmen, aber sie wird schließlich überschrieben, daher ist dies keine gute Möglichkeit, dies zu tun.

Darüber hinaus deployed()soll im Sinne eines Singletons verwendet werden. Wenn Ihr Vertrag kein Singleton ist, sollten Sie ihn nicht über abfragen deployed().

Wenn Sie folgende Konstellation haben: Vertrag A (Singleton) instanziiert Vertrag B, dann können Sie die Referenz(en) auf B in A speichern und von JavaScript aus abfragen.

Beispiel

contract A {
    B[] public arrayOfBs;
    function create() returns (B) {
        B b = new B();
        arrayOfBs.push(b);
        return b;
    }
}

deployer.deploy(A);
...
A.deployed()
    .then(a => {return a.arrayOfBs(idx)})
    .then(bAddr => {return B.at(b)})
    .then(b => {b.showMeTheMoney()})

Wenn B ein Singleton sein soll, müssen Sie Ihr Migrationsskript ändern und wie folgt bereitstellen.

deployer.deploy(A); 
deployer.deploy(B);

Dann können Sie es über abfragen B.deployed().

Gibt es eine Truffle-Funktion, mit der j eine Instanz eines benutzerdefinierten bereitgestellten Vertrags erhalten kann?
Ja. Genau wie in web3 können Sie Contract.at(addr) verwenden.
Aber Sie meinen, dass es erforderlich ist, die Referenz in Vertrag A zu speichern? Kann sich diese gespeicherte Referenz auch in einem Array von Referenzen befinden? Könnten Sie ein kleines Beispiel geben, wie Sie die Referenz von Vertrag B in A speichern können, da B ein Los und A nur eins sein wird.
Ich habe die Antwort aktualisiert. Wenn Sie Ihre Verträge skizzieren können, kann ich Ihnen vielleicht ein besseres Beispiel geben.
Liebe @ivicaa Danke für die tolle Antwort. Ich habe versucht, Ihre Antwort umzusetzen, bin aber auf ein anderes Problem gestoßen. Ich habe hier eine neue Frage eröffnet: ethereum.stackexchange.com/questions/41023/… Es wäre wirklich cool, wenn Sie einen Blick darauf werfen könnten!

Weiß jemand, wie ich in der Truffle-Konsole mit Verträgen interagieren kann, die über andere Verträge bereitgestellt werden?

Um die Liste der bereits im Truffle Develop-Netzwerk bereitgestellten Verträge anzuzeigen, funktioniert dieser Befehl:

truffle(develop)> networks [--clean]

Network: develop (id: 4447)
  Migrations: 0xfb88de099e13c3ed21f80a7a1e49f8caecf10df6
  MyNewContract: 0xf204a4ef082f5c04bb89f7d5e6568b796096735a