Documentación de Solidity 0.4.5 en español - 1. Introducción a los contractos inteligentes

in #solidity8 years ago (edited)

Voy a traducir por partes la documentación de Solidity que puedes encontrar aquí. Puedes encontrar aquí todos los capítulos traducidos.


Solidity es un lenguaje de alto nivel orientado a contratos cuya síntesis es similar a JavaScript y ha sido diseñado para la máquina virtual Ethereum. Solidity es de tipado estático, soporta herencias, librerias y complejas definiciones de tipos de usuario, entre otras caraterísticas.

Como puedes ver, es posible crear contratos para votar, crowfunding, subastas a ciegas, monederos multi-firma y más.

La mejor manera de probar Solidity ahora mismo es usando el "Browser-Based Compiler" (puede tardar un poco en cargar, por favor sé paciente).

Introducción a los contratos inteligentes

Un simple contrato inteligente

Vamos a comenzar con el ejemplo más básico. Está bien si no entiendes todo ahora mismo, entraremos en detalle más tarde.

Almacenamiento

pragma solidity ^0.4.0;

contract SimpleStorage {
    uint storedData;

    function set(uint x) {
        storedData = x;
    }

    function get() constant returns (uint) {
        return storedData;
    }
}

La primera línea simplemente dice que el código fuente está escrito para una versión de Solidity 0.4.0 o superior que sea compatible. Esto asegura que el contrato no se comporta de repente diferente en una nueva versión del compilador.

Un contrato en el sentido de Solidity es una colección de código (sus funciones) e información (sus estados) que residen en una dirección específica en la blockchain Ethereum. La línea uint storedData; declara una variable de estado llamada storeddata de tipo uint (entero no firmado de 256 bits). Puedes imaginarlo como un pequeños espacio en una base de datos que puede ser preguntado y alterado llamando a funciones del código que maneja la base de datos. En el caso de Ethereum. esto es siempre el propio contrato. Y, en este caso, las funciones set y get pueden ser usadas para modificar o recuperar el valor de la variable.

Para acceder al estado de la variable, no necesitas el prefijo this. como es común en otros lenguajes.
Este contrato no hace mucho más aparte de (debido a la infraestructura construida por Ethereum) permitir a cualquier almacenar un sólo número que es accesible por cualquiera en el planeta sin (factible) una forma de prevenir la publicación del número. Por supuesto, alguien podría llamar a set de nuevo con un valor diferente y reescribir tu número, pero este estará todavía en la historia de la blockchain. Más tarde veremos como puedes imponer restricciones de acceso de forma que sólo tu puedas alterar el número.

Ejemplo Submoneda

El siguiente contrato implementará la forma más simple de una criptomoneda. Será posible generar coins del aire, pero sólo la persona que creó el contrato será capaz de hacer eso (es más trivial de implementar que un sistema de emisión diferente).
Además, cualquiera puede enviar coins a otro sin la necesidad de registrarse con usuario y contraseña, todo lo que necesitas es un par de keys Ethereum.

pragma solidity ^0.4.0;

contract Coin {
    // The keyword "public" makes those variables
    // readable from outside.
    address public minter;
    mapping (address => uint) public balances;

    // Events allow light clients to react on
    // changes efficiently.
    event Sent(address from, address to, uint amount);

    // This is the constructor whose code is
    // run only when the contract is created.
    function Coin() {
        minter = msg.sender;
    }

    function mint(address receiver, uint amount) {
        if (msg.sender != minter) return;
        balances[receiver] += amount;
    }

    function send(address receiver, uint amount) {
        if (balances[msg.sender] < amount) return;
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        Sent(msg.sender, receiver, amount);
    }
}

Este contrato introduce algunos conceptos nuevos, vamos a través de ellos uno por uno.

La línea address public minter declara una variable de estado de tipo 'address' que es accesible públicamente. El tipo 'address' es un valor en 160-bit que no permite operaciones aritméticas. Es adecuado para almacenar direcciones de contratos o pares de keys que pertenecen a personas externas. La key pública automáticamente genera una función que te permite acceder al valor actual de la variable de estado. Sin esta keyword otros contratos no tendrían forma de acceder a la variable y sólo el código de este contrato puedes escrbirlo. La función lucirá algo como esto:

function minter() returns (address) { return minter; }

Por supuesto, añadiendo una función exactamente como no funcionaría porque tenemos una función y un estado variable con el mismo nombre, pero con optimismo, obtienes la idea - el compilador figura esta salida para ti.

La siguiente línea mapping (address => unit) public balances; también crea un estado público variable, pero es un tipo de dato más complejo. El tipo 'maps addresses to unsigned integers'. Los mapeos (mappings) pueden verse como tablas de hash las cuales son virtualmente inicializadas tan pronto como la key exista y esté mapeada a un valor cuya representación de bytes es todo ceros. Esta analogía no va demasiado lejos ya que no es posible obtener una lista de todas las claves de un mapeo ni una lista con todos los valores. Por lo tanto, tenga en mente, (o mejor, haga una una lista o use una forma más avanzada de recopilación de datos)lo que has añadido al mapping o usado en un contexto donde no es necesario, como este. La función antecesora creada por la keyword pública es un poco más compleja en este caso. Aproximadamente luciría como sigue:

function balances(address _account) returns (uint) {
    return balances[_account];
}

Como ves, puedes usar esta función para preguntar fácilmente el balance de una sóla cuenta.

La línea event Sent(address from, address to, uint amount); clara un llamado así "event" el cual es encendido en la última línea de la función send. Las interfaces de usuario (así como las aplicaciones de servidor, por supuesto) pueden escuchar a esos eventos siendo disparados en la blockchain sin mucho coste. Tan pronto como es encendido, el oyente recibe los argumentos from, to and amount, los cuales hacen fácil seguir el regitro de transacciones. En orden de recibir respuesta para este evento, debes usar

Coin.Sent().watch({}, '', function(error, result) {
    if (!error) {
        console.log("Coin transfer: " + result.args.amount +
            " coins were sent from " + result.args.from +
            " to " + result.args.to + ".");
        console.log("Balances now:\n" +
            "Sender: " + Coin.balances.call(result.args.from) +
            "Receiver: " + Coin.balances.call(result.args.to));
    }
}

Nota como la función automáticamente generada balances es llamada desde la interface de usuario.

La función especialCoin es el contructor el cual está ejecutándose durante la creación del contrato y no puede ser llamado después. Almacena permanentemente las direcciones de la persona creando el contrato: msg (junto con tx y block) es una variable global mágica que contiene algunas propiedades que permiten acceder a la blockchain. msg.sender es siempre la dirección donde la función actual (externa) traiga la llamada.

Finalmente, las funciones que actualmente terminan con el contrato y pueden ser llamadas por usuarios y contratos, cómo son minty send. Si mintes llamada por alguien que no es la cuenta que ha creado el contrato, no pasa nada. Por otra parte, sendpuede ser usado por cualquiera (quien tenga ahora alguna de esas monedas) para enviar coins a cualquier otro. Observa que si usas este contrato para enviar coins a una dirección, no verás nada cuando mires a esas direcciones en un explorador blockchain, porque el hecho es que cuando envías coins y os cambios en los balances son almacenados en el almacenamiento de datos de este contrato de coin particular. Mediante el uso de eventos es relativamente fácil crear un explorador blockchain que fuera registrando transacciones y balances de tu nueva coin.


Índice de la documentación:

1. Introducción a los contractos inteligentes
2. La cadena de bloques y la Máquina Virtual de Ethereum
3. Instalando Solidity

Coin Marketplace

STEEM 0.18
TRX 0.15
JST 0.028
BTC 62943.85
ETH 2464.43
USDT 1.00
SBD 2.55