Öffentliche Vertragsvariablen bleiben undefiniert. Warum?

Ich habe einen Vertrag, der so aussieht:

contract MainContract is usingOraclize {
    ...

    address minter;
    uint public returnRate;

    ...

    function MainContract(uint _returnRate) {
        minter = msg.sender;
        returnRate = returnRate;
        oraclize_setProof(proofType_TLSNotary | proofStorage_IPFS);
    }        

    modifier onlyMinter {
        if (msg.sender != minter) throw;
        _;
    }

     function updateReturnRate(uint newReturnRate) onlyMinter {
        returnRate = newReturnRate;
     }

     ...    

}

Ich habe es im Testnetz bereitgestellt: https://testnet.etherscan.io/address/0x5cad3cbdbf64b65174b36269f5201d3265569f2b

Wenn ich jedoch versuche, den Wert der Variable „returnRate“ abzurufen, erhalte ich, dass er nicht definiert ist, obwohl er bei der Vertragserstellung hätte festgelegt werden sollen. Also habe ich dann versucht, es über die Funktion updateReturnRate zu aktualisieren, und es ist immer noch undefiniert. Und ich kann mir nicht erklären warum...

Muss ich die Funktion als öffentlich angeben? Warum wurde der Wert jedoch nicht bei der Vertragserstellung festgelegt?

Ich verwende den Browser Solidity Compiler zum Testen.

Ihr Parameter ist _returnRate (Unterstrich vorangestellt), also sollten Sie returnRate via initialisierenreturnRate=_returnRate;
Ah, richtig, oops ... Unterstrich vergessen. Aber wie kommt es, dass ich es nicht über die Update-Funktion aktualisieren kann?
Für die updateReturnRateFunktion. es sollte funktionieren, in Ihrem Code ist nichts falsch. Der einzige Grund dafür könnte sein, dass die Transaktion von jemand anderem als minter(Vertragseigentümer) gesendet wird. Sonst Ausnahmen? Auch für die Schreibmethode rate ich, ein erfolgreiches Flag zurückzugebenfunction updateReturnRate(uint newReturnRate) onlyMinter returns(bool successful){ returnRate = newReturnRate; return true; }
Wie sich herausstellt, wenn man sich die Blockchain ansieht: testnet.etherscan.io/address/… wurde die Transaktion nicht von derselben Adresse wie die Vertragserstellungsadresse gesendet. Obwohl ich nicht weiß, warum der Solidity-Compiler des Browsers eine Funktion von einer Adresse aufgerufen hat, die nicht meine ist.
Selbst mit derselben Adresse wie der Erstellungsadresse wird diese nicht aktualisiert. Hier ist der Transaktions-Hash: testnet.etherscan.io/tx/… gesendet von derselben Adresse wie die Vertragserstellungsadresse: testnet.etherscan.io/address/…

Antworten (1)

Nach einem kurzen Blick funktioniert Ihr Vertrag einwandfrei. Ich denke, dass mit Browser Solidity definitiv etwas nicht stimmt

Normalerweise entwickle ich mit Truffle , also habe ich schnell ein Truffle-Projekt aus Ihrem Vertrag erstellt (unten).

pragma solidity ^0.4.4;
contract MainContract {
    address minter;
    uint public returnRate;

    function MainContract(uint _returnRate) {
        minter = msg.sender;
        returnRate = _returnRate;
    }        
    modifier onlyMinter {
        if (msg.sender != minter) throw;
        _;
    }
     function updateReturnRate(uint newReturnRate) onlyMinter {
        returnRate = newReturnRate;
     } 
}

Ich habe den Vertrag zusammengestellt und bereitgestellt:

Und in der Konsole getestet. Hier ist das Ergebnis:

truffle(default)> var c = MainContract.deployed()
truffle(default)> c.returnRate.call()
{ [String: '20'] s: 1, e: 1, c: [ 20 ] }
truffle(default)> c.updateReturnRate(30)
'0x642d24031f582730000c37dd254173944840e5e771fbb0b74c032bd74f7294ba'
truffle(default)> c.returnRate.call()
{ [String: '30'] s: 1, e: 1, c: [ 30 ] }

Der Vertrag initialisiert die Rate auf 20. Und ich habe sie auf 30 geändert, indem ich die Funktion updateRate aufrufe.

Wie auch immer, ich bin kein Experte für Browser Solidity, aber ich empfehle Tools wie Truffle, um Ihre Entwicklung zu industrialisieren und effizienter zu machen.

Alles ist da