Hyperledger appka za 24 hodín alebo ako bolo na IBM Hackathon 2017

Každý nový jazyk, knižnica či framework je výzvou. O to viac, ak sa jedná o celú novú technológiu akou je napríklad Hyperledger. O Hyperledger blockchaine som čítal a myslím aj písal už skôr, no nikdy som nemal príležitosť ani čas ho výskúšať na nejakom príklade. Príležitosť prišla keď môj co-founder Jakub z projektu Paktos prišiel s nápadom prihlásiť sa na IBM hackathon.

 

O pár mesiacov skôr

Celé leto som trávil písaním o blockchain technológiách, ich testovaním a pripravovaním ethereum tutoriálov a keďže som jeden z tých typov ľudí, ktorí nedokážu obsedieť na zadku bez toho aby nezačali nejaký nový projekt alebo neoverovali si svoj nový nápad, pri písaní smart contractov som si uvedomil nejeden z “heuréka” nápadov. Jeden z nich mi zarezonoval v hlave dlhšie, preto som sa rozhodol vytvoriť jeho alfa verziu a celý jeho roadmap som nechal na náhodu. Projekt som nazval ViceVersa. V skratke, ide o digitalizovanie zmlúv a právnyh vzťahov medzi firmami a jednotlivcami, kde smart contracty slúžia ako escrow. V podstate ide o blockchain verziu reálnej zmluvy, napr. zmluvy o dielo, ktorá aby bola podpísaná, objednávateľ služby na ňu uloží prostriedky o ktorých zmluva hovorí a ktoré budú automaticky uvoľnené realizátorovy pod určitými podmienkami či po vykonaní diela. Zmluvu vytvorenú v systéme si vie uložiť aj ako PDF súbor reálnej zmluvy ktorú môže v prípade potreby či sporu použiť.
Keďže som programátor, dokázal som si MVP verziu pripraviť sám s použitím React + Redux front-endu, Firebase ako back-end a samozrejme smart contracty bežiace na Ropsten testnete. V tom čase ma kontaktoval Jakub Greguš ako čitateľ a oslovil ma s tým, či sa nechcem stretnúť a prebrať jeho projekt. Zistili sme, že pracujeme obidvaja na rovnakom projekte a po niekoľkých diskusiách sme sa rozhodli že najrozumnejšie bude zlúčiť sa dokopy pod jeden projekt a pracovať na ňom spolu. Keďže názov ViceVersa nieje z právneho hľadiska pre takýto projekt najvhodnejšou voľbou, zhodli sme sa na mene Jakubového projektu – Paktos.

 

24 hodín a nová alfa veriza

Klamal by som ak by som popieral že obidvaja sme hrdí na náš projekt a snažíme využiť každú príležitosť overiť si našu filozofiu v praxi. Takáto príležitosť sa naskytla na IBM hackathone. Súťažilo sa v dvoch kategóriách, prvá o najlepší projekt a druhá o najlepšie využitie IBM produktu Bluemix. Keďže sme mali naivnú predstavu o tom, že zázrakom dokážeme vyhrať obidve kategórie, rozhodoli sme sa hecnúť. Otvoril som si stránku IBM a hor sa do toho.  Najrpv som si vyskúšal ako Hyperledger composer vyzerá z pohľadu zdrojového kódu online na playgrounde s existujúcimi príkladmi a až potom som sa pustil do dokumentácie. Ak si otvoríte na playgrounde iba obyčajný sample project, dá vám to dostatočný prehľad o tom, ako asi funguje návrh siete, vzťahy medzi účastníkmi, permissions, transakcie a podobne. Využil som sample project a vystaval som si vlastnú štruktúru.

Snímka obrazovky 2017-10-28 o 3.15.50

Ako teda vyzerala naša alfa verzia? Rozhodli sme sa napojiť jednoduchú zmluvu o dielo na blockchain s tým, že ak je práca odovzdaná, prevedú sa peniaze z účtu objednávateľa na účet realizátora. Neukladal som všetky dáta zo zmluvy a jej plné znenie ale len dáta potrebné pre overenie. Vzťah medzi zmluvnými stranami určovalo IČO firmy alebo živnostníka, keďže aj ako v reálnom živote, je to unikátny identifikátor. Štruktúru som vyskladal podľa kódu nižšie. Úplne simple príklad, ale pre hackathon to úplne stačí.

namespace org.acme.delivery.legalcontract


enum DeliveryStatus {
  o CREATED
  o IN_PROGRESS
  o DONE
}

abstract transaction DeliveryTransaction {
    --> Delivery delivery
}

transaction ServiceReceived extends DeliveryTransaction {
}

asset Delivery identified by deliveryId {
  o String deliveryId
  o DeliveryStatus status
  o Long unitCount
  --> Contract contract
}

asset Contract identified by contractId {
  o String contractId
  o String investorBusinessName
  --> Investor investorIco
  o String investorDic
  o String investorIcdph
  o String investorAccountNumber
  o String investorBankName
  o String investorLegalRegisterNumber
  o String providerbusinessName
  --> Provider providerIco
  o String providerDic
  o String providerIcdph
  o String providerAccountNumber
  o String providerBankName
  o String providerLegalRegisterNumber
  o Double unitPrice
  o String createdAtPlace
  o DateTime deadlineDateTime
}

