Documentos de Académico
Documentos de Profesional
Documentos de Cultura
inteligentes
Un contrato inteligente simple
Ejemplo de almacenamiento
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;
contract SimpleStorage {
uint storedData;
La primera línea le dice que el código fuente tiene la licencia GPL versión 3.0. Los
especificadores de licencias legibles por máquina son importantes en un entorno
en el que la publicación del código fuente es la predeterminada.
La siguiente línea especifica que el código fuente está escrito para la versión
0.4.16 de Solidity, o una versión más reciente del idioma hasta, pero sin incluir la
versión 0.9.0. Esto es para asegurar que el contrato no sea compilable con una
nueva versión del compilador (rompiendo), donde podría comportarse de manera
diferente. Los pragmas son instrucciones comunes para los compiladores sobre
cómo tratar el código fuente (por ejemplo, pragma una vez ).
Para acceder a un miembro (como una variable de estado) del contrato actual,
normalmente no agrega el this. prefijo, solo accede a él directamente a través de
su nombre. A diferencia de otros idiomas, omitirlo no es solo una cuestión de
estilo, da como resultado una forma completamente diferente de acceder al
miembro, pero más sobre esto más adelante.
Advertencia
Tenga cuidado con el uso de texto Unicode, ya que los caracteres de aspecto
similar (o incluso idénticos) pueden tener diferentes puntos de código y, como
tales, se codifican como una matriz de bytes diferente.
Nota
Ejemplo de submoneda
contract Coin {
// The keyword "public" makes variables
// accessible from other contracts
address public minter;
mapping (address => uint) public balances;
balances[msg.sender] -= amount;
balances[receiver] += amount;
emit Sent(msg.sender, receiver, amount);
}
}
Este contrato introduce algunos conceptos nuevos, repasemos uno por uno.
Puede agregar una función como la anterior usted mismo, pero tendría una
función y una variable de estado con el mismo nombre. No es necesario que haga
esto, el compilador lo resolverá por usted.
La función getter creada por la public palabra clave es más compleja en el caso de
un mapeo. Se parece a lo siguiente:
Puede utilizar esta función para consultar el saldo de una sola cuenta.
Las funciones que componen el contrato, y que los usuarios y contratos pueden
llamar son mint y send .
La mint función envía una cantidad de monedas recién creadas a otra
dirección. La llamada a la función require define condiciones que revierten todos
los cambios si no se cumplen. En este ejemplo, asegura que solo el creador del
contrato pueda llamar . En general, el creador puede acuñar tantas fichas como
quiera, pero en algún momento, esto conducirá a un fenómeno llamado
"desbordamiento". Tenga en cuenta que debido a la aritmética
Checked predeterminada , la transacción se revertiría si la expresión se desborda,
es decir, cuando la aritmética de precisión arbitraria es mayor que el valor máximo
de ( ). Esto también es cierto para la declaración de la
función . require(msg.sender == minter);mintbalances[receiver] += amount;balances[receiv
er] + amountuint2**256 - 1balances[receiver] += amount;send
Los errores le permiten brindar más información a la persona que llama sobre por
qué falló una condición u operación. Los errores se utilizan junto con
la declaración revert . La declaración de reversión anula incondicionalmente y
revierte todos los cambios similares a la require función, pero también le permite
proporcionar el nombre de un error y datos adicionales que se proporcionarán a la
persona que llama (y eventualmente a la aplicación front-end o al explorador de
bloques). que una falla se puede depurar o reaccionar más fácilmente.
La send función puede ser utilizada por cualquier persona (que ya tenga algunas
de estas monedas) para enviar monedas a cualquier otra persona. Si el remitente
no tiene suficientes monedas para enviar, la if condición se evalúa como
verdadera. Como resultado, revert hará que la operación falle mientras se
proporciona al remitente los detalles del InsufficientBalance error utilizando el error.
Nota
Si usa este contrato para enviar monedas a una dirección, no verá nada cuando
mire esa dirección en un explorador de blockchain, porque el registro que envió
monedas y los saldos cambiados solo se almacenan en el almacenamiento de
datos de esta moneda en particular. contrato. Mediante el uso de eventos, puede
crear un "explorador de blockchain" que rastrea las transacciones y los saldos de
su nueva moneda, pero debe inspeccionar la dirección del contrato de la moneda
y no las direcciones de los propietarios de la moneda.
Actas
Como ejemplo, imagine una tabla que enumere los saldos de todas las cuentas en
una moneda electrónica. Si se solicita una transferencia de una cuenta a otra, la
naturaleza transaccional de la base de datos asegura que si el monto se resta de
una cuenta, siempre se agrega a la otra cuenta. Si por alguna razón no es posible
agregar el monto a la cuenta de destino, la cuenta de origen tampoco se modifica.
Bloques
Nota
Cuentas
Además, cada cuenta tiene un saldo en éter (en “Wei” para ser exactos, es ) que
puede ser modificado mediante el envío de transacciones que incluyen
éter. 1 ether10**18 wei
Actas
Una transacción es un mensaje que se envía de una cuenta a otra (que puede ser
la misma o estar vacía, ver más abajo). Puede incluir datos binarios (que se
denominan "carga útil") y Ether.
Nota
Mientras se crea un contrato, su código aún está vacío. Por eso, no debe volver a
llamar al contrato en construcción hasta que su constructor haya terminado de
ejecutarse.
Gas
Si el gas se agota en cualquier momento (es decir, sería negativo), se activa una
excepción de falta de gas, que revierte todas las modificaciones realizadas al
estado en la trama de llamada actual.
La máquina virtual Ethereum tiene tres áreas donde puede almacenar datos:
almacenamiento, memoria y pila, que se explican en los siguientes párrafos.
El EVM no es una máquina de registro sino una máquina de pila, por lo que todos
los cálculos se realizan en un área de datos llamada pila . Tiene un tamaño
máximo de 1024 elementos y contiene palabras de 256 bits. El acceso a la pila
está limitado al extremo superior de la siguiente manera: Es posible copiar uno de
los 16 elementos superiores a la parte superior de la pila o intercambiar el
elemento superior por uno de los 16 elementos inferiores. Todas las demás
operaciones toman los dos elementos superiores (o uno, o más, dependiendo de
la operación) de la pila y empujan el resultado a la pila. Por supuesto, es posible
mover elementos de la pila al almacenamiento o memoria para obtener un acceso
más profundo a la pila, pero no es posible acceder simplemente a elementos
arbitrarios más profundos en la pila sin quitar primero la parte superior de la pila.
Conjunto de instrucciones
Los contratos pueden llamar a otros contratos o enviar Ether a cuentas sin
contrato mediante llamadas de mensajes. Las llamadas de mensajes son similares
a las transacciones, ya que tienen una fuente, un objetivo, una carga útil de datos,
Ether, gas y datos de retorno. De hecho, cada transacción consta de una llamada
de mensaje de nivel superior que, a su vez, puede crear más llamadas de
mensaje.
Como ya se dijo, el contrato llamado (que puede ser el mismo que el de la persona
que llama) recibirá una instancia de memoria recién borrada y tendrá acceso a la
carga útil de la llamada, que se proporcionará en un área separada
llamada calldata . Una vez finalizada la ejecución, puede devolver datos que se
almacenarán en una ubicación en la memoria de la persona que llama
previamente asignada por la persona que llama. Todas estas llamadas son
completamente sincrónicas.
Esto significa que un contrato puede cargar código dinámicamente desde una
dirección diferente en tiempo de ejecución. El almacenamiento, la dirección actual
y el saldo aún se refieren al contrato de llamada, solo se toma el código de la
dirección llamada.
Registros
Crear
Desactivar y autodestruirse
La única forma de eliminar el código de la cadena de bloques es cuando un
contrato en esa dirección realiza la selfdestruct operación. El Ether restante
almacenado en esa dirección se envía a un destino designado y luego el
almacenamiento y el código se eliminan del estado. Eliminar el contrato en teoría
suena como una buena idea, pero es potencialmente peligroso, ya que si alguien
envía Ether a contratos eliminados, el Ether se pierde para siempre.
Advertencia
Contratos precompilados
Anteriorpróximo
Instalación del compilador de solidez
Control de versiones
Remezclar
npm / Node.js
Úselo npm para instalar solcjs un compilador Solidity de una manera conveniente y
portátil . El programa solcjs tiene menos funciones que las formas de acceder al
compilador descritas más abajo en esta página. El uso de la línea de comandos
del compilador documentación supone que está utilizando el compilador con todas
las funciones, solc . El uso de solcjs está documentado dentro de su
propio repositorio .
Nota: El proyecto solc-js se deriva de C ++ solc usando Emscripten, lo que
significa que ambos usan el mismo código fuente del compilador. solc-js se puede
utilizar directamente en proyectos de JavaScript (como Remix). Consulte el
repositorio solc-js para obtener instrucciones.
Nota
Las opciones de la línea de comandos de solcjs no son compatibles con solc y las
herramientas (como geth ) que esperan el comportamiento de solc no
funcionarán solcjs .
Estibador
Paquetes de Linux
También tenemos PPA para Ubuntu, puede obtener la última versión estable
usando los siguientes comandos:
Nota
pacman -S solidity
emerge dev-lang/solidity
Paquetes macOS
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 y , respectivamente. brew install solidity@4brew install solidity@5
El repositorio no solo es una forma rápida y fácil para que los usuarios finales
preparen binarios para usarlos de inmediato, sino que también está destinado a
ser compatible con herramientas de terceros:
El solc-bin repositorio contiene varios directorios de nivel superior, cada uno de los
cuales representa una única plataforma. Cada uno contiene un list.json archivo
que enumera 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"
]
}
Software Notas
GCC , versión 8+
Clang , versión 7+
MSVC , versión 2019+
Requisitos previos: macOS
Visual Studio 2019 proporciona tanto IDE como el compilador y las bibliotecas
necesarios. Entonces, si no tiene un IDE y prefiere desarrollar Solidity, Visual
Studio 2019 puede ser una opción para que pueda configurar todo fácilmente.
Aquí está la lista de componentes que deben instalarse en Visual Studio 2019
Build Tools o Visual Studio 2019:
scripts\install_deps.ps1
Clonar el repositorio
Nota
Este método dará como resultado una versión preliminar que conducirá, por
ejemplo, a que se establezca una bandera en cada código de bytes producido por
dicho compilador. Si desea volver a compilar un compilador de Solidity publicado,
utilice el tarball de origen en la página de lanzamiento de github:
https://github.com/ethereum/solidity/releases/download/v0.XY/solidity_0.XYtar.gz
mkdir build
cd build
cmake .. && make
Advertencia
Y para Windows:
mkdir build
cd build
cmake -G "Visual Studio 16 2019" ..
Opciones de CMake
Si está interesado en las opciones de CMake disponibles, ejecute . cmake .. -LH
Solucionadores SMT
Nota: En algunos casos, esto también puede ser una posible solución para los
errores de compilación.
Ejemplo: