HelloWorld-Vertrag mit Truffle v3.2.1

Ich habe meinen ersten sehr einfachen HelloWorld Smart Contract gemacht:

pragma solidity ^0.4.4;

contract HelloWorld {
    uint public balance;

    function sayHi() returns (bool success) {
        balance = 1000;
        return true;
    }
}

Der Versuch, alle mithilfe von Truffle in einem lokalen Testrpc-Netzwerk bereitzustellen. Meine Bereitstellungsverträge sehen folgendermaßen aus:

var HelloWorld = artifacts.require("./HelloWorld.sol");
module.exports = function(deployer) {

  deployer.deploy(HelloWorld);
};

Ich truffle build && truffle migrateversuche dann, meinen Vertrag zu verwenden, ich kann sehen, dass mein Vertrag korrekt bereitgestellt wird, ich kann auf mein Testrpc-Netzwerk zugreifen (verfügbare Konten usw.), aber ich versuche, mein Guthaben zu erhalten:

truffle(development)> var aHelloWorld = HelloWorld.deployed()
undefined
truffle(development)> aHelloWorld.balance.call().then(console.log)
TypeError: Cannot read property 'call' of undefined

Es findet meine Gleichgewichtseigenschaft nicht ... aber wenn ich console.logmein aHelloWorldObjekt sehe, kann ich sehen, dass es eine Gleichgewichtseigenschaft hat.

und dann rief ich an:

truffle(development)> aHelloWorld.toString()
'[object Promise]'

Es scheint also, dass mein Vertrag ein Versprechen bleibt, ich habe versucht:

truffle(development)> aHelloWorld.then(function (myContract) { 
  myContract.sayHi().then(); 
  console.log(myContract.balance.call().then(console.log))
})
Promise { <pending> }
undefined
truffle(development)> { [String: '1000'] s: 1, e: 3, c: [ 1000 ] }

Es hat mein Gleichgewicht richtig verändert, ich bin glücklich, aber wirklich verwirrt ... Ich habe mir einige Tutorials angesehen und hier auch einige Antworten zu grundlegenden Schritten gelesen, wie zum Beispiel Truffle error: Cannot read property 'call' of undefinedHelloWorld.deployed().balance.call()...

Ich meine, direkt auf den Vertrag zuzugreifen, HelloWorld.deployed()ohne auf das Versprechen zu warten ... Liegt es an der Truffle-Version, die ich verwende, oder mache ich etwas falsch?

UPDATE: Sogar das Truffle-Tutorial zeigt direkten Zugriff auf das deployed()Objekt: http://truffle.readthedocs.io/en/latest/getting_started/testing/

Antworten (2)

Ich kann nicht glauben, dass ich eine Antwort in einem YouTube-Videokommentar gefunden habe:

Trüffel ändern, um auf diese Weise zu nennen

HelloWorld.deployed().then(a => console.log(a.address))

Link zum YouTube-Video: Link

Was in meinem Fall bedeutet HelloWorld.deployed().then(a => console.log(a.balance)), oder HelloWorld.deployed().then(a => console.log(a.balance.then(console.log))), um direkt eine Antwort zu erhalten. Also ja, Truffle hat ihre Art des Zugriffs auf Verträge in neueren Versionen geändert, sie sollten ihr Dokument aktualisieren

Danke @BadrBellaj, diese Frage tauchte bei den ähnlichen Fragen nicht auf

Um das Leben ein wenig einfacher zu machen, können Sie es auch so machen:

Zuerst können Sie den Vertrag einer Variablen zuweisen:

truffle(development)> HelloWorld.deployed().then(function(instance){helloWorld=instance})

Da balance eine öffentliche Variable ist, erstellt der Compiler eine Getter-Funktion für Sie. Um das Guthaben zu erhalten, können Sie anrufen:

truffle(development)> helloWorld.balance.call()

oder um den Saldo einer Variablen zuzuweisen, die Sie aufrufen können:

truffle(development)> var balance = helloWorld.balance.call()

Um die Funktion sayHi aufzurufen, würden Sie Folgendes aufrufen:

truffle(development)> helloWorld.balance.sayHi()