Solidity — Visibilidad de las funciones

Samuel Sanchez Lopez
3 min readApr 30, 2019

--

En este artículo vamos a hablar sobre algo que aborda uno de tantos temas dentro de la seguridad de los contratos de Ethereum, en concreto hablaremos sobre la importancia de definir correctamente las funciones de estos contratos.

En las funciones de los contratos de solidity hay distintos tipos de visibilidad :

  • Private: solo están visibles para el contrato en el que se han definido y no para contratos qué derivan del mismo (herencia).
  • Public: están visibles tanto para el contrato en el que se han definido, como para contratos que derivan del mismo o incluso para contratos externos.
  • Internal: estas funciones solo están visibles para el contrato en el que se han definido y para contratos qué derivan del mismo (herencia).
  • External: estas funciones pueden llamarse desde otros contratos y vía transacciones. Dicho de otra forma, no se pueden llamar internamente.

Por defecto las funciones son públicas permitiendo a los usuarios llamarlas desde el propio contrato o desde otros ajenos al mismo.

La vulnerabilidad: al ser por defecto públicas, el problema viene cuando los desarrolladores lo ignoran y hay funciones que deberían de ser privadas o que solo puedan llamarse dentro del contrato (internal). Un ejemplo de malas prácticas podría ser este contrato:

Contrato de ejemplo

Este contrato es simple, para ganar el balance del contrato el usuario debe generar un address donde los últimos 8 caracteres hexadecimales del address sean 0. Una vez conseguido ellos pueden llamar a la función withdrawWinnings(), donde si cumplen la condición obtendrían el balance, debido a que la función anterior llama a la función _sendWinnings(). El problema viene en que la última función no tiene definida la visibilidad siendo por defecto pública y por lo tanto puede ser llamada por cualquier usuario fuera del contrato y obtener el balance del mismo siempre que quiera.

Técnicas de prevención: es buena práctica especificar la visibilidad de las funciones en un contrato, incluso cuando sean públicas. Las últimas versiones de solidity muestran advertencias en la compilación para las funciones que no tienen especificada su visibilidad, para así fomentar esta práctica.

Un ejemplo del mundo real fue el caso de Parity MultiSig Wallet (First Hack), el primer caso de hackeo multi-sig de Parity, aproximadamente 31 millones de dólares en ether fueron robados de tres wallets.

https://medium.freecodecamp.org/a-hacker-stole-31m-of-ether-how-it-happened-and-what-it-means-for-ethereum-9e5dc29e33ce

He obtenido gran parte de la información de un artículo del blog Sigma prime. Para mayor información sobre seguridad en contratos de ethereum visite el siguiente artículo:

--

--

Samuel Sanchez Lopez

Hello! My name is Samuel and I'm 28 years old. Passionate about the technical world, with 7 years of experience using web technologies and languages.