Bystroushaak's blog / Czech section / Crypto / Ethereum prakticky

Ethereum prakticky

Zhruba před rokem jsem tu psal (Ethereum) o nové, „revoluční“ technologii nazvané Ethereum. Tenkrát se ještě nejednalo o nic víc, než teorii a pár „proof of concept“ ukázek. Zhruba před čtrnácti dny bylo však Ethereum spuštěno ve Frontier verzi, což se dá považovat za veřejnou betu. Dnes se tudíž můžeme podívat, jak to vypadá prakticky.

Rekapitulace

Můj oblíbený, a většině smrtelníků nicneříkající elevator pitch je:

Na konsenzu založený virtuální stroj a měna používající decentralizovanou technologii blockchainu.

Ethereum je technologie postavená nad blockchainem, tedy sdílenou databází, kde o transakcích a úkonech nad touto databází hlasuje celá síť. Oproti kryptoměnám se však nejedná jen o další druh „peněz“, protože přináší navíc koncept „smart contracts“, tedy „chytrých kontraktů“.

Tyto kontrakty jsou v podstatě miniaturní programy běžící v gigantické virtuální mašině, kterou mezi sebou sdílí a vykonává celá síť. Kontrakty můžou mít vlastní adresu, na a z které je možné posílat ether - jednotku virtuální měny.

Těžaři kromě běžného Proof of Work algoritmu a zpracování transakcí mezi účty také vyhodnocují běh této virtuální mašiny stejně jako transakce, tedy hlasováním o dalším stavu.

Aby se to těžařům vyplatilo, dostávají od sítě zaplaceno za běh virtuální mašiny „gasetherů za každou proběhlou instrukci, každý uložený bajt a každou poslanou zprávu. Gas je nastavený tržně, samotnými těžaři.

Kontrakty nemohou běžet do nekonečna - typicky se aktivují s příchozí transakcí a běží pouze dokud nespálí gas, který mají k dispozici.

Výhoda kontraktů spočívá ve faktu, že jednou nahrané do blockchainu se již nedají měnit a tedy je zaručeno, že dojde k jejich vykonání. Zdrojový bajtkód (a někdy i kompletní zdrojáky) je přitom dostupný všem a všichni si tedy mohou ověřit, že kontrakt dělá co deklaruje že dělat má.

K čemu to?

Díky této vlastnosti je možné implementovat netriviální systémy vyžadující důvěru. Automatizované směnárny, banky, úložny peněz, distribuované organizace (Entity), kasína, tržiště, volební systémy a tak dále.

Všechny tyto systémy byly v minulosti implementovány jako blackboxy, které tvrdily, že nepodvádí, neměli jste ale žádnou možnost podvodu zabránit, či ověřit, že skutečně pracují a za každých okolností (i pod nátlakem) budou pracovat jak deklarují. To s Ethereem nyní neplatí, neboť na kontrakty se můžete spolehnout.

Kromě toho je samozřejmě kontrakt turingovsky kompletní, což znamená, že v něm můžete naprogramovat cokoliv chcete. Typickou ukázkou jsou třeba jmenné registry ala DNS implementované jako key:val storage, která na příchozí transakci odpoví překladem key na val.

Tím však možnosti rozhodně nekončí, protokol totiž podporuje nízké datové toky pro tenké klienty. Díky tomu je možné zabudovávat podporu například do různých miniaturních zařízení, kde Ethereum slouží jako distribuovaná platforma zajišťující komunikaci (představte si třeba email či jabber postavený nad Ethereem).

Aby toho všeho nebylo málo, celé Ethereum je vymyšleno a implementováno velmi chytře, s matematickými důkazy, Merkle Patricia stromy, automatickým tržním balancováním a tak dále. Dá se více/méně spolehnout, že autoři mysleli na všechno a pokud si u něčeho na laické úrovni říkáte „to přece nemůže fungovat“, nebo „tady je určitě chyba a proto to přestane fungovat“, autoři s tím počítali a problém řeší v samotném zárodku.

Současný stav

V současné době se technologie nachází v takzvaném Frontier stavu. Jedná se o veřejnou betu, která (oproti původním prohlášením a očekáváním) funguje již v plnohodnotném módu (tedy 100% těžení[1, 2]), není však příliš vhodná pro obyčejné uživatele.

Většina softwaru je v současné době ovladatelná čistě z příkazové řádky, často velmi složitě (javascript konzole) a můžete narazit na nejrůznější bugy. Blockchain se již ale měnit nebude, tedy všechny ethery které získáte na Frontieru vám zůstanou i do budoucna.

Poté co budou odladěny bugy a vznikne uživatelsky příjemný software bude následovat fáze Homestead, během které lze předpokládat nárůst uživatelů. V této fázi by již nemělo hrozit, že dojde k nějakému problému, či větší změně.

Po fázi Homestead bude následovat fáze Metropolis, která předpokládá možnost plnohodnotného použití netechnickými osobami. Grafické nástroje, mobilní peněženky, etheromaty, eshopy a tak podobně.

Existuje ještě jedna fáze Serenity, která teoreticky může přinést změnu Proof of Work algoritmu, který je používaný při hlasování o konsenzu, na něco použitelnějšího a méně zbytečného. Samotných uživatelů by se to ale mělo dotknout minimálně.

Instalace

Proces instalace základní sady programů go implementace (existují i C++, python a další) je popsán na githubu, v sekci Building Ethereum.

Sám používám Linux Mint a na serverech Ubuntu, budu se tedy věnovat pouze Ubuntu verzi. Instalaci započneme přidáním PPA do systému:

sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo add-apt-repository -y ppa:ethereum/ethereum-dev
sudo apt-get update
sudo apt-get install ethereum ethminer

Programy

Instalací jsme získali několik programů, ze kterých nás nejvíc zajímá dvojice geth a ethminer.

geth

geth slouží jako miner, ale i jako základní uživatelský klient. Po svém spuštění zahájí synchronizaci se sítí. K dispozici dává JavaScriptovou konzoli a také RPC API.

Úplně nejzákladnějším krokem hned po instalaci je vytvoření nového účtu následujícím příkazem:

$ geth account new
 
=======================================
Disclaimer of Liabilites and Warranties
=======================================
 
THE USER EXPRESSLY KNOWS AND AGREES THAT THE USER IS USING THE ETHEREUM PLATFORM AT THE USER’S SOLE
RISK. THE USER REPRESENTS THAT THE USER HAS AN ADEQUATE UNDERSTANDING OF THE RISKS, USAGE AND
INTRICACIES OF CRYPTOGRAPHIC TOKENS AND BLOCKCHAIN-BASED OPEN SOURCE SOFTWARE, ETH PLATFORM AND ETH.
THE USER ACKNOWLEDGES AND AGREES THAT, TO THE FULLEST EXTENT PERMITTED BY ANY APPLICABLE LAW, THE
DISCLAIMERS OF LIABILITY CONTAINED HEREIN APPLY TO ANY AND ALL DAMAGES OR INJURY WHATSOEVER CAUSED
BY OR RELATED TO RISKS OF, USE OF, OR INABILITY TO USE, ETH OR THE ETHEREUM PLATFORM UNDER ANY CAUSE
OR ACTION WHATSOEVER OF ANY KIND IN ANY JURISDICTION, INCLUDING, WITHOUT LIMITATION, ACTIONS FOR
BREACH OF WARRANTY, BREACH OF CONTRACT OR TORT (INCLUDING NEGLIGENCE) AND THAT NEITHER STIFTUNG
ETHEREUM NOR ETHEREUM TEAM SHALL BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR
CONSEQUENTIAL DAMAGES, INCLUDING FOR LOSS OF PROFITS, GOODWILL OR DATA. SOME JURISDICTIONS DO NOT
ALLOW THE EXCLUSION OF CERTAIN WARRANTIES OR THE LIMITATION OR EXCLUSION OF LIABILITY FOR CERTAIN
TYPES OF DAMAGES. THEREFORE, SOME OF THE ABOVE LIMITATIONS IN THIS SECTION MAY NOT APPLY TO A USER.
IN PARTICULAR, NOTHING IN THESE TERMS SHALL AFFECT THE STATUTORY RIGHTS OF ANY USER OR EXCLUDE
INJURY ARISING FROM ANY WILLFUL MISCONDUCT OR FRAUD OF STIFTUNG ETHEREUM.
 
Do you accept this agreement? [y/N] y
 
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase:
Repeat Passphrase: 
Address: {797e99024a03481ad2a00ffe9c98fe145c817969}

Výsledek si hned můžete zkontrolovat:

$ geth account
Account #0: {797e99024a03481ad2a00ffe9c98fe145c817969}

Jak vidíte, v systému mám nyní nový účet s adresou 797e99024a03481ad2a00ffe9c98fe145c817969. Tato adresa se často zadává s předponou určující její hexadecimálnost, tedy 0x.

Jakmile mám adresu, můžu si na ní nechat poslat ethery, či obecně transakce, posílat transakce z ní, dívat se na stavy ostatních účtů, vytvářet kontrakty a také těžit.

ethminer

ethminer je podstatně jednodušší program než geth, protože jak už název napovídá, umožňuje jen těžit. Zde je ukázka příkazu pro poolové těžení na mém procesoru pomocí 5 threadů:

$ ethminer -t 5 -F http://us1.ethpool.org/miner/0x797e99024a03481ad2a00ffe9c98fe145c817969/0.1

