Comprender los Contratos inteligentes: Leer, Escribir y Auditar

Avanzado11/26/2023, 12:41:25 PM
Este artículo cubre técnicas de programación de contratos inteligentes, incluidas pautas para leer, escribir y auditar. Comprender la estructura y los bloques de código de los contratos inteligentes es el primer paso para escribirlos en Solidity u otros lenguajes. Dado que los contratos inteligentes son fundamentales para las Finanzas Descentralizadas (DeFi) y las Aplicaciones Descentralizadas (DApps), garantizar su seguridad y perfección es crucial, con las auditorías de contratos inteligentes desempeñando un papel clave.

Leyendo contratos inteligentes

Los contratos inteligentes son fragmentos programables de código que se ejecutan solo cuando se cumplen un conjunto de condiciones. Son sinónimos de contratos legales vinculantes del mundo real; solo que en este caso, el código es la ley. Dado que los contratos inteligentes residen en la cadena de bloques, son inmutables, es decir, no se pueden manipular. Es este factor de inmutabilidad lo que hace que los contratos inteligentes sean especiales, entre otras cosas.

Comprender los contratos inteligentes: conceptos básicos y propósito

Contrato inteligenteestán destinados a automatizar transacciones específicas de blockchain. Dado que son contratos condicionales, no requieren intermediarios. Lo que hace útiles a los contratos inteligentes es su compatibilidad en una amplia gama de casos de uso, incluyendo servicios financieros, gestión de la cadena de suministro y más. Y a diferencia de los trozos de código tradicionales que se programan de una sola vez, los contratos inteligentes requieren estrategias altamente seguras y que consumen mucho tiempo.

Cómo los contratos inteligentes se alinean con la tecnología blockchain: BeInCrypto

"La palabra de moda "web3" sugiere los hábitos de programación laxos y pobres en seguridad de la web. Cuando la criptomoneda o los contratos inteligentes se programan como una página web, están condenados al fracaso. Las blockchains y sus aplicaciones exitosas se basan en métodos de programación mucho más seguros, cuidadosos y lentos."

Nick Szabo, criptógrafo y científico informático: Twitter

Los contratos inteligentes pueden funcionar con tokens específicos de blockchain, como ERC-20 para la blockchain de Ethereum, incentivando esfuerzos y moviendo transacciones. Dado que implica código, condiciones y costos, debes tener cuidado al leer, escribir y auditarlos.

Contratos inteligentes y su importancia

El verdadero significado de los contratos inteligentes concierne a su naturaleza y posicionamiento. Para un escenario dado, digamos que una persona A mueve fondos a la persona B cuando B completa un servicio, se guarda una copia del contrato inteligente y es ejecutada por los nodos de la cadena de bloques. Los contratos inteligentes se guardan como códigos de contrato dentro de la cadena. Esta validación de múltiples vías es una característica centrada en la cadena de bloques y mantiene las cosas seguras.

Además, existen contratos inteligentes secuenciales o síncronos y contratos inteligentes asincrónicosdonde las tareas se ejecutan en paralelo. Por lo tanto, el tipo y propósito de un contrato inteligente determina cómo se escribe, lee o incluso se audita.

Los contratos tradicionales, escrituras de propiedad, testamentos, etc. son derecho privado, "redactados por personas privadas en lugar de políticos o burócratas gubernamentales". Los contratos inteligentes son una nueva forma de elaboración de reglas descentralizadas.https://t.co/EU2Y28FznK
— Nick Szabo ( @NickSzabo4)15 de marzo de 2018

Consideremos un grupo de liquidez estándar gobernado por un contrato inteligente.

Imagina que el pool de tokens se puede utilizar para operar, y cada vez que se produce una operación exitosa, se envía un 0,3% del valor total de la operación al proveedor de liquidez que hizo posible esa operación o añadió liquidez para ese activo negociable dado. Todas las condiciones que resaltan los escenarios de operación, las comisiones de operación y las condiciones de incumplimiento y fallos en la operación están codificadas como un Contrato inteligente, que se almacena dentro de la cadena como un código de contrato.

Características de contratos inteligentes

No podemos sumergirnos profundamente en la lectura, escritura y auditoría de contratos si no conocemos sus características. Aquí están los rasgos estándar de los contratos inteligentes de los que debemos ser conscientes:

Algunas características de un contrato inteligente estándar: BeInCrypto

Contratos programables

Los contratos inteligentes son simplemente piezas de código. Puedes escribir contratos inteligentes para ejecutar comandos y escenarios basados en condiciones específicas. Por eso, los desarrolladores y programadores de contratos inteligentes están actualmente en demanda, ya que la mayoría de los DeFiel espacio ya depende de contratos inteligentes para procesar instancias complejas como el manejo de comisiones de trading en pools de liquidez, manteniendo APYtasas y más.

Sin confianza

Los contratos inteligentes que residen en la cadena de bloques eliminan la intervención humana. Esto los hace completamente confiables. Por ejemplo, si un DeFiprotocol, gobernado por contrato(s) inteligente(s), acuerda liquidar sus activos una vez que el valor caiga por debajo de un umbral, ninguna intervención humana puede o debe detenerlo. El código maneja el pago, el rendimiento, la gestión y la aplicación de reglas, haciendo que todo el espacio sea completamente desconfiado.

Autónomo

Como se mencionó anteriormente, los contratos inteligentes están cargados con conjuntos de instrucciones autoejecutables. En cuanto a la codificación, esto significa tener iteraciones y bucles incorporados en el esquema básico. Esto garantiza que tareas como pagos, retiros, depósitos, penalización de validadores mediante el recorte y varias otras tareas se manejen de forma autónoma.

Asegurado

Y finalmente, como los contratos inteligentes están asegurados mediante criptografía, vulnerarlos es increíblemente difícil. Sin una vulnerabilidad incorporada, eludir un contrato inteligente significaría intentar vulnerarlo a la vista de todos en la cadena de bloques.

Verificable

Las transacciones procesadas a través de contratos inteligentes son autoverificables. Esto significa que la ejecución es prueba suficiente de que la transacción ocurrió en primer lugar, ya que no hay ningún elemento humano involucrado. El mecanismo autoverificable otorga a los contratos inteligentes una ventaja sobre los contratos tradicionales que rigen las configuraciones bancarias heredadas.

Así que la próxima vez que planees leer un contrato inteligente, asegúrate de que el formulario o la documentación tengan todas las características mencionadas involucradas.


Una versión simplificada de los contratos inteligentes: Reddit

Leyendo contratos inteligentes basados en las características

Aquí hay un contrato inteligente simple que representa una cuenta de depósito en garantía. Los usuarios depositan sus fondos en la cuenta de depósito en garantía, que luego transfiere lo mismo al destinatario después de un período de tiempo específico.

/ SPDX-License-Identifier: MITpragma solidez ^0.8.0;// Esquema básico de contrato inteligentecontrato SimpleTrustlessEscrow {// Variables de estadoaddress public depositor; // Cuenta que deposita etheraddress payable public beneficiary; // Cuenta que recibe etheruint256 public releaseTime; // Marca de tiempo para liberar ether// Eventos para verificar la actividad del contratoevento Deposited(address indexed _from, uint256 _value);evento Released(address indexed _to, uint256 _value);// El constructor del contrato inicializa el contrato inteligenteconstructor(address payable _beneficiary, uint256 _releaseTime) {    require(_releaseTime > block.timestamp, “El tiempo de liberación debe estar en el futuro”);    // Seguro y sin confianza: El contrato vincula al depositante y al beneficiario    depositor = msg.sender;    beneficiary = _beneficiary;    releaseTime = _releaseTime;}// Función de depósito: ejecución autónoma (función por defecto)receive() external payable {    emit Deposited(msg.sender, msg.value);}// Liberar el ether al beneficiariofunction release() public {    // Programable: Solo se puede ejecutar después de releaseTime    require(block.timestamp >= releaseTime, “Demasiado pronto para liberar”);    // Autónomo: Se ejecuta automáticamente según la condición    uint256 amount = address(this).balance;    beneficiary.transfer(amount);    emit Released(beneficiary, amount);}}

Mientras llegamos a descifrar y leer este contrato inteligente en detalle, primero verifiquemos si cumple con las características de contrato mencionadas.

La parte "programable"

Observa de cerca el contrato para esta pieza de código:

require(block.timestamp >= releaseTime, “Demasiado pronto para liberar”);

uint256 amount = address(this).balance;

beneficiary.transfer(amount);

Los fondos se liberarán solo cuando se cumpla una condición específica de releaseTime, lo que hace que estos contratos sean programables.

La parte "sin confianza"

Aquí hay un breve fragmento de código de arriba:

depositor = msg.sender;

beneficiario = _beneficiario;

releaseTime = _releaseTime;

En el contrato, todos están vinculados por código, desde el depositante hasta la persona que recibe los fondos. Nadie necesita interactuar o confiar en el otro, ya que la función de transferir fondos está vinculada por releaseTime, un parámetro basado en código.

La parte "autónoma"

Aquí está la parte de "liberación de fondos" del código:

function release() public {require(block.timestamp >= releaseTime, “Demasiado pronto para liberar”);uint256 amount = address(this).balance;beneficiary.transfer(amount);emit Released(beneficiary, amount);}

Todo el proceso es autónomo, ya que los fondos solo se liberan cuando el releaseTime cumple con un cierto criterio. Tenga en cuenta que el código no es parcialmente programable sino completamente autónomo.

Otros elementos del código del contrato inteligente, incluida la función de depósito, también se pueden hacer completamente autónomos dependiendo de las características que desee incluir. Por ejemplo, puede iniciar un plan de depósito recurrente cada vez que el billeteracruza los $100, con el excedente moviéndose al beneficiario.

La parte "asegurada"

Preocupado por qué elemento prestaseguridad¿Al contrato? Echa un vistazo a esta parte del código:

constructor(address payable _beneficiary, uint256 _releaseTime) {require(_releaseTime > block.timestamp, “El tiempo de liberación debe estar en el futuro”); depositante = msg.sender; beneficiario = _beneficiary; releaseTime = _releaseTime;}

Observe cómo hay una precedencia establecida de la función releaseTime en relación con la marca de tiempo. Nada es aleatorio y las condiciones deben cumplirse.

La parte "verificable"

Cada transacción asociada con el contrato inteligente se registra dentro de la cadena, cortesía de elementos de actividad de registro separados.

event Deposited(address indexed _from, uint256 _value);

event Released(address indexed _to, uint256 _value);

emit Deposited(msg.sender, msg.value);

emitir Liberado(beneficiario, importe);

Leyendo otras partes de un contrato inteligente

Ahora que hemos identificado los elementos que definen las características de un contrato inteligente, aquí están los otros elementos del contrato para ayudarlo a comprender mejor el ejercicio.

Pragma solidez ^0.8.0; – La versión del lenguaje de programación Solidity necesaria para escribir este contrato inteligente.

// SPDX-License-Identifier: MIT - Se refiere al intercambio de datos de paquetes de software terminado, este identificador indica la licencia de la versión del código. Es recomendable incluirlo para que la gente sepa si es de código abierto y se puede modificar o no.

TimeLock de contrato { - Asigna un nombre al contrato inteligente, como una etiqueta.

Dirección del depositante público; – Dado que el contrato implica un depositante y un beneficiario, este es el punto donde se menciona la dirección pública del depositante. Esta variable es la Billetera Ethereumdirección y es públicamente visible.

Dirección del beneficiario público pagadero; - Esta es la dirección pública del beneficiario donde el fideicomiso transfiere fondos. También es legible y proporciona un sentido de transparencia a los contratos inteligentes impulsados por blockchain.

Uint256 public releaseTime; - Como es un contrato vinculado al tiempo, el uint256 asigna la variable basada en el tiempo al contrato. Este será el marco de tiempo según el cual se producirán las liberaciones de fondos.

En Solidity, uint (entero sin signo) es la forma de asignar valores basados en enteros. El sufijo 256 representa un almacenamiento grande de números.

después de 5 años escribiendo contratos inteligentes, me doy cuenta hoy de que el logo de Solidity es el logo de Ethereum desplegado 🤯pic.twitter.com/wlM369Eff9
— kaden.eth (← enlaces · editar)@0xKadenError: No text to translate8 de julio de 2023

Puedes considerar la posibilidad de leer Documentación de Soliditypara familiarizarse con la sintaxis, expresiones y otros elementos de código.

Otros elementos

constructor(address payable _beneficiary, uint256 _releaseTime) { – El “Constructor” es una función especial única que se llama una vez cuando se implementa el contrato inteligente. Pone en marcha el contrato. Observa cómo en este punto, se llaman e inicializan todas las variables de dirección que declaramos previamente.

Receive() external payable { – Esta es una función especial llamada cuando los fondos se trasladan a la dirección del contrato desde el exterior. Externo sugiere desde el exterior, y “Payable” define la naturaleza del movimiento, es decir, recibir tokens ERC-20.

function release() public { - Esta es una función pública que indica el movimiento de tokens ERC-20 desde la dirección del contrato al beneficiario. Esta función depende de releaseTime.

Todos estos elementos son partes del hipotético contrato de depósito en garantía del que hablamos. Asegúrese de leer toda la documentación de Solidity para aprender mejor sobre el lenguaje.

Conozca los elementos antes de planear escribir contratos inteligentes: BeInCrypto

DApps y contratos inteligentes: la relación

Para este momento, deberías tener una ventaja en la lectura y comprensión de un contrato inteligente ya escrito. Y muchos contratos inteligentes, como los que discutimos, constituyen la parte trasera de una aplicación descentralizada — una cadena de bloquesversión de una aplicación móvil estándar.

Todas las características de un contrato inteligente, incluida la seguridad del contrato, la ejecución autónoma y programable, la falta de confianza de las transacciones y más, se implementan fácilmente mientras se desarrolla una aplicación descentralizada. Así que la próxima vez que te encuentres con una DApp, ten en cuenta que se trata de un backend impulsado por un contrato inteligente alojado en la cadena de bloques, que te ayuda a iniciar múltiples tareas sin intervención humana. Los contratos inteligentes forman la lógica de las DApps.

Cadenas de bloques para contratos inteligentes

Sabemos que Ethereum te permite desarrollar contratos inteligentes, como una solución de software masiva. Sin embargo, no es el único protocolo de cadena de bloques que existe. Si desea profundizar en el mundo del desarrollo de contratos inteligentes, es posible que desee mirar otras cadenas de bloques. Las diferentes cadenas de bloques tienen diferentes lenguajes cuando se trata de trazar contratos.

Pero primero, analicemos Ethereum— la plataforma predilecta para la mayoría de los desarrolladores de contratos inteligentes.

Ethereum

Los contratos inteligentes en Ethereum están escritos en el lenguaje de programación Solidity. Y la interfaz de token para esta plataforma de desarrollo de contratos inteligentes es ERC-20.

Puede volver al contrato inteligente basado en custodia que discutimos anteriormente para ver cómo se escribe un contrato inteligente estándar basado en Etheruem.

Incluso lanzar un token ERC-20 en la cadena de bloques de Ethereum es una característica intensiva de contrato inteligente, algo de lo que hablaremos en profundidad al escribir un contrato inteligente.

Aquí tienes cómo se ve una estructura de código básica, siempre que planeemos lanzar una nueva criptomoneda BIC.

Considere esto como un escenario hipotético. No es exactamente el lanzamiento de una criptomoneda BIC.

pragma solidez ^0.8.0;importar "@openzeppelin/contratos/token/ERC20/ERC20.sol";contrato BICToken es ERC20 {    constructor(uint256 initialSupply) ERC20("BIC Token", "BIC") {        _emitir(msg.sender, initialSupply);    }}

Discutiremos cada elemento de este código más tarde al escribir nuestro contrato inteligente.

Otras blockchains

Al igual que Ethereum, incluso puedes crear contratos inteligentes en plataformas como Solana, usando Rust y Cardano, utilizando Plutus, un subconjunto de Haskell, un lenguaje de programación funcional.

—¿Tiene Cordona contratos inteligentes?
Bromas contigo, amigo. #CardanoADA pic.twitter.com/j8SXCu72Sd
— Willybot 🇦🇺 (@wilbot28)9 de julio de 2023

Esto es lo que es una estructura de código en Rust (Solana) tiene el siguiente aspecto:

Nota: Es un contrato simple donde un contador se incrementa.

use anchor_lang::prelude::*;declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");#[program] pub mod hello_world {use super::*;pub fn initialize(ctx: Context) -> ProgramResult {    let greeting_account = &mut ctx.accounts.greeting_account;    greeting_account.counter = 0;    Ok(())}pub fn increment(ctx: Context) -> ProgramResult {    let greeting_account = &mut ctx.accounts.greeting_account;    greeting_account.counter += 1;    Ok(())}}

¿Sabías? Mientras que Rust es el lenguaje de programación para crear contratos inteligentes basados en Solana, Anclaje es el marco de desarrollo de contratos inteligentes que se utiliza. Para crear contratos inteligentes usando Rust, los desarrolladores deben extraer módulos del marco Anchor, algo que es la primera línea de nuestro código de muestra (use anchor_lang::prelude::*;) significa.

Documentación de Solanate ayudará a comprender el lenguaje de contrato inteligente específico de Rust.

De manera similar, Cardano sigue a Plutus como la elección de lenguaje, seguido por el lenguaje Ink! para Polkadot, TEAL para Algorand, C# para NEO y más. Se recomienda aprender la documentación específica de la cadena detalladamente antes de proceder con la escritura de contratos inteligentes compatibles.

¿Por qué deberías aprender a leer contratos inteligentes?

La capacidad de escribir contratos inteligentes es muy reconocida, pero incluso poder leer también tiene sus beneficios:

  1. La capacidad de aprender sobre las complejidades de automatización asociadas con las aplicaciones DeFi.
  2. Analizando los estándares de propiedad asociados con el activotokenización.
  3. Comprender cómo organizaciones autónomas descentralizadas (DAOs)función.
  4. Comprender e implementar lógica impulsada por casos de uso relacionada con seguros, monetización de contenido, votaciónsistema, regalías y otros verticales.

Cómo escribir contratos inteligentes

Ahora que la lectura de contratos inteligentes está fuera del camino, centrémonos en la escritura de contratos inteligentes. Antes de adentrarnos más, es necesario reiterar que diferentes blockchains pueden tener estándares y lenguajes diferentes relacionados con el desarrollo de contratos inteligentes. Es necesario enfocarse en los estándares definidos por cualquier blockchain dado, para comenzar con la escritura y despliegue de contratos.

Para la mayoría de nuestra discusión, nos centraremos en Ethereum como la cadena y Solidity como el lenguaje.

El papel de la programación

Programar un contrato inteligente es fácilmente la parte más importante del ciclo de desarrollo. Y para adentrarse en el desarrollo de contratos inteligentes en Ethereum u cualquier otra blockchain, deberías tener algo de experiencia con lenguajes de programación no relacionados con blockchain como Javascript.

Diferentes blockchains y el lenguaje para escribir contratos inteligentes: BeInCrypto

La capacidad de programar un contrato inteligente le permite implementar la lógica, manejar los elementos de seguridad del mismo, optimizar el código para tarifas de gas, personalizar lo mismo e incluso hacerlo interoperable si es necesario.

EVM y contratos inteligentes: una visión general

Cualquiera que esté planeando escribir contratos inteligentes en Ethereum necesita entender qué es la Máquina Virtual de Ethereum (EVM) y cómo funciona con los contratos inteligentes. Para empezar, la EVM es un componente de Ethereum que brinda a los programas un entorno aislado y controlado para trabajar. Considéralo como una computadora global que aloja cada trozo de código de contrato que existe en Ethereum. Cada nodoen la red Ethereum se ejecuta el EVM.

Si aspiras a ser un desarrollador de contratos inteligentes, esto es lo que necesitas saber con respecto a los contratos inteligentes y EVM.

Una vez que escribas el programa en Solidity, que es un lenguaje de alto nivel, necesitas compilarlo en bytecode, un formato de bajo nivel comprensible por la máquina. Este bytecode se introduce en la cadena de bloques de Ethereum y reside allí. Cualquiera que interactúe con el contrato inteligente necesita enviar una transacción a la dirección del contrato.

Cada nodo con el EVM instalado puede ver esta transacción, y una vez que los validadores la aprueban, se ejecuta el código del contrato inteligente. Como cada nodo tiene visibilidad de la transacción, nada puede ser manipulado, y el código se ejecuta tal como fue escrito. Y una vez que el código se ejecuta, el estado de la cadena de bloques cambia, haciendo que el proceso sea de extremo a extremo y completamente transparente.

¿Alguien puede escribir un contrato inteligente?

Escribir contratos inteligentes requiere conocimientos técnicos. Pero eso no es todo. También necesitas comprender a fondo cómo funciona la tecnología blockchain, cuáles son las necesidades específicas del lenguaje relevantes para el blockchain que estás apuntando,interoperabilidad, y más. Además de eso, también deberías saber bastante sobre las vulnerabilidades del contrato inteligente — cosas que debes evitar al escribir código. Y finalmente, el conocimiento sobre pruebas de contrato y despliegue de contrato también es imprescindible.

Todo eso puede resultar abrumador. Así que aquí tienes una hoja de trucos rápida para empezar:

  1. Comienza eligiendo la plataforma o cadena con la que deseas trabajar.
  2. Aprende el lenguaje de programación asociado a la cadena, como Solidity para Ethereum.
  3. Aprender sobre el uso de las herramientas de desarrollo como el Entorno de Desarrollo Integrado como Remix.
  4. Empieza por escribir tu primer contrato y luego haz pruebas usando testnets.
  5. Una vez que estés satisfecho con los elementos del código, puedes implementarlo en la cadena. Recuerda que implementar el contrato en la cadena tendrá un costo en forma de tarifas de gas.

Aquí hay un hilo rápido con algunos consejos para escribir mejores contratos inteligentes:

🥧 FREI-PI
‼️ ¡Por qué los desarrolladores de contratos inteligentes NECESITAN saber esto!
Función:
– Requisitos
– Efectos
– Interacciones
Protocolo
- Invariantes
Este es el patrón en el que todos deberían pensar al construir contratos inteligentes.
Aquí está por qué 👇
— Patrick Collins (@PatrickAlphaC)6 de julio de 2023

Sumergiéndose en la programación

Es hora de adentrarse en los aspectos técnicos del desarrollo de contratos inteligentes. Aunque cadenas como Solana y Cardano te permiten desarrollar contratos inteligentes, Ethereum sigue siendo la plataforma de desarrollo de contratos inteligentes más popular.

¿Sabías? Solo en 2022, más de 100,000 aplicaciones descentralizadas se unieron a la red de Ethereum.

¿Por qué Ethereum?

Ethereum tiene una gran comunidad de desarrolladores. Cualquier cosa que desarrolles recibirá atención inmediatamente. Además, su lenguaje nativo, Solidity, es relativamente fácil para personas que conocen Python o JavaScript. Finalmente, el software global de Ethereum, EVM, ayuda con la ejecución de contratos sin problemas.

Si usted está en la mayoría y prefiere usar Ethereum y Solidity, aquí hay una lista rápida de cosas que necesita rastrear antes de comenzar con el desarrollo de contratos inteligentes:

  1. Pragmas or the compiler version
  2. Definición de contrato para etiquetado
  3. Variables de estado para almacenar datos
  4. Eventos para el registro EVM
  5. Modificadores para otorgar derechos específicos a organismos específicos
  6. Funciones o actividades del contrato inteligente en juego
  7. Herencia para interoperabilidad
  8. Comprensión de estructuras de control como if, else, bucles for, tipos de datos como cadena, entero y más.

Escribir e implementar el primer contrato inteligente

Ahora que sabemos cómo funcionan las cosas en la cadena, vamos a escribir y desplegar el primer contrato inteligente. Aunque "Hello World" sigue siendo el primer paso, comenzaremos creando un contrato inteligente para lanzar un token BIC hipotético con un suministro desbloqueado del 100% de 1 millón.

Los conceptos básicos

El primer paso es instalar la última versión de Node.js y el NPM o Gestor de Paquetes de Node. Esto se encarga de las herramientas de desarrollo y del entorno local para el desarrollo. Además, Node.js y NPM te permiten configurar el front-end web para tu contrato inteligente.

Ahora, necesitas configurar un IDE para escribir el código del contrato. Para ello, puedes instalar rápidamente Visual Studio Code. O puedes reducir el desorden y saltoen Alquimia, una plataforma de desarrollo de blockchain. Con Alquimia, puedes obtener algo de ETH de la red de prueba. Esto cubrirá las tarifas de gas cuando despliegues el contrato inteligente en la red de prueba Goerli o incluso en la red de prueba Sepolia.

Ten en cuenta que Sepolia es una testnet más joven y, por lo tanto, ocupa menos espacio en disco cuando se trata de implementación de nodos.

Por ahora, persistiremos con la red de prueba Goerli ya que tiene un mayor número de aplicaciones desplegadas.

Con la red de prueba y el ETH falso listos, pasemos específicamente a escribir el contrato inteligente. Aquí está el fragmento de código para crear un token BIC con un suministro fijo de 1 millón.

Nota: Implementaremos nuestro contrato inteligente localmente en MacOS y no en la red de prueba. Para la implementación de contratos inteligentes en la red de prueba y en la red principal, tendremos una pieza separada, que está más allá del alcance de esta discusión.

Pasos para escribir e implementar

Aquí está el fragmento de código simple para el token hipotético:

pragma solidez ^0.8.0;importar "@openzeppelin/contracts/token/ERC20/ERC20.sol";contrato BICToken es ERC20 {    constructor() ERC20("BIC Token", "BIC") {        _mint(msg.sender, 1000000 * 10 ** decimals());    }}

Si conoces la sintaxis, sabrías lo que significa cada componente de código. En cuanto a la Openzepplinpart, es la biblioteca de referencia para importar contratos inteligentes ERC-20. Esta biblioteca ofrece los estándares operativos básicos para tokens ERC-20.

La función de acuñación habla sobre el suministro inicial, que se implementa en la dirección del contrato inteligente o en el msg.sender.

Para configurar este código localmente y probarlo, necesitaremos tres componentes:

  1. Node.js y NPM (ya discutidos): Funciona como un motor para alimentar tus contratos inteligentes
  2. Trufa: Funciona como un conjunto de herramientas, ayudándote a organizar código, scripts y otras partes de un contrato
  3. Ganache: Funciona como un patio de recreo virtual en el dispositivo. Piénsalo como un blockchain personal.

¿Qué es la ejecución del contrato?

Si ha pasado por el proceso detallado de escribir un contrato inteligente, es imperativo conocer bastante sobre la ejecución del contrato. Es un proceso por el cual el código del contrato inteligente se ejecuta en una cadena por los nodos.

Es la uniformidad asociada con la ejecución del contrato lo que hace que los contratos inteligentes sean transparentes e inmutables. Ahora comprendamos el proceso escalonado asociado con la ejecución del contrato:

Paso 1

Los fragmentos de código que hemos estado escribiendo deben ejecutarse en algún lugar. En el caso de los contratos inteligentes, este lugar de ejecución es la cadena de bloques. Los nodos o los miembros participantes de la cadena ayudan a ejecutar el contrato.

Paso 2

Los nodos aceptan la responsabilidad de ejecutar bloques de código de contrato a cambio de incentivos relacionados con la cadena. Cada comando o acción que ocurre dentro de la cadena es liderado por contratos inteligentes.

Paso 3

Cada contrato inteligente tiene una dirección específica. Para ejecutar el contrato, las transacciones se envían a esa dirección del contrato. Tenga en cuenta que cada nodo ejecuta el EVM, que luego tiene una copia del código del contrato inteligente, lo que facilita comprobar la autenticidad de las transacciones.

Paso 4

Las transacciones dirigidas hacia el contrato inteligente son seleccionadas por los validadores, quienes luego las incluyen en bloques específicos.

Paso 5

Una vez que la transacción se ha realizado y validado con éxito, se convierte en parte de la cadena de bloques. La función del contrato inteligente asociada con la transacción es entonces llamada y ejecutada a través de los nodos de la cadena de bloques.

Paso 6

Cada nodo que ejecute el contrato inteligente debería llegar a una conclusión determinista: el mismo resultado para el mismo conjunto de entradas, lo que hace que la naturaleza de los contratos sea completamente sin confianza y transparente.

Nota: Cualquier error relacionado con la ejecución del código o problemas relacionados con las tarifas de gas revierte las transacciones. Esto significa que la transacción basada en un código de contrato inteligente específico dejará de existir. Esto es exactamente lo que sucede con préstamos flashcuando la incapacidad de adherirse a normas específicas revierte toda la transacción, aparentemente dando la impresión de que los fondos ni siquiera se movieron en primer lugar.

Cada cambio de estado asociado con los contratos inteligentes se registra dentro de la cadena de bloques y se convierte en una parte inmutable de la misma.

Desarrollo de contrato inteligente y mejores prácticas

Ahora que sabes bastante sobre contratos inteligentes, aquí tienes algunos consejos para comenzar con el desarrollo de contratos:

  1. Al escribir contratos, es aconsejable confiar en bibliotecas confiables como las de OpenZeppelin para cumplir con los estándares de seguridad y optimización de código deseados.
  2. La idea es mantener el contrato modular y más simple, lo que facilita las pruebas y revisiones.
  3. Una buena idea es implementar controles de acceso específicos del contrato. Esto significa declarar fragmentos de código donde solo una persona o entidad específica puede cambiar los rasgos cruciales del contrato. El control de acceso facilita mantener seguros los contratos inteligentes.
  4. Al redactar un contrato, siempre haga disposiciones para manejar casos límite y excepciones, todo esto mientras escribe múltiples pruebas.

Cuidando la sostenibilidad del código

Cada una de las prácticas mencionadas anteriormente ayuda con la optimización del código y las implementaciones específicas de seguridad. Sin embargo, hay algunas prácticas específicas del contrato que debes seguir e implementar para cuidar la sostenibilidad del código. Esto tiene como objetivo mantener el código del contrato ligero y utilizable para que cada nodo que lo ejecute y ejecute el mismo no tenga que dedicar mucha potencia computacional al mismo.

  1. Gestione el almacenamiento de forma eficiente mediante el uso de conjuntos de datos más pequeños. Por ejemplo, al escribir un contrato, use uint8 como valor operativo en lugar de uint256.
  2. Al redactar un contrato, es aconsejable optimizar el código combinando varias operaciones en una sola. Profundizaremos en esto en nuestro artículo detallado sobre "escribir contratos inteligentes".
  3. Una buena idea es utilizar la evaluación perezosa en lo que respecta a la ejecución del contrato inteligente. De esta manera, solo necesitas ejecutar una función cuando sea necesario y no cada vez que algo se envía a la dirección del contrato inteligente.
  4. Finalmente, confiar en cálculos fuera de la cadena también es una buena manera de centrarse en la sostenibilidad. Esto ayuda a reducir los requisitos de tarifas de gas e incluso puede acelerar la ejecución del contrato.

A pesar de seguir las mejores prácticas al escribir y desarrollar contratos inteligentes, es necesario centrarse en las vulnerabilidades de seguridad del contrato al llevarlos a la mainnet.

¿Cómo auditar contratos inteligentes?

Cada contrato inteligente que tiene presencia en la mainnet debe ser evaluado en cuanto a rendimiento de código, seguridad y otros atributos. Aquí es donde la auditoría, un riguroso proceso de prueba de contrato, cobra protagonismo, permitiéndote descubrir posibles vulnerabilidades y debilidades del contrato.

Aquí tienes una lista de verificación rápida de auditoría para empezar:
Increíble lista de verificación de auditoría de contratos inteligentes😈
Asegúrese de verificarlos en su próxima auditoría✅
Agradecería un retweet, difunde el conocimiento🫡https://t.co/ILx0C67kf8
— cholakov (@cholakovv)7 de julio de 2023

Relación entre lectura, escritura y auditoría: ¿por qué incluso auditar contratos inteligentes?

Mientras que la lectura y escritura de contratos inteligentes están entrelazadas cuando se trata de desarrollar piezas de código inteligentes, la auditoría tiene un lugar especial e implica verificar la lógica en primer lugar. Cuando se trata de la ejecución de código basado en blockchain, todo es inmutable y cualquier cosa catastrófica puede tener consecuencias irreversibles en la ejecución del contrato. Por eso es exactamente necesario un chequeo exhaustivo del código del contrato y otros aspectos a través de la auditoría.

Vulnerabilidades del contrato y correcciones

Puede haber una multitud de vulnerabilidades del contratoque una auditoría detallada del contrato inteligente puede identificar. Estos incluyen verificar ataques de reentrada, desbordamientos o subdesbordamientos, problemas relacionados con el control de acceso y más. Una vez que se determine la naturaleza exacta del problema, el auditor incluso puede sugerir las mejores prácticas para solucionarlo.

Incumplimientos lanzan estudios y aprendizajes

¿Todavía no estás seguro de cómo puede ayudar la auditoría de contratos inteligentes? Bueno, volvamos al infame DAOhack en 2016, que explotó un problema de reentrancia y causó una pérdida de casi 3.6 millones de ETH. Del mismo modo, hubo el hack del contrato de la billetera Parity en 2017, lo que llevó a una pérdida de casi 500,000 ETH. Estos problemas podrían haberse evitado con el conjunto adecuado de auditorías.


Diagrama de flujo del hackeo de DAO: BeInCrypto

Estrategias para auditar contratos inteligentes

Hay numerosas estrategias para auditar contratos inteligentes. Algunas de las más populares incluyen:

Herramientas de auditoría

Estas herramientas actúan como el primer conjunto de defensas y son mejores para localizar vulnerabilidades comunes. Algunas de las herramientas más populares incluyen Securify, Mythril y más, capaces de realizar análisis estático del código, detectar patrones de violación y ayudar a obtener una ventaja específica de seguridad.

Herramientas para auditar contratos inteligentes: BeInCrypto

Revisión de código

Aquí es donde entran en escena los revisores de código manuales, escrutando la base de código e identificando vulnerabilidades complejas, si las hay. Una revisión manual puede ayudar a cuidar la lógica del negocio, el contexto y los patrones de uso.

Aquí es cómo las revisiones de código manuales te ayudan a localizar amenazas:

¡Un pequeño dato curioso para nuestros auditores junior!
¡Vamos a retuitear si encontraste el error! pic.twitter.com/i14YtweXcz
— CharlesPaladin (@PaladinCharles)8 de julio de 2023

Escaneos automáticos

Herramientas como Snyk y GuardRails ayudan con el escaneo automático de contratos, una implementación de seguridad que se invoca cada vez que se actualiza el código. Esta forma de auditoría garantiza que los nuevos cambios realizados en un código sean seguros y no invasivos por naturaleza.

Verificación formal

Este es un proceso complejo que depende únicamente de la verificación de la lógica empresarial del código. Tenga en cuenta que la verificación formal no está destinada a verificar la sintaxis, sino solo la lógica para ver si el código se ejecuta como se desea.

Además de las estrategias mencionadas, la auditoría de contratos inteligentes también se puede iniciar mediante revisiones por pares, programas de recompensas por errores y coberturas de prueba a través de herramientas como Solidity Coverage para maximizar la eficacia.

Una forma sencilla de auditar contratos inteligentes: BeInCrypto

¿Cómo revisar el código correctamente?

Si eres nuevo en la auditoría de contratos inteligentes, es importante tener en cuenta que hay dos formas de analizar ampliamente el código e identificar problemas. Entre ellas se encuentran:

Análisis estático

Este tipo de análisis de código ayuda a identificar vulnerabilidades de seguridad básicas, errores de codificación y otros problemas según las normas y convenciones de codificación proporcionadas. Amenazas como llamadas no verificadas a fuentes externas, desbordamientos de enteros y más se pueden resaltar mediante análisis estático. Lo mejor del análisis estático es que el código no necesita ser ejecutado para ser verificado.

Análisis dinámico

Este enfoque hacia la auditoría de pruebas verifica la alineación del código con el EVM. En lugar de solo comprobar el código, el análisis dinámico verifica la respuesta de los contratos inteligentes a una amplia gama de entradas. El análisis dinámico puede identificar problemas como el consumo incoherente de gas e incluso lógica de contrato errónea. Entornos personales de blockchain como Ganache pueden funcionar como plataformas de análisis dinámico, permitiendo a los desarrolladores realizar transacciones, ejecutar comandos y hacer mucho más con sus contratos.

Probando un trozo real de código

Aquí hay un fragmento de contrato inteligente que funciona como un almacenamiento de fondos, con una función de retiro:

solidez del pragma ^0.6.1; contract VulnerableContract { mapping(address => uint256) saldos públicos;    function deposit() public payable { balances[msg.sender] += msg.value;    } function withdraw(uint256 _amount) public { require(balances[msg.sender] >= _amount, "Saldo insuficiente.");        (bool success, ) = msg.sender.call{value: _amount}("");        require(success, "Error en la transferencia.");        balances[msg.sender] -= _amount;    }}

Si observas de cerca el código, hay una vulnerabilidad clave:

En el caso anterior, la función de "retiro" se puede llamar de nuevo si el usuario que recibe los fondos también es un contrato inteligente, aunque sea malicioso. Por lo tanto, antes de que se produzca la última función o la actualización del saldo, se puede iniciar un ataque de reentrancia para transferir fondos adicionales. Los auditores experimentados identifican este tipo de vulnerabilidad.

Aquí está el código corregido para lo mismo:

function withdraw(uint256 _amount) public {    require(balances[msg.sender] >= _amount, "Saldo insuficiente.");    balances[msg.sender] -= _amount;    (bool success, ) = msg.sender.call{value: _amount}("");
require(success, “Transfer failed.”);}

Verifique cómo se llama primero la función de actualización de saldo y luego el primer movimiento al usuario. Este cambio en el orden de operación es lo que soluciona el contrato.

Cadenas y revisión de código no relacionadas con Ethereum

El mundo de las aplicaciones descentralizadas y los contratos inteligentes ha trascendido más allá de Ethereum. Aunque la mayor parte de la actividad todavía ocurre dentro del ecosistema de Ethereum, existen otras cadenas como Cardano, Solana y más que admiten contratos inteligentes y requieren diferentes estándares de auditoría.

¿Por qué es cada plataforma única?

Diferentes blockchains utilizan diferentes lenguajes de programación. La semántica, sintaxis y propiedades del código son diferentes, lo que hace que los contratos inteligentes respondan a diferentes prácticas de escritura y auditoría. Por ejemplo, Ethereum utiliza Solidity, mientras que Polkadotusa Ink y Rust, lo que lo hace reactivo a estándares de auditoría específicos.

Herramientas para ir no-Ethereum

Ahora, si quieres ir más allá de Ethereum, hay algunas herramientas de auditoría especializadas para empezar. Por ejemplo, con Cardano, está la suite Marlowe para verificación formal y auditoría. Cuando se trata de Solana, libfuzzer específico de Rust y cargo-fuzz están destinados para auditoría y pruebas de contrato. Un auditor multi-cadena debe estar familiarizado con estos conceptos para mantener a raya las vulnerabilidades del contrato.

¿Cuáles son los diferentes tipos de auditoría de contrato inteligente?

Solo para reiterar, puedes segregar la auditoría de contratos inteligentes en tres tipos: manual, automática e híbrida. Ten en cuenta que las personas prefieren estrategias de auditoría híbridas para contratos complejos con una lógica empresarial profunda, ya que son las más completas.

Externalización de tus auditorías

Las organizaciones y personas con conocimientos mínimos de codificación a menudo subcontratan sus requisitos de redacción y auditoría a empresas de renombre. Cuando se trata de auditoría, la elección de la empresa adecuada se vuelve aún más importante, ya que incluso aunque herramientas de IAgustarChatGPTpuede ayudar a escribir código de contrato inteligente, verificar lo mismo requiere percepciones manuales.

Además, aquí están los factores a tener en cuenta al externalizar las tareas de auditoría:

Elegir la firma adecuada

Antes de centrarse en la empresa de externalización adecuada, es crucial revisar auditorías pasadas, evaluar la experiencia e incluso centrarse en los miembros clave del equipo.

Comprender responsabilidades, costos y gastos generales

Antes de contratar, tome nota de los costos y servicios asociados con las auditorías. Es imperativo entender primero la naturaleza de los servicios ofrecidos, como la identificación de problemas, la resolución de problemas y más. También debe verificar si se proporcionan reauditorías después de implementar la primera línea de correcciones. El costo de una auditoría de contrato inteligente puede variar según los servicios, por lo que es necesario hacer un seguimiento de cada requisito y oferta antes de proceder.

Mejores prácticas de auditoría de contratos inteligentes

En caso de que desee deshacerse de una empresa y auditar contratos inteligentes por sí mismo, aquí están las mejores estrategias y prácticas a tener en cuenta:

  1. Concéntrese siempre en una revisión exhaustiva del código, incluida la sintaxis y la lógica
  2. Comience por detectar vulnerabilidades comunes utilizando herramientas como Slither, MythX y más
  3. Navegue a través del Registro de Clasificación de Vulnerabilidades de Contratos Inteligentes o SWC para localizar las vulnerabilidades conocidas y verificarlas de antemano.
  4. Pruebe los contratos inteligentes rigurosamente, incluidas las pruebas de integración, las pruebas unitarias y más, para probar el código en una amplia gama de escenarios.
  5. Es importante verificar las posibilidades de ataques de reentrancia específicamente. La mejor manera de combatir lo mismo es revisar las llamadas recursivas que los hackers pueden hacer antes de la primera función del contrato inteligente.
  6. Enfóquese en las funciones que llevan a llamadas externas. Un error en este sentido puede alterar el estado y el flujo de control, lo cual no es deseable.
  7. Siempre mantén un ojo en los fragmentos de código que apuntan al uso de gas. No quieres que tu contrato inicie interacciones que sean prohibitivamente costosas.

Desarrollo de contratos inteligentes y IA: el futuro

La inteligencia artificial está facilitando la escritura de contratos inteligentes. Sin embargo, independientemente de la innovación de la IA, la capacidad de auditar los contratos inteligentes de la mejor manera posible todavía requiere intervención humana. Por lo tanto, si planeas construir tu próximo producto web3 enfatizando los contratos inteligentes y las aplicaciones descentralizadas, es crucial enfocarse religiosamente en los mejores recursos de auditoría para tus contratos inteligentes. Con los hacks y violaciones de criptomonedas surgiendo cada día y los hackers planeando nuevas estrategias para infiltrarse, auditar un contrato a la perfección es sin duda una de las habilidades más importantes de la era moderna.

Descargo de responsabilidad:

  1. Este artículo es reproducido de [ Beincrypto], y los derechos de autor pertenecen al autor original [Ananda Banerjee]. Si hay objeciones a la reproducción, por favor contacte al equipo de Gate Learn, y el equipo lo procesará prontamente de acuerdo con los procedimientos relevantes.
  2. Descargo de responsabilidad: Las opiniones expresadas en este artículo representan únicamente las opiniones personales del autor y no constituyen ningún consejo de inversión.
  3. Otras versiones del artículo son traducidas por el equipo de Gate Learn. Sin mencionar Gate.io, no se permite copiar, difundir o plagiar los artículos traducidos.

Bagikan

Comprender los Contratos inteligentes: Leer, Escribir y Auditar

Avanzado11/26/2023, 12:41:25 PM
Este artículo cubre técnicas de programación de contratos inteligentes, incluidas pautas para leer, escribir y auditar. Comprender la estructura y los bloques de código de los contratos inteligentes es el primer paso para escribirlos en Solidity u otros lenguajes. Dado que los contratos inteligentes son fundamentales para las Finanzas Descentralizadas (DeFi) y las Aplicaciones Descentralizadas (DApps), garantizar su seguridad y perfección es crucial, con las auditorías de contratos inteligentes desempeñando un papel clave.

Leyendo contratos inteligentes

Los contratos inteligentes son fragmentos programables de código que se ejecutan solo cuando se cumplen un conjunto de condiciones. Son sinónimos de contratos legales vinculantes del mundo real; solo que en este caso, el código es la ley. Dado que los contratos inteligentes residen en la cadena de bloques, son inmutables, es decir, no se pueden manipular. Es este factor de inmutabilidad lo que hace que los contratos inteligentes sean especiales, entre otras cosas.

Comprender los contratos inteligentes: conceptos básicos y propósito

Contrato inteligenteestán destinados a automatizar transacciones específicas de blockchain. Dado que son contratos condicionales, no requieren intermediarios. Lo que hace útiles a los contratos inteligentes es su compatibilidad en una amplia gama de casos de uso, incluyendo servicios financieros, gestión de la cadena de suministro y más. Y a diferencia de los trozos de código tradicionales que se programan de una sola vez, los contratos inteligentes requieren estrategias altamente seguras y que consumen mucho tiempo.

Cómo los contratos inteligentes se alinean con la tecnología blockchain: BeInCrypto

"La palabra de moda "web3" sugiere los hábitos de programación laxos y pobres en seguridad de la web. Cuando la criptomoneda o los contratos inteligentes se programan como una página web, están condenados al fracaso. Las blockchains y sus aplicaciones exitosas se basan en métodos de programación mucho más seguros, cuidadosos y lentos."

Nick Szabo, criptógrafo y científico informático: Twitter

Los contratos inteligentes pueden funcionar con tokens específicos de blockchain, como ERC-20 para la blockchain de Ethereum, incentivando esfuerzos y moviendo transacciones. Dado que implica código, condiciones y costos, debes tener cuidado al leer, escribir y auditarlos.

Contratos inteligentes y su importancia

El verdadero significado de los contratos inteligentes concierne a su naturaleza y posicionamiento. Para un escenario dado, digamos que una persona A mueve fondos a la persona B cuando B completa un servicio, se guarda una copia del contrato inteligente y es ejecutada por los nodos de la cadena de bloques. Los contratos inteligentes se guardan como códigos de contrato dentro de la cadena. Esta validación de múltiples vías es una característica centrada en la cadena de bloques y mantiene las cosas seguras.

Además, existen contratos inteligentes secuenciales o síncronos y contratos inteligentes asincrónicosdonde las tareas se ejecutan en paralelo. Por lo tanto, el tipo y propósito de un contrato inteligente determina cómo se escribe, lee o incluso se audita.

Los contratos tradicionales, escrituras de propiedad, testamentos, etc. son derecho privado, "redactados por personas privadas en lugar de políticos o burócratas gubernamentales". Los contratos inteligentes son una nueva forma de elaboración de reglas descentralizadas.https://t.co/EU2Y28FznK
— Nick Szabo ( @NickSzabo4)15 de marzo de 2018

Consideremos un grupo de liquidez estándar gobernado por un contrato inteligente.

Imagina que el pool de tokens se puede utilizar para operar, y cada vez que se produce una operación exitosa, se envía un 0,3% del valor total de la operación al proveedor de liquidez que hizo posible esa operación o añadió liquidez para ese activo negociable dado. Todas las condiciones que resaltan los escenarios de operación, las comisiones de operación y las condiciones de incumplimiento y fallos en la operación están codificadas como un Contrato inteligente, que se almacena dentro de la cadena como un código de contrato.

Características de contratos inteligentes

No podemos sumergirnos profundamente en la lectura, escritura y auditoría de contratos si no conocemos sus características. Aquí están los rasgos estándar de los contratos inteligentes de los que debemos ser conscientes:

Algunas características de un contrato inteligente estándar: BeInCrypto

Contratos programables

Los contratos inteligentes son simplemente piezas de código. Puedes escribir contratos inteligentes para ejecutar comandos y escenarios basados en condiciones específicas. Por eso, los desarrolladores y programadores de contratos inteligentes están actualmente en demanda, ya que la mayoría de los DeFiel espacio ya depende de contratos inteligentes para procesar instancias complejas como el manejo de comisiones de trading en pools de liquidez, manteniendo APYtasas y más.

Sin confianza

Los contratos inteligentes que residen en la cadena de bloques eliminan la intervención humana. Esto los hace completamente confiables. Por ejemplo, si un DeFiprotocol, gobernado por contrato(s) inteligente(s), acuerda liquidar sus activos una vez que el valor caiga por debajo de un umbral, ninguna intervención humana puede o debe detenerlo. El código maneja el pago, el rendimiento, la gestión y la aplicación de reglas, haciendo que todo el espacio sea completamente desconfiado.

Autónomo

Como se mencionó anteriormente, los contratos inteligentes están cargados con conjuntos de instrucciones autoejecutables. En cuanto a la codificación, esto significa tener iteraciones y bucles incorporados en el esquema básico. Esto garantiza que tareas como pagos, retiros, depósitos, penalización de validadores mediante el recorte y varias otras tareas se manejen de forma autónoma.

Asegurado

Y finalmente, como los contratos inteligentes están asegurados mediante criptografía, vulnerarlos es increíblemente difícil. Sin una vulnerabilidad incorporada, eludir un contrato inteligente significaría intentar vulnerarlo a la vista de todos en la cadena de bloques.

Verificable

Las transacciones procesadas a través de contratos inteligentes son autoverificables. Esto significa que la ejecución es prueba suficiente de que la transacción ocurrió en primer lugar, ya que no hay ningún elemento humano involucrado. El mecanismo autoverificable otorga a los contratos inteligentes una ventaja sobre los contratos tradicionales que rigen las configuraciones bancarias heredadas.

Así que la próxima vez que planees leer un contrato inteligente, asegúrate de que el formulario o la documentación tengan todas las características mencionadas involucradas.


Una versión simplificada de los contratos inteligentes: Reddit

Leyendo contratos inteligentes basados en las características

Aquí hay un contrato inteligente simple que representa una cuenta de depósito en garantía. Los usuarios depositan sus fondos en la cuenta de depósito en garantía, que luego transfiere lo mismo al destinatario después de un período de tiempo específico.

/ SPDX-License-Identifier: MITpragma solidez ^0.8.0;// Esquema básico de contrato inteligentecontrato SimpleTrustlessEscrow {// Variables de estadoaddress public depositor; // Cuenta que deposita etheraddress payable public beneficiary; // Cuenta que recibe etheruint256 public releaseTime; // Marca de tiempo para liberar ether// Eventos para verificar la actividad del contratoevento Deposited(address indexed _from, uint256 _value);evento Released(address indexed _to, uint256 _value);// El constructor del contrato inicializa el contrato inteligenteconstructor(address payable _beneficiary, uint256 _releaseTime) {    require(_releaseTime > block.timestamp, “El tiempo de liberación debe estar en el futuro”);    // Seguro y sin confianza: El contrato vincula al depositante y al beneficiario    depositor = msg.sender;    beneficiary = _beneficiary;    releaseTime = _releaseTime;}// Función de depósito: ejecución autónoma (función por defecto)receive() external payable {    emit Deposited(msg.sender, msg.value);}// Liberar el ether al beneficiariofunction release() public {    // Programable: Solo se puede ejecutar después de releaseTime    require(block.timestamp >= releaseTime, “Demasiado pronto para liberar”);    // Autónomo: Se ejecuta automáticamente según la condición    uint256 amount = address(this).balance;    beneficiary.transfer(amount);    emit Released(beneficiary, amount);}}

Mientras llegamos a descifrar y leer este contrato inteligente en detalle, primero verifiquemos si cumple con las características de contrato mencionadas.

La parte "programable"

Observa de cerca el contrato para esta pieza de código:

require(block.timestamp >= releaseTime, “Demasiado pronto para liberar”);

uint256 amount = address(this).balance;

beneficiary.transfer(amount);

Los fondos se liberarán solo cuando se cumpla una condición específica de releaseTime, lo que hace que estos contratos sean programables.

La parte "sin confianza"

Aquí hay un breve fragmento de código de arriba:

depositor = msg.sender;

beneficiario = _beneficiario;

releaseTime = _releaseTime;

En el contrato, todos están vinculados por código, desde el depositante hasta la persona que recibe los fondos. Nadie necesita interactuar o confiar en el otro, ya que la función de transferir fondos está vinculada por releaseTime, un parámetro basado en código.

La parte "autónoma"

Aquí está la parte de "liberación de fondos" del código:

function release() public {require(block.timestamp >= releaseTime, “Demasiado pronto para liberar”);uint256 amount = address(this).balance;beneficiary.transfer(amount);emit Released(beneficiary, amount);}

Todo el proceso es autónomo, ya que los fondos solo se liberan cuando el releaseTime cumple con un cierto criterio. Tenga en cuenta que el código no es parcialmente programable sino completamente autónomo.

Otros elementos del código del contrato inteligente, incluida la función de depósito, también se pueden hacer completamente autónomos dependiendo de las características que desee incluir. Por ejemplo, puede iniciar un plan de depósito recurrente cada vez que el billeteracruza los $100, con el excedente moviéndose al beneficiario.

La parte "asegurada"

Preocupado por qué elemento prestaseguridad¿Al contrato? Echa un vistazo a esta parte del código:

constructor(address payable _beneficiary, uint256 _releaseTime) {require(_releaseTime > block.timestamp, “El tiempo de liberación debe estar en el futuro”); depositante = msg.sender; beneficiario = _beneficiary; releaseTime = _releaseTime;}

Observe cómo hay una precedencia establecida de la función releaseTime en relación con la marca de tiempo. Nada es aleatorio y las condiciones deben cumplirse.

La parte "verificable"

Cada transacción asociada con el contrato inteligente se registra dentro de la cadena, cortesía de elementos de actividad de registro separados.

event Deposited(address indexed _from, uint256 _value);

event Released(address indexed _to, uint256 _value);

emit Deposited(msg.sender, msg.value);

emitir Liberado(beneficiario, importe);

Leyendo otras partes de un contrato inteligente

Ahora que hemos identificado los elementos que definen las características de un contrato inteligente, aquí están los otros elementos del contrato para ayudarlo a comprender mejor el ejercicio.

Pragma solidez ^0.8.0; – La versión del lenguaje de programación Solidity necesaria para escribir este contrato inteligente.

// SPDX-License-Identifier: MIT - Se refiere al intercambio de datos de paquetes de software terminado, este identificador indica la licencia de la versión del código. Es recomendable incluirlo para que la gente sepa si es de código abierto y se puede modificar o no.

TimeLock de contrato { - Asigna un nombre al contrato inteligente, como una etiqueta.

Dirección del depositante público; – Dado que el contrato implica un depositante y un beneficiario, este es el punto donde se menciona la dirección pública del depositante. Esta variable es la Billetera Ethereumdirección y es públicamente visible.

Dirección del beneficiario público pagadero; - Esta es la dirección pública del beneficiario donde el fideicomiso transfiere fondos. También es legible y proporciona un sentido de transparencia a los contratos inteligentes impulsados por blockchain.

Uint256 public releaseTime; - Como es un contrato vinculado al tiempo, el uint256 asigna la variable basada en el tiempo al contrato. Este será el marco de tiempo según el cual se producirán las liberaciones de fondos.

En Solidity, uint (entero sin signo) es la forma de asignar valores basados en enteros. El sufijo 256 representa un almacenamiento grande de números.

después de 5 años escribiendo contratos inteligentes, me doy cuenta hoy de que el logo de Solidity es el logo de Ethereum desplegado 🤯pic.twitter.com/wlM369Eff9
— kaden.eth (← enlaces · editar)@0xKadenError: No text to translate8 de julio de 2023

Puedes considerar la posibilidad de leer Documentación de Soliditypara familiarizarse con la sintaxis, expresiones y otros elementos de código.

Otros elementos

constructor(address payable _beneficiary, uint256 _releaseTime) { – El “Constructor” es una función especial única que se llama una vez cuando se implementa el contrato inteligente. Pone en marcha el contrato. Observa cómo en este punto, se llaman e inicializan todas las variables de dirección que declaramos previamente.

Receive() external payable { – Esta es una función especial llamada cuando los fondos se trasladan a la dirección del contrato desde el exterior. Externo sugiere desde el exterior, y “Payable” define la naturaleza del movimiento, es decir, recibir tokens ERC-20.

function release() public { - Esta es una función pública que indica el movimiento de tokens ERC-20 desde la dirección del contrato al beneficiario. Esta función depende de releaseTime.

Todos estos elementos son partes del hipotético contrato de depósito en garantía del que hablamos. Asegúrese de leer toda la documentación de Solidity para aprender mejor sobre el lenguaje.

Conozca los elementos antes de planear escribir contratos inteligentes: BeInCrypto

DApps y contratos inteligentes: la relación

Para este momento, deberías tener una ventaja en la lectura y comprensión de un contrato inteligente ya escrito. Y muchos contratos inteligentes, como los que discutimos, constituyen la parte trasera de una aplicación descentralizada — una cadena de bloquesversión de una aplicación móvil estándar.

Todas las características de un contrato inteligente, incluida la seguridad del contrato, la ejecución autónoma y programable, la falta de confianza de las transacciones y más, se implementan fácilmente mientras se desarrolla una aplicación descentralizada. Así que la próxima vez que te encuentres con una DApp, ten en cuenta que se trata de un backend impulsado por un contrato inteligente alojado en la cadena de bloques, que te ayuda a iniciar múltiples tareas sin intervención humana. Los contratos inteligentes forman la lógica de las DApps.

Cadenas de bloques para contratos inteligentes

Sabemos que Ethereum te permite desarrollar contratos inteligentes, como una solución de software masiva. Sin embargo, no es el único protocolo de cadena de bloques que existe. Si desea profundizar en el mundo del desarrollo de contratos inteligentes, es posible que desee mirar otras cadenas de bloques. Las diferentes cadenas de bloques tienen diferentes lenguajes cuando se trata de trazar contratos.

Pero primero, analicemos Ethereum— la plataforma predilecta para la mayoría de los desarrolladores de contratos inteligentes.

Ethereum

Los contratos inteligentes en Ethereum están escritos en el lenguaje de programación Solidity. Y la interfaz de token para esta plataforma de desarrollo de contratos inteligentes es ERC-20.

Puede volver al contrato inteligente basado en custodia que discutimos anteriormente para ver cómo se escribe un contrato inteligente estándar basado en Etheruem.

Incluso lanzar un token ERC-20 en la cadena de bloques de Ethereum es una característica intensiva de contrato inteligente, algo de lo que hablaremos en profundidad al escribir un contrato inteligente.

Aquí tienes cómo se ve una estructura de código básica, siempre que planeemos lanzar una nueva criptomoneda BIC.

Considere esto como un escenario hipotético. No es exactamente el lanzamiento de una criptomoneda BIC.

pragma solidez ^0.8.0;importar "@openzeppelin/contratos/token/ERC20/ERC20.sol";contrato BICToken es ERC20 {    constructor(uint256 initialSupply) ERC20("BIC Token", "BIC") {        _emitir(msg.sender, initialSupply);    }}

Discutiremos cada elemento de este código más tarde al escribir nuestro contrato inteligente.

Otras blockchains

Al igual que Ethereum, incluso puedes crear contratos inteligentes en plataformas como Solana, usando Rust y Cardano, utilizando Plutus, un subconjunto de Haskell, un lenguaje de programación funcional.

—¿Tiene Cordona contratos inteligentes?
Bromas contigo, amigo. #CardanoADA pic.twitter.com/j8SXCu72Sd
— Willybot 🇦🇺 (@wilbot28)9 de julio de 2023

Esto es lo que es una estructura de código en Rust (Solana) tiene el siguiente aspecto:

Nota: Es un contrato simple donde un contador se incrementa.

use anchor_lang::prelude::*;declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");#[program] pub mod hello_world {use super::*;pub fn initialize(ctx: Context) -> ProgramResult {    let greeting_account = &mut ctx.accounts.greeting_account;    greeting_account.counter = 0;    Ok(())}pub fn increment(ctx: Context) -> ProgramResult {    let greeting_account = &mut ctx.accounts.greeting_account;    greeting_account.counter += 1;    Ok(())}}

¿Sabías? Mientras que Rust es el lenguaje de programación para crear contratos inteligentes basados en Solana, Anclaje es el marco de desarrollo de contratos inteligentes que se utiliza. Para crear contratos inteligentes usando Rust, los desarrolladores deben extraer módulos del marco Anchor, algo que es la primera línea de nuestro código de muestra (use anchor_lang::prelude::*;) significa.

Documentación de Solanate ayudará a comprender el lenguaje de contrato inteligente específico de Rust.

De manera similar, Cardano sigue a Plutus como la elección de lenguaje, seguido por el lenguaje Ink! para Polkadot, TEAL para Algorand, C# para NEO y más. Se recomienda aprender la documentación específica de la cadena detalladamente antes de proceder con la escritura de contratos inteligentes compatibles.

¿Por qué deberías aprender a leer contratos inteligentes?

La capacidad de escribir contratos inteligentes es muy reconocida, pero incluso poder leer también tiene sus beneficios:

  1. La capacidad de aprender sobre las complejidades de automatización asociadas con las aplicaciones DeFi.
  2. Analizando los estándares de propiedad asociados con el activotokenización.
  3. Comprender cómo organizaciones autónomas descentralizadas (DAOs)función.
  4. Comprender e implementar lógica impulsada por casos de uso relacionada con seguros, monetización de contenido, votaciónsistema, regalías y otros verticales.

Cómo escribir contratos inteligentes

Ahora que la lectura de contratos inteligentes está fuera del camino, centrémonos en la escritura de contratos inteligentes. Antes de adentrarnos más, es necesario reiterar que diferentes blockchains pueden tener estándares y lenguajes diferentes relacionados con el desarrollo de contratos inteligentes. Es necesario enfocarse en los estándares definidos por cualquier blockchain dado, para comenzar con la escritura y despliegue de contratos.

Para la mayoría de nuestra discusión, nos centraremos en Ethereum como la cadena y Solidity como el lenguaje.

El papel de la programación

Programar un contrato inteligente es fácilmente la parte más importante del ciclo de desarrollo. Y para adentrarse en el desarrollo de contratos inteligentes en Ethereum u cualquier otra blockchain, deberías tener algo de experiencia con lenguajes de programación no relacionados con blockchain como Javascript.

Diferentes blockchains y el lenguaje para escribir contratos inteligentes: BeInCrypto

La capacidad de programar un contrato inteligente le permite implementar la lógica, manejar los elementos de seguridad del mismo, optimizar el código para tarifas de gas, personalizar lo mismo e incluso hacerlo interoperable si es necesario.

EVM y contratos inteligentes: una visión general

Cualquiera que esté planeando escribir contratos inteligentes en Ethereum necesita entender qué es la Máquina Virtual de Ethereum (EVM) y cómo funciona con los contratos inteligentes. Para empezar, la EVM es un componente de Ethereum que brinda a los programas un entorno aislado y controlado para trabajar. Considéralo como una computadora global que aloja cada trozo de código de contrato que existe en Ethereum. Cada nodoen la red Ethereum se ejecuta el EVM.

Si aspiras a ser un desarrollador de contratos inteligentes, esto es lo que necesitas saber con respecto a los contratos inteligentes y EVM.

Una vez que escribas el programa en Solidity, que es un lenguaje de alto nivel, necesitas compilarlo en bytecode, un formato de bajo nivel comprensible por la máquina. Este bytecode se introduce en la cadena de bloques de Ethereum y reside allí. Cualquiera que interactúe con el contrato inteligente necesita enviar una transacción a la dirección del contrato.

Cada nodo con el EVM instalado puede ver esta transacción, y una vez que los validadores la aprueban, se ejecuta el código del contrato inteligente. Como cada nodo tiene visibilidad de la transacción, nada puede ser manipulado, y el código se ejecuta tal como fue escrito. Y una vez que el código se ejecuta, el estado de la cadena de bloques cambia, haciendo que el proceso sea de extremo a extremo y completamente transparente.

¿Alguien puede escribir un contrato inteligente?

Escribir contratos inteligentes requiere conocimientos técnicos. Pero eso no es todo. También necesitas comprender a fondo cómo funciona la tecnología blockchain, cuáles son las necesidades específicas del lenguaje relevantes para el blockchain que estás apuntando,interoperabilidad, y más. Además de eso, también deberías saber bastante sobre las vulnerabilidades del contrato inteligente — cosas que debes evitar al escribir código. Y finalmente, el conocimiento sobre pruebas de contrato y despliegue de contrato también es imprescindible.

Todo eso puede resultar abrumador. Así que aquí tienes una hoja de trucos rápida para empezar:

  1. Comienza eligiendo la plataforma o cadena con la que deseas trabajar.
  2. Aprende el lenguaje de programación asociado a la cadena, como Solidity para Ethereum.
  3. Aprender sobre el uso de las herramientas de desarrollo como el Entorno de Desarrollo Integrado como Remix.
  4. Empieza por escribir tu primer contrato y luego haz pruebas usando testnets.
  5. Una vez que estés satisfecho con los elementos del código, puedes implementarlo en la cadena. Recuerda que implementar el contrato en la cadena tendrá un costo en forma de tarifas de gas.

Aquí hay un hilo rápido con algunos consejos para escribir mejores contratos inteligentes:

🥧 FREI-PI
‼️ ¡Por qué los desarrolladores de contratos inteligentes NECESITAN saber esto!
Función:
– Requisitos
– Efectos
– Interacciones
Protocolo
- Invariantes
Este es el patrón en el que todos deberían pensar al construir contratos inteligentes.
Aquí está por qué 👇
— Patrick Collins (@PatrickAlphaC)6 de julio de 2023

Sumergiéndose en la programación

Es hora de adentrarse en los aspectos técnicos del desarrollo de contratos inteligentes. Aunque cadenas como Solana y Cardano te permiten desarrollar contratos inteligentes, Ethereum sigue siendo la plataforma de desarrollo de contratos inteligentes más popular.

¿Sabías? Solo en 2022, más de 100,000 aplicaciones descentralizadas se unieron a la red de Ethereum.

¿Por qué Ethereum?

Ethereum tiene una gran comunidad de desarrolladores. Cualquier cosa que desarrolles recibirá atención inmediatamente. Además, su lenguaje nativo, Solidity, es relativamente fácil para personas que conocen Python o JavaScript. Finalmente, el software global de Ethereum, EVM, ayuda con la ejecución de contratos sin problemas.

Si usted está en la mayoría y prefiere usar Ethereum y Solidity, aquí hay una lista rápida de cosas que necesita rastrear antes de comenzar con el desarrollo de contratos inteligentes:

  1. Pragmas or the compiler version
  2. Definición de contrato para etiquetado
  3. Variables de estado para almacenar datos
  4. Eventos para el registro EVM
  5. Modificadores para otorgar derechos específicos a organismos específicos
  6. Funciones o actividades del contrato inteligente en juego
  7. Herencia para interoperabilidad
  8. Comprensión de estructuras de control como if, else, bucles for, tipos de datos como cadena, entero y más.

Escribir e implementar el primer contrato inteligente

Ahora que sabemos cómo funcionan las cosas en la cadena, vamos a escribir y desplegar el primer contrato inteligente. Aunque "Hello World" sigue siendo el primer paso, comenzaremos creando un contrato inteligente para lanzar un token BIC hipotético con un suministro desbloqueado del 100% de 1 millón.

Los conceptos básicos

El primer paso es instalar la última versión de Node.js y el NPM o Gestor de Paquetes de Node. Esto se encarga de las herramientas de desarrollo y del entorno local para el desarrollo. Además, Node.js y NPM te permiten configurar el front-end web para tu contrato inteligente.

Ahora, necesitas configurar un IDE para escribir el código del contrato. Para ello, puedes instalar rápidamente Visual Studio Code. O puedes reducir el desorden y saltoen Alquimia, una plataforma de desarrollo de blockchain. Con Alquimia, puedes obtener algo de ETH de la red de prueba. Esto cubrirá las tarifas de gas cuando despliegues el contrato inteligente en la red de prueba Goerli o incluso en la red de prueba Sepolia.

Ten en cuenta que Sepolia es una testnet más joven y, por lo tanto, ocupa menos espacio en disco cuando se trata de implementación de nodos.

Por ahora, persistiremos con la red de prueba Goerli ya que tiene un mayor número de aplicaciones desplegadas.

Con la red de prueba y el ETH falso listos, pasemos específicamente a escribir el contrato inteligente. Aquí está el fragmento de código para crear un token BIC con un suministro fijo de 1 millón.

Nota: Implementaremos nuestro contrato inteligente localmente en MacOS y no en la red de prueba. Para la implementación de contratos inteligentes en la red de prueba y en la red principal, tendremos una pieza separada, que está más allá del alcance de esta discusión.

Pasos para escribir e implementar

Aquí está el fragmento de código simple para el token hipotético:

pragma solidez ^0.8.0;importar "@openzeppelin/contracts/token/ERC20/ERC20.sol";contrato BICToken es ERC20 {    constructor() ERC20("BIC Token", "BIC") {        _mint(msg.sender, 1000000 * 10 ** decimals());    }}

Si conoces la sintaxis, sabrías lo que significa cada componente de código. En cuanto a la Openzepplinpart, es la biblioteca de referencia para importar contratos inteligentes ERC-20. Esta biblioteca ofrece los estándares operativos básicos para tokens ERC-20.

La función de acuñación habla sobre el suministro inicial, que se implementa en la dirección del contrato inteligente o en el msg.sender.

Para configurar este código localmente y probarlo, necesitaremos tres componentes:

  1. Node.js y NPM (ya discutidos): Funciona como un motor para alimentar tus contratos inteligentes
  2. Trufa: Funciona como un conjunto de herramientas, ayudándote a organizar código, scripts y otras partes de un contrato
  3. Ganache: Funciona como un patio de recreo virtual en el dispositivo. Piénsalo como un blockchain personal.

¿Qué es la ejecución del contrato?

Si ha pasado por el proceso detallado de escribir un contrato inteligente, es imperativo conocer bastante sobre la ejecución del contrato. Es un proceso por el cual el código del contrato inteligente se ejecuta en una cadena por los nodos.

Es la uniformidad asociada con la ejecución del contrato lo que hace que los contratos inteligentes sean transparentes e inmutables. Ahora comprendamos el proceso escalonado asociado con la ejecución del contrato:

Paso 1

Los fragmentos de código que hemos estado escribiendo deben ejecutarse en algún lugar. En el caso de los contratos inteligentes, este lugar de ejecución es la cadena de bloques. Los nodos o los miembros participantes de la cadena ayudan a ejecutar el contrato.

Paso 2

Los nodos aceptan la responsabilidad de ejecutar bloques de código de contrato a cambio de incentivos relacionados con la cadena. Cada comando o acción que ocurre dentro de la cadena es liderado por contratos inteligentes.

Paso 3

Cada contrato inteligente tiene una dirección específica. Para ejecutar el contrato, las transacciones se envían a esa dirección del contrato. Tenga en cuenta que cada nodo ejecuta el EVM, que luego tiene una copia del código del contrato inteligente, lo que facilita comprobar la autenticidad de las transacciones.

Paso 4

Las transacciones dirigidas hacia el contrato inteligente son seleccionadas por los validadores, quienes luego las incluyen en bloques específicos.

Paso 5

Una vez que la transacción se ha realizado y validado con éxito, se convierte en parte de la cadena de bloques. La función del contrato inteligente asociada con la transacción es entonces llamada y ejecutada a través de los nodos de la cadena de bloques.

Paso 6

Cada nodo que ejecute el contrato inteligente debería llegar a una conclusión determinista: el mismo resultado para el mismo conjunto de entradas, lo que hace que la naturaleza de los contratos sea completamente sin confianza y transparente.

Nota: Cualquier error relacionado con la ejecución del código o problemas relacionados con las tarifas de gas revierte las transacciones. Esto significa que la transacción basada en un código de contrato inteligente específico dejará de existir. Esto es exactamente lo que sucede con préstamos flashcuando la incapacidad de adherirse a normas específicas revierte toda la transacción, aparentemente dando la impresión de que los fondos ni siquiera se movieron en primer lugar.

Cada cambio de estado asociado con los contratos inteligentes se registra dentro de la cadena de bloques y se convierte en una parte inmutable de la misma.

Desarrollo de contrato inteligente y mejores prácticas

Ahora que sabes bastante sobre contratos inteligentes, aquí tienes algunos consejos para comenzar con el desarrollo de contratos:

  1. Al escribir contratos, es aconsejable confiar en bibliotecas confiables como las de OpenZeppelin para cumplir con los estándares de seguridad y optimización de código deseados.
  2. La idea es mantener el contrato modular y más simple, lo que facilita las pruebas y revisiones.
  3. Una buena idea es implementar controles de acceso específicos del contrato. Esto significa declarar fragmentos de código donde solo una persona o entidad específica puede cambiar los rasgos cruciales del contrato. El control de acceso facilita mantener seguros los contratos inteligentes.
  4. Al redactar un contrato, siempre haga disposiciones para manejar casos límite y excepciones, todo esto mientras escribe múltiples pruebas.

Cuidando la sostenibilidad del código

Cada una de las prácticas mencionadas anteriormente ayuda con la optimización del código y las implementaciones específicas de seguridad. Sin embargo, hay algunas prácticas específicas del contrato que debes seguir e implementar para cuidar la sostenibilidad del código. Esto tiene como objetivo mantener el código del contrato ligero y utilizable para que cada nodo que lo ejecute y ejecute el mismo no tenga que dedicar mucha potencia computacional al mismo.

  1. Gestione el almacenamiento de forma eficiente mediante el uso de conjuntos de datos más pequeños. Por ejemplo, al escribir un contrato, use uint8 como valor operativo en lugar de uint256.
  2. Al redactar un contrato, es aconsejable optimizar el código combinando varias operaciones en una sola. Profundizaremos en esto en nuestro artículo detallado sobre "escribir contratos inteligentes".
  3. Una buena idea es utilizar la evaluación perezosa en lo que respecta a la ejecución del contrato inteligente. De esta manera, solo necesitas ejecutar una función cuando sea necesario y no cada vez que algo se envía a la dirección del contrato inteligente.
  4. Finalmente, confiar en cálculos fuera de la cadena también es una buena manera de centrarse en la sostenibilidad. Esto ayuda a reducir los requisitos de tarifas de gas e incluso puede acelerar la ejecución del contrato.

A pesar de seguir las mejores prácticas al escribir y desarrollar contratos inteligentes, es necesario centrarse en las vulnerabilidades de seguridad del contrato al llevarlos a la mainnet.

¿Cómo auditar contratos inteligentes?

Cada contrato inteligente que tiene presencia en la mainnet debe ser evaluado en cuanto a rendimiento de código, seguridad y otros atributos. Aquí es donde la auditoría, un riguroso proceso de prueba de contrato, cobra protagonismo, permitiéndote descubrir posibles vulnerabilidades y debilidades del contrato.

Aquí tienes una lista de verificación rápida de auditoría para empezar:
Increíble lista de verificación de auditoría de contratos inteligentes😈
Asegúrese de verificarlos en su próxima auditoría✅
Agradecería un retweet, difunde el conocimiento🫡https://t.co/ILx0C67kf8
— cholakov (@cholakovv)7 de julio de 2023

Relación entre lectura, escritura y auditoría: ¿por qué incluso auditar contratos inteligentes?

Mientras que la lectura y escritura de contratos inteligentes están entrelazadas cuando se trata de desarrollar piezas de código inteligentes, la auditoría tiene un lugar especial e implica verificar la lógica en primer lugar. Cuando se trata de la ejecución de código basado en blockchain, todo es inmutable y cualquier cosa catastrófica puede tener consecuencias irreversibles en la ejecución del contrato. Por eso es exactamente necesario un chequeo exhaustivo del código del contrato y otros aspectos a través de la auditoría.

Vulnerabilidades del contrato y correcciones

Puede haber una multitud de vulnerabilidades del contratoque una auditoría detallada del contrato inteligente puede identificar. Estos incluyen verificar ataques de reentrada, desbordamientos o subdesbordamientos, problemas relacionados con el control de acceso y más. Una vez que se determine la naturaleza exacta del problema, el auditor incluso puede sugerir las mejores prácticas para solucionarlo.

Incumplimientos lanzan estudios y aprendizajes

¿Todavía no estás seguro de cómo puede ayudar la auditoría de contratos inteligentes? Bueno, volvamos al infame DAOhack en 2016, que explotó un problema de reentrancia y causó una pérdida de casi 3.6 millones de ETH. Del mismo modo, hubo el hack del contrato de la billetera Parity en 2017, lo que llevó a una pérdida de casi 500,000 ETH. Estos problemas podrían haberse evitado con el conjunto adecuado de auditorías.


Diagrama de flujo del hackeo de DAO: BeInCrypto

Estrategias para auditar contratos inteligentes

Hay numerosas estrategias para auditar contratos inteligentes. Algunas de las más populares incluyen:

Herramientas de auditoría

Estas herramientas actúan como el primer conjunto de defensas y son mejores para localizar vulnerabilidades comunes. Algunas de las herramientas más populares incluyen Securify, Mythril y más, capaces de realizar análisis estático del código, detectar patrones de violación y ayudar a obtener una ventaja específica de seguridad.

Herramientas para auditar contratos inteligentes: BeInCrypto

Revisión de código

Aquí es donde entran en escena los revisores de código manuales, escrutando la base de código e identificando vulnerabilidades complejas, si las hay. Una revisión manual puede ayudar a cuidar la lógica del negocio, el contexto y los patrones de uso.

Aquí es cómo las revisiones de código manuales te ayudan a localizar amenazas:

¡Un pequeño dato curioso para nuestros auditores junior!
¡Vamos a retuitear si encontraste el error! pic.twitter.com/i14YtweXcz
— CharlesPaladin (@PaladinCharles)8 de julio de 2023

Escaneos automáticos

Herramientas como Snyk y GuardRails ayudan con el escaneo automático de contratos, una implementación de seguridad que se invoca cada vez que se actualiza el código. Esta forma de auditoría garantiza que los nuevos cambios realizados en un código sean seguros y no invasivos por naturaleza.

Verificación formal

Este es un proceso complejo que depende únicamente de la verificación de la lógica empresarial del código. Tenga en cuenta que la verificación formal no está destinada a verificar la sintaxis, sino solo la lógica para ver si el código se ejecuta como se desea.

Además de las estrategias mencionadas, la auditoría de contratos inteligentes también se puede iniciar mediante revisiones por pares, programas de recompensas por errores y coberturas de prueba a través de herramientas como Solidity Coverage para maximizar la eficacia.

Una forma sencilla de auditar contratos inteligentes: BeInCrypto

¿Cómo revisar el código correctamente?

Si eres nuevo en la auditoría de contratos inteligentes, es importante tener en cuenta que hay dos formas de analizar ampliamente el código e identificar problemas. Entre ellas se encuentran:

Análisis estático

Este tipo de análisis de código ayuda a identificar vulnerabilidades de seguridad básicas, errores de codificación y otros problemas según las normas y convenciones de codificación proporcionadas. Amenazas como llamadas no verificadas a fuentes externas, desbordamientos de enteros y más se pueden resaltar mediante análisis estático. Lo mejor del análisis estático es que el código no necesita ser ejecutado para ser verificado.

Análisis dinámico

Este enfoque hacia la auditoría de pruebas verifica la alineación del código con el EVM. En lugar de solo comprobar el código, el análisis dinámico verifica la respuesta de los contratos inteligentes a una amplia gama de entradas. El análisis dinámico puede identificar problemas como el consumo incoherente de gas e incluso lógica de contrato errónea. Entornos personales de blockchain como Ganache pueden funcionar como plataformas de análisis dinámico, permitiendo a los desarrolladores realizar transacciones, ejecutar comandos y hacer mucho más con sus contratos.

Probando un trozo real de código

Aquí hay un fragmento de contrato inteligente que funciona como un almacenamiento de fondos, con una función de retiro:

solidez del pragma ^0.6.1; contract VulnerableContract { mapping(address => uint256) saldos públicos;    function deposit() public payable { balances[msg.sender] += msg.value;    } function withdraw(uint256 _amount) public { require(balances[msg.sender] >= _amount, "Saldo insuficiente.");        (bool success, ) = msg.sender.call{value: _amount}("");        require(success, "Error en la transferencia.");        balances[msg.sender] -= _amount;    }}

Si observas de cerca el código, hay una vulnerabilidad clave:

En el caso anterior, la función de "retiro" se puede llamar de nuevo si el usuario que recibe los fondos también es un contrato inteligente, aunque sea malicioso. Por lo tanto, antes de que se produzca la última función o la actualización del saldo, se puede iniciar un ataque de reentrancia para transferir fondos adicionales. Los auditores experimentados identifican este tipo de vulnerabilidad.

Aquí está el código corregido para lo mismo:

function withdraw(uint256 _amount) public {    require(balances[msg.sender] >= _amount, "Saldo insuficiente.");    balances[msg.sender] -= _amount;    (bool success, ) = msg.sender.call{value: _amount}("");
require(success, “Transfer failed.”);}

Verifique cómo se llama primero la función de actualización de saldo y luego el primer movimiento al usuario. Este cambio en el orden de operación es lo que soluciona el contrato.

Cadenas y revisión de código no relacionadas con Ethereum

El mundo de las aplicaciones descentralizadas y los contratos inteligentes ha trascendido más allá de Ethereum. Aunque la mayor parte de la actividad todavía ocurre dentro del ecosistema de Ethereum, existen otras cadenas como Cardano, Solana y más que admiten contratos inteligentes y requieren diferentes estándares de auditoría.

¿Por qué es cada plataforma única?

Diferentes blockchains utilizan diferentes lenguajes de programación. La semántica, sintaxis y propiedades del código son diferentes, lo que hace que los contratos inteligentes respondan a diferentes prácticas de escritura y auditoría. Por ejemplo, Ethereum utiliza Solidity, mientras que Polkadotusa Ink y Rust, lo que lo hace reactivo a estándares de auditoría específicos.

Herramientas para ir no-Ethereum

Ahora, si quieres ir más allá de Ethereum, hay algunas herramientas de auditoría especializadas para empezar. Por ejemplo, con Cardano, está la suite Marlowe para verificación formal y auditoría. Cuando se trata de Solana, libfuzzer específico de Rust y cargo-fuzz están destinados para auditoría y pruebas de contrato. Un auditor multi-cadena debe estar familiarizado con estos conceptos para mantener a raya las vulnerabilidades del contrato.

¿Cuáles son los diferentes tipos de auditoría de contrato inteligente?

Solo para reiterar, puedes segregar la auditoría de contratos inteligentes en tres tipos: manual, automática e híbrida. Ten en cuenta que las personas prefieren estrategias de auditoría híbridas para contratos complejos con una lógica empresarial profunda, ya que son las más completas.

Externalización de tus auditorías

Las organizaciones y personas con conocimientos mínimos de codificación a menudo subcontratan sus requisitos de redacción y auditoría a empresas de renombre. Cuando se trata de auditoría, la elección de la empresa adecuada se vuelve aún más importante, ya que incluso aunque herramientas de IAgustarChatGPTpuede ayudar a escribir código de contrato inteligente, verificar lo mismo requiere percepciones manuales.

Además, aquí están los factores a tener en cuenta al externalizar las tareas de auditoría:

Elegir la firma adecuada

Antes de centrarse en la empresa de externalización adecuada, es crucial revisar auditorías pasadas, evaluar la experiencia e incluso centrarse en los miembros clave del equipo.

Comprender responsabilidades, costos y gastos generales

Antes de contratar, tome nota de los costos y servicios asociados con las auditorías. Es imperativo entender primero la naturaleza de los servicios ofrecidos, como la identificación de problemas, la resolución de problemas y más. También debe verificar si se proporcionan reauditorías después de implementar la primera línea de correcciones. El costo de una auditoría de contrato inteligente puede variar según los servicios, por lo que es necesario hacer un seguimiento de cada requisito y oferta antes de proceder.

Mejores prácticas de auditoría de contratos inteligentes

En caso de que desee deshacerse de una empresa y auditar contratos inteligentes por sí mismo, aquí están las mejores estrategias y prácticas a tener en cuenta:

  1. Concéntrese siempre en una revisión exhaustiva del código, incluida la sintaxis y la lógica
  2. Comience por detectar vulnerabilidades comunes utilizando herramientas como Slither, MythX y más
  3. Navegue a través del Registro de Clasificación de Vulnerabilidades de Contratos Inteligentes o SWC para localizar las vulnerabilidades conocidas y verificarlas de antemano.
  4. Pruebe los contratos inteligentes rigurosamente, incluidas las pruebas de integración, las pruebas unitarias y más, para probar el código en una amplia gama de escenarios.
  5. Es importante verificar las posibilidades de ataques de reentrancia específicamente. La mejor manera de combatir lo mismo es revisar las llamadas recursivas que los hackers pueden hacer antes de la primera función del contrato inteligente.
  6. Enfóquese en las funciones que llevan a llamadas externas. Un error en este sentido puede alterar el estado y el flujo de control, lo cual no es deseable.
  7. Siempre mantén un ojo en los fragmentos de código que apuntan al uso de gas. No quieres que tu contrato inicie interacciones que sean prohibitivamente costosas.

Desarrollo de contratos inteligentes y IA: el futuro

La inteligencia artificial está facilitando la escritura de contratos inteligentes. Sin embargo, independientemente de la innovación de la IA, la capacidad de auditar los contratos inteligentes de la mejor manera posible todavía requiere intervención humana. Por lo tanto, si planeas construir tu próximo producto web3 enfatizando los contratos inteligentes y las aplicaciones descentralizadas, es crucial enfocarse religiosamente en los mejores recursos de auditoría para tus contratos inteligentes. Con los hacks y violaciones de criptomonedas surgiendo cada día y los hackers planeando nuevas estrategias para infiltrarse, auditar un contrato a la perfección es sin duda una de las habilidades más importantes de la era moderna.

Descargo de responsabilidad:

  1. Este artículo es reproducido de [ Beincrypto], y los derechos de autor pertenecen al autor original [Ananda Banerjee]. Si hay objeciones a la reproducción, por favor contacte al equipo de Gate Learn, y el equipo lo procesará prontamente de acuerdo con los procedimientos relevantes.
  2. Descargo de responsabilidad: Las opiniones expresadas en este artículo representan únicamente las opiniones personales del autor y no constituyen ningún consejo de inversión.
  3. Otras versiones del artículo son traducidas por el equipo de Gate Learn. Sin mencionar Gate.io, no se permite copiar, difundir o plagiar los artículos traducidos.
Mulai Sekarang
Daftar dan dapatkan Voucher
$100
!