ABONAMENTE VIDEO TESTE REDACȚIA
RO
EN
×
▼ 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.

Sponsori

  • ntt data
  • 3PillarGlobal
  • Betfair
  • Telenav
  • Accenture
  • Siemens
  • Bosch
  • FlowTraders
  • MHP
  • BCR
  • Itiviti
  • Connatix
  • UIPatj
  • MicroFocus
  • Colors in projects