Después de la implementación, la interacción con las funciones no da el resultado deseado usando Web3, Truffle

El conjunto de funciones de contrato proporciona el comportamiento esperado cuando se prueba en Remix. Pero cuando las mismas funciones se implementan en TestRPC mediante Truffle y Web3 y se accede a ellas mediante una interfaz web, no se obtienen los resultados lógicos necesarios.

Las Estructuras son las siguientes:

struct ProofEntry {
bytes32 owner;
bytes32 privateKey;
bytes32 previousTrackingId;}


struct registerEntry{
bytes32 owner;
bytes32 privateKey;}

Las asignaciones requeridas son las siguientes:

mapping (bytes32 => ProofEntry) proofs; // trackingId to ownerBlock

mapping (string => bytes32) items;  // productId to trackingId

mapping (bytes32 => registerEntry) register; // ownerHash to registerEntry

Considere las siguientes funciones: 1] addProduct

function addProduct(string password, string productId) public returns(bool){
    if(hasEntry(productId))
      return false;
    else {
    bytes32 owner = keccak256(bytes32ToString(keccak256(password)));
    bytes32 privateKey =  keccak256(password);
    bytes32 previousTrackingId = keccak256("root");
    bytes32 trackingId = keccak256(productId);
    proofs[trackingId] = ProofEntry(owner, privateKey, previousTrackingId);
    register[owner] = registerEntry(owner , privateKey);
    items[productId] = trackingId;
    productAdded(password,owner,productId);
    return true;
  }
}

2] obtener propietario

function getOwner(string productId) constant returns(bytes32) {
 bytes32 trackingId = items[productId];
 ProofEntry memory record = proofs[trackingId];
 return (record.owner);}

Ahora, cuando pruebo estas funciones en Remix, es decir, al proporcionar una contraseña y un ID de producto para addproduct() y el ID de producto en getOwner, obtengo el Hash correspondiente del propietario.

Pero cuando lo implemento en testRPC usando Truffle, Web3 y accedo a él usando WebUI, addproduct() devuelve verdadero indicando que ha agregado el producto pero cuando paso el mismo productId a getOwner(), devuelve el valor predeterminado de bytes32 y no el OwnerHash, que indica que los valores no se han reflejado en las asignaciones en la cadena de bloques y no puedo entender por qué. Necesito ayuda Urgente!!!!!

Respuestas (2)

Parece que está descuidando la espera de que se extraiga la transacción de agregar producto. Luego, continúa y verifica y encuentra que nada ha cambiado.

Fuera de Remix, que lo hace "gratis", hay que esperar la transacción minada para ver el efecto.

La siguiente función le permite pasar el recibo de la transacción (que tendrá) y hacer una pausa hasta que se haya extraído la transacción de interés.

https://gist.github.com/xavierlepretre/88682e871f4ad07be4534ae560692ee6

Espero eso ayude.

¿Cuánto tiempo debería llevar normalmente minar una transacción en testRPC? He esperado mucho, también en mi terminal donde se ejecuta testRPC muestra detalles del uso de gas, número de bloque, etc.
TestRPC es más o menos inmediato, por lo que si el evento no llega es probable que el contrato no lo haya emitido.

La función addproduct() no refleja los cambios en la cadena de bloques porque puede haber sido invocada usando .call() , y una llamada es una invocación local de una función de contrato que no transmite ni publica nada en la cadena de bloques.

Para reflejar cambios en la cadena de bloques, se debe invocar usando .sendTransaction() , porque una transacción se transmite a la red, los mineros la procesan y, si es válida, se publica en la cadena de bloques.

Consulte el siguiente enlace para obtener más información sobre la diferencia entre transacción y llamada.

¿Cuál es la diferencia entre una transacción y una llamada?