Clientes oficiales
Clientes no oficiales:
Diferentes implementaciones puede dar lugar a problemas
El cliente de Ethereum es válido tanto para la red principal (Main net), como para diferentes implementaciónes (Ropsten, Private chain...)
$ sudo apt-get install software-properties-common$ sudo add-apt-repository -y ppa:ethereum/ethereum$ sudo apt-get update$ sudo apt-get install ethereum
Con solo esto, ya somos capaces de interactuar con Ethereum!
La ejecución de Geth admite numerosos "flags", algunos de los más importantes:
Flag | Descripción | Por defecto | ||
---|---|---|---|---|
--networkid |
ID de la blockchain | 0 (main net) | ||
--rpc |
Permiso a la interfaz RPC | true | ||
--datadir |
Path que almacena la blockchain | (Linux) .ethereum/chaindata | ||
--rpcapi |
APIs abiertas vía RPC | web3 | ||
--rpcport |
Puerto de acceso a RPC | 8545 | ||
--rpccorsdomain |
Dominios de acceso a RPC | localhost | ||
--port |
Puerto de conexión para otros nodos | 30303 |
network_id=0
, o sin utilizar flagsnetwork_id=1
, o con el flag --testnet
network_id=your_own_network_id
Normalmente, los contratos siguen el siguiente proceso de deployment:Dos recursos necesarios para comenzarla:
{ "nonce": "0x0000000000000042", "timestamp": "0x0", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x0", "gasLimit": "0x8000000", "difficulty": "0x400", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x3333333333333333333333333333333333333333", "alloc": { }}
geth --datadir </path/a/bloques/> init genesis.json
$ geth + Flags...
Para el desarrollo de aplicaciones del curso, se utilizará esta librería.
Ejecutar
$ testrpc
Options (From the Docs):
-a
or --accounts
: Specify the number of accounts to generate at startup.-b
or --blocktime
: Specify blocktime in seconds for automatic mining. Default is 0 and no auto-mining.-d
or --deterministic
: Generate deterministic addresses based on a pre-defined mnemonic.-m
or --mnemonic
: Use a specific HD wallet mnemonic to generate initial addresses.-p
or --port
: Port number to listen on. Defaults to 8545.-h
or --hostname
: Hostname to listen on. Defaults to Node's server.listen()
default.-s
or --seed
: Use arbitrary data to generate the HD wallet mnemonic to be used.-g
or --gasPrice
: Use a custom Gas Price (defaults to 20000000000)-l
or --gasLimit
: Use a custom Gas Limit (defaults to 0x47E7C4)-f
or --fork
: Fork from another currently running Ethereum client at a given block. Input should be the HTTP location and port of the other client, e.g. http://localhost:8545
. You can optionally specify the block to fork from using an @
sign: http://localhost:8545@1599200
.Crear una blockchain privada con los siguientes parámetros.
Flag | Valor | ||
---|---|---|---|
--networkid |
25052017 | ||
--rpc |
true | ||
--datadir |
$HOME/documents/blockchain/private_blockchain | ||
--rpcapi |
web3 | ||
--rpcport |
8546 | ||
--rpccorsdomain |
localhost | ||
--port |
30303 |
Una vez inicializado y corriendo la blockchain, encontraréis un archivo .ipc. Conectar a la blockchain a través de IPC:
geth attach ipc: /your/path/to/your/ipc
A través de la consola podemos acceder a diferentes funciones de Web3 y gestión de claves: Probar interfaces utilizando como ejemplos:
> admin // Gestión de la red > eth // web3.eth > personal //Gestión de claves personal > miner //Gestión de minería
> eth.accounts // Array> eth.accounts[0] //Primera cuenta
> personal.newAccount()
Passphrase:Repeat passphrase:
datadir/keystore
De la misma manera que hemos creado una cuenta, podemos importarlas de carteras externas. Para ello, únicamente necesitamos realizar:
geth account import <keyfile>
Para exportar una cuenta y tratarla desde una wallet diferente, únicamente necesitamos utilizar el archivo alojado en keystore.
MyEtherWallet es un ejemplo muy generalizado de empleo de Wallets. Alguna vez pueden haberte recomendado utilizarla para acceder a un token sale, pero: ¿Cómo importar la wallet desde aquí?
Acceder a MyEtherWallet y conseguir importar una cuenta en vuestra wallet de Geth.
De la misma manera que hemos importado una cuenta podemos exportarla a MyEtherWallet, utilizando el archivo de keystore.
Exportar una Wallet de MyEtherWallet e importarla para acceder a ella desde la consola de geth.
> miner.start()
> miner.stop()
Ejecutar el comando de 'start', ¿Qué ocurre?Al ejecutar miner.start, obtendremos un resultado como el siguiente:
I0526 02:22:54.754878 miner/worker.go:514] commit new work on block 4884 with 0 txs & 0 uncles. Took 290.93µsI0526 02:22:59.329896 miner/unconfirmed.go:105] 🔗 ** mined block #4879** [6e362780…] reached canonical chainI0526 02:22:59.329921 miner/unconfirmed.go:83] 🔨 mined potential block #4884 [afb8d8da…], waiting for 5 blocks to confirmI0526 02:22:59.330157 miner/worker.go:514] commit new work on block 4885 with 0 txs & 0 uncles. Took 198.083µs
Ejecutar:
> eth.getBalances(eth.accounts[0])
¿Qué ocurre?
> miner.setEtherBase(eth.accounts[0])
Podemos volver a minar, obteniendo ahora los beneficios asociados:> miner.setEtherBase(eth.accounts[0])
Recordando la estructura de las transacciones repasada en la clase anterior:
Al realizar una transacción, desde consola, debemos especificar
Todo esto, utilizando la consola con javascript, se realizaría de la siguiente manera:
var sender = eth.accounts[0];var receiver = eth.accounts[1];var amount = web3.toWei(0.01, "ether")eth.sendTransaction({from: sender, to: receiver, value: web3.toWei(1, "ether")})
Observar la primera consola, qué ocurre?
A partir de aquí, podemos acceder a otras herramientas para hacer seguimiento de las transacciones en la blockchain.
> txpool.status
> eth.getBlockTransactionCount("pending");
> eth.getBlockTransactionCount("pending");
Ver todas las transacciones pendientes del bloque eth.getBlock("pending", true).transactions
Al realizar una transacción, desde consola, debemos especificar
Esto necesita de un compilador. Nosotros usaremos solidity:
La compilación/deployment/ejecución también puede realizarse a través de consola
Sin embargo esto resulta mucho más sencillo comenzando a utilizar librerías externas: Web3
Para ello, en lugar de utilizar el cliente geth comenzaremos a utilizar la librería testRPC
Principal interfaz para interactuación con la blockchain
Ofrece, a través de javascript una librería de herramientas completa para interactuar y desarrollar con la blockchain.
Interactuación con otros servicios adicionales de Ethereum (keystore, whisper, swarm)
Instalación:
npm install web3
Abre Geth
Ejecuta el siguiente código: node web3-test.js
var Web3 = require('web3'); var web3 = new Web3( new Web3.providers.HttpProvider("http://localhost:8545")); web3.eth.getBlock(0, function(error, result){ if(!error) console.log(result) else console.error(error); });
var Web3 = require('web3'); var web3 = new Web3(); web3.setProvider(new web3.providers.HttpProvider("http://localhost:8545")); web3.eth.sendTransaction(tx_object) console.log("Balance 0" + web3.eth.getBalance(web3.eth.accounts[0])) console.log( "Balance 1" + web3.eth.getBalance(web3.eth.accounts[1]) web3.eth.sendTransaction ({from:web3.eth.accounts[0], to: web3.eth.accounts[1], value: web3.toWei(1, "ether")}) console.log("Balance 0" + web3.eth.getBalance(web3.eth.accounts[0])) console.log("Balance 1" + web3.eth.getBalance(web3.eth.accounts[1])
Web3 no solo provee de herramientas propias de la blockchain de ethereum sino de cualquier facilitador útil para el desarrollo en Ethereum. Un ejemplo es la utilización de Hashes:
$ node (Initialize web3) web3.sha3("Hello Ethereum Course")
Crea el siguiente archivo (compilecontract.js):
var Web3 = require('web3');var web3 = new Web3();web3.setProvider(new web3.providers.HttpProvider("http://localhost:8545"));var source = 'pragma solidity ^0.4.6; contract demo {string public name = "buendiadas"; function changeName(string _newName){name = _newName; } }';var compiled = web3.eth.compile.solidity(source);console.log(compiled);console.log("ABI")console.log( compiled.info.abiDefinition);
Ejecuta:
$ node compilecontract.js
Copia las anteriores lineas en un nuevo fichero(e.g. contractupload.js), y añade las siguientes:
var nameContract= web3.eth.contract(compiled.info.abiDefinition); var uploadedContract = nameContract.new({from:web3.eth.accounts[0], data: compiled.code, gas: 1000000}, function(e, contract){ if(!e) { if(!contract.address) { console.log("Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined..."); } else { console.log("Contract mined! Address: " + contract.address); console.log(contract); } } });
En terminal:
$ node contractupload.js
Recupera los valores ABI, y contract Address del valor anterior
Con estos, sustituye en el siguiente script, y crea un nuevo fichero (getname.js)
var Web3 = require('web3'); var web3 = new Web3(); web3.setProvider(new web3.providers.HttpProvider("http://localhost:8545")); var ABI = [{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_newName","typ$ var contractAddress = "0xbbfd34ccf4bd62ec0d33d8b25c687c34888941af"; var contract = web3.eth.contract(ABI).at(contractAddress); contract.name.call(function(data){ console.log(data) });
Recupera los valores ABI, y contract Address del valor anterior
Accede a el IDE oficial (REMIX) : http://ethereum.github.io/browser-solidity/#version=soljson-v0.4.9+commit.364da425.js
Principal interfaz para interactuación con la blockchain
Ofrece, a través de javascript una librería de herramientas completa para interactuar y desarrollar con la blockchain.
Interactuación con otros servicios adicionales de Ethereum (keystore, whisper, swarm)
Instalación:
npm install web3
Abre Geth
$ geth --networkid 03032017 --rpccorsdomain "*" --datadir "/home/satoshi/chain" --port "30303" "db,eth,net,web3"
Ejecuta el siguiente código: node web3-test.js
var Web3 = require('web3'); var web3 = new Web3( new Web3.providers.HttpProvider("http://localhost:8545")); web3.eth.getBlock(0, function(error, result){ if(!error) console.log(result) else console.error(error); });
Recordamos el objeto transaction:
from, to, value, data, *nonce
Transacción entre cuentas externas --> Campo value > 0, no data
> web3.eth.sendTransaction(tx_object) > web3.eth.sendTransaction ({from:web3.eth.accounts[0], to: web3.eth.accounts[1], value: web3.toWei(1, "ether")}) > web3.eth.getBalance(web3.eth.accounts[0]) > web3.eth.getBalance(web3.eth.accounts[1])
Similar a clases en OOP
contract mortal is owned {}
Referencia a Internal Storage (Variables de estado) (Recordar account object)
1: Versión pragma
0.x.0`
or
x.0.0
pragma solidity ^0.4.0;
-2: Importando otros contratos:
import "filename";
Solidity permite los siguientes tipos por defecto:
Almacenadas en el storage asociado a cada account
contract demo { string public name = "buendiadas"; ....
Computación descentralizada en función de los inputs de la transacción.
function changeName(string _newName){ name = _newName; }}
Ejecución de condiciones previas a la ejecución de dicho contrato. Suelen utilizarse para generar restricciones
pragma solidity ^0.4.0;contract owned { function owned() { owner = msg.sender; } address owner; modifier onlyOwner { if (msg.sender != owner) throw; _; }}contract mortal is owned {}}
Computación descentralizada en función de los inputs de la transacción.
function changeName(string _newName){ name = _newName; }}
Log de Ethereum (Recordar blockchain structure). Permiten subir información externa a la blockchain, donde se almacena únicamente el hash.
event NameChanged(string _oldName, string _newName);function changeName(string _newName){ name = _newName; NameChanged(name, _newName); }}
contract MetaCoin { mapping (address => uint) balances; function MetaCoin() { balances[tx.origin] = 10000; } function sendCoin(address receiver, uint amount) returns(bool sufficient) { if (balances[msg.sender] < amount) return false; balances[msg.sender] -= amount; balances[receiver] += amount; return true; } function getBalance(address addr) returns(uint) { return balances[addr]; }}
A partir de los ejemplos mostrados en la definición de los diferentes componentes, escribir un SC (ENS) que :
A partir de el contrato anterior, crear un token que tenga las siguientes reglas económicas:
La especificación del estandard puede encontrarse en el siguiente link
https://github.com/Matchpool/contracts
¿Cómo asocia los Tokens?
¿Quién se queda el Ether que se recibe?
¿Qué periodos hay de precios?
¿Cuántos tokens hay en total?
¿Cuánto tiempo dura la ICO?
¿Cuánto dinero almacena el contrato?
Keyboard shortcuts
↑, ←, Pg Up, k | Go to previous slide |
↓, →, Pg Dn, Space, j | Go to next slide |
Home | Go to first slide |
End | Go to last slide |
Number + Return | Go to specific slide |
b / m / f | Toggle blackout / mirrored / fullscreen mode |
c | Clone slideshow |
p | Toggle presenter mode |
t | Restart the presentation timer |
?, h | Toggle this help |
Esc | Back to slideshow |