Lo que quiero hacer es crear un contrato inteligente que tenga una variable que pueda acumular valor. Me gustaría que comience como 0
, y luego lo incremente, mientras verifico periódicamente para verificar que mis llamadas para aumentar el valor hayan funcionado.
Aquí está mi contrato inteligente muy simple para lograr eso:
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;
}
}
Sin embargo, debe estar roto, o tal vez no lo estoy llamando de la manera correcta, como puede ver en la salida de mi consola:
El entorno de ejecución que estoy usando es trufa.
Los comandos para compilar fueron:
truffle compile --all
truffle migrate --reset
Luego enciendo truffle console
para interactuar con él, después de haber comenzado testrpc
en otra ventana.
Los comandos exactos que he estado usando para llamarlo han sido:
Incrementer.deployed()
Incrementer.deployed().then(function(instance) { meta = instance; return meta.getIteration.call(); })
y alternativamente:
Incrementer.deployed().then(function(instance) { meta = instance; return meta.increment.call(1); })
¿Cómo puedo aumentar el valor de iteration()
llamando increment()
y luego emitiendo el resultado con getIteration()
?
EDITAR:
Uno de los procedimientos correctos, según mis experimentos, es llamar de esta manera:
Incrementer.deployed().then(function(instance) { meta = instance; return meta.increment(1); })
la salida se ve así:
verificar de esta manera:
Incrementer.deployed().then(function(instance) { meta = instance; return meta.getIteration(); })
resultados en:
Dos cosas saltan a la vista y algunos consejos de estilo.
Primero, y probablemente lo más importante
Cuando te return meta.getIteration.call()
la .call()
parte es redundante (pero inofensiva). Es redundante porque la función de contrato está marcada constant
y, por lo tanto, solo se ejecutará en la máquina local, no en la red verificada. Debería funcionar igual de bien (y lo mismo) sin .call()
.
Pero, se mete en problemas cuando lo hace .call()
porque .increment()
está diciendo explícitamente que desea la ejecución local, el modo de ejecución de solo lectura y sin verificación. Por lo tanto, no envía una transacción a la red. Ergo, no hace lo que esperas que haga.
Segundo
Puede superar el primer obstáculo y luego encontrarse con el siguiente. Después de soltar .call()
, las cosas cambiarán a sendTransaction()
un modo profundo y obtendrá un txnHash
valor de retorno en lugar de uno. Esto es normal.
Estilo
Escribiría public
en ambas funciones para ayudar a formar un hábito de acuerdo con las mejores prácticas. Es el valor predeterminado, por lo que no cambiará nada. Además, lo haría return(bool success)
o return(uint newCount)
en beneficio de otros contratos.
Espero eso ayude.
Actualizar
Considerar:
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);
});
Solo yendo al estilo libre, aquí, así que espero no haber fallado.
smatthewenglish
.call()
onincrement
, y tambiéngetIteration
, pero parece devolver solo la firma del método, o algo así, en ese caso. He publicado la salida de la consola en la edición reciente del OP. Disculpe mi ignorancia, pero no estoy seguro de lo que quiere decir conreturn(bool success)
, ¿podría mostrarme cómo se vería eso como parte de una de esas funciones? De todos modos, muchas gracias por estos consejos, realmente aprecio tu consejo.Rob Hitchens
meta.getInteraction().then(...
ymeta.increment().then(...
smatthewenglish
Rob Hitchens
smatthewenglish
Incrementer()
método para restablecerlo a cero, y eso no funcionó, ¿es que solo puede llamar a ese tipo de métodos constructores una vez por alguna razón?Rob Hitchens
smatthewenglish
Rob Hitchens
smatthewenglish