Parceros
  • 👽Recursos
    • 💻Nodos validadores
      • Buenas prácticas y seguridad de un validador
      • Montaje de nodo validador de Stargaze
      • Montaje de nodo validador de Tgrade
      • Montaje de nodo validador de Juno
      • Instalacion del Cosmovisor
      • Instalación de AutoCompound
      • Guía de instalación Prometheus y Grafana para un Validador
    • 🎓Desarrollo
      • Fundamentos en Gnu/Linux
      • Fundamentos en Blockchain
      • Billeteras
      • Introducción a Cosmos Hub
      • Guia de Inicio en Rust
      • Clases de CosmWasm
        • Introducción a CosmWasm
        • Puntos de entrada de un contrato vacio
        • Consultas - Query
      • Clases de Rust
        • Introducción a Rust
        • Ciclos
        • Funciones
        • Manejo de la memoria
        • Tipos de datos avanzados
        • Macros
        • Manejo de paquetes
        • Manejo de errores
      • Guia Archway
        • Instalación de requisitos
        • Configuración del proyecto
        • Solicitud de tokens Testnet
        • Mi primera app
          • Configuracion
          • Produciendo ejecutables wasm
          • Despliegue e instanciación de contratos en la cadena
          • Interactuar con su contrato
          • Construir el frontend de la dApp
        • Proyecto NFT
          • Creando un proyecto NFT
          • Despliegue del contrato de tokens
          • Acuñación y envío de tokens
          • Construye la Dapp NFT
        • Fee Grant
          • Comprendiendo los Fee grant
          • Grant asignación
          • Utilizando asignaciones grant
        • Multifirmas
          • Archway multi firma hub
          • Navegar por la interfaz multi firmas
      • Cosmwasm Documentacion
        • Introducción
        • Primeros pasos
          • Introducción
          • Configuración del entorno
          • Elaborar un contrato
          • Test Unitarios
          • Despliegue e interacción
          • Integración con contratos inteligentes
          • Próximos pasos
        • Arquitectura
          • ¿Qué son los contratos multicadena?
          • Modelo de actor para las convocatorias de contratos
          • Nombres y direcciones
          • Consulta del estado del contrato
          • Formatos de serialización
          • Composición del contrato
          • Comparación con los contratos de solidity
        • Contratos inteligentes
          • Semántica contractual
          • Message
            • Messages
            • Submensajes
          • State
            • Simple state
            • Complex state y maps
          • Result y option
          • Entry points
          • Query
          • Events
          • Math
          • Verificación de contratos inteligentes
          • Migration
          • Migrar una dapp a una red diferente
          • Testing
          • Ejecución Sudo
          • CosmWasm y CIB
        • Tutoriales
          • Opcion simple
            • Testing
          • Storage
            • ¿Cómo funciona el almacenamiento de valores clave?
            • Índices
            • Modelización avanzada de estados
          • Cosmwasm con ejemplos
            • Operaciones matemáticas de Cosmowasm
            • Crear una instancia de un contrato CosmWasm
            • Timelock
            • Contrato Crowdfunding
            • Respuestas y atributos en Cosmwasm
            • Lee y escribe
            • Envío de tokens
            • Token Vaults
            • Creador de mercado automático de productos constantes (AMM)
      • Guia Celestia
        • Descripcion general de celestia
          • Introduccion
          • Blockchains monolíticos vs modulares
          • Capa de disponibilidad de datos
            • La capa de disponibilidad de datos de Celestia
            • El ciclo de vida de una transacción celestia-app
            • Recuperabilidad de datos y poda
            • Disponibilidad de datos FAQ
          • Recursos adicionales
            • Aprende modular
            • Glosario de Celestia
            • Especificaciones de aplicación de celestes
            • Documentación API de nodo celestial
        • Ejecutar un nodo
          • Descripción general de los nodos en ejecución en Celestia
          • Guía de inicio rápido
            • Decidir qué nodo ejecutar
            • Entorno de desarrollo
            • Instalar celestia-node
            • Instalar celestia-app
            • 🐳 Configuración de Docker
          • Redes
            • Resumen de redes
            • Mainnet Beta
            • Mocha testnet
            • Arábica devnet
          • Tipos de nodos
            • Disponibilidad de datos
              • Nodo ligero
              • Nodo completo
              • Nodo puente
            • Consenso
            • Relay de IBC
              • Guía de retransmisión IBC
              • Relays de IBC
          • Recursos
            • nodo-celestia
              • Metricas
              • guía config.toml
              • Redes y valores personalizados
              • Solución de problemas
            • celestia-app
              • Especificaciones
              • Métricas, visualización y alertas
              • Mecánica de corte
              • Crear un testnet Celestia
              • Comandos CLI útiles
              • Monitor de Actualización
              • Carteras en celestia-app
              • Multisig
              • Crea una cuenta de adquisición
            • SystemD
            • Proceso de hardfork
        • Desarrolladores
          • Construir modular
          • Envío de blobs de datos a Celestia
          • Directrices de reenvío de transacciones
          • API de nodo
            • Celestia-node RPC CLI tutorial
            • Documentación de la API RPC de Celestia-Node
            • Rápido Scavenger
            • Page
          • Integrar con Blobstream
            • Descripción general de Blobstream
            • Integrarse con contratos de Blobstream
            • Integrar con el cliente Blobstream
            • Consultando las pruebas de Blobstream
            • Operadores locales de Blobstream X
              • Solicitar rangos de compromiso de datos
              • Nuevas implementaciones de Blobstream X
          • Implementar un rollup
            • L2s Ethereum
              • Ethereum fallback
              • Arbitro
                • Introducción a los rollups de Arbitrum con Celestia como DA
                • Implementar un arbitrum rollup devnet
                • Testnet de nitrógeno
                • Implementar un contrato inteligente sobre la implementación de Arbitrum
                • Implemente un dapp en su devnet Arbitrum rollup
                • Optimismo
                  • Introducción a la integración de OP Stack
                  • Bubs testnet
                  • Implemente un contrato inteligente en Bubs testnet
                  • Implemente un dapp en Bubs testnet
                  • Implemente un devnet OP Stack
                  • Implemente un devnet OP Stack en Celestia
                  • Auditoría
                  • Implemente un dapp con thirdweb
                  • Rollups-as-a-Servicio
                    • Caldera
            • Rollkit
            • Astria
              • Documentación
              • Implementar a Dusknet
            • SDK Soberano
            • Vistara
            • Dimensión
          • Carteras
            • Crea una billetera con celestia-node
            • Integraciones de billeteras con Celestia
          • Integre Celestia para proveedores de servicios
      • Unión
        • Arquitectura
          • CometBLS
          • Galois
          • Voyager
        • Conceptos
          • BLS Firmas
          • Clientes de Luz Condicional
          • Verificación de Consenso
          • Tecnología de validador distribuido
          • IBC
          • Sin permiso versus sin confianza
        • Infraestructura
          • Operador de nodo
            • Empezando
            • Docker Compose
            • Kubernetes
            • NixOS
            • Configuración del Nodo
        • Integracion
          • IBC Enabled Solidity
        • Demostrar
          • Dirigiendo el Union Devnet
          • PingPong
        • Unirse al testnet
          • Empezando
          • Ejecutar el binario cliente
          • Ejecución de Unionvisor
          • Obteniendo Tokens Testnet
          • Crear un Validador
          • Endpoints publicos
          • Sincronización de estado
          • Liberar un validador
          • Preguntas frecuentes
          • Historial de actualizaciones
        • Guia de estilo
          • Lista de palabras
      • Avail
        • Introducción a Avail
          • Aprovechar DA
          • Aprovechar Nexus
          • Aprovechar la fusión
        • Informacion de red
        • Más información sobre disponibilidad
          • El conseso
            • BABE
            • GRANDPA
            • NPoS
          • EIP-4844 y disponible
        • Guia de nuevo usuario
          • Cómo crear y administrar una cuenta disponible
          • Cómo utilizar el Explorador Goldberg Testnet
          • Cómo utilizar el faucet Testnet
          • Cómo establecer una identidad en cadena
          • Cómo generar una identificación de aplicación disponible
          • Cómo realizar transferencias de saldo disponibles
          • Cómo crear grupos de nominaciones disponibles
        • Construir con disponibilidad
          • Cree un paquete acumulativo con Avail
          • Comience con Avail
          • Optimium
            • OP Stack
            • Aprovechando la pila OP con Avail
            • Cómo utilizar la pila OP con Avail
            • Adaptador de pila OP 🔗
          • Validium
            • Polygon zkEVM
              • Construyendo sobre Polygon zkEVM con Avail
              • Cómo utilizar Polygon zkEVM con Avail
              • Nodo Validium 🔗
              • Contratos de Validium 🔗
              • Puente Validium 🔗
            • Madara Starknet
              • Construyendo sobre Madara Stack con Avail
              • Cómo utilizar Madara con Avail
              • Madara Starknet🔗
            • Referencia
          • Sovereign Rollups
            • Sovereign SDK 🔗
            • Rollkit 🔗
            • OpEVM 🔗
        • Glosario
        • Preguntas generales frecuentes
      • Dymension
        • Aprender
          • ELI5
          • RollApps
            • RollApps
            • Tokens
            • Gobernancia
            • Puente
            • En profundidad
              • Dymension RDK
                • Dymint
              • Gobernanza
                • Gobernador
                  • Descripción general
                  • Crear gobernador
                  • Otros comandos
                • Votación
                  • Parámetros ajustables
                  • Gasto comunitario
                  • Registro de tokens ERC-20
              • IBC Puente
                • Visión general
                • Seguridad
                • Retransmisores
          • Dymension
            • Visión general
            • DYM
              • Supply
              • Demanda
              • Crecimiento
              • Distribución
            • Seguridad
              • Estándares
              • Actualizable
              • Disponibilidad de datos
              • Pruebas de fraude
              • Resistencia a la censura
              • Page 1
            • Puentes
              • IBC
              • eIBC
            • Liquidez
              • Descripción general
              • Depositar tokens
              • Vinculación de tokens LP
              • Incentivos
              • Comisiones
            • Gobernanza
              • Descripción general
              • Preparando una propuesta
              • Proponiendo a la dimocracia
        • Construir
          • Descripción general
          • Testnet
            • EVM
              • Descripción general
            • CosmWasm
              • Descripción general
              • Información
              • Ejemplo de cosmoWasm
          • Roller CLI
            • Descripción general
            • Comenzar
              • Instalar
              • Inicializar RollApp
              • Registro
              • Correr
                • Simple
                • Avanzado
                  • Cliente ligero DA
                  • Secuenciador
                  • Retransmisor
            • Nodo en ejecución
              • Ejecutando en producción
              • Supervisión
              • Información de RollApp
              • Exportar claves
              • Mejora
              • Editar la configuración de RollApp
              • Sincronización de estado
            • Solución de problemas
              • Descripción general
              • Saldos
              • Hardware
              • Rollapp de importación/exportación
              • Acceso externo
              • Estado
              • Archivos de registro
            • RollApp local
              • Ejecute la aplicación EVM RollApp
              • Ejecute la aplicación CosmWasm RollApp
        • Validar
          • Preguntas frecuentes sobre nodos
          • Construir dimensión
          • Configuración de nodo
          • Únase a una red
          • Nodo de sincronización
          • Validador
          • Actualizaciones
          • Solución de problemas
          • Programa de delegación
            • objetivos del programa
            • Parámetros de evaluación
            • Solicitud
      • Movement
        • Desarrolladores
          • Inicio rápido
          • Configuración
            • Usando contenedores
            • Usando el instalador
          • Tutoriales
            • Desplegar
              • Módulo Aptos
              • Módulo Sui
              • Contratos EVM
                • Implementación de contratos de solidez en movimiento utilizando Foundry y Fractal
                • Implementación de contratos de solidez en M1 usando Hardhat y Fractal
                • Implementación de contratos inteligentes de Solidity en M1 utilizando el tiempo de ejecución Fractal
            • Ejecute MoveVM
              • Ejecutando M1 usted mismo
            • Construir dApp
              • Aptos Move dApp
              • Aplicación Sui Move
              • DApp de solidity
            • Interoperar
              • AptosVM<>MEVM
          • Herramientas de desarrollo
            • Movement CLI
              • Movement aptos
                • cuenta
                  • crear
                  • crear-cuenta-de-recursos
                    • derivar-dirección-de-cuenta-de-recursos
                  • fondo-con-grifo
                  • lista
                  • dirección de búsqueda
                  • rotar llave
                  • transferir
                • configuración
                  • generar-compleciones-de-shell
                  • configurar-global-config
                  • show-global-config
                  • mostrar-perfiles
                • génesis
                  • generar-admin-escritura-conjunto
                  • generar-génesis
                  • obtener direcciones de grupo
                  • generar-claves
                  • generar-plantilla-de-diseño
                  • configuración-git
                  • configuración-del-validador-de-conjuntos
                • gobernancia
                  • proponer
                  • votar
                  • propuesta de show
                  • lista-propuestas
                  • verificar-propuesta
                  • ejecutar propuesta
                  • generar-propuesta-de-actualización
                  • aprobar-ejecución-hash
                • información
                • init
                • llave
                  • generar
                  • extraer-peer
                • mover
                  • construir-publicar-carga útil
                  • limpio
                  • compilar
                  • script de compilación
                  • cobertura
                    • resumen
                    • fuente
                    • código de bytes
                  • crear-cuenta-de-recursos-y-publicar-paquete
                  • desmontar
                  • documento
                  • descargar
                  • init
                  • list
                  • probar
                  • publicar
                  • correr
                  • ejecutar guión
                  • prueba
                  • prueba transaccional
                  • verificar-paquete
                  • vista
                • multifirma
                  • aprobar
                  • crear
                  • crear-transacción
                  • ejecutar
                  • ejecutar-rechazar
                  • ejecutar con carga útil
                  • rechazar
                  • verificar-propuesta
                • nodo
                  • analizar-validador-rendimiento
                  • arranque-db
                  • verificar-conectividad-de-red
                  • conseguir-participación-pool
                  • inicializar-validador
                  • conjunto de validadores de unión
                  • conjunto de validadores de licencia
                  • mostrar-información-de-época
                  • mostrar-validador-config
                  • mostrar-conjunto-validador
                  • mostrar-validador-participación
                  • ejecutar-testnet-local
                  • actualización-clave-de-consenso
                  • actualizar-validador-direcciones-de-red
                • apostar
                  • agregar apuesta
                  • crear-contrato-de-participación
                  • distribuir-monedas-adquiridas
                  • aumentar-bloqueo
                  • inicializar-propietario de la participación
                  • solicitud-comisión
                  • establecer-votante-delegado
                  • operador de conjunto
                  • desbloquear-apuesta
                  • desbloquear-monedas-adquiridas
                  • retirar-apuesta
                • actualizar
              • movement sui
                • comenzar
                • génesis
                • ceremonia-genesis
                  • init
                  • estado de validación
                  • agregar-validador
                  • validadores de lista
                  • punto de control de compilación sin firmar
                  • examinar-punto-de-control-génesis
                  • verificar y firmar
                  • finalizar
                • herramienta clave
                  • convertir
                  • decodificar-tx-bytes
                  • decodificar-multi-sig
                  • generar
                  • importar
                  • lista
                  • par de claves de carga
                  • dirección multifirma
                  • multi-sig-combinar-sig-parcial
                  • herencia-sig-parcial-combinada-multi-sig
                  • espectáculo
                  • firmar
                  • señal-kms
                  • deshacer
                  • zk-login-firmar-y-ejecutar-tx
                  • zk-login-ingresar-token
                  • zk-login-sig-verificar
                  • zk-login-signo-inseguro-mensaje-personal
                • consola
                • cliente
                  • dirección activa
                  • entorno-activo
                  • direcciones
                  • llamar
                  • identificador de cadena
                  • campo dinámico
                  • env
                  • ejecutar-tx firmado
                  • gas
                  • fusionar moneda
                  • nueva direccion
                  • nuevo-ambiente
                  • objeto
                  • objetos
                  • pagar
                  • pago todo-sui
                  • pay-sui
                  • publicar
                  • moneda dividida
                  • cambiar
                  • bloque tx
                  • transferir
                  • transferencia-sui
                  • mejora
                  • verificar-bytecode-metro
                  • verificar-fuente
                  • transacción-repetición
                  • lote de repetición
                  • punto de control de repetición
                • validador
                  • hacer-información-validador
                  • convertirse en candidato
                  • comité conjunto
                  • comité de licencia
                  • metadatos de visualización
                  • actualizar-metadatos
                    • nombre
                    • descripción
                    • URL de la imagen
                    • URL del proyecto
                    • dirección de red
                    • dirección primaria
                    • dirección-trabajador
                    • dirección-p2p
                    • clave-pub-de-red
                    • clave-pub-trabajador
                    • protocolo-pub-clave
                  • actualizar-precio-de-gas
                  • validador de informes
                  • serializar-carga útil-pop
                  • mostrar-actualización-del-precio-del-gas-raw-txn
                • move
                  • construir
                  • cobertura
                    • resumen
                    • fuente
                    • código de bytes
                  • desmontar
                  • nuevo
                  • probar
                  • prueba
                • simulacro de incendio
                  • rotación de metadatos
              • movement ctl
              • movement manage
            • fractales
              • marco evm
          • Desarrolladores Aptos
            • Configurar la CLI de Aptos
            • Usando la CLI de Aptos
          • Desarrolladores Sui
            • Configurar Sui CLI
            • Usando Sui CLI
          • Preguntas más frecuentes
        • Ecosistema
          • Wallets
          • Tokens
          • Faucet
          • Move idioma
            • Módulos y scripts
            • Tipos primitivos
              • Enteros
              • booleano
              • DIRECCIÓN
              • Vector
              • Firmante
              • Referencias
              • Tuplas y unidad
          • Recursos de aprendizaje
          • Techpedia
            • Paralelización
            • Mover recursos
            • SDK de movement
      • Initia
        • ACERCA DE
          • Bienvenido a Inicia
          • Arquitectura Omnitia
            • Inicia (Capa 1)
            • Minitia (Capa 2)
          • Ciclo de vida de la transacción
          • Liquidez y apuestas consagradas
            • IniciaDEX
          • Programa de intereses adquiridos
        • CONSTRUIR SOBRE LA INICIATIVA
          • iniciado
          • inicia.js
          • Creando cuenta
          • Tutoriales específicos de VM
            • MoverVM
              • Implementación de módulos de movimiento
              • Creando moneda de movimiento
              • Envío de moneda de movimiento
              • Creando movimiento NFT
              • Módulos relacionados con el replanteo
              • Interactuar con Oracle en MoveVM
              • Mover ganchos IBC
            • WASMVM
              • Implementación del contrato CosmWasm
              • Interactuando con Oracle en WasmVM
              • Ganchos Wasm IBC
              • Fábrica de fichas
            • EVM
              • Implementación del contrato de solidez
              • Crear un token ERC-20 personalizado
              • Consultar estados del cosmos
              • Ejecutando mensajes de Cosmos
              • Conversión de direcciones entre EVM y Cosmos
              • Conversión entre direcciones Denom y ERC-20
              • Interactuar con Oracle en EVM
              • Ganchos EVM IBC
              • Ethereum JSON-RPC
          • Tutoriales generales
            • Oráculo: Furtivo
            • Mensajes entre cadenas
            • Saltar API
            • Miniswap
              • Interactuando con Minitswap
            • Conversión entre nombres de usuario y direcciones
            • Usando el Explorador local de Initia
            • Interactuando con InitiaDEX
            • Usando el widget de billetera Initia
        • IMPLEMENTAR MINITIA
          • Empezando
            • Implementación de su propia Minitia (Capa 2)
          • Configuración
          • Implementación de una Minitia independiente
          • Implementación completa de Minitia
            • Dirigiendo la Minitia
            • Pila de OPinit
              • Módulo OPinit: OPhost y OPchild
              • Configurar robots OPinit
                • Ejecutor del puente
                • Remitente de salida
                • Desafiador
                • Envío por lotes
                  • Envío de lotes a Inicia L1
                  • Envío de lotes a Celestia
            • Relé Hermes (IBC)
            • Habilitando oráculos
          • Retroceder
          • Agregar tokens a Initia Wallet
          • Personalizando Minitia
        • EJECUTAR EL NODO DE INICIO
          • Ejecutando el nodo de inicio
          • Arrancar un nodo de inicio
          • Conéctese a la red Inicial
          • Oráculo
          • Automatización de actualizaciones de software con Cosmovisor
          • Convertirse en un validador
        • RECURSOS
          • Registro de Iniciación
          • Información de la cadena Testnet
          • Parámetros de cadena
          • Documentación de la API
          • Documentos API (MiniMove)
          • Documentos API (MiniWasm)
          • Documentos API (MiniEVM)
      • Internet Computer
        • ¡Hola, mundo!
        • Descripción general del ICP
Powered by GitBook
On this page
  • Instanciación de contratos inteligentes
  • Evitar los ataques de reentrada
  • Limitacion de recursos
  • Lecciones aprendidas de Ethereum
  1. Recursos
  2. Desarrollo
  3. Cosmwasm Documentacion
  4. Arquitectura

Comparación con los contratos de solidity

CosmWasm sigue un enfoque diferente al de Ethereum para desplegar y ejecutar contratos inteligentes. Implica tres fases para tener un contrato inteligente en funcionamiento:

  1. Subir Código - En este paso, sólo subes un poco de código wasm optimizado. A diferencia de los contratos inteligentes en Ethereum, en este paso, no necesitas preocuparte ni del estado ni de la dirección del contrato.

  2. Instanciar Contrato - En este paso, se instancia una referencia de código con un estado inicial y se crea una dirección de contrato.

  3. Ejecutar el contrato: una vez que el contrato está activo, puede admitir diferentes llamadas en función del diseño específico del contrato.

De forma similar a Ethereum:

  • La instanciación y ejecución de contratos requieren gas.

  • Tanto la instanciación como la ejecución permiten al firmante enviar algunos tokens al contrato junto con el mensaje.

A diferencia de Ethereum:

  • El envío de tokens directamente a un contrato (es decir, a través de SendMsg) no activa ningún código de contrato. Ya que la ejecución del contrato necesita ser solicitada explícitamente. Esta decisión de diseño de CosmWasm ayuda a reducir posibles vectores de ataque. Por ejemplo, en Ethereum, cuando se transfieren tokens a un contrato, la función fallback del contrato se activa automáticamente. Si esta función fallback no está bien implementada o tiene vulnerabilidades de seguridad, puede dejar el contrato o incluso todo el sistema susceptible a diferentes tipos de ataques, incluyendo ataques de reentrada.

Instanciación de contratos inteligentes

En CosmWasm, la carga del código de un contrato y la instanciación de un contrato se consideran eventos separados (a diferencia de Ethereum). Esto es para permitir que un pequeño conjunto de arquetipos de contrato vetados existan como múltiples instancias que comparten el mismo código base, pero que aún pueden ser configurados con diferentes parámetros.

Un contrato de vesting es un tipo de contrato inteligente que bloquea tokens y los libera gradualmente durante un periodo de tiempo determinado. Mediante el uso de diferentes parámetros durante la instanciación, puede crear múltiples instancias de la misma plantilla de contrato de vesting para adaptarse a diversos casos de uso.

Por ejemplo, si un contrato de adquisición permitiera los siguientes parámetros:

// VestingContract.wasm
{
  "vesting_start_time": "1616678400", // Unix timestamp for vesting start time
  "vesting_duration": "31536000",     // Vesting duration in seconds (1 year)
  "total_tokens": "1000000",          // Total tokens to be vested
  "beneficiary_address": "archway1xyz" // Address of the beneficiary
}

Al instanciar este contrato de adquisición de derechos con diferentes valores de parámetros, puede crear múltiples instancias que se adapten a varios escenarios de adquisición de derechos. Por ejemplo:

Instance A: Employee A receives 1,000,000 tokens vested over three years.
Instance B: Employee B receives 500,000 tokens vested over two years.
Instance C: Advisor A receives 250,000 tokens vested over one year with a six-month cliff.

Utilizando una única plantilla de contrato de adquisición de derechos y personalizando los parámetros durante la instanciación, puede crear contratos de adquisición de derechos únicos para diferentes beneficiarios y condiciones de adquisición de derechos.

Evitar los ataques de reentrada

Los ataques de reentrada se evitan por diseño. Esta es una cuestión importante, ya que un gran número de exploits en Ethereum se basan en ataques de reentrada. Para ilustrar cómo funcionan los ataques de reentrada en los contratos inteligentes de Ethereum, considere el siguiente escenario:

En medio de la ejecución de una función en el contrato A, se realiza una llamada implícita o explícita. Esta llamada transfiere el control de ejecución al contrato B (que ahora puede ejecutar código) y vuelve a llamar al contrato A. Como ahora hay dos copias del Contrato A ejecutándose, necesitas ser extremadamente cuidadoso en cuanto a la gestión del estado antes de ejecutar cualquier contrato remoto (o hacer límites de gas muy estrictos en las sub-llamadas). Los ataques de reentrada pueden desencadenar un comportamiento indefinido en el Contrato A, sentando las bases para exploits (similar al hack del DAO de Ethereum).

Cosmwasm evita completamente los ataques de reentrada impidiendo que cualquier contrato llame directamente a otro. Como queremos permitir la composición y al mismo tiempo evitar las llamadas de funciones en línea a código malicioso, CosmWasm permite que cualquier contrato devuelva una lista de mensajes para ser ejecutados en la misma transacción. Esto significa que un contrato necesita terminar su ejecución antes de poder realizar una llamada a otro contrato. Si los mensajes futuros fallan, entonces toda la transacción se revierte, incluyendo las actualizaciones del estado del contrato. Este enfoque CosmWasm permite la composición atómica.

Limitacion de recursos

Otro vector de ataque para los contratos inteligentes son los ataques de denegación de servicio (DoS). Por ejemplo, un actor malicioso podría cargar un contrato que ejecutara un bucle infinito para detener la cadena o escribir toneladas de datos para llenar las capacidades de almacenamiento. Como Web Assembly proporciona una caja de arena hermética sin acceso predeterminado al sistema operativo, sólo tenemos que preocuparnos de proporcionar límites de recursos estrictos para los contratos inteligentes. Todos los desarrolladores deben ser conscientes de estos límites.

Uso de Memoria - Al instanciar una VM Wasm, se le proporcionan 32MB de RAM por defecto. Esto es para almacenar el código de bytes así como toda la memoria utilizada por el proceso en ejecución (pila y montón). Esto debería ser lo suficientemente grande para casi cualquier contrato, pero tal vez algunos circuitos complejos de conocimiento-cero alcanzarían límites allí. También es lo suficientemente pequeño como para garantizar que los contratos tengan un impacto mínimo en el uso de memoria de la cadena de bloques.

Uso de la CPU - El Wasmer Runtime que utilizamos puede inyectar lógica de medición en el código wasm. Calcula los precios de varias operaciones, cargos, y comprueba los límites antes de cada sentencia de salto (bucle, llamada a función, etc.), para producir un precio de gas determinista independientemente de la velocidad de la CPU, plataforma, etc. Antes de ejecutar un contrato, se establece un límite de gas wasm basado en el gas Cosmos SDK restante, y el gas se deduce al final del contrato (hay un multiplicador constante para convertir, actualmente 100 gas wasm por 1 gas SDK). Esto pone un límite duro en cualquier cálculo de la CPU como usted debe pagar por los ciclos utilizados.

Uso del disco - Todo el acceso al disco es a través de lecturas y escrituras en el KVStore. El SDK de Cosmos ya impone los pagos de gas para el acceso KVStore. Dado que todo el acceso al disco en los contratos se realiza a través de devoluciones de llamada en el SDK, se cobra allí. Si uno fuera a integrar CosmWasm en otro tiempo de ejecución, uno tendría que asegurarse de cobrar por el acceso allí también.

Lecciones aprendidas de Ethereum

Para producir funcionalidades robustas de contratos inteligentes, es útil aprender tanto de los éxitos como de los defectos de Ethereum. Por lo tanto, podemos echar un vistazo a los vectores de ataque más comunes de Ethereum junto con las estrategias de mitigación, para que podamos comparar cuánto de esta lista se aplica a Cosmwasm. Encontrarás que muchos de estos vectores de ataque están cerrados por diseño, mientras que un número permanece, y se planea una sección para evitar los problemas restantes.

  1. Reentrada Como ya se ha comentado, en CosmWasm devolvemos mensajes para ejecutar otros contratos en la misma operación atómica, pero después de que el contrato haya terminado su ejecución. Esto se basa en el modelo de actor y evita la posibilidad de ataques de reentrada. Más concretamente, nunca hay un estado volátil cuando se llama a un contrato.

  2. Rust te permite simplemente establecer overflow-checks = true en el manifiesto Cargo para abortar el programa si se detecta algún desbordamiento. No hay manera de optar por matemáticas seguras.

  3. Llamada Delegada En CosmWasm, no hay lógica de Llamada Delegada. Puede importar módulos, pero están vinculados entre sí en tiempo de compilación, lo que les permite ser probado como un todo, y no hay puntos de entrada sutiles dentro de la lógica de un contrato.

  4. Visibilidades por defecto En lugar de autogenerar puntos de entrada para cada función/método de su código (o peor aún, asumir que es público si no se especifica), el desarrollador debe definir claramente una lista de mensajes a tratar y enviarlos a las funciones adecuadas. De esta forma, es imposible exponer accidentalmente una función.

  5. Ataque de Dirección/Parámetro Corto Este es un exploit que se aprovecha del mecanismo de codificación RLP y del tamaño fijo de pila de 32 bytes. No se aplica al analizador JSON de comprobación de tipos de CosmWasm.

  6. Valores de retorno de CALL no comprobados CosmWasm no permite llamar a otros contratos directamente, pero en su lugar, los mensajes enviados serán despachados por un enrutador. El enrutador comprobará el resultado de todos los mensajes, y si algún mensaje en la cadena devuelve un error, se aborta toda la transacción, y se retroceden los cambios de estado. Esto te permite centrarte de forma segura en el caso de éxito cuando programes llamadas a otros contratos, sabiendo que todos los estados se revertirán si no va según lo planeado.

  7. Punteros de almacenamiento no inicializados CosmWasm no rellena automáticamente las variables, ya que debes cargarlas explícitamente desde el almacenamiento. Rust no permite variables no inicializadas en ninguna parte, haciendo el almacenamiento explícito en lugar de implícito.

  8. Puntos flotantes y precisión Tanto Solidity como CosmWasm no admiten operaciones de punto flotante debido al posible no determinismo en el redondeo, que depende de la CPU. Solidity no tiene alternativa a las operaciones matemáticas con números enteros, y muchos desarrolladores hacen a mano aproximaciones de números enteros a números decimales, lo que puede introducir errores de redondeo. En CosmWasm, puede importar cualquier paquete de Rust y simplemente elegir un paquete apropiado y utilizarlo internamente. Por ejemplo, puedes utilizar rust_decimal, "una implementación de Decimal escrita en Rust puro adecuada para cálculos financieros que requieren dígitos integrales y fraccionarios significativos sin errores de redondeo", o debe ser fijo para proporcionar matemáticas decimales de punto fijo. Soporta números de hasta 128 bits, lo que es suficiente para 18 dígitos antes del decimal y 18 después, lo que debería ser suficiente para cualquier caso de uso.

  9. Autenticación Tx.Origin CosmWasm no expone tx.origin, sino sólo el contrato o el usuario que llama directamente al contrato como params.message.signer. Esto significa que es imposible confiar en la autenticación incorrecta, ya que sólo hay un valor para comparar.

PreviousComposición del contratoNextContratos inteligentes

Last updated 1 year ago

👽
🎓