concept Address {
  o String city optional
  o String country
  o String street optional
  o String zip optional
}

abstract participant Business identified by ico {
  o String businessName
  o String ico
  o Address address
  o Double accountBalance
}

participant Provider extends Business {
}

participant Investor extends Business {
}

Keď už máme navrhnutý model siete, potrebujeme určiť ako sa majú správať transakcie. Našťastie sa tieto funkcie píšu v javascripte preto som vedel okamžite napísať, resp. upraviť už existujúcu funkciu do podoby, ktorú som potreboval.

/**
 * A service has been received by an investor
 * @param {org.acme.delivery.legalcontract.ServiceReceived} serviceReceived - the ServiceReceived transaction
 * @transaction
 */
function payOut(serviceReceived) {
    
        var contract = serviceReceived.delivery.contract;
        var delivery = serviceReceived.delivery;
        var payOut = contract.unitPrice;
    
        console.log('Received at: ' + serviceReceived.timestamp);
        console.log('Contract deadlineDateTime: ' + contract.deadlineDateTime);
    
        delivery.status = 'DONE';
    
        console.log('Payout: ' + payOut, contract);
        contract.providerIco.accountBalance += payOut;
        contract.investorIco.accountBalance -= payOut;
    
        console.log('Investor: ' + contract.investorIco.$identifier + ' new balance: ' + contract.investorIco.accountBalance);
        console.log('Provider: ' + contract.providerIco.$identifier + ' new balance: ' + contract.providerIco.accountBalance);
    
        return getParticipantRegistry('org.acme.delivery.legalcontract.Investor')
            .then(function (investorRegistry) {
                return investorRegistry.update(contract.investorIco);
            })
            .then(function () {
                return getParticipantRegistry('org.acme.delivery.legalcontract.Provider');
            })
            .then(function (importerRegistry) {
                return importerRegistry.update(contract.providerIco);
            })
            .then(function () {
                return getAssetRegistry('org.acme.delivery.legalcontract.Delivery');
            })
            .then(function (deliveryRegistry) {
                return deliveryRegistry.update(delivery);
            });
    }
    

 

V sekcii test si viete okamžite svoj kód otestovať ešte pred tým, ako ho zapracujete do projektu u seba na localhoste. V tomto momente máme fungujúcu sieť a je na čase dať jej pekný front-end. Aj v tomto prípade sme mali obrovské množstvo času ušetrené vďaka možnosti vygenerovať pomocou composera REST API a automaticky aj celý front-end postavený na JS frameworku Angular.

Nechcem tu moc popisovať návod ako na to keďže všetko je perfektne popísané v tejto dokumentácii. Ak prežijete úvodny setup dev environmentu u seba na PC, tak si môžete zagratulovať. Máte za sebou 70% cesty. Priznám sa, že pre mňa osobne to bol docela pain keďže NPM mi každú chvíľu vyhadzovalo nejakú chybu a neustále som musel niečo spätne fixovať.

Po prejdení celého tutoriálu som skopíroval môj navrhnutý kód z playgroundu do pripraveného workspacu a zbytok práce bol už veľmi jednoduchý. Vygeneroval som distribution file, ktorý som deployol na sieť z ktorej composer-rest-server vygeneroval celú API aj s dokumentáciou. Po otestovaní API cez Postman som jediným príkazom v terminále pomocou “yo hyperledger-composer” vyskladal celý fungujúci front-end ku ktorému som našiel peknú bootstrap tému a voilà, appka bola na svete. Priznám sa, že viac času som strávil pri setupe environmentu a CSSkách ako pri samotnej aplikácii.

Zdrojový kód k celej aplikácii aj s návodom ako ju rozbehať nájdete ako vždy, na mojom githube.

git clone https://github.com/OndroS/hyperledger_ibm_hackathon.git
Snímka obrazovky 2017-10-28 o 11.54.13
Úvodná strana aplikácie predstavovala dva samostatné účty, dvoch zmluvných strán, aby bolo hneď jasné, že transakcia prebehla.
Snímka obrazovky 2017-10-28 o 11.54.24
Sekcia pre správu vytvorených zmlúv. Celé sa to dalo spraviť aj krajšie bez toho, aby ID zmluvy musel zadávať užívateľ ručne a samozrejme ani ten zobrazený čas nieje moc user friendly, ale sme na hackathone a čas beží.
Snímka obrazovky 2017-10-28 o 11.54.34
Tu je už konkrétna zmluva. Netvrdím že je použiteľná ale pre ukážku funkcionality bohate stačila.
Snímka obrazovky 2017-10-28 o 11.54.52
Sekcia delivery slúži na označenie zmluvy, resp. nahlásenie dodania služby. Ak je delivery označené statusom DONE, je možné vykonať transakciu.
Snímka obrazovky 2017-10-28 o 11.55.09
Tu je už samotná transakcia.

 

 

 


 

Deň prezentácie

