La llamada de Drizzle Contract devuelve un objeto inesperado

Tengo una función de vista en mi contrato inteligente que devuelve un uint.

En la página javascript de Truffle Drizzle hago la llamada cuando se carga la página:

this.contracts.TheContract.methods.getNumber.call()

Habría esperado un objeto de gran número. en cambio:

arguments:[]
call: ƒ () 
encodeABI: ƒ () 
estimateGas:ƒ ()
send: ƒ ()
_ethAccounts:
Accounts {_requestManager: RequestManager, givenProvider: MetamaskInpageProvider, providers: {…}, _provider: MetamaskInpageProvider, …}
_method:
{constant: true, inputs: Array(0), name: "getNumber", outputs: Array(1), payable: false, …}
_parent:
Contract {_requestManager: RequestManager, givenProvider: MetamaskInpageProvider, providers: {…}, _provider: MetamaskInpageProvider, …}
__proto__:Object

Si hago una llamada a ese objeto, devuelve una promesa; no es lo que esperaba para una llamada estándar.

cacheCall devuelve 0x0; una dirección vacía? ¿eh? ¿Alguien ha podido usar trufa y llovizna sin tener que recurrir al estándar web3?

ideas?

Gracias

Respuestas (2)

La llamada estándar también devuelve una promesa en web3. Así que ese es el resultado esperado.

myContract.methods.myMethod([param1[, param2[, ...]]]).call(opciones[, callback])

o usa el método de devolución de llamada o la promesa de que obtendrá el resultado esperado

// usando la devolución de llamada
myContract.methods.myMethod(123).call({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}, function(error, resultado){
    ...
});

// usando la promesa
myContract.methods.myMethod(123).call({desde: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'})
.entonces(función(resultado){
    ...
});

// asíncrono / espera
const resultado = esperar myContract.methods.myMethod(123).call({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'})

árbitro

Mi problema resultó ser llovizna de trufa, aun así, sigue sin funcionar como esperaba

Si está usando Drizzle, su mejor opción es usar cacheCall(). Como se ha explicado en otras respuestas, la llamada estándar en web3 devolverá una promesa en lugar del valor de retorno que podría esperar del código del contrato. Esto se debe a que la llamada se realiza de forma asíncrona en la ejecución y el valor no se conoce de inmediato. El manejo de una promesa se ha explicado bien en otras respuestas, por lo que no lo volveré a escribir aquí.

Drizzle's cacheCall()es más poderoso, le dice a Drizzle que le gustaría realizar un seguimiento de los datos en la tienda de Drizzle. Drizzle monitoreará la cadena de bloques en busca de transacciones que interactúen con su contrato y actualizará automáticamente el valor en la tienda si se modifican los datos del contrato. El valor de retorno de cacheCall()no es el valor del contrato, sino que devuelve la clave correspondiente al valor en la tienda Drizzle. En su ejemplo, la clave de la tienda es 0x0. Para ver el valor de getNumber, debe recuperarlo de la tienda de llovizna. Lo encontrarás this.props.TheContract.getNumber['0x0']cuando lo uses en la render()función de tu Dapp. Cada vez que una transacción a su contrato modifique este valor, drizzle lo cambiará automáticamente en la tienda, por lo que la pantalla se actualizará de inmediato. esta guíaha sido inmensamente útil para explicar cómo usar las llamadas Drizzle. Explica mucho más en profundidad cómo y dónde usar esta función.