Curso Ethereum
Avanzado
andres.junge@consensys.net
Introducción a los Smart Contracts
Programación de Smart Contracts
Introducción a los Smart Contracts
Smart Contracts
Nick Szabo 1994
¿Contratos?
¿Inteligentes?
Smart Contracts
Lógica de Negocio en el Blockchain
Código almacenado en el Blockchain
Estado consensuado
Smart Contracts
Estado
Funciones que modifican el estado
Consulta de estado
Blockchain y Smart Contracts
Transacción de instanciación
Transacción de invocación
Consulta de estado de contrato
Ethereum
Ethereum Virtual Machine (EVM)
Turing Complete
Cada nodo ejecuta el código
Lenguajes
Serpent / Viper
LLL
Solidity
Instanciación
from: Instanciador del contrato
to: (vacio)
data: código compilado del contrato
resultado: dirección de instancia de contrato
Invocación de función
from: Invocador del contrato
to: dirección de instancia del contrato
data: función + parametros
resultado: status + eventos
Consenso
Nodo ejecuta la transacción
Verifica el estado final
Consenso a nivel de bloque
contract Counter {
int private count = 0;
function incrementCounter() public {
count += 1;
}
function decrementCounter() public {
count -= 1;
}
function getCount() public constant returns (int) {
return count;
}
}
Interacción externa
Entre contratos
Oráculos (Oracles)
Eventos
Casos de Uso
Gestión de Propiedad
Subastas
Fideicomiso
Intro Smart Contracts
¿Partes de un SC?
Variables de estado y funciones
¿Donde se ejecuta el código?
EVM
¿Cual nodo ejecuta el código?
Todos
¿Lenguaje mas popular?
Solidity
¿Cómo interactuar con el mundo exterior?
Oráculos y eventos
¿Preguntas?
Programación de Smart Contracts
Herramientas
Editor de Texto
Compilador
Nodo
Compilador
solc
remix
truffle
Nodo
geth
parity
ganache
Ejemplo
remix + ganache
Variables de estado
pragma solidity ^0.4.0;
contract SimpleStorage {
uint storedData; // State variable
// ...
}
Funciones
pragma solidity ^0.4.0;
contract SimpleAuction {
function bid() public payable { // Function
// ...
}
}
Modificadores de funciones
pragma solidity ^0.4.11;
contract Purchase {
address public seller;
modifier onlySeller() { // Modifier
require(msg.sender == seller);
_;
}
function abort() public onlySeller { // Modifier usage
// ...
}
}
Eventos
pragma solidity ^0.4.21;
contract SimpleAuction {
event HighestBidIncreased(address bidder, uint amount); // Event
function bid() public payable {
// ...
emit HighestBidIncreased(msg.sender, msg.value); // Triggering event
}
}
Estructuras
pragma solidity ^0.4.0;
contract Ballot {
struct Voter { // Struct
uint weight;
bool voted;
address delegate;
uint vote;
}
}
Enumeraciones
pragma solidity ^0.4.0;
contract Purchase {
enum State { Created, Locked, Inactive } // Enum
}
Tipo de datos
Booleanos: bool
Enteros: int, uint, uint256
Direcciones: address
Arreglos fijos: bytes1, bytes32
Arreglos dinámicos: bytes, string
Mapas: mapping(address => uint)
Variables especiales
msg.sender
msg.value
block.timestamp
tx.gasprice
Manejo de Errores
require()
assert()
Ejemplo: Token
pragma solidity ^0.4.8;
contract DemoToken {
function DemoToken(uint256 _totalSupply) public {
balances[msg.sender]=_totalSupply;
}
function transfer(address _to, uint256 _value) public returns (bool success) {
require(balances[msg.sender] >= _value);
balances[msg.sender] -= _value;
balances[_to] += _value;
emit Transfer(msg.sender, _to, _value);
return true;
}
function balanceOf(address _owner) view public returns (uint256 balance) {
return balances[_owner];
}
mapping (address => uint256) balances;
event Transfer(address indexed _from, address indexed _to, uint256 _value);
}
Ejemplo: Escrow
pragma solidity ^0.4.8;
import "./DemoToken.sol";
contract DemoEscrow {
address public tokenAddress;
address public comprador;
address public vendedor;
address public arbitro;
function DemoEscrow(address _tokenAddress) public {
tokenAddress = _tokenAddress;
arbitro = msg.sender;
}
...
Ejemplo: Escrow
...
function setComprador(address _comprador) public returns (bool success){
require(comprador == address(0));
comprador = _comprador;
return true;
}
function setVendedor(address _vendedor) public returns (bool success){
require(vendedor == address(0));
vendedor = _vendedor;
return true;
}
function setArbitro(address _arbitro) public returns (bool success){
require(arbitro == msg.sender);
arbitro = _arbitro;
return true;
}
function getEscrowBalance() view public returns (uint256 _saldo) {
DemoToken t = DemoToken(tokenAddress);
return t.balanceOf(this);
}
...
Ejemplo: Escrow
...
function cancel() public returns (bool success){
require( msg.sender == vendedor || msg.sender == arbitro);
DemoToken t = DemoToken(tokenAddress);
uint256 balance = t.balanceOf(this) ;
require( balance > 0);
return t.transfer(comprador,balance);
}
function finish() public returns (bool success){
require( msg.sender == comprador || msg.sender == arbitro);
DemoToken t = DemoToken(tokenAddress);
uint256 balance = t.balanceOf(this) ;
require( balance > 0);
return t.transfer(vendedor,balance);
}
}
¡Hasta mañana!
andres.junge@consensys.net
Curso Ethereum (2/5): Avanzado
By Andres Junge
Curso Ethereum (2/5): Avanzado
Curso Ethereum. Parte 2 de 5. Avanzado
- 475