Celý IBM event sa nedá hodnotiť inak ako pozitívne. Spoznali sme celú kopu nových ľudí čiže o networking tam núdza nebola. Prekvapilo ma, že sa tam zozbierali ľudia z celej krajiny. Stretol som tam ľudí z Prešova, Košíc, Trenčína a kadejakých iných miest a konkurencia bola fakt veľká. No my sme dôverovali nášmu projektu a najmä technológii blockchain, že splní svoj “wow” efekt v ktorý sme dúfali.
Na to aby sa tento efekt dostavil, základom je dokonalá prezentácia. Začali sme ju pripravovať až nasledujúci deň ráno čo možno bola aj chyba, keďže sme stavili na minimalizmus z ktorého nakoniec porota nebola úplne nadšená. Všetko sme ale stihli pripraviť na čas. Prezentovanie mal na starosti Jakub. Čas na pódiu bol dokopy max. 8 minút s tým že 5 minút je pre prezentáciu a 3 minúty na Q&A od poroty. O 16:00 nás všetkých nahnali do Starej Tržnice na námestí SNP. Vôbec sme s Jakubom netušili, ako to bude vyzerať a čo nás tam bude čakať, no keď sme prešli dverami, docela mi zovrelo hrdlo.

22688428_10203822066910177_2114425394803050010_n

Sebecky som sa ale upokojil že prezentáciu ma na starosti Jakub a ja som len ten, ktorý odkliká appku(sorry Kubko nabudúce si to vymeníme sľubujem :P). Využili sme zostávajúci čas na to, aby sme si dookola prechádzali prezentáciu a nacvičili synchronizáciu s tým, čo kecá Jakub a čo ja ukazujem. Na to že Jakub prezentoval prvý krát musím uznať je že mu to šlo skvele. Nepíšem to len preto, že je to co-founder a že spolu pracujeme na projekte ale preto, lebo sám som pred rokmi videl seba ako mi to šlo na prezentácii v ImpactHUBe, čo je už ale iný vtipný príbeh.
Každý z tímov si vytiahol poradové číslo. My sme šli až trinásti v poradí. Bolo mi to ale viac-menej jedno. Niekto tvrdí že veľmi záleží na poradí projektu, aby úsudok poroty bol čo najčistejší ale vedel som, že keď sa preriedia na pódiu bullshity a ostane cca 7-8 ozaj serióznych projektov + náš wow efekt tak z toho možno niečo bude(ach tá naivita).

DSC_0033

22769940_10155254469577832_6702522438404315678_o

Nakoniec došlo k vyhodnoteniu. Nevyhrali sme nič a vôbec mi to nieje ľúto. Štvalo by ma to len vtedy ak by to vyhrali tie bullshit-projekty ale cenu za najlepšie využitie IBM technológie vyhral tím s celkom premakanou nutričnou appkou a hlavnú cenu vyhral zdravotnícky projekt. Napísal by som o nich viac ale vôbec si už nespomínam o čo tam šlo. Týmto zároveň aj gratulujem víťazom ak to náhodou čítajú.

 

Ďalšie kroky a budúcnosť projektu

Hackathon nám ukázal čo robiť a čo nerobiť keď už sme sa rozhodli súťažiť. Dôležité ale bude odložiť hyperledger bokom a vrátiť sa k pôvodnej alfa verzii. Ako som sa už niektorým z vás stihol na poslednom meetupe pochváliť, som involvnutý ako Lead Blockchain & Smart Contracts Developer na jednom ethereovom projekte Bethereum. Mám na starosti prípravu a organizáciu ICO z technickej stránky + vývoj samotnej crypto časti aplikácie, čo je obrovská zodpovednosť a 100% sústredenia musí ísť smerom k projektu Bethreum. Je to zároveň aj taká moja vlastná premiéra v crypto svete ktorá verím že dopadne skvele. O Bethereu chystám článok aj na môj blog no ak by to niekeho zaujímalo viac, nech sleduje Bethreum blog na medium kde pravidelne budem prispievať. Projektu Paktos v najbližších mesiacoch sa budem môcť venovať len okrajovo, no verím že po finalizovaní ICO na Bethereu dostane časom aj projekt Paktos boost ako sa patrí.

 

Záver

Celá to bola skvelá skúsenosť a najmä to malo svoj zmysel v rámci evanjelizácie o blockchain technológiách a jej obrovskom potenciále. Musíme si uvedomiť najmä my, kreatívci a programátori, že stále sme len na začiatku niečoho veľkého. Teraz je čas tvoriť a experimentovať. Pamätajte na tieto slová z tohto blogu, že možno o rok, o dva, vám bude zo slova blockchain rovnako zle ako keď vám niekto povie že je startupista.

Týmto pozdravujem dvoch UBER vodičov, ktorým som stihol za tých 24 hodín dať prednášku.


Ak ťa zaujíma ako spraviť vlastnú dappku, zační týmto tutoriálom:

#1 Ethereum DApp Tutorial: Intro do Smart Contractov

Pokiaľ ťa zaujíma ako funguje ICO, tu som o tom niečo napísal:

Tutoriál: Stručný sprievodca spustením ICO

 

Related Posts