¿Cómo proteger los contratos inteligentes de los bots?

Este artículo demostrará cómo los desarrolladores pueden utilizar Proof of HUMANity para proteger sus DApps de los bots.

El artículo cubrirá cómo los contratos inteligentes son vulnerables a la actividad de los bots, y ofrecerá una solución a los desarrolladores: Proof-of-HUMANity.

Consideremos el ejemplo más simple de dApp – un contador almacenado en la cadena.
 

Demo: basic-counter.bakoush.in

Nota. Todos los demos de este artículo están desplegados en Polygon Mumbai Testnet. Considere la posibilidad de obtener algunos MATIC de prueba a través de su faucet.

Los humanos pueden aumentar el contador pulsando el botón en la interfaz de usuario. Los robots, en cambio, podrían aprovechar una llamada directa al contrato inteligente. Este es un ejemplo que vale para muchos contratos inteligentes.

Full bot code en GitHub

Si quieres jugar con el bot tú mismo, aquí está la dirección del contrato básico del contador (Polygon Mumbai Testnet): 0x336c94E1F0F4D0103b012E78E6700959c89Ba8AD

Dependiendo del diseño de tu aplicación, es posible que quieras evitar que bots similares interactúen con tu aplicación.

Aquí es donde surge el problema de la protección de los bots.

Dado que todo el mundo puede interactuar con los métodos públicos de los contratos inteligentes, no basta con integrar las soluciones CAPTCHA tradicionales en la interfaz de usuario o en los servidores backend. Tenemos que comprobar adicionalmente la humanidad en la cadena, dentro del propio contrato inteligente, que no tiene capacidad para interactuar con el mundo exterior y, por tanto, no puede llamar a ninguna API fuera de la cadena.

Proponemos un mecanismo sencillo, pero potente, para pasar la verificación de la prueba de humanidad a la infraestructura de la cadena.

Concepto de prueba de humanidad

Proof of HUMANity (Prueba de Humanidad o PoH) es evidencia firmada de que la persona que llama es un humano. Firmada fuera de la cadena por una parte de confianza, la PoH puede ser verificada en la cadena.

PoH consiste en una base de pruebas de 36 o 97 bytes de longitud, dependiendo del tipo de prueba, y una firma de 65 bytes del validador sobre la base de pruebas.

En la cadena se puede verificar la firma del validador y, por tanto, confiar en que la humanidad del llamante está auténticamente confirmada.

La prueba de humanidad puede ser de dos tipos: básica y soberana.

PoH básica

La prueba básica tiene una base de 36 bytes y, por tanto, tiene una longitud de 101 bytes. Consiste en un reto aleatorio y una marca de tiempo como base de la prueba, junto con una firma del validador sobre la base de la prueba.

PoH soberana

La prueba soberana tiene una base de 97 bytes y, por tanto, tiene una longitud de 166 bytes. Además de los elementos básicos de la PoH, su base incluye la firma del remitente.

De este modo, se puede comprobar en la cadena que la prueba ha sido generada por el propio remitente de la transacción, eliminando la posibilidad de que se generen pruebas por quienes no controlan la dirección del remitente.

Esto proporciona más robustez, pero requiere que los usuarios firmen el reto con su wallet.

Usando Proof of HUMANity en tu DApp

Cuando un usuario quiere enviar una transacción a su contrato inteligente, la interfaz de usuario de su aplicación podría obtener una verificación Proof-of-HUMANity utilizando el sistema hCaptcha. Esta prueba podría utilizarse en la llamada al contrato inteligente.

El contrato inteligente, a su vez, verifica que la prueba proviene de la fuente de confianza y no ha sido vista antes. En caso contrario, revierte.

Integrar el PoH en su aplicación es bastante fácil gracias a las bibliotecas existentes. Se necesitan tres pasos:

  1. Desplegar la API del validador (hCaptcha)

  2. Incluir PoH en la UI de su dApp

  3. Integrar PoH en tus contratos inteligentes

API del validador 

El elemento clave de la prueba de humanidad es la firma del validador. Debes confiar en que este validador está realmente validando la humanidad de los usuarios. Esto puede lograrse al menos de dos maneras:

  • tienes el control total del validador (hCaptcha API)

  • confía en un validador de terceros establecido, como un importante proveedor de CAPTCHA

Esta última opción aún no está disponible (pero esperamos que lo esté), así que vamos a centrarnos en la primera.

Desplegar la API del validador

Puedes desplegar rápidamente una API que produzca la Prueba de Humanidad utilizando una imagen Docker. Es un ejemplo de API validadora de PoH para el servicio hCaptcha.

Tienes que proporcionar el secreto de hCaptcha y la clave privada del validador. Esta clave se utilizará para firmar las pruebas.

También puedes crear tu propio validador, siempre y cuando produzcas las pruebas válidas que se adhieren al formato PoH que discutimos anteriormente.

Incluir PoH en la interfaz de usuario

Para interactuar con la API desplegada, puedes utilizar un conjunto de componentes React diseñados para integrarse rápidamente en cualquier aplicación:

1) Envuelve tu app en el ProofOfHumanityProvider:

2) Instanciar el PoH hCaptcha validator plugin:

3) Inicializar el método getProofOfHumanity desde el enganche PoH utilizando el validador instanciado

4) Obtenga la prueba de humanidad antes de enviar cualquier transacción sensible, y proporciónela como parámetro al método externo sensible que esté llamando:

Eso es todo en cuanto a la interfaz de usuario.

Actualización de contratos inteligentes

Puedes utilizar la librería poh-contracts para integrar fácilmente Proof-Of-HUMANity en tus contratos inteligentes.

Veamos un ejemplo. Este es nuestro contrato básico de counter:

Así es cómo podemos integrarlo con Proof-Of-HUMANity:

  1. Heredar su contrato de HumanOnly.

  2. Asegúrese de que la dirección del validador se establece (se puede hacer en el constructor o por llamada externa también).

  3. Añadir uno de los modificadores -proof a tus métodos sensibles junto con “bytes calldata proof parameter”

¡Eso es todo para el contrato inteligente!

Ahora, la llamada al método se revertirá a menos que la prueba tenga una firma válida y no haya sido vista antes.

Demo: poh-counter.bakoush.in

Si tienes ganas de probar el bot, aquí está la dirección (Polygon Mumbai Testnet): 0x454C82492DF9E5582186c983D26Dda6Bf9861A50

Referencias

Ejemplo dApp 

Counter dApp

Source code

Validator API (Docker)

Proof-of-Humanity hCaptcha Validator API

Componentes UI 

Proof-of-Humanity-React

Proof-of-Humanity hCaptcha Validator React

Solidity Library

Proof-of-Humanity Solidity Contracts

Alex Bakoushin es ingeniero de Software Full-Stack con interés por el desarrollo web, la experiencia de usuario, la inteligencia artificial, los drones y IoT. Actualmente desarrolla aplicaciones de contabilidad en la compañía 1C (Moscú, Rusia). El artículo original fue editado por Human Protocol y compartido con Cointelegraph en Español.

Aclaración: La información y/u opiniones emitidas en este artículo son de exclusiva responsabilidad del autor y no representan necesariamente los puntos de vista o la línea editorial de Cointelegraph. La información aquí expuesta no debe ser tomada como consejo financiero o recomendación de inversión. Toda inversión y movimiento comercial implican riesgos y es responsabilidad de cada persona hacer su debida investigación antes de tomar una decisión de inversión.