cómo usar trufa para leer el valor de estado de un contrato inteligente

soy un novato

Tengo el siguiente contrato ficticio

contract A{

uint public test = 6;
address public myaddress;
uint public dummy;

/**
* The logs that will be emitted in every step of the contract's life cycle
*/
event MyEvent(address myaddress);
event ReadEvent(address myaddress, uint dummy);

/**
* The contract constructor
*/
constructor() public {
    myaddress = msg.sender;
    emit MyEvent(myaddress);
}

function myF(address sender, uint value) internal {
    require(sender == myaddress );
    dummy = value;
    emit ReadEvent(sender, myaddress);

}


function run() public payable{
    myF(msg.sender, msg.value);

    /*SendMiles();*/

}
}

Luego lo compilo y migro usando truffle. Después, inicio una consola de trufas en una red de desarrollo y hago lo siguiente:

A.deployed().then(inst => { AInstance = inst })

account0 = web3.eth.accounts[0];

AInstance.run({from: account0, value: 5});

Luego obtengo un número de transacción '0xa72b03232f5028332411d7f05cf47248616aab96d982ce9a7b147a00642db405' en glinche.

Dos preguntas: 1. ¿Cómo puedo obtener el valor de las variables del contrato principalmente para prueba, mi dirección y ficticio para la transacción '0xa72b03232f5028332411d7f05cf47248616aab96d982ce9a7b147a00642db405'

  1. ¿Cómo puedo obtener esos valores en un formato más complejo como json?

Probé web3.eth.storeat y A.at('0xa72b03232f5028332411d7f05cf47248616aab96d982ce9a7b147a00642db405') y no funcionó en ambos casos

gracias de antemano;

Respuestas (1)

Su transacción '0xa72b0...' modifica el estado del contrato A. Las variables públicas del contrato, como mi dirección, se almacenan en el estado de su contrato: pedir obtener mi dirección para una transacción específica no tiene sentido.

  1. En solidez, dar a una variable el publicatributo genera automáticamente una función getter del mismo nombre: puede obtener el valor de myaddress con el comando:AInstance.myaddress()
  2. Puede generar JSON manualmente:

    var tmp = new Object()
    tmp.test = AInstance.test()
    tmp.myaddress = AInstance.myaddress()
    tmp.dummy = AInstance.dummy()
    result = JSON.stringify(tmp)
    
1. si entiendo esto correctamente, ¿hay un contrato y cada transacción actualiza el estado en ese contrato? Entonces, si inicio 2 contratos A desde 2 cuentas diferentes, ¿A.instance.myaddress() tendrá la dirección de la segunda instancia? 2. ¿Cómo inicio una instancia en una transacción particular en la cadena de bloques y obtengo sus valores? 3. ¿Hay alguna manera de activar automáticamente los estados en todas las transacciones en un archivo de texto sin usar truffle, geth o cualquier aplicación web3?
Tu primera frase es correcta. Sin embargo, siento que la diferencia entre un contrato y una instancia de contrato no está clara para usted. Cuando ejecuta, AInstance.run()está llamando al método rundesde la instancia específica AInstancede su contrato A. Si implementa nuevamente, obtendrá otra instancia de su contrato A.
así que cada vez que implementa un contrato obtiene una instancia. Entonces esta instancia tendrá una o más transacciones, ¿correcto? Entonces, en ese caso, supongo que estoy tratando de entender en una transacción actual, ¿cuál es el valor de esa instancia, correcto?