Pool funguje tak, že jakmile dosáhne vytěžená hodnota 1 etheru, je poslána na adresu uvedenou v URL (všimněte si 0x na začátku). Poslední parametr označuje požadovanou difficulty, v tomto případě 0.1, tedy na 100kHash/s.

Těžení na procesoru není moc výhodné, proto je zde parametr -G. K tomu aby vám však fungoval potřebujete správnou konstelaci výkonné grafiky, podporovaných ovladačů, OpenCL, Venuše s Merkurem, sudiček u kolébky a I-ťingu. Pokud jí nemáte, bude vám to shazovat Xka a vyhazovat roztomilou hlášku:

[OPENCL]:No OpenCL platforms found
No GPU device with sufficient memory was found. Can't GPU mine. Remove the -G argument

Těžení na grafice je přibližně 10 - 50x výkonnější. Pokud se vám s tím nechce moc experimentovat, je zde také možnost koupit si na amazonu EC2 instanci s výkonnou grafikou, která funguje přibližně na 9MHash/s. Detaily instalace viz ETHEREUM CLOUD MINING FOR DUMMIES. Den běhu / jeden ether v pool těžení vás tam podle mého experimentu vyjde na přibližně 14 dolarů.

Použití geth

Předpokládám, že jste si nainstalovali geth. Pokud jste dobrodruzi, tak jste možná i spustili příkaz geth console a byli zavaleni tunou neustále se updatujících hlášek. Co teď s tím?

Otevřete si dva terminály. V prvním spusťte konzoli s přesměrováním:

$ geth console 2>geth.log
instance: Geth/v1.0.1/linux/go1.4.2
 datadir: /home/bystrousak/.ethereum
coinbase: 0x797e99024a03481ad2a00ffe9c98fe145c817969
at block: 76287 (2015-08-13 00:17:27)
 modules: admin:1.0 db:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 shh:1.0 txpool:1.0 web3:1.0
>

Ve druhém si pak můžete pustit synchronizační zprávy:

tail -f geth.log

Pokud by se vám geth nechtěl synchronizovat a vyhazoval v synchronizačním logu spoustu hlášek jako „Synchronisation failed: block downloading canceled (requested)“ a tak, vypněte konzoli, spusťte geth upgradedb, počkejte než skončí a zase jí zapněte. Tohle se stává typicky po upgrade na novou verzi.

Nyní jste tedy v konzoli. Dobré. Co s tím?

Stav účtu

Úplně nejzákladnější je příkaz na zjištění stavu účtu. Jedná se o JavaScriptovou konzoli, celý příkaz je tedy v JavaScriptu:

> web3.fromWei(eth.getBalance(eth.coinbase), "ether")
'18.27723449'

Jak můžete vidět, mám na účtu momentálně přesně 18.27723449 etherů, které jsem koupil za přibližně 500kč (0.07BTC) ve středu 12.8.2015. „Příkaz“ se skládá ze dvou funkcí a dvou konstant:

Funkce web3.fromWei() konvertuje částku ve wei (nejnižší jednotka, 10-18 etheru) na ethery, resp. na hodnotu zadanou string konstantou v druhém parametru ("ether" v tomhle případě). Pokud bych použil samotné eth.getBalance(eth.accounts[0]), dostal bych hodnotu 18277234490000000000, což je kapku nepřehledné.

eth.coinbase je by default pointer na eth.accounts[0].

Poslání etherů

Příjem je jednoduchý a stačí vám k němu pouze adresa. Jak na odeslání peněz?

> eth.sendTransaction({from:eth.coinbase, to:"0x685628357ea28e77263ea037e2fad6d34e59ab10", value: web3.toWei(0.05, "ether")})

Jedná se o příkaz v konzoli, zde jsem ho pro přehlednost rozepsal:

eth.sendTransaction({
    from:eth.coinbase,
    to:"0x685628357ea28e77263ea037e2fad6d34e59ab10",
    value: web3.toWei(0.05, "ether")
})

Jak je možné vidět, k odesílání etherů slouží funkce eth.sendTransaction(), která očekává jako parametr slovník sestávající se z klíčů from, to a value (ve wei).

Poté co funkci odešlete do konzole vás geth vyzve k zadání hesla, které jste nastavili v době generování adresy a vrátí jako návratovou hodnotu ID transakce:

