Consulta del estado del contrato

Puede ver el estado de un contrato como cliente externo utilizando la CLI o mientras ejecuta otro contrato. En esta secci贸n, exploraremos los dos tipos de consultas: sin procesar y personalizadas. Tambi茅n veremos la sem谩ntica de la consulta a trav茅s de un cliente externo y como cliente interno (otro contrato). Prestaremos especial atenci贸n no s贸lo a c贸mo funciona en la pr谩ctica, sino tambi茅n a las cuestiones de dise帽o y seguridad de la ejecuci贸n de consultas de un contrato a otro.

Consultas en bruto

La consulta m谩s sencilla de implementar es el acceso de lectura sin procesar al almac茅n de valores clave. Si la persona que llama (ya sea un cliente externo u otro contrato) pasa la clave binaria en bruto utilizada en el almacenamiento del contrato, podemos devolver f谩cilmente el valor binario en bruto. La ventaja de este enfoque es que es f谩cil de implementar y universal. La desventaja es que requiere conocer el contrato exacto que se est谩 ejecutando, ya que espera que la persona que llama conozca la implementaci贸n del almacenamiento del contrato.

Dado que las consultas sin procesar se implementan dentro del tiempo de ejecuci贸n de wasmd, evitan la m谩quina virtual. Como consecuencia, no requieren soporte del contrato CosmWasm, y todo el estado del contrato es visible. La funci贸n query_raw est谩 expuesta a todas las llamadas, tanto externas como internas.

Consultas personalizadas

Como a menudo no es deseable acoplarse estrechamente a los detalles de implementaci贸n, es preferible depender de una interfaz en su lugar. Por ejemplo, podemos definir un est谩ndar para "CW20" ExecuteMsg para llamar al contrato, y podemos definir tal est谩ndar para un QueryMsg tambi茅n. Por ejemplo, consultar el saldo por direcci贸n, consultar el subsidio a trav茅s del otorgante + el beneficiario y consultar la informaci贸n de las fichas (ticker, decimales, etc.). Al definir una interfaz est谩ndar, permitimos muchas implementaciones, incluyendo contratos complejos, donde la interfaz "CW20" es s贸lo un peque帽o subconjunto de su funcionalidad.

Para habilitar las consultas personalizadas, permitimos que cada contrato exponga una funci贸n de consulta que pueda acceder a su almac茅n de datos en modo de s贸lo lectura. Esto permite cargar cualquier dato e incluso realizar c谩lculos sobre 茅l. Este m茅todo se expone como query_custom a todas las llamadas, tanto externas como internas. Como el formato de los datos (tanto para la consulta como para la respuesta) puede ser el que desee el contrato, debe documentarse en el esquema p煤blico, junto con ExecuteMsg e InitMsg.

Tenga en cuenta que la ejecuci贸n de un contrato puede consumir una cantidad ilimitada de gas, mientras que query_raw leer谩 una clave y tiene un coste peque帽o, en su mayor parte fijo. Con query_custom, necesitamos imponer un l铆mite de gas. Como el m茅todo para imponer un l铆mite de gas se hace de forma diferente para las llamadas externas e internas, profundizaremos en los detalles a continuaci贸n.

Consultas externas

Las consultas externas son la principal forma en que los clientes web y CLI interact煤an con el blockchain. Hacen una llamada a Tendermint RPC, que a su vez llama a abci_query en el SDK de Cosmos y delega la tarea al m贸dulo apropiado. Para evitar posibles vectores de ataque, como el uso de un contrato wasm con un bucle infinito para crear un ataque DoS en un nodo RPC p煤blico que expone la consulta, es necesario definir un l铆mite de gas fijo para todas las transacciones query_custom llamadas externamente. Este l铆mite no se utiliza para cobrar una tarifa, sino para limitar los abusos.

Sin embargo, es dif铆cil definir un valor est谩ndar para el l铆mite de gas, ya que un nodo expuesto p煤blicamente probablemente establecer铆a un l铆mite de gas peque帽o, mientras que un nodo de archivo que realice consultas complejas requerir铆a un valor diferente. Para solucionar este problema, se puede definir un l铆mite de gas para todas las llamadas query_custom en un archivo de configuraci贸n espec铆fico de la aplicaci贸n. Los operadores de nodos pueden personalizar este valor, mientras que se establece un l铆mite por defecto razonable para permitir que los nodos p煤blicos se protejan de las consultas complejas. Las consultas opcionales pueden realizar grandes agregaciones sobre todos los datos de contratos en nodos especialmente configurados.

Es importante tener en cuenta que la llamada abci_query nunca lee el estado actual "en curso" de los m贸dulos. En su lugar, utiliza una instant谩nea de s贸lo lectura del estado despu茅s del 煤ltimo bloque confirmado.

Consultas internas

Aunque muchas interacciones entre contratos pueden modelarse f谩cilmente mediante el env铆o de mensajes, hay algunos casos en los que nos gustar铆a consultar de forma sincr贸nica otros m贸dulos sin alterar su estado. Por ejemplo, si quisi茅ramos resolver un nombre a una Direcci贸n, o si quisi茅ramos comprobar el estado de alguna cuenta antes de activar una acci贸n. Aunque podr铆as modelar esto como una serie de mensajes, ser铆a bastante complejo y crear铆a problemas a la hora de implementar casos de uso sencillos.

N贸tese que este dise帽o tambi茅n violar铆a uno de los principios b谩sicos del Modelo Actor, ya que cada contrato s贸lo deber铆a tener acceso exclusivo a su propio estado interno. Tanto query_raw como query_custom fallan en este aspecto. Lejos de ser s贸lo un problema te贸rico, esto puede llevar a problemas de concurrencia y reentrada si no se maneja correctamente. Como no hay necesidad de poner este razonamiento de seguridad cr铆tica en manos de los desarrolladores de contratos, las garant铆as de seguridad se pueden incrustar en el propio marco.

Como tal, proporcionamos al Querier acceso de s贸lo lectura a la instant谩nea del estado justo antes de la ejecuci贸n del mensaje CosmWasm actual. Dado que tomamos una instant谩nea y tanto el contrato en ejecuci贸n como el contrato consultado tienen acceso de s贸lo lectura a los datos antes de la ejecuci贸n del contrato, esto sigue siendo seguro debido a las reglas de pr茅stamo de Rust. El contrato actual s贸lo escribe en una cach茅, que se vac铆a despu茅s en caso de 茅xito.

Tenga en cuenta que todas las consultas se realizan como parte de una transacci贸n, que ya tiene un l铆mite de gas fuertemente impuesto. Todas las lecturas de almacenamiento y el procesamiento de datos realizados como parte de una consulta se deducen del mismo contador de gas que el resto de la transacci贸n y, por tanto, limitan el tiempo de procesamiento.

Last updated