Instalando el compilador de Solidity

Versionado

Solidity utiliza Versionado Semántico. Además, los parches publicados con versión 0 (ej. 0.x.y) no contendrán cambios con rupturas. Eso significa que si un código compila con una versión 0.x.y puede esperar que compile con una versión 0.x.z donde z > y.

Adicionalmente a los lanzamientos, proporcionamos builds nocturnos con la intención de facilitar a los desarrolladores probar próximas funcionalidades y proveer retroalimentación temprana. Note, sin embargo, que aunque los builds nocturnos son bastante estables, contienen código reciente de la rama de desarrollo y no podemos garantizar que siempre funcionen. A pesar de nuestros mejores esfuerzos, pueden contener cambios fallidos o sin documentar que no formarán parte del lanzamiento final. No están pensados para uso en producción.

Al desplegar contratos, debería usar el último lanzamiento de Solidity. Esto es porque regularmente se introducen cambios con rupturas, funcionalidades nuevas y correcciones de errores. Actualmente usamos un número de versión 0.x para indicar el rápido ritmo de cambio.

Remix

Recomendamos Remix para pequeños contratos y para aprender Solidity rápidamente.

Entre a Remix en línea, no necesita instalar nada. Si quiere usarlo sin conexión a internet, vaya a https://github.com/ethereum/remix-live/tree/gh-pages y descargue el archivo .zip como se explica en la página. Remix también es una buena opción para probar builds nocturnos sin instalar múltiples versiones de Solidity.

Las siguientes opciones en esta página detallan cómo instalar el software para compilar Solidity mediante línea de comandos en su computadora. Use un compilador de línea de comandos si está trabajando en un contrato más largo o si requiere más opciones de compilación.

npm / Node.js

Use npm para instalar solcjs, un compilador de Solidity, de una manera portable y sencilla. El programa solcjs tiene menos funcionalidades que el resto de maneras de compilar detalladas más abajo en esta página. La documentación del compilador de línea de comandos asume que está usando el compilador con funcionalidad completa, solc. El uso de solcjs está documentado dentro de su propio repositorio.

Nota: El proyecto solc-js fue extraído del programa solc escrito en C++ usando Emscripten, lo que significa que ambos usan el mismo código fuente. solc-js puede usarse directamente en proyectos JavaScript (como Remix). Por favor diríjase al repositorio de solc-js para más instrucciones.

npm install -g solc

Nota

El ejecutable de línea de comandos es llamado solcjs.

Las opciones de línea de comandos de solcjs no son compatibles con solc y las herramientas (como geth) que esperen el comportamiento de solc no funcionarán con solcjs.

Docker

Las imágenes de Docker de Solidity están disponibles usando la imagen solc de la organización ethereum. Busque la etiqueta stable para la versión más reciente, y nightly para versiones con cambios potencialmente inestables de la rama de desarrollo.

La imagen de Docker corre el ejecutable del compilador, así que puede pasarle todos los argumentos del compilador. Por ejemplo, el comando de abajo toma la versión estable de la imagen de solc (si no la tiene todavía), y la corre en un contenedor nuevo, pasando el argumento --help.

docker run ethereum/solc:stable --help

También puede solicitar versiones de lanzamientos específicas, por ejemplo la versión 0.5.4.

docker run ethereum/solc:0.5.4 --help

Para usar una imagen de Docker para compilar archivos Solidity en la máquina huésped, monte una carpeta local para entrada y salida, y especifique el contrato a compilar. Por ejemplo.

docker run -v /local/path:/sources ethereum/solc:stable -o /sources/output --abi --bin /sources/Contract.sol

También puede usar la interfaz standard de JSON (que es la recomendada cuando se usa el compilador con otras herramientas). Cuando use esta interfaz, no es necesario montar ningún directorio mientras el input de JSON sea autocontenido (ej. cuando no haga referencia a archivos externos que tendrían que ser cargados con un import callback).

docker run ethereum/solc:stable --standard-json < input.json > output.json

Paquetes de Linux

Los binarios de Solidity están disponibles en solidity/releases.

También tenemos PPAs para Ubuntu, puede obtener la versión estable más reciente usando los siguientes comandos:

sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc

La versión nocturna puede ser instalada usando estos comandos:

sudo add-apt-repository ppa:ethereum/ethereum
sudo add-apt-repository ppa:ethereum/ethereum-dev
sudo apt-get update
sudo apt-get install solc

Más aún, algunas distribuciones de Linux proveen sus propios paquetes. Estos paquetes no son mantenidos directamente por nosotros, sino por los desarrolladores de dichos paquetes.

Por ejemplo, Arch Linux tiene paquetes para la última versión de desarrollo:

pacman -S solidity

También hay un paquete para snap, sin embargo actualmente no se le da mantenimiento. Se puede instalar en todas las distros de Linux respaldadas. Para instalar la última versión estable de solc:

sudo snap install solc

Si usted quiere ayudar a probar la última versión de desarrollo de Solidity con los cambios más recientes, por favor utilice el siguiente comando:

sudo snap install solc --edge

Nota

El snap de solc usa confinamiento estricto. Este es el modo más seguro para paquetes de snap pero tiene sus limitaciones, como por ejemplo, el solo acceder a los archivos en sus directorios /home y /media. Para más información, vaya a Demystifying Snap Confinement.

Paquetes para macOs

Distribuimos el compilador de Solidity a través de Homebrew como una versión build-from-source. Los binarios pre-compilados no son respaldados actualmente.

brew update
brew upgrade
brew tap ethereum/ethereum
brew install solidity

Para instalar la versión 0.4.x / 0.5.x más reciente de Solidity también puede usar brew install solidity@4 y brew install solidity@5, respectivamente.

Si necesita una versión específica de Solidity puede instalar una fórmula de Homebrew directamente desde Github.

Ver commits de solidity.rb en Github.

Copie el commit hash de la versión que quiere y haga check out en su máquina.

git clone https://github.com/ethereum/homebrew-ethereum.git
cd homebrew-ethereum
git checkout <el-hash-va-aquí>

Instalar usando brew:

brew unlink solidity
# ej. para instalar 0.4.8
brew install solidity.rb

Binarios estáticos

Mantenemos un repositorio con todos los binarios estáticos y versiones actuales del compilador para todas las plataformas respaldadas en solc-bin. En esta locación también puede encontrar las compilaciones nocturnas.

Este repositorio no es solamente una manera fácil y rápida para que los usuarios finales puedan obtener los archivos binarios listos para usarse; también está pensado para ser amigable para herramientas de terceros:

  • El contenido está respaldado en https://binaries.soliditylang.org donde puede ser descargado por HTTPS sin autenticación, limitaciones de velocidad o la necesidad de usar git.

  • El contenido es servido con las cabeceras de tipo Content-Type correctas y una configuración de CORS permisiva para que pueda ser cargado directamente por herramientas que corran en navegadores.

  • Los binarios no requieren instalación o desempaquetado (con la excepción de algunas compilaciones antiguas para Windows que vienen con DLLs necesarios).

  • Nos esforzamos por una alta compatibilidad con versiones anteriores. Una vez que añadimos un archivo, no lo movemos o borramos sin proveer un symlink/redirect a la locación anterior. Nunca los modificamos en su lugar y el checksum siempre debería coincidir. La única excepción es con archivos dañados o corrompidos que potencialmente podrían causar más daño de dejarse como están.

  • Los archivos son servidos por HTTP y HTTPS. Mientras obtenga la lista de archivos de manera segura (via git, HTTPS, IPFS o esté cacheado localmente) y verifique los hashes de los binarios después de descargarlos, no necesita usar HTTPS para los binarios en sí mismos.

Los mismos binarios están disponibles la mayoría de las ocasiones en la página de releases de Solidity en Gihtub. La diferencia es que normalmente no actualizamos viejos releases en esa página. Eso significa que no los renombramos si las convenciones para nombrar archivos cambian, y tampoco añadimos compilaciones para plataformas que no estaban disponibles cuando se hizo el release. Esto solo sucede en solc-bin.

El repositorio de solc-bin contiene varios directorios de primer nivel, cada uno representando una plataforma. Cada uno contiene un archivo list.json que enlista los binarios disponibles. Por ejemplo, en emscripten-wasm32/list.json encontrará la siguiente información sobre la versión 0.7.4:

{
  "path": "solc-emscripten-wasm32-v0.7.4+commit.3f05b770.js",
  "version": "0.7.4",
  "build": "commit.3f05b770",
  "longVersion": "0.7.4+commit.3f05b770",
  "keccak256": "0x300330ecd127756b824aa13e843cb1f43c473cb22eaf3750d5fb9c99279af8c3",
  "sha256": "0x2b55ed5fec4d9625b6c7b3ab1abd2b7fb7dd2a9c68543bf0323db2c7e2d55af2",
  "urls": [
    "bzzr://16c5f09109c793db99fe35f037c6092b061bd39260ee7a677c8a97f18c955ab1",
    "dweb:/ipfs/QmTLs5MuLEWXQkths41HiACoXDiH8zxyqBHGFDRSzVE5CS"
  ]
}

Esto significa que:

Advertencia

Debido a los fuertes requerimientos de compatibilidad con versiones anteriores, el repositorio contiene algunos elementos descontinuados que debería evitar usar al crear herramientas nuevas:

  • Use emscripten-wasm32/ (o en su defecto emscripten-asmjs/) en lugar de bin/ si quiere el mejor rendimiento. Hasta la versión 0.6.1 solo proveíamos binarios de asm.js. A partir de la versión 0.6.2 hicimos el cambio a WebAssembly builds que tiene mucho mejor rendimiento. Hemos recompilado las versiones más antiguas para wasm pero los archivos originales asm.js se mantienen en bin/. Los nuevos tuvieron que ser puestos en un directorio separado para evitar conflictos de nombramiento.

  • Use los directorios emscripten-asmjs/ y emscripten-wasm32/ en lugar de bin/ y wasm/ si quiere estar seguro de si está descargando un binario de wasm o de asm.js.

  • Use list.json en vez de list.js y list.txt. El formato JSON contiene toda la información de los binarios antiguos y más.

  • Use https://binaries.soliditylang.org en vez de https://solc-bin.ethereum.org. Para mantener las cosas simples, movimos casi todo lo relacionado al compilador al nuevo dominio soliditylang.org y esto también aplica para solc-bin. Aunque recomendamos el nuevo dominio, el antiguo sigue siendo mantenido y se garantiza que apunte a la misma locación.

Advertencia

Los binarios también están disponbiles en https://ethereum.github.io/solc-bin/ pero esta página dejó de ser actualizada justo después del lanzamiento de la versión 0.7.2, no va a recibir nuevos releases ni compilaciones nocturnas para ninguna plataforma y no sirve la nueva estructura del directorio, incluyendo compilaciones no-emscripten.

Si usted la está usando, por favor cambie a https://binaries.soliditylang.org, que es su reemplazo. Esto nos permite hacerle cambios al hosting subyacente de una manera transparente y minimizar disrupciones. Al contrario del dominio ethereum.github.io, el cual no controlamos, binaries.soliditylang.org está garantizado para funcionar y mantener la misma estructura de URLs en el largo plazo.

Compilando del código fuente

Prerrequisitos - Todos los Sistemas Operativos

A continuación las dependencias para todas las compilaciones de Solidity:

<<<<<<< HEAD | CMake (version 3.13+) | Generadord de código fuente multiplataforma. | +———————————–+——————————————————-+ | Boost (version 1.77+ en | Librerías de C++. | | Windows, 1.65+ en otros) | | ======= | CMake (version 3.21.3+ on | Cross-platform build file generator. | | Windows, 3.13+ otherwise) | | +———————————–+——————————————————-+ | Boost (version 1.77 on | C++ libraries. | | Windows, 1.65+ otherwise) | | >>>>>>> english/develop +———————————–+——————————————————-+ | Git | Software de línea de comandos para obtener código | | | fuente. | +———————————–+——————————————————-+ | z3 (versión 4.8+, Opcional) | Para usar con SMT checker. | | z3 (version 4.8.16+, Opcional) | Para usar con SMT checker. | +———————————–+——————————————————-+ | cvc4 (Opcional) | Para usar con SMT checker. | +———————————–+——————————————————-+

Nota

Las versiones de Solidity anteriores a la 0.5.10 pueden no funcionar correctamente con versiones de Boost 1.70+. Una posible solución es renombrar temporalmente <Boost install path>/lib/cmake/Boost-1.70.0 antes de correr el comando de cmake para configurar Solidity.

A partir de la versión 0.5.10, debería funcionar correctamente con las versiones de Boost 1.70+ sin necesidad de ajustes manuales.

Nota

La configuración de la compilación por defecto requiere una versión de Z3 específica (la última en el momento que el código se actualizó por última vez). Los cambios que hay entre versiones de Z3 generalmente dan como resultado lanzamientos ligeramente distintos (pero válidos). Nuestras pruebas SMT no toman en cuenta estas diferencias y probablemente fallarán con una versión diferente de la versión para la que fueron escritas. Esto no significa que una compilación que use una versión diferente está dañada. Si usted pasa la opción -DSTRICT_Z3_VERSION=OFF a CMake, puede compilar con cualquier versión que satisfaga los requerimientos de la tabla de arriba. Si hace esto, sin embargo, recuerde pasar la opción --no-smt a scripts/tests.sh para saltar las pruebas SMT.

Versiones Mínimas del Compilador

Nota

De forma predeterminada, la compilación se realiza en modo pedante, lo que activa advertencias adicionales y le indica al compilador para tratar todas las advertencias como errores. Esto obliga a los desarrolladores a corregir las advertencias a medida que surgen, de modo que no acumulen que se solucionen más tarde. Si sólo le interesa crear una versión de lanzamiento y no desea modificar el código fuente para tratar estas advertencias, puede pasar la opción ``-DPEDANTIC=OFF` a CMake para deshabilitar este modo. No se recomienda hacerlo para uso general, pero puede ser necesario cuando se utiliza una cadena de herramientas que estamos no probar o intentar crear una versión anterior con herramientas más recientes. Si encuentra este tipo de advertencias, tenga en cuenta reporting them.

Los siguientes compiladores de C++ y sus versiones mínimas pueden compilar el código de Solidity:

Prerrequisitos - macOS

Para compilar en macOS, asegúrese que tenga la versión más reciente de Xcode instalada. Ésta contiene el compilador Clang C++, el IDE de Xcode y otras herramientas de desarrollo de Apple que se requieren para compilar aplicaciones C++ en OS X. Si está instalando Xcode por primera vez, o acaba de instalar una nueva versión necesitará aceptar la licencia antes de poder compilar desde la línea de comandos:

sudo xcodebuild -license accept

Nuestro script de compilación para OS X usa el gestor de paquetes Homebrew para instalar dependencias externas. Aquí puede ver cómo desinstalar Homebrew, si necesita empezar desde cero.

Prerrequisitos - Windows

Necesitará instalar las siguientes dependencias para compilar Solidity en Windows:

Software

Notas

Visual Studio 2019 Build Tools

Compilador de C++

Visual Studio 2019 (Opcional)

Compilador de C++ y entorno de desarrollo

<<<<<<< HEAD | Boost (versión 1.77+) | Librerías de C++ | ======= | Boost (version 1.77) | C++ libraries. | >>>>>>> english/develop +———————————–+——————————————————-+

Si ya tiene un IDE y solo necesita instalar el compilador y las librerías, puede instalar solamente Visual Studio 2019 Build Tools.

Visual Studio 2019 provee un IDE y el compilador y librerías necesarias. Si usted todavía no cuenta con un IDE de su preferencia y desea programar en Solidity, Visual Studio 2019 puede ser una opción para configurar todo de manera sencilla.

A continuación, una lista de componentes que deben ser instalados ya sea que use Visual Studio 2019 o Visual Studio 2019 Build Tools.

  • Visual Studio C++ core features

  • VC++ 2019 v141 toolset (x86,x64)

  • Windows Universal CRT SDK

  • Windows 8.1 SDK

  • C++/CLI support

Tenemos un script de soporte que puede usar para instalar todas las dependencias externas necesarias:

scripts\install_deps.ps1

Esto instalará boost y cmake al subdirectorio deps.

Clonar el repositorio

Para clonar el código fuente ejecute el siguiente comando:

git clone --recursive https://github.com/ethereum/solidity.git
cd solidity

Si usted quiere ayudar en el desarrollo de Solidity, le recomendamos hacer “fork” de Solidity y añadir su “fork” personal como segundo remoto:

git remote add personal git@github.com:[username]/solidity.git

Nota

Este método generará una precompilación que llevará a, por ejemplo, que se genere una bandera en cada bytecode producido por el compilador. Si quiere recompilar un compilador de Solidity ya lanzado, por favor use el archivo tarball en la página de lanzamientos de github:

https://github.com/ethereum/solidity/releases/download/v0.X.Y/solidity_0.X.Y.tar.gz

(no el «código fuente» de github).

Compilación por la línea de comandos

Asegúrese de instalar todas las dependencias externas (ver arriba) antes de compilar.

El proyecto de Solidity utiliza CMake para configurar la compilación. Se recomienda instalar ccache para acelerar el proceso si requiere compilar en repetidas ocasiones. CMake lo detectará automaticamente. Compilar Solidity es bastante parecido en Linux, macOS y otras versiones de Unix:

mkdir build
cd build
cmake .. && make

En Linux y macOS es todavía más fácil, puede correr:

#nota: esto instalará los binarios solc y soltest en usr/local/bin
./scripts/build.sh

Advertencia

Las compilaciones en BSD deberían funcionar, pero no han sido probadas por el equipo de Solidity.

Y para Windows:

mkdir build
cd build
cmake -G "Visual Studio 16 2019" ..

En caso de querer usar la versión de boost instalada por scripts\install_deps.ps1, deberá pasar adicionalmente las banderas -DBoost_DIR="deps\boost\lib\cmake\Boost-*" y -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded como argumentos cuando corra cmake.

Esto debería crear un archivo solidity.sln en ese directorio. Al hacer doble click en ese archivo Visual Studio debería abrirse. Sugerimos compilar con la configuración Release pero todas las demás funcionan.

De manera alternativa, puede compilar en Windows desde la línea de comandos:

cmake --build . --config Release

Opciones de CMake

Para ver las opciones de Cmake disponibles solo corra cmake .. -LH.

Solvers de SMT

Solidity puede ser compilado contra solvers SMT y lo hará por defecto si se encuentran en el sistema. Cada solver puede ser deshabilitado con una opción de cmake.

Nota: En algunos casos, esto también puede ser una solución alterna para compilaciones fallidas.

En la carpeta donde compile puede deshabilitarlos, ya que están habilitados por defecto:

# deshabilita solo el solver SMT para Z3
cmake .. -DUSE_Z3=OFF

# deshabilita solo el solver SMT para CVC4
cmake .. -DUSE_CVC4=OFF

# deshabilita los solvers para CVC4 y Z3
cmake .. -DUSE_CVC4=OFF -DUSE_Z3=OFF

La Cadena de Versión en Detalle

La cadena de versión de Solidity contiene cuatro partes:

  • el número de versión

  • la etiqueta de pre-release, generalmente fijada en develop.YYYY.MM.DD o nightly.YYYY.MM.DD

  • commit en el formato commit.GITHASH

  • la plataforma, que contiene un número arbitrario de elementos, e incluye detalles sobre la plataforma y el compilador

Si hay modificaciones locales, el commit tendrá el sufijo de .mod.

Estas partes se combinan según requerimientos de SemVer, donde la etiqueta de pre-release de Solidity equivale al pre-release de SemVer y el commit de Solidity y la plataforma combinados nos dan la metadata del compilado de SemVer.

Un ejemplo de release: 0.4.8+commit.60cc1668.Emscripten.clang.

Un ejemplo de pre-release: 0.4.9-nightly.2017.1.17+commit.6ecb4aa3.Emscripten.clang

Información Importante Sobre el Versionado

Después de que se hace un lanzamiento, se aumenta el número de versión de parche, porque asumimos que solo siguen cambios a nivel de parches. Cuando los cambios se fusionan, la versión debería ser aumentada de acuerdo a SemVer y a la severidad del cambio. Finalmente, un lanzamiento siempre se hace con la versión de la compilación nocturna vigente, pero sin el especificador de prerelease.

Ejemplo:

  1. Se hace el release de la versión 0.4.0.

  2. La compilación nocturna tiene una versión de 0.4.1 de ahora en adelante.

  3. Se introducen cambios sin rupturas –> no hay cambio en la versión.

  4. Se introduce un cambio con rupturas –> la versión se aumenta a 0.5.0.

  5. Se hace el release de la versión 0.5.0.

Este método funciona bien con la versión de pragma.