Please unlock account 797e99024a03481ad2a00ffe9c98fe145c817969.
Passphrase: 
Account is now unlocked for this session.
"0x0129afe425d6eab2aef3e55834bac8e11ccffa35dc77feb1b87dd6d55b340cd6"
(Na webu https://etherscan.io/ pak můžete vidět, že transakce skutečně odešla.)

a na druhém počítači:

$ geth console 2>geth.log 
instance: Geth/v1.0.1/linux/go1.4.2
 datadir: /home/bystrousak/.ethereum
coinbase: 0x685628357ea28e77263ea037e2fad6d34e59ab10
at block: 28709 (Mon, 03 Aug 2015 21:30:02 CEST)
modules: admin:1.0 db:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 shh:1.0 txpool:1.0 web3:1.0
> web3.fromWei(eth.getBalance(eth.coinbase), "ether")
0.05

Zde si můžete všimnout „divného“ čísla bloku a datumu. Jedná se o geth na serveru, kde jsem geth nainstaloval nově (proto to nízké číslo bloku), přesto se téměř okamžitě synchronizoval se sítí.

JavaScript API

Kompletní popis celého dostupného JavaScriptového API se dá najít opět na GitHubu: Management API Reference. Zde zmíním jen ty části, které mi přijdou nejdůležitější.

personal

Objekt personal vám umožňuje manipulovat s vaší peněženkou. Názvy jsou docela samopopisné:

miner

Jak už název napovídá, miner vám umožňuje kontrolovat geth miner zevnitř. geth ovšem neumí těžit v poolu, takže to není zas tak moc užitečné.

Zajímavé jsou hlavně první tři, které vám umožňují spustit a zastavit miner a zjistit kolik váš procesor dává hashrate (v H/s). Pokud chcete těžit, potřebujete taky DAG, takže doporučuji zavolat miner.startAutoDAG(), nebo geth spouštět s parametrem --autodag.

Někomu také může přijít zajímavý parametr miner.setExtra("extra data"), který do každého vytěženého bloku přidá "extra data" jako podpis. Ty se pak zobrazují v různých přehledech bloků a tak, ale k ničemu praktickému to imho není.

web3

web3 zpřístupňuje všechno možné JavaScriptové API vhodné pro psaní a práci s kontrakty. Jsou tam desítky funkcí, kompletní přehled najdete zde: Web3 Javascript Ðapp API Reference.

net

net je zkratka pro web3.net, jenž vám umožňuje zjišťovat základní info o síti.

První vrací počet připojených peerů (0 = nesynchronizujete se), druhý true v případě že jste připojeni.

eth

eth je opět zkratka, tentokrát pro web3.eth. Jak je vidět, nachází se toho zde opravdu hodně:

Co vás bude pravděpodobně zajímat je:

Kde a jak získat ethery

Nejjednodušší cesta je momentálně přes Bitcoin. Ti co jsou z Prahy, či ostatních měst kde se nacházejí bitcoinomaty (Plzeň, Brno a Ostrava) to mají lehké; stačí jim přijít k bitcoinomatu, nakrmit ho penězi a získané Bitcoiny pak směnit na jedné z burz za Ethereum. Samotného mě překvapilo, jak moc jednoduché to je, zhruba na úrovni použití běžného bankomatu a tak si troufám tvrdit, že to zvládne opravdu každý.

Pokud bitcoiny, či bitcoinomat poblíž nemáte, můžete se poohlédnout po burze, která bude brát třeba převody z karty, z účtu na účet, či pomocí paypalu. Zde se již nemusíte omezovat na Bitcoin, ale můžete takhle zkusit koupit rovnou ether.

Jestliže by se vám nechtělo ani do tohohle, pořád ještě máte možnost si nějaké ty ethery poctivě vytěžit, pokud tedy máte vhodný hardware.

Burzy

Burz momentálně existuje několik a dá se říct, že jen přibývají. Kompletní přehled najdete zde: https://www.cryptocompare.com/coins/eth/. Zde je malý přehled burz fungujících ke dni vydání článku:

Na všech se musíte zaregistrovat a často poněkud složitě ověřit svojí totožnost, než vás burza pustí k obchodování. Výhoda je, že jak máte jednou ověřenou totožnost, není problém dělat například bankovní transakce, či nakupovat za paypal.

Můj oblíbenec je potom https://shapeshift.io/, což je cosi jako transformátor kryptoměn. Vyberete z čeho do čeho a bez registrace odešlete na zobrazenou adresu vaší kryptoměnu, přičemž vám skoro hned přijde kryptoměna do které transformujete (samozřejmě mínus poplatky za převod). Kupoval jsem takhle dvakrát ether pro ostatní lidi a funguje to krásně.

Bohužel, spousta lidí neprojde testem inteligence ohledně toho kam napsat jakou adresu, zde je tedy vysvětlující screenshot, který jsem dělal pro kamaráda:

(Na vyplnění opravdu není nic těžkého.)

Zrada je v tom, že tam musíte dát i svojí bitcoinovou adresu pro případ, že by došlo k chybě v transakci, aby vám mohli peníze vrátit.

Těžení

Těžení se dá rozdělit na CPU, GPU a poolované. Co to znamená?

Pomocí standardně dodávaného programu geth máte možnost těžit přímo ve spolupráci se sítí. To znamená, že nějakou dobu těžíte třeba pomocí procesoru, pak konečně vytěžíte blok (síť uzná váš výkon a odmění vás za jeho pálení pro ní) a dostanete 5 etherů. I když je block-time v Ethereu 12-20 vteřin a tedy máte podstatně větší šanci blok vytěžit, než třeba v Bitcoinu, těžení čistě pomocí procesoru by to trvalo řádově desítky až stovky dní.

Těžení na grafice je jiná, zde již máte praktickou šanci narazit na blok v řádu dnů. Pořád to ale má ten workflow pustím miner, ten běží a nic moc viditelného nedělá a po nějaké nespecifikované době možná vytěžím blok. Čím méně máte výkonu, tím je doba delší, či pravděpodobnost nižší a nejhorší na tom je, že více/méně nevidíte žádný progress bar, takže to celé působí dost depresivně.

Netrpěliví lidé s nic moc hardwarem jako já tedy těží v poolech, kde se na těžení jednoho bloku skládá velký počet těžařů. Momentálně jediným mě známým poolem[3] je http://ethpool.org/. Ten funguje bez registrace. ethminer nakrmíte URL, jejíž součástí je adresa vaší peněženky, vyberete difficulty podle vašeho hardware a můžete začít (viz příkaz výše v sekci ethminer).

Pak se již můžete posadit do křesla, dát si nohy na stůl a sledovat, jak vám naskakují ethery, což vypadá třeba takto:

Jakmile dosáhnete jednoho etheru, pool by vám ho měl odeslat na uvedenou adresu.

Edit: Objevila se kalkulačka náročnosti těžby a předpokládaných výdělků: Ethereum Mining Profitability Calculator.

Smart contracts

Vzhledem k tomu, že síť byla spuštěna ve Frontier režimu teprve před dvěma týdny (do té doby bylo relativně těžké získat ether k pokusům) a týden z toho jsem měl dovolenou mimo internet, nenašel jsem si zatím moc času na to si kontrakty zkusit programovat.

V budoucnu bych to rád napravil a napsal pár článků na tohle téma, zatím se ale pojďme podívat alespoň na hello world příklad uvedený na stránce Etherea jako greeter.

Jelikož je greeter napsaný v jazyku Solidity, bude se prvně hodit kompiler. Na Ubuntu je dostupný v již přidaném PPA pod jménem solc, nainstalovat ho tedy můžete pomocí „sudo aptitude install solc“.

V konzoli potom můžete ověřit že je dostupný pomocí:

> eth.getCompilers()
["Solidity"]

Nyní k samotnému greeteru:

contract mortal {
    /* Define variable owner of the type address*/
    address owner;
 
    /* this function is executed at initialization and sets the owner of the contract */
    function mortal() { owner = msg.sender; }
 
    /* Function to recover the funds on the contract */
    function kill() { if (msg.sender == owner) suicide(owner); }
}
 
contract greeter is mortal {
    /* define variable greeting of the type string */
    string greeting;
 
    /* this runs when the contract is executed */
    function greeter(string _greeting) public {
        greeting = _greeting;
    }
 
    /* main function */
    function greet() constant returns (string) {
        return greeting;
    }
}

Jak můžete vidět, jsou zde definovány dva kontrakty - mortal (smrtelník) a greeter, který od smrtelníka dědí vlastnosti.

mortal v podstatě jen definuje základní věci, které by každý kontrakt měl umět, tedy znát svého vlastníka a umět sám sebe zabít, pokud mu to vlastník přikáže.

greeter pak definuje konstruktor, který dynamicky do objektu uloží pozdrav a pak ho vrátí, pokud je zavolána metoda greet().

Z ukázky je možné vidět, že Solidity je divná sprsklotina C-like jazyka a go s poněkud divnou syntaxí definování metod. Nevím, co vedlo tvůrce zrovna k tomuhle, ale osobně se mi to moc nelíbí, příště se tedy podívám na lll a serpent.

Pokud by někoho Solidity zaujalo, zde jsou další zdroje:

Kompilace

Výše uvedený zdrojový kód v je nyní třeba zkompilovat, pomocí solc. Ten je přístupný přímo z geth console. Bohužel v současnosti není možné načítat scripty nějak rozumně z disku, musíme vše tedy do konzole vložit manuálně (je vidět, že počítají hlavně s RPC API, kde tohle nevadí):

var greeterSource = 'contract mortal { address owner; function mortal() { owner = msg.sender; } function kill() { if (msg.sender == owner) suicide(owner); } } contract greeter is mortal { string greeting; function greeter(string _greeting) public { greeting = _greeting; } function greet() constant returns (string) { return greeting; } }'

Kompilace se pak volá funkcí web3.eth.compile.solidity(source):

var greeterCompiled = web3.eth.compile.solidity(greeterSource)

Tím získáme strukturu popisující zkompilovaný kód:

> greeterCompiled
{
  greeter: {
    code: "0x60606040526040516102b43803806102b48339016040526060805160600190602001505b5b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b806001600050908051906020019082805482825590600052602060002090601f01602090048101928215609e579182015b82811115609d5782518260005055916020019190600101906081565b5b50905060c5919060a9565b8082111560c1576000818150600090555060010160a9565b5090565b50505b506101dc806100d86000396000f30060606040526000357c01000000000000000000000000000000000000000000000000000000009004806341c0e1b514610044578063cfae32171461005157610042565b005b61004f6004506100ca565b005b61005c60045061015e565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f1680156100bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561015b57600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b5b565b60206040519081016040528060008152602001506001600050805480601f016020809104026020016040519081016040528092919081815260200182805480156101cd57820191906000526020600020905b8154815290600101906020018083116101b057829003601f168201915b505050505090506101d9565b9056",
    info: {
      abiDefinition: [{...}, {...}, {...}],
      compilerVersion: "0.1.1",
      developerDoc: {
        methods: {}
      },
      language: "Solidity",
      languageVersion: "0",
      source: "contract mortal { address owner; function mortal() { owner = msg.sender; } function kill() { if (msg.sender == owner) suicide(owner); } } contract greeter is mortal { string greeting; function greeter(string _greeting) public { greeting = _greeting; } function greet() constant returns (string) { return greeting; } }",
      userDoc: {
        methods: {}
      }
    }
  },
  mortal: {
    code: "0x60606040525b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b60d58061003f6000396000f30060606040526000357c01000000000000000000000000000000000000000000000000000000009004806341c0e1b5146037576035565b005b60406004506042565b005b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141560d257600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b5b56",
    info: {
      abiDefinition: [{...}, {...}],
      compilerVersion: "0.1.1",
      developerDoc: {
        methods: {}
      },
      language: "Solidity",
      languageVersion: "0",
      source: "contract mortal { address owner; function mortal() { owner = msg.sender; } function kill() { if (msg.sender == owner) suicide(owner); } } contract greeter is mortal { string greeting; function greeter(string _greeting) public { greeting = _greeting; } function greet() constant returns (string) { return greeting; } }",
      userDoc: {
        methods: {}
      }
    }
  }
}

Pozor, nejedná se o instanci objektu, jen o zkompilovaný kód!

Nahrání do sítě

Instanci vytvoříme nahráním greeteru do sítě:

var _greeting = "Linuxákům zdar!"
var greeterContract = web3.eth.contract(greeterCompiled.greeter.info.abiDefinition);
 
var greeter = greeterContract.new(_greeting,{from:web3.eth.accounts[0], data: greeterCompiled.greeter.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);
      }
 
    }
})

geth nás samozřejmě opět vyzve k zadání hesla (při nahrání kontraktu musíme poslat i gas který bude spalovat):

Please unlock account 797e99024a03481ad2a00ffe9c98fe145c817969.
Passphrase: 
Account is now unlocked for this session.
Contract transaction send: TransactionHash: 0x91d6caefcadf4b071b6f0e6f6811182e053a8cbdcd830bd833e0e1aa4d2d2662 waiting to be mined...
undefined

Na etherescanu se opět můžeme podívat, jak transakce vypadá. Všimněte si, že payload odpovídá sekci code: ze struktury získané kompilátorem.

Po chvíli se v konzoli objeví:

> Contract mined! Address: 0x4113caa93a1b90a0659314052305fbe94d2b3d8b
[object Object]

Volání kontraktu

Na lokálním stroji to máme jednoduché, stačí prostě zavolat objekt greeteru, který vznikl po nahrání do sítě:

> greeter
{
  address: "0x4113caa93a1b90a0659314052305fbe94d2b3d8b",
  transactionHash: "0x91d6caefcadf4b071b6f0e6f6811182e053a8cbdcd830bd833e0e1aa4d2d2662",
  allEvents: function(),
  greet: function(),
  kill: function()
}

Povšimněte si klíče address:, který objeví poslední hlášce o kontraktu z předchozí kapitoly. Nyní již tedy k volání konkrétní metody:

> greeter.greet()
"Linuxákům zdar!"

Jednoduché, že? Jak na to ale z jiného počítače? K tomu budeme potřebovat definici ABI a již zmiňovanou adresu:

> greeterCompiled.greeter.info.abiDefinition;
[{
    constant: false,
    inputs: [],
    name: "kill",
    outputs: [],
    type: "function"
  }, {
    constant: true,
    inputs: [],
    name: "greet",
    outputs: [{
        name: "",
        type: "string"
      }],
    type: "function"
  }, {
    inputs: [{
        name: "_greeting",
        type: "string"
      }],
    type: "constructor"
  }]
> greeter.address;
"0x4113caa93a1b90a0659314052305fbe94d2b3d8b"

Na druhém počítači pak stačí zavolat metodu eth.contract(ABI).at(Address);

bystrousak:~,0$ geth console 2>geth.log 
instance: Geth/v1.0.1/linux/go1.4.2
 datadir: /home/bystrousak/.ethereum
coinbase: 0x685628357ea28e77263ea037e2fad6d34e59ab10
at block: 90392 (Sat, 15 Aug 2015 13:45:33 CEST)
modules: admin:1.0 db:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 shh:1.0 txpool:1.0 web3:1.0
> var greeter_remote = eth.contract([{constant:false,inputs:[],name:'kill',outputs:[],type:'function'},{constant:true,inputs:[],name:'greet',outputs:[{name:'',type:'string'}],type:'function'},{inputs:[{name:'_greeting',type:'string'}],type:'constructor'}]).at('0x4113caa93a1b90a0659314052305fbe94d2b3d8b');

čímž vznikne objekt, který můžeme volat stejně jako v předchozím příkladě:

> greeter_remote.greet()
"Linuxákům zdar!"

Zajímavá je rychlost vykonání, která je prakticky okamžitá.

Zabití kontraktu

Pokud se vám kontrakt přestane líbit, máte vždy možnost ho zabít. Učinit tak lze zasláním kill zprávy (menší transakční cena):

greeter.kill.sendTransaction({from:eth.accounts[0]})

Pokud si ještě vzpomínáte na kód objektu mortal, je vám asi jasné, jak to funguje:

contract mortal {
    address owner;
 
    function mortal() { owner = msg.sender; }
 
    function kill() { if (msg.sender == owner) suicide(owner); }
}

Kontrakt prvně ověří, že jste skutečně jeho tvůrce a pak spáchá sebevraždu, přičemž vám odešle veškerou zbylou hotovost, kterou má na účtě.

Osobně jsem kontrakt zatím nezabil, aby jste si mohli vyzkoušet mu zaslat zprávu. Vhodné ovšem je kontrakty po sobě čistit, jakmile s nimi přestanete experimentovat, aby síť nebyla zbytečně zahlcená trivialitami.

Autoři do budoucna uvažují, že kontrakty budou muset platit pronájem i za existenci z bloku do bloku, aby se předešlo přeplnění. Zatím je to však poměrně zbytečné, uvážíme-li velikost běžného kontraktu (<1kB) a že stejně už při vytvoření musí platit za místo, které v síti zabírá. Když k tomu připočítáme, kolik výkonu se zbytečně pálí v Proof of Work algoritmu, podle mého názoru zatím není třeba se moc znervózňovat nesmrtelnými kontrakty.

Zajímavé projekty

Teď už víte, co je Ethereum, co jsou to chytré kontrakty, jak se dají použít a programovat. Jak plyne z mé zkušenosti, i když to někomu detailně vysvětlím, neznamená to, že skutečně pochopí celý potenciál, který to nabízí. Pojďme se tedy nyní podívat na několik zajímavých projektů, které nějakým způsobem používají Ethereum.

ADEPT od IBM/Samsungu

Zatímco většina se soustředí převážně na kontrakty, v IBM si řekli, jak moc je asi tak Ethereum použitelné jako decentralizovaná platforma pro Internet of Things. Ukázalo se, že docela hodně, díky nízkým datovým tokům, které umožňuje mít velmi tenké klienty. Provozovatel tím získává decentralizovanou komunikační platformu, po které si spolu můžou povídat nejrůznější senzory.

Augur

Augur je decentralizovaná burza crowdsourcovaných analýz, odhadů a predikcí. Něco jako když se dělají ankety, akorát bez společnosti, co by ty ankety dělala a mohla falšovat.

BoardRoom

BoardRoom vypadá jako podnikový systém, přes který je možné provádět veškeré činnosti nutné k řízení a organizaci firmy. Zahrnuje různé pluginy pro zasedání, hlasování, komise, šifrovanou komunikaci a tak podobně.

airlock

Airlock představuje správu klíčů a přístupů k zámkům. Zámky mohou být otevřené pro všechny, pro držitele klíčů, časově, či pouze pro jedno použití.

slock.it

Sdílení přístupů k čemukoliv zamykatelnému, od praček po domy. Pokud to dokážete zamknout, oni se postarají o pronájem.

Maker

DAO starající se o půjčky. K čemu banky, když můžete svěřit své finance nemyslícím korporacím? :)

WeiFund

Decentralizovaný crowdsourcing. Představte si něco jako kickstarter, akorát bez lidí a bez cenzury. Uživatelé hlasují penězi, pokud projekty nevyjdou, jsou jim vráceny.

Váš projekt

Ethereum není jen výpočetní síť, je to také komunikační platforma, databáze a měna. Všechno důležité integrované do jednoho systému.

Na tomhle místě se příště může nacházet i váš projekt. Víte co je to Ethereum, víte jak ho použít, tak na co čekáte? Ti kdo přijdou první s originálními myšlenkami v nově vznikajícím světě chytrých kontraktů mají ty největší šance zbohatnout a přetvořit svět.

Cena a dohady

Ethereum je momentálně číslo čtyři na http://coinmarketcap.com/, s finančními toky v řádu pěti milionů dolarů za den. To není špatné, uvážíme-li že existuje teprve něco přes dva týdny. Během tohoto týdne jsem viděl, jak se z jednoho dolaru zvedlo na 2.22, načež zase pokleslo na 1.39.

Jak je vidět, jedná se o ideální měnu pro spekulace. Vzhledem k tomu, že se momentálně nachází ve veřejné betaverzi a nejsou k dispozici žádné uživatelsky přívětivé nástroje, dá se očekávat, že až opadne počáteční hype, cena ještě klesne a bude docházet k velkým fluktuacím.

Pokud věříte technologii Etherea a nezpanikaříte, až uvidíte jak kolísá, doporučuji nakoupit a trochu si přivydělat prodejem ve správnou chvíli.

Osobně už mám nějaké ty ethery nakoupené, teď ještě počkám až klesne cena zpět k / pod jeden dolar a nakoupím ještě za takových 5 tisíc kč. Až přijde na řadu Homestead verze s grafickými nástroji, dá se očekávat, že cena zase raketově poletí nahoru, jak se do hry budou snažit dostat uživatelé, kteří Ethereum dosud ignorovali.

Informační zdroje

Pokud chcete být naprosto na špičce všech událostí kolem Etherea, doporučuji jednoznačně reddit kanál /r/ethereum (RSS). Zde se objevují veškeré novinky, články, návody a drby, které si jen můžete přát. Nevýhodou je trochu větší datový tok, který činní momentálně zhruba 150 nových témat denně.

Kdyby se vám nechtělo číst tak silné datové toky, je zde fórum: https://forum.ethereum.org/ a naprostou nutností je pak oficiální blog, kde se objevují všechna důležitá oznámení: https://blog.ethereum.org/ (RSS).

Pro ty kdo chtějí více uživatelských a praktických informací zde mám dvě vznikající e-knihy, jenž vás obeznámí z koncepty, ale i s konkrétními programy a jazyky, které je možné použít k psaní kontraktů:

Prakticky zaměřeným uživatelům se určitě bude líbit přehled všech transakcí, s možností zkoumat kdo má co na účtě a co kde běží za kontrakty:

Vizuálně zaměřeným pak zase statistiky sítě a přehledy právě vytěžených bloků:

Poznámky

[1] Viz:

Many of the planned Frontier gotchas (which included a chain reset at Homestead, limiting mining rewards to 10%, and centralized checkpointing) were deemed unnecessary.

Frontier is coming – what to expect, and how to prepare

[2] https://www.reddit.com/r/ethereum/comments/3d53f9/stephan_tuals_explanation_of_the_mining_rewards/ct1z7qg. Ursium je jeden z core developerů.

[3] Objevil se nový pool: http://www.pooleum.com/

Shameless self-bump

Tento článek mě podle mého timetrackeru stál přibližně jedenáct hodin čistého času. Nejenom to; jedná se dokonce o již druhý článek na téma Ethereum, který mě stál desítky hodin času strávených výzkumy a psaním. Aby toho nebylo málo, sdělil jsem vám v ucelené a čitelné formě spoustu knowhow, které jinak stojí desítky a stovky hodin získávání, čtení, studování a zkoušení. V případě prvního článku dokonce s ročním předstihem. Nyní jste na podobné úrovni jako já - můžete Ethereum začít používat, těžit, nakupovat, prodávat, spekulovat a programovat.

Proč to dělám?

Přemýšlel jsem nad tím a odpověď je „protože můžu“. Nenašel jsem žádný důvod a tak to dělám bezdůvodně.

Pokud si to můžete dovolit a chcete, vpravo nahoře jsou adresy mnou přijímaných kryptoměn, kam mi můžete poslat nějaké drobné, či na ně nastavit miner a věnovat mi trochu vašeho výpočetního výkonu.

Nepotřebuji to fyzicky; momentálně jsem zabezpečený, ale potěší mě to psychicky. Ukazuje mi to, že máte o mé články zájem a že se líbily. V neposlední řadě mi to také dává prostředky, které investuji do dalších nových kryptoměn, projektů a různých sofistikovaných kryptoanarchistických technologií, o které se pak zajímám a o kterých píšu články. Výhodné je to tedy oboustranně.

Become a Patron