Was ich tun möchte, ist einen intelligenten Vertrag zu erstellen, der eine Variable hat, die einen Wert ansammeln kann. Ich möchte, dass es als beginnt 0
und es dann erhöht, während ich regelmäßig überprüfe, ob meine Aufrufe zum Erhöhen des Werts tatsächlich funktioniert haben.
Hier ist mein sehr einfacher Smart Contract, um das zu erreichen:
pragma solidity ^0.4.13;
// This contract demonstrates a simple non-constant (transactional) function you can call from geth.
// increment() takes no parameters and merely increments the "iteration" value.
contract Incrementer {
uint iteration;
function Incrementer() {
iteration = 0;
}
function increment(uint count) {
iteration += count;
}
function getIteration() constant returns (uint) {
return iteration;
}
}
Es muss jedoch kaputt sein, oder ich nenne es vielleicht nicht richtig, wie Sie an meiner Konsolenausgabe sehen können:
Die Ausführungsumgebung, die ich verwende, ist truffle.
Die Befehle zum Kompilieren waren:
truffle compile --all
truffle migrate --reset
Dann starte ich, um damit truffle console
zu interagieren, nachdem ich testrpc
in einem anderen Fenster begonnen habe.
Die genauen Befehle, die ich verwendet habe, waren:
Incrementer.deployed()
Incrementer.deployed().then(function(instance) { meta = instance; return meta.getIteration.call(); })
und alternativ:
Incrementer.deployed().then(function(instance) { meta = instance; return meta.increment.call(1); })
Wie kann ich den Wert von iteration()
erhöhen, indem ich increment()
aufrufe und dann das Ergebnis mit ausgebe getIteration()
?
BEARBEITEN:
Eines der korrekten Verfahren ist nach meinen Experimenten, auf diese Weise aufzurufen:
Incrementer.deployed().then(function(instance) { meta = instance; return meta.increment(1); })
Ausgabe sieht so aus:
überprüfen Sie auf diese Weise:
Incrementer.deployed().then(function(instance) { meta = instance; return meta.getIteration(); })
ergibt:
Zwei Dinge springen heraus und einige Stilhinweise.
Erstens und wahrscheinlich am wichtigsten
Bei Dir ist return meta.getIteration.call()
das .call()
Teil überflüssig (aber harmlos). Es ist überflüssig, da die Vertragsfunktion markiert ist constant
und daher nur auf dem lokalen Computer ausgeführt wird, nicht netzwerkverifiziert. Es sollte genauso gut (und genauso) ohne funktionieren .call()
.
Aber Sie bekommen Probleme, wenn Sie .call()
das .increment()
tun, weil Sie ausdrücklich sagen, dass Sie die lokale Ausführung, den verifizierungsfreien, schreibgeschützten Ausführungsmodus wollen. Daher übermittelt es keine Transaktion an das Netzwerk. Ergo, macht nicht das, was Sie erwarten.
Zweite
Sie könnten die erste Hürde überwinden und dann auf die nächste stoßen. Nach dem Ablegen .call()
werden die Dinge sendTransaction()
tief unten in den Modus versetzt, und Sie erhalten einen txnHash
statt eines Rückgabewerts. Das ist normal.
Stil
Ich würde public
in beiden Funktionen schreiben, um eine Gewohnheit im Einklang mit Best Practices zu entwickeln. Es ist die Standardeinstellung, es ändert sich also nichts. Außerdem würde ich return(bool success)
oder return(uint newCount)
zugunsten anderer Verträge.
Ich hoffe es hilft.
Aktualisieren
Halten:
var contract;
var counter;
Incrementer.deployed()
.then(function(instance) {
contract = instance;
return contract.increment(1);
})
.then(function(txnHash) {
return contract.getIteration();
})
.then(function(response) {
var counter = response.toString(10);
console log("Counter says:", counter);
});
Ich gehe hier nur Freestyle, also hoffe ich, dass ich es nicht vermasselt habe.
smatthewenglisch
.call()
onincrement
und auch versuchtgetIteration
, aber es scheint in diesem Fall nur die Methodensignatur oder so etwas zurückzugeben. Ich habe die Konsolenausgabe unter der letzten Bearbeitung des OP gepostet. Bitte verzeihen Sie mir meine Unwissenheit, aber ich bin mir nicht sicher, was Sie damit meinenreturn(bool success)
. Können Sie mir vielleicht zeigen, wie das als Teil einer dieser Funktionen aussehen würde? Trotzdem vielen Dank für diese Hinweise, ich schätze Ihre Ratschläge sehr.Rob Hitchens
meta.getInteraction().then(...
Undmeta.increment().then(...
smatthewenglisch
Rob Hitchens
smatthewenglisch
Incrementer()
Methode aufzurufen, um sie auf Null zurückzusetzen, und das hat nicht funktioniert. Können Sie diese Art von Konstruktormethoden aus irgendeinem Grund nur einmal aufrufen?Rob Hitchens
smatthewenglisch
Rob Hitchens
smatthewenglisch