Implementación del contrato CosmWasm

Descripción general

Esta guía proporciona una descripción general completa de la creación, implementación e interacción con contratos CosmWasm en Wasm Minitia. Es esencial tener en cuenta que los contratos CosmWasm se admiten exclusivamente en Minitias que utilizan WasmVM.

Tutorial

Paso 1: clonar el cw-contractsrepositorio

Para comenzar, usaremos el nameservicemódulo del cw-contractsrepositorio como nuestro proyecto de ejemplo. Ejecute los siguientes comandos para clonar el repositorio y navegar hasta el directorio del contrato correspondiente:

git clone https://github.com/deus-labs/cw-contracts.git
cd cw-contracts
git checkout main
cd contracts/nameservice

Paso 2: compilar un contrato

Utilice el siguiente comando para compilar un binario Wasm y prepararlo para su implementación en Wasm Minitia:

RUSTFLAGS='-C link-arg=-s' cargo wasm

Tras una compilación exitosa, target/wasm32-unknown-unknown/release/cw_nameservice.wasmse generará el binario.

Compilación avanzada conrust-optimizer

Para una eficiencia óptima, particularmente para minimizar los costos de gas asociados con la implementación y la interacción, se debe minimizar el tamaño del archivo binario. Esto requiere la instalación de Docker y el uso de rust-optimizer, una herramienta diseñada para reducir el tamaño binario sin comprometer la funcionalidad del contrato.

Ejecute el siguiente comando para utilizar rust-optimizer:

docker run --rm -v "$(pwd)":/code \
  --mount type=volume,source="$(basename "$(pwd)")_cache",target=/code/target \
  --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \
  cosmwasm/rust-optimizer:0.12.11

Este proceso generará un archivo binario ubicado en artifacts/cw_nameservice.wasm.

Paso 3: almacenar un contrato

La siguiente fase consiste en almacenar el cw_nameservice.wasmcontrato compilado en Minitia.

CLIinicia.js

> minitiad tx wasm store [binary-path] \
  --from test-account \
  --gas auto --gas-adjustment 1.5 \
  --gas-prices [gas-price] \
  --node [rpc-url]:[rpc-port] \
  --chain-id [chain-id]

Paso 4: crear una instancia de un contrato

El último paso consiste en crear una instancia del contrato recién almacenado. Para lograrlo es necesaria la codeIddel contrato almacenado . cw_nameservice.wasmObtenga el codeIdcon la siguiente línea de comando:

CLIinicia.js

> RES=$(minitiad q tx --type=hash [txhash] --node [rpc-url]:[rpc-port] --output json)
CODE_ID=$(echo $RES | jq -r '.events[-1].attributes[1].value') 
echo $CODE_ID

Ahora puedes crear una instancia de un nuevo contrato Wasm usando este código:

CLIinicia.js

> INIT='{"purchase_price":{"amount":"100","denom":"l2/2588fd87a8e081f6a557f43ff14f05dddf5e34cb27afcefd6eaf81f1daea30d0"},"transfer_price":{"amount":"100","denom":"l2/2588fd87a8e081f6a557f43ff14f05dddf5e34cb27afcefd6eaf81f1daea30d0"}}'

minitiad tx wasm instantiate 1 "$INIT" --label=nameservice --no-admin \
  --from test-account \
  --gas auto --gas-adjustment 1.5 \
  --gas-prices [gas-price] \
  --node [rpc-url]:[rpc-port] \
  --chain-id [chain-id]

Paso 5: interactuar con un contrato

Habiendo creado con éxito una instancia del contrato CosmWasm, el siguiente paso consiste en interactuar con él. Esta fase requiere la dirección del contrato, que se puede recuperar usando el comando que se describe a continuación:

CLIinicia.js

> RES=$(minitiad q tx --type=hash [txhash] --node [rpc-url]:[rpc-port] --output json)
CONTRACT_ADDRESS=$(echo $RES | jq -r '.events[-1].attributes[0].value') 
echo $CONTRACT_ADDRESS

Ejecutar una función de contrato

Con la dirección del contrato a mano, ahora podemos ejecutar funciones dentro del contrato. Como ejemplo, ejecutaremos la registerfunción para registrar "prueba" como dominio de servicio de nombres. El comando de ejecución es el siguiente:

CLIinicia.js

> REGISTER='{"register":{"name":"test"}}'
minitiad tx wasm execute [contract_address] "$REGISTER" --amount 100[denom]  \
  --from test-account \
  --gas auto --gas-adjustment 1.5 \
  --gas-prices [gas-price] \
  --node [rpc-url]:[rpc-port] \
  --chain-id [chain-id]

Resultados de la consulta

Después de la ejecución exitosa de la registerfunción, la verificación del nombre registrado se puede lograr mediante una consulta de contrato. Utilice el siguiente comando para realizar la consulta:

CLIinicia.js

> NAME_QUERY='{"resolve_record": {"name": "test"}}'
minitiad query wasm contract-state smart [contract_address] "$NAME_QUERY" --node [rpc-url]:[rpc-port]

Esta consulta arrojará resultados en el siguiente formato, confirmando el registro exitoso:

{
  "address": "init150748hf2e3mjed5w0xqkp9wn8xs55nnzneg452"
}

Este paso completa la guía sobre desarrollo, implementación e interacción con contratos CosmWasm. Ilustra las etapas desde la compilación del contrato, el almacenamiento y la creación de instancias hasta la fase de interacción final. Seguir esta guía garantiza un enfoque estructurado para el desarrollo de contratos de CosmWasm, lo que permite a los desarrolladores crear y gestionar contratos de manera eficiente dentro de Wasm Minitia.

Last updated