Verificación de contratos inteligentes

Se trata de un paso vital para garantizar que se está ejecutando el contrato adecuado. Es posible verificar cualquier contrato inteligente desplegado en la cadena de bloques. Tomemos un ejemplo práctico en el que se tiene un contrato activo en la blockchain y se desea determinar su nombre en clave y su versión.

Inspeccionar código

Examinaremos el siguiente contrato de acceso público archway1cug98emkqmj8n3n2tnm9d04e7q52r9lrjgaud9hecnqw6pth8fvse96uwj en las redes de Archway. Este contrato se basa en el modelo de contrato Increment que puede encontrarse aquí.

Podemos consultar la información del contrato utilizando el siguiente comando:

Mainnet
archwayd query wasm contract-state raw archway1cug98emkqmj8n3n2tnm9d04e7q52r9lrjgaud9hecnqw6pth8fvse96uwj 636F6E74726163745F696E666F --node https://rpc.mainnet.archway.io:443 --chain-id archway-1 --output json | jq  -r .data | base64 -d | jq
{
  "contract": "crates.io:archway5",
  "version": "0.1.0"
}

Testnet
archwayd query wasm contract-state raw archway1cug98emkqmj8n3n2tnm9d04e7q52r9lrjgaud9hecnqw6pth8fvse96uwj 636F6E74726163745F696E666F --node https://rpc.constantine.archway.tech:443 --chain-id constantine-3 --output json | jq  -r .data | base64 -d | jq
{
  "contract": "crates.io:archway5",
  "version": "0.1.0"
}

¿Qué significa exactamente 636F6E74726163745F696E666F en la consulta anterior?

El ContractInfo se almacena bajo la clave contract_info, que se traduce a 636F6E74726163745F696E666F en formato hexadecimal, como se documenta aquí.

Para obtener el hash requerido, primero necesitamos encontrar el ID de código correspondiente. Este es el proceso para obtenerlo:

Mainnet
archwayd query wasm contract archway1cug98emkqmj8n3n2tnm9d04e7q52r9lrjgaud9hecnqw6pth8fvse96uwj  --node https://rpc.mainnet.archway.io:443 --output json  | jq
{
  "address": "archway1cug98emkqmj8n3n2tnm9d04e7q52r9lrjgaud9hecnqw6pth8fvse96uwj",
  "contract_info": {
    "code_id": "85",
    "creator": "archway1hlsd2tgjxalap5gslxz4g4t0f0yr9nwne98uyu",
    "admin": "archway1hlsd2tgjxalap5gslxz4g4t0f0yr9nwne98uyu",
    "label": "archway5 0.1.0",
    "created": null,
    "ibc_port_id": "",
    "extension": null
  }
  
  Testnet
  archwayd query wasm contract archway1cug98emkqmj8n3n2tnm9d04e7q52r9lrjgaud9hecnqw6pth8fvse96uwj  --node https://rpc.constantine.archway.tech:443 --output json  | jq
{
  "address": "archway1cug98emkqmj8n3n2tnm9d04e7q52r9lrjgaud9hecnqw6pth8fvse96uwj",
  "contract_info": {
    "code_id": "85",
    "creator": "archway1hlsd2tgjxalap5gslxz4g4t0f0yr9nwne98uyu",
    "admin": "archway1hlsd2tgjxalap5gslxz4g4t0f0yr9nwne98uyu",
    "label": "archway5 0.1.0",
    "created": null,
    "ibc_port_id": "",
    "extension": null
  }

Ahora tenemos code_id junto con las direcciones creator y admin. La siguiente consulta recuperará el hash:

Mainnet
archwayd query wasm code 85 85_code.wasm --node https://rpc.mainnet.archway.io:443 --chain-id archway-1
Downloading wasm code to 85_code.wasm

Testnet
archwayd query wasm code 85 85_code.wasm --node https://rpc.constantine.archway.tech:443 --chain-id constantine-3
Downloading wasm code to 85_code.wasm

Ahora recupera el hash:

sha256sum 85_code.wasm
dc02d33e40511396a5895ac0b1c3b9d53803e115f605ad5cbfe8035a031bbd3f  85_code.wasm

Encontrar el código original

Los hashes de los contratos inteligentes de cw-plus se publican junto con el código del contrato, que puede encontrarse en cw-plus dentro de un archivo checksums.txt. He aquí un ejemplo:

fe34cfff1cbc24594740164abb953f87735afcdecbe8cf79a70310e36fc13aa0  cw1155_base.wasm
de49426e9deed6acf23d5e930a81241697b77b18131c9aea5c3ca800c028459e  cw1_subkeys.wasm
c424b66e7f289cef69e1408ec18732e034b0604e4b22bfcca7546cc9d57875e3  cw1_whitelist.wasm
e462d44a086a936c681f3b3389d50b8404ce2152c8f0fb32b257064576210c03  cw1_whitelist_ng.wasm
0b2e5d5dc895f8f49f833b076a919774bb5b0d25bf72819e9a1cbdf70f9bf79b  cw20_atomic_swap.wasm
6c1fa5872e1db821ee207b5043d679ad1f57c40032d2fd01834cd04d0f3dbafb  cw20_base.wasm
f00759aa9a221efeb58b61a1a1d4cc4281cdce39d71ac4d8d78d234f03b3b0eb  cw20_bonding.wasm
b6041789cc227472c801763c3fab57a81005fb0c30cf986185aba5e0b429d2e6  cw20_escrow.wasm
91b35168d761de9b0372668dd8fa8491f2c8faedf95da602647f4bade7cb9f57  cw20_ics20.wasm
d408a2195df29379b14c11277f785b5d3f57b71886b0f72e0c90b4e84c2baa4a  cw20_merkle_airdrop.wasm
934ba53242e158910a2528eb6c6b82deb95fe866bbc32a8c9afa7b97cfcb9af4  cw20_staking.wasm
ac1f2327f3c80f897110f0fca0369c7022586e109f856016aef91f3cd1f417c1  cw3_fixed_multisig.wasm
785340c9eff28e0faeb77df8cca0fafee6b93a1fa033d41bda4074cd97600ec1  cw3_flex_multisig.wasm
87b3ad1dee979afc70e5c0f19e8510d9dcc8372c8ef49fc1da76725cad706975  cw4_group.wasm
4651e90405917897f48d929198278f238ec182ac018c414ee22f2a007a052c1e  cw4_stake.wasm

Compilar uno mismo

En lugar de confiar en hashes preexistentes, podemos generar el hash para nuestro contrato nosotros mismos. Podemos utilizar rust-optimizer no sólo para crear código compacto y de alto rendimiento, sino también para asegurar que el código de salida es determinista y puede ser comparado con precisión. De hecho, los hashes proporcionados en el ejemplo anterior fueron todos producidos usando 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/workspace-optimizer:0.12.11

En Windows, puede utilizar el siguiente comando en su lugar:

docker run --rm -v ${pwd}:/code `
 --mount type=volume,source="$("$(Split-Path -Path $pwd -Leaf)")_cache",target=/code/target `
 --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry `
 cosmwasm/rust-optimizer:0.12.11

Los hashes serán generados en ./artifacts/checksums.txt.

En lugar de usar el rust-optimizer directamente, puedes utilizar el Archway CLI para optimizar tu código que también generará el checksum requerido con el hash para tu código. El rust-optimizer está siendo usado en segundo plano.

archway build --optimize

Los hashes se generarán en ./artifacts/checksums.txt.

Puede encontrar el valor y compararlo con el que hemos obtenido.

cat ./artifacts/checksums.txt | grep archway5.wasm
dc02d33e40511396a5895ac0b1c3b9d53803e115f605ad5cbfe8035a031bbd3f  archway5.wasm
diff  <(echo "dc02d33e40511396a5895ac0b1c3b9d53803e115f605ad5cbfe8035a031bbd3f" ) <(echo "dc02d33e40511396a5895ac0b1c3b9d53803e115f605ad5cbfe8035a031bbd3f")

Si los hashes coinciden, se verifica el contrato.

Last updated