incrementar el valor del contrato con la llamada de la consola en truffle / testrpc, la variable no es persistente

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:

ingrese la descripción de la imagen aquí

El entorno de ejecución que estoy usando es trufa.

Los comandos para compilar fueron:

truffle compile --all
truffle migrate --reset

Luego enciendo truffle consolepara interactuar con él, después de haber comenzado testrpcen 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:

ingrese la descripción de la imagen aquí

Respuestas (2)

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í:

ingrese la descripción de la imagen aquí

verificar de esta manera:

Incrementer.deployed().then(function(instance) { meta = instance; return meta.getIteration(); })

resultados en:

ingrese la descripción de la imagen aquí

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 constanty, 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 txnHashvalor de retorno en lugar de uno. Esto es normal.

Estilo

Escribiría publicen 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.

Lo probé sin .call()on increment, y también getIteration, 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 con return(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.
meta.getInteraction().then(...ymeta.increment().then(...
¿Qué tal la respuesta que acabo de publicar? parece funcionar
Parece que vas en la dirección correcta. Agregué un pensamiento a mi respuesta original. Quizás te dé algunas ideas.
Sin embargo, traté de llamar a ese 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?
Sí. El constructor dispara una vez y solo una vez. No está disponible.
ajá, está bien, genial. ¿Es eso como un paradigma de programación general? Que los constructores solo se activan una vez, y que no se puede llamar a un método con el mismo nombre que el... ¿cómo se llama contrato? o clase o algo
En Solidity, un constructor es una función con el mismo nombre que el contrato y se activa una vez durante la implementación y el implementador paga el costo de ejecución. Es más o menos similar a init() en otros idiomas. Nadie puede llamarlo.
aha, ok genial, es bueno saber eso. ¿Quizás tiene un buen recurso, es decir, actualizado, etc., sobre cómo implementar un contrato como este para ropsten? He estado tratando sin éxito de empujar este hasta allí