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.
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
Gregor Jeanmart
returnRate=_returnRate;
Pabi
Gregor Jeanmart
updateReturnRate
Funktion. es sollte funktionieren, in Ihrem Code ist nichts falsch. Der einzige Grund dafür könnte sein, dass die Transaktion von jemand anderem alsminter
(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; }
Pabi
Pabi