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!!!!!
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.
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.
sharan rajani
Rob Hitchens