Aufruf funktioniert nicht mit deklarierter Variable in einem Vertrag mit Trüffel

Ich habe einen einfachen Vertrag mit Truffle erstellt, um die Dinge zu testen. Ich benutze testrpc damit.

pragma solidity ^0.4.11;

contract HelloSystem {

    address owner;

    function HelloSystem() {
        owner = msg.sender;
    }

    function remove() {
        if (msg.sender == owner) {
            selfdestruct(owner);
        }
    }
}

Nachdem ich diesen Vertrag bereitgestellt habe, kann ich zwar removevon der Truffle-Konsole aus anrufen, aber nicht den Eigentümer anrufen, der bei Vertragsbeginn festgelegt wurde.

Habe versucht:

truffle(development)> HelloSystem.deployed().then(function(instance){HS = HelloSystem.at(instance.address)})
HS.owner.call().then(console.log)
HS.owner
HS.owner.call()

Ich bin sehr gut in der Lage, die Funktion zum Entfernen meines Vertrags aufzurufen und zu entfernen. Aber Besitzer funktioniert nicht. Ich bin sicher, dass ich etwas Einfaches vermisse, wenn jemand darauf hinweisen kann, wäre viel wow vielen Dank.

Ich habe einen weiteren einfachen Vertrag mit numerischem Uint-Saldo erstellt und veröffentlicht.

contract helloWorld {    
    uint public balance;    

    function helloWorld() {
        balance = 1000;
    }
} 

Jetzt funktioniert mein Call-to-Balance einwandfrei.

truffle(development)> helloWorld.deployed().then(function(instance){HW = helloWorld.at(instance.address)})
truffle(development)> HW.balance
{ [Function]
  call: [Function],
  sendTransaction: [Function],
  request: [Function: bound ],
  estimateGas: [Function] }
truffle(development)>

Liegt das an der Deklaration öffentlich/privat?

Update Inline mit meinem Argument der öffentlichen Deklaration habe ich versucht zu deklarieren address public ownerfunktioniert immer noch nicht. Daher offen für Ihre Jungs. Bitte helfen Sie.

Antworten (1)

In Ihrem Vertrag ownerist die Variable nicht öffentlich, daher ist HS.owner nicht definiert.

Um dieses Problem zu umgehen, können Sie entweder die Eigentümervariable als öffentlich deklarieren oder eine Getter-Funktion erstellen, um den Eigentümer wie folgt abzurufen:

address public owner;

oder

function getOwner() returns (address owner) {
    return owner;
}

Nach meinem Verständnis sollte dies eine konstante Rückkehr sein, um jeglichen Gasverbrauch zu vermeiden. Wie unten:

function getOwner() constant returns (address owner) {
    return owner;
}

Hoffe das hilft..!

Ja es funktioniert. Seltsamerweise habe ich die Adresse später als öffentlich erklärt, als mir klar wurde, dass der Grund, auf den Sie hingewiesen haben, der Grund sein muss. Irgendwie, möglich, weil ich den Code nicht gespeichert habe, wurde die neue Änderung nicht kompiliert :)
Wahrscheinlich wurde die Datei nicht gespeichert oder nicht kompiliert oder nicht migriert. :)