ABONAMENTE VIDEO REDACȚIA
RO
EN
NOU
Numărul 150
Numărul 149 Numărul 148 Numărul 147 Numărul 146 Numărul 145 Numărul 144 Numărul 143 Numărul 142 Numărul 141 Numărul 140 Numărul 139 Numărul 138 Numărul 137 Numărul 136 Numărul 135 Numărul 134 Numărul 133 Numărul 132 Numărul 131 Numărul 130 Numărul 129 Numărul 128 Numărul 127 Numărul 126 Numărul 125 Numărul 124 Numărul 123 Numărul 122 Numărul 121 Numărul 120 Numărul 119 Numărul 118 Numărul 117 Numărul 116 Numărul 115 Numărul 114 Numărul 113 Numărul 112 Numărul 111 Numărul 110 Numărul 109 Numărul 108 Numărul 107 Numărul 106 Numărul 105 Numărul 104 Numărul 103 Numărul 102 Numărul 101 Numărul 100 Numărul 99 Numărul 98 Numărul 97 Numărul 96 Numărul 95 Numărul 94 Numărul 93 Numărul 92 Numărul 91 Numărul 90 Numărul 89 Numărul 88 Numărul 87 Numărul 86 Numărul 85 Numărul 84 Numărul 83 Numărul 82 Numărul 81 Numărul 80 Numărul 79 Numărul 78 Numărul 77 Numărul 76 Numărul 75 Numărul 74 Numărul 73 Numărul 72 Numărul 71 Numărul 70 Numărul 69 Numărul 68 Numărul 67 Numărul 66 Numărul 65 Numărul 64 Numărul 63 Numărul 62 Numărul 61 Numărul 60 Numărul 59 Numărul 58 Numărul 57 Numărul 56 Numărul 55 Numărul 54 Numărul 53 Numărul 52 Numărul 51 Numărul 50 Numărul 49 Numărul 48 Numărul 47 Numărul 46 Numărul 45 Numărul 44 Numărul 43 Numărul 42 Numărul 41 Numărul 40 Numărul 39 Numărul 38 Numărul 37 Numărul 36 Numărul 35 Numărul 34 Numărul 33 Numărul 32 Numărul 31 Numărul 30 Numărul 29 Numărul 28 Numărul 27 Numărul 26 Numărul 25 Numărul 24 Numărul 23 Numărul 22 Numărul 21 Numărul 20 Numărul 19 Numărul 18 Numărul 17 Numărul 16 Numărul 15 Numărul 14 Numărul 13 Numărul 12 Numărul 11 Numărul 10 Numărul 9 Numărul 8 Numărul 7 Numărul 6 Numărul 5 Numărul 4 Numărul 3 Numărul 2 Numărul 1
×
▼ LISTĂ EDIȚII ▼
Numărul 73
Abonament PDF

Ethereum și Smart Contracts

Ovidiu Mățan
Fondator @ Today Software Magazine



PROGRAMARE


Cu toate că în viața de zi cu zi, suntem din ce în ce mai familiarizați cu știrile despre monedele digitale, acestea sunt pentru majoritatea dintre noi, ceva destul de greu de definit și mai degrabă aflate în sfera mitului. Cei mai pragmatici și mânați de dorința unor câștiguri rapide sunt primii care au perceput dimensiunea lor realistă și plină de avantaje economice și s-au decis să cumpere monedele virtuale. Din păcate, faptul că aceste monede au fost private de platforme software care să ofere o securitate solidă, a avut ca efecte negative numeroase pierderi și tot atâtea dezamăgiri. Pe de altă parte, a te raporta la monedele virtuale doar ca la un nou instrument speculativ financiar, ar însemna să le ignori potențialul major de a dezvolta un internet descentralizat. Valoarea lor constă în primul rând în maniera de a le folosi independent de băncile centrale și în afara contextelor naționale și regionale. La aceasta trebuie adăugată și calitatea de a putea programa ce se întâmplă cu ele.

Articolul de față vă oferă o modalitate practică de a face primii pași către Ethereum și de crea un Smart Contract. Acestea sunt aplicații executate în blockchain prin intermediul cărora puteți să vă manipulați monedele și chiar să creați anumite categorii de jocuri cum ar fi cele piramidale, loterii, quizuri. Abordarea de față este una practică, o introducere în lumea Ethereum. Dacă doriți să descoperiți mai multe, vă recomand să citiți Building Games with Ethereum Smart Contracts.

Pentru a fi pe aceeași platformă, vom începe prin pornirea unei mașini virtuale folosind Vagrant. Vom seta o imagine de Ubuntu.

Setup Vagrant

Descărcați și instalați VirtualBox și Vagrant. Primul pas este să creăm o instanță de Ubuntu folosind configurarea vagrant de mai jos:

Vagrant.configure("2") do |config|
 config.vm.box="ubuntu/trusty64"
 config.vm.provider "virtualbox"
    do |v|
       v.memory = 8024 
       v.cpus = 2
    end

Pornim mașina virtuală : vagrant up și ne conectăm la aceasta cu vagrant ssh. Folderul /vagrant din mașina virtuală va fi sharuit cu OS-ul gazdă. Mergem în acest folder și instalăm NodeJS:

cd /vagrant
install nodeJS - sudo apt-get install nodejs npm

Continuăm cu instalarea compilatorului Solidity, limbajul în care vom scrie smart contractul nostru.

sudo npm install -g solc

în cazul în care apare o eroare, vă recomand să rulați următoarea comandă npm config set strict-ssl false și să reîncercați instalarea.

Geth

Este un client capabil să ruleze un nod în Ethereum. Acesta este implementat în Go și putem să îl folosim în trei moduri: linie de comandă, un server json - RPC și ca o consolă. Odată instalați, geth poate fi folosit pentru mining, transferul de monede, crearea de smart contracts și multe altele. Instalăm clientul astfel:

sudo apt-get install software-properties-common
sudo addd-apt-repository -y ppa:ethereum/Ethereum
sudo adpt-get update
sudo adpt-get install Ethereum

Truffle

Este un framework de dezvoltare, testare și deployment pentru Ethereum. Noi îl vom folosi pentru a face deploy la smart contractul nostru. Instalăm Truffle:

sudo npm install -g truffle

Verificăm dacă versiunea de NodeJS : node -version este cel puțin 8, în caz contrar vor apărea erori. În cazul în care avem altă versiune de NodeJS, rulăm următoarele:

curl -sL https://deb.nodesource.com/setup_8.x 
     | sudo -E bash -
sudo apt-get update
sudo apt-get install nodejs

Haideți să cream un folder de lucru truffle și să pornim consola

mkdir truffle
cd truffle
truffle init
truffle develop

Vom testa primul script de migrare, astfel sunt denumite scripturile de deployment:

truffle(develop)\> migrate
truffle(develop)\> .exit

Sincronizarea nodurilor Ethereum

Pentru a putea adăuga un smart contract în blockchain va trebui să sincronizăm nodurile Ethereum în modul full din Mainnet:

geth console
geth -fast -cache=1024

Va trebui să aveți aproximativ 128 GB liberi pe o partiție SSD, iar tot acest proces poate dura 10 ore. Deoarece partiția Vagrant instalată are în mod standard doar 40GB, va trebui să realizăm câteva trickuri. Vedeți următoarea secțiune: Redimensionarea și mutarea partiției Virtual Box .

Într-o consolă separată, lansați comanda de sincronizare a rețelei de test Rinkeby:

geth -rinkeby -port 31303

Redimensionarea și mutarea partiției VirtualBox

O problemă frecventă care poate să se manifeste este să nu avem spațiu în mașina virtuală. Dacă sunteți pe Windows, găsiți folderul VirtualBox și lansați o consolă acolo. Primul pas este să convertim diskul virtual în format VDI:

vagrant halt
VBoxManage clonehd "C:\\Users\\Ovidiu\\VirtualBoxVMs\\vm\_default\_1531041167356\_31836\\box-disk1.vmdk" "e:\\vm\\cloned.vdi" -format vdi

Putem să folosim această comandă și pentru a muta fișierul pe o altă partiție unde avem suficient spațiu. Urmează să modificăm dimensiunea partiției la 128 GB:

VBoxManage modifyhd "e:\\vm\\cloned.vdi" --resize 131072

La final, va trebui să deschidem VirtualBox și în configurările mașinii virtuale folosite, să ștergem vechiul disk și să îl adăugăm pe cel nou. Verificăm totul prin pornirea vagrant și prin examinarea spațiului cu comanda df.

Crearea unui cont

Folosim pentru aceasta, Geth de unde vom putea crea conturi noi pe rețeaua principală: Mainnet sau pe cea de test Testnet. Versiunea rețelei de test se numește acum Rinkeby. Cele două rețele se comportă similar, singura diferență este că în cea de test monedele virtuale nu au valoare.

Mainnet

vagrant@vagrant-ubuntu-trusty-64:~$ geth account new
INFO [07-12|10:00:12.441] Maximum peer count ETH=25 LES=0 total=25
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase:
Repeat passphrase:
Address: {2b6992db21136fbf6f90d56263af2dda19319388}

Putem să ne creăm un cont nou și din consola geth astfel:

> personal.newAccount("parolaSigură")
"0x55b89b75982702ebf0ccc05a34c8469945cdea9f"

Va trebui să alegeți o parolă puternică deoarece acesta va fi singurul mod de a vă accesa contul. De asemenea, oricine va putea să încerce să vă ghicească parola. Puteți merge acum pe https://www.etherchain.org/ de exemplu și să vă verificați contul. Totodată veți putea să vă uitați și la alte conturi ce au realizat tranzacții. Bineînțeles că toate datele sunt anonime iar legătura cu numele unui titular de cont nu poate fi realizată.

Un mic hint, dacă în anumite tooluri nu este validată adresa contului, adăugați 0x în față. Acesta prefix vine de la reprezentarea în hexazecimal. În același fel, va fi afișat și în consola geth:

geth --verbosity 0 console
Welcome to the Geth JavaScript console!

instance: Geth/v1.8.12-stable-37685930/linux-amd64/go1.10
coinbase: 0xfa25bcba7e194a9c6ce3d5049bb22489c4c3d696

Aici putem să listăm conturile existente:

> eth.accounts
["0xfa25bcba7e194a9c6ce3d5049bb22489c4c3d696", "0xbcaafe6b1aa4fdcf4a90880bb0251bc77e4c3993", "0x3a566b131e736ca9e9eeb5f00adfca51726ffc7f", "0x55b89b75982702ebf0ccc04a34c8469945cdea9f", "0x2b6992db21136fbf6f90d56263af2dda19319388"]

Verificăm balanța contului:

> eth.getBalance(eth.accounts[0])
0

sau folosind direct numele contului

> eth.getBalance("0xfa25bcba7e194a9c6ce3d5049bb22489c4c3d696")
0

Testnet

Față de mainnet, pentru crearea unui cont pe Testnet va trebui să ne conectăm la rețeau Rinkeby:

$ geth --rinkeby --port 31303 -verbosity 0 console
Welcome to the Geth JavaScript console!

instance: Geth/v1.8.12-stable-37685930/linux-amd64/go1.10
coinbase: 0x7179cd407b2ee5e949f4d0969d02e5f050ddb00d
at block: 2621501 (Thu, 12 Jul 2018 10:50:01 UTC)
 datadir: /home/vagrant/.ethereum/rinkeby
 modules: admin:1.0 clique:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

Odată conectați putem crea un cont nou la fel ca și pentru mainnet:

> personal.newAccount("parolaSigură")

Pentru a adăuga câteva monede de test în cont, vom merge la https://faucet.rinkeby.io/ și va trebui să dăm share la numele contului pe o rețea de socializare după care să cerem Etherium de test folosind link-ul la mesaj.

Vom copia linkul mesajului și vom cere Ethereum de test. După ce am adăugat monedele, putem reveni la consola Geth și să verificăm prezența acestora:

> eth.getBalance(eth.accounts[0])
3000000000000000000

Transferul între conturi

Prima oară ne vom autentifica în contul din care dorim să facem transferul:

> personal.unlockAccount(eth.accounts[0],"parolaSigura")
true

După aceasta, vom realiza un transfer către un alt cont de test.

> eth.sendTransaction({
from: eth.accounts[0],
to: eth.accounts[1],
value:1e16
gas:90e3
gasPrice:20e9
> eth.getBalance(eth.accounts[1])
10000000000000000
> eth.getBalance(eth.accounts[0])
2989580000000000000
>

Primul Smart Contract

Vom crea un smart contract care răspunde doar la comanda Hello

pragma solidity ^0.4.15;

contract HelloWorld {
    address owner;
 string msg = "Hello World";

 // Constructor function
 function HelloWorld () public {
     owner = msg.sender;
 }

 function message() constant public returns (string){
     return msg;    
 }

 function kill () public {
     require(owner == msg.sender);
     selfdestruct(owner);
 }
}

Un modalitate simplă de a rula un SmartContract este prin folosirea toolului Truffle. Vom folosi în continuare Geth în calitate de client Etherium.

În folderul /Vagrant vom crea un folder truffle și vom instala frameworkul:

sudo npm install -g truffle

După care rulăm inițializarea

truffle init
truffle develop

Putem rula și primul test de deployment prin rularea comenzii migrate în consolă

truffle(development)> migrate

Ieșim din consolă (ctrl-c de două ori) și putem observa directoarele create. Ne interesează migrate unde vom adăuga fișierele de migrare și contracts unde vom adăuga Smart contracturile. Dar înainte de aceasta, va trebui să creăm un fișier de migrare:

var HelloWorld = artifacts.require(
   "./HelloWorld.sol");

var fs = require('fs');
module.exports = function(deployer, network) {

    // unlock account for geth
    if (network == "rinkeby" || network == "mainnet") {
        var password = "parolaSigură"
        web3.personal.unlockAccount(
          web3.eth.accounts[0], password)
    }

    deployer.deploy(HelloWorld);
}; 

Înlocuiți password cu parola contului dvs. și putem continua. Fișierul îl vom salva cu numele 2_helloworld.js în folderul migration iar codul de mai sus pentru Smart Contracts îl vom salva într-un fișier numit HelloWorld.sol în folderul contracts.

Deploymentul se va realiza în felul următor:

geth --rinkeby --rpc --rpcapi personal,web3,eth,net --port 31303 -verbosity 0 console
truffle migrate -f 2 --network rinkeby

Rezultatul este următorul:

$ truffle migrate -f 2 --network rinkeby
Using network 'rinkeby'.

Running migration: 2_hello_world.js
  Deploying HelloWorld...
  ... 0x779b0299dca015a9f070fa2cdca5b92a8c5c798911303343e3a53825b47ad369
  HelloWorld: 0x41ef886e796a4f63c5f573dc88f68ab0e02cd895  HelloWorld: 0x41ef886e796a4f63c5f573dc88f68ab0e02cd895
Saving artifacts...

În continuare, vom chema metoda greet() în consola Truffle:

truffle(development)> HelloWorld.at(
"0x41ef886e796a4f63c5f573dc88f68ab0e02cd895").greet()

unde referința o veți înlocui cu rezultatul final al migrării voastre. Putem de asemenea, să creăm o referință la contract pentru a chema mai ușor metodele:

> contract=
    "0x366b20052081548f8152fc2d010d8574730d1aa0"
> hw=HelloWorld.at(contract)
> hw.message()
'Hello World'

Putem să ștergem aplicația, dar pentru a realiza acest lucru, este important să ne autentificăm:

> web3.personal.unlockAccount(web3.eth.accounts[0], "ceck123")
true
> hw.kill()

Concluzie

Etherium și blockchain sunt o tehnologie spectaculoasă aflate la început și care ne conduc către noi paradigme de dezvoltare software. Fiecare programator ar trebui să înțeleagă tehnologia care stă în spatele acestora din perspectiva unei bune culturi generale în programare. În articolul următor, voi prezenta un caz mai complex de smart contracts.

NUMĂRUL 149 - Development with AI

Sponsori

  • Accenture
  • BT Code Crafters
  • Accesa
  • Bosch
  • Betfair
  • MHP
  • BoatyardX
  • .msg systems
  • P3 group
  • Ing Hubs
  • Cognizant Softvision
  • Colors in projects