zápočtová práce Základy implementace měny BITCOIN v programovacím jazyku C# N_TK Technologie krypto-měn



Podobné dokumenty
Digitální měna Bitcoin. Dalibor Hula Slezská univerzita v Opavě OPF v Karviné

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Bitcoin. digitální měna budoucnosti nebo nafouklá bublina? Jaroslav Brychta. Jan Skalický

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

- PC musí být připojené v lokální síti - je bezpodmínečně nutné, aby aplikace Outlook nebyla aktivní)

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 26.3.

Obsah. Kdo jsme? Co vám přinášíme s naší bránou? Jak si otevřu bránu na klikniavolej.cz?... 3

Krajská knihovna Karlovy Vary Váš druhý domov...

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

1 Nejkratší cesta grafem

Uživatelský manuál Citfin, spořitelní družstvo Potřebujete poradit? Volejte infolinku nebo pište na

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

Praktické šifrování dat pomocí programu PGP

První kapitola úvod do problematiky

Základy algoritmizace. Hašování

Vzhled a popis hlavních funkcí systému SMSbrána.cz

5 Rekurze a zásobník. Rekurzivní volání metody

Šablony, kontejnery a iterátory

Bitcoin změní svět peněz, blockchain změní svět Karel Fillner

Geis Point Plugin Map

Webové služby. služby OctopusPro

Spojová implementace lineárních datových struktur

Příjem a odesílání datových zpráv na UK

Tematická oblast: Programování 2 (VY_32_INOVACE_08_2_PR) Anotace: Využití ve výuce: Použité zdroje:

8 Třídy, objekty, metody, předávání argumentů metod

INTERNETOVÉ BANKOVNICTVÍ ARTESA IDEAL

Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39

Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Implementační manuál aplikace Essox Lite pro programátora/webmastera e-shopu

1. Téma 03 - Rozhodování

Kolekce, cyklus foreach

Platební systém XPAY [

Programování II. Třídy a objekty (objektová orientovanost) 2018/19

Elektronická fakturace - chytře a ekonomicky na faktury Pohled ze strany společnosti Synthesia

ProxyPay3/M.e-commerce. MO/TO transakce

Martin Flusser. December 15, 2016


Výčtový typ strana 67

Úvod do programování - Java. Cvičení č.4

iphone 4.x.x. (3G, 3GS, 4) a Android 2.1, 2.2, verze 1 / září 2011

Jazyk C# (seminář 6)

GO! ONLINE & TRACK UŽIVATELSKÝ MANUÁL ČAS JE VŠE

Komponenty v.net. Obsah přednášky

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Manuál pro implementaci služby PLATBA 24. Datum: 17. prosince 2014 Verze: 1.49

Objekt. základní prvek v OOP. má vlastnosti. má metody. vznikne vytvoření nové instance definován pomocí třídy

JSON API pro zjišťování cen MtG karet

Konstruktory a destruktory

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

Pro kontrolu správného formátu hodnoty N použijeme metodu try-catch.

UŽIVATELSKÁ PŘÍRUČKA PRO INTERNETOVÉ BANKOVNICTVÍ PPF banky a.s.

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Úvod do programovacích jazyků (Java)

Platební systém XPAY [

OpenSSL a certifikáty

Kryptoměny. v účetnictví a daních

PREPROCESOR POKRAČOVÁNÍ

Dynamické datové struktury IV.

Platební systém XPAY [

PiiGAB 810. Převodník M-Bus na Ethernet. Výrobce: piigab.com. 4. listopadu 2015 w w w. p a p o u c h. c o m

Průvodce studenta WebCT

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Cisco IOS TCL skriptování využití SMTP knihovny

Firmadat SMS Sender. aplikace pro odesílání SMS zpráv z Vašeho PC pomocí telefonu ZÁKLADNÍ INFORMACE A INSTALACE MILAN PASTOR, ROMAN NEPŠINSKÝ

Jazyk C# (seminář 3)

Dokumentace ke službě SMS Connect.

CryptoNote exploit. aneb proč se musí body na Curve25519 validovat (pro Monero, ByteCoin...) abyssal

KTE / ZPE Informační technologie

Skutečně privátní a bezpečná komunikace? Budoucnost nemusí být pouze v

Internet Banka v mobilu

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Nastavení skenování do u Technický průvodce

Datové struktury. alg12 1

Objektově orientované programování

Vyhledávač datových referencí. Dokumentace

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Platební systém XPAY [

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

20. Projekt Domácí mediotéka

Datové struktury 2: Rozptylovací tabulky

ResearcherID. A Global Community Where Researchers Connect

Jazyk C# (seminář 5)

Manuál pro implementaci aplikace Na poštu

Návrh a tvorba WWW stránek 1/14. PHP a databáze

ONLINE API GLS GLS online webová služba SOAP pro tiskové služby

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Testování uživatelského rozhraní internetové stránky společnosti České dráhy (cd.cz) A4B39TUR A2 Kateřina Cízlová

JavaScript 101. "Trocha života do statických stránek"

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

TERMÍNY ZKOUŠEK VYPISOVÁNÍ (verze 2)

PŘÍKAZ REKTORA č. 103/2012

Měna Základní charakteristika Využití Historie Praktické použití Čím je měna podložena

UJO Framework. revoluční architektura beans. verze

TÉMATICKÝ OKRUH Softwarové inženýrství

Transkript:

zápočtová práce Základy implementace měny BITCOIN v programovacím jazyku C# N_TK Technologie krypto-měn Tomáš Pekárek 25387 listopad 2015 1

Obsah 1. Zadání... 2 2. Vývojové prostředí... 2 3. Bitcoin adresy... 3 4. Transakce... 6 1. Zadání ze dne 2. 11. 2015 v rámci předmětu: Technologie krypto-měn bych chtěl pro získání zápočtu, vypracovat následují seminární práci: - manuál pro implementaci krypto-měny Bitcon v programovacím jazyku C# - při využití knihovny NBitcoin (popis tříd, metod, událostí včetně jednoduchých ukázek) Poznatky získané v rámci seminární práce umožní tvorbu jednoduché aplikace využívající měnu Bitcon (např. peněženka, e-shop, finanční mechanizmus počítačové hry apod.). 2. Vývojové prostředí a) Určeno pro Visual Studio 2013, 2015 Community Programovací jazyk.net C# Technologie krypto-měny Bitcoin, které popisuje tato zápočtová práce, je možné implementovat pro desktopové, webové a mobilní aplikace. b) Zavedení knihovny NBitcoin obrázek č. 1 2

1. Visual Studio -> Nástroje -> Správa balíčků, knihovny -> Spravovat balíčky NuGet pro řešení 2. Vyhledat: NBitcoin 3. Nainstalovat 4. Zavedení direktivy v programu using NBitcoin; 3. Bitcoin adresy Základní schéma adres a klíčů v síti Bitcoin obrázek č. 2 a) Soukromý klíč (private key) vygenerujeme pomocí třídy Key. Key privatniklic = new Key(); 3

b) Bitcoin adresa privátní (Bitcoin secret) je reprezentována třídou BitcoinSecret. Vlastní adresu získáme použitím metody GetBitcoinSecret z třídy Key. Adresu je možné vygenerovat pro veřejnou nebo vlastní testovací Bitcoinovou síť. Stačí u metody GetBitcoinSecret nastavit parametr Network. /* Třída "BitcoinSecret" */ /* Využití metody "GetBitcoinSecret" z třídy "Key" */ BitcoinSecret bitcoinadresaprivatnimain=privatniklic.getbitcoinsecret(network.main); /* Network.Main - pro využití adresy v hlavní síti */ Console.WriteLine("Bitcoin adresa - privátní (v hlavní síti):\n0}\n", bitcoinadresaprivatnimain); Parametr Network: - v testovací síti: Network.TestNet - v hlavní síti: Network.Main obrázek č. 3 c) Veřejný klíč (public key) je reprezentován třídou PubKey. Vlastní klíč získáme použitím metody PubKey z třídy Key. /* Třída "PubKey" */ /* Využití metody "PubKey" z třídy "Key" */ PubKey verejnyklic = privatniklic.pubkey; Console.WriteLine("Veřejný klíč:\n0}\n", verejnyklic); obrázek č. 4 d) Bitcoin adresa veřejná (bitcoin address) je reprezentována třídou BitcoinAdress. Vlastní adresu získáme použitím metody GetAdress z třídy PubKey. Adresu je možné vygenerovat pro veřejnou nebo vlastní testovací Bitcoinovou síť. Stačí u metody GetAdress nastavit parametr Network. /* Třída "BitcoinAddress" */ /* Využití metody "GetAddress" z třídy "PubKey" */ BitcoinAddress bitcoinadresamain = verejnyklic.getaddress(network.main); Console.WriteLine("Bitcoin adresa (v hlavní síti):\n0}\n", bitcoinadresamain); 4

obrázek č. 5 Parametr Network: - v testovací síti: Network.TestNet - v hlavní síti: Network.Main e) Skript veřejného klíče (script pub key) je reprezentován třídou Script. Vlastní skript získáme z veřejné Bitcoin adresy (třída BitcoinAdress) při použití metody ScriptPubKey. /* Třída "Script" */ /* Využití metody "ScriptPubKey" z třídy "BitcoinAddress" */ Script skriptverejnehoklice = bitcoinadresamain.scriptpubkey; Console.WriteLine("Skript veřejného klíče (z Bitcoin adresy):\n0}\n", skriptverejnehoklice); obrázek č. 6 f) Bitcoin adresa veřejná (bitcoin address) ze skriptu veřejného klíče Použitím metody GetDestinationAddress ze třídy Script můžeme zpětně ze skriptu veřejného klíče získat naší veřejnou Bitcoin adresu. /* Využití metody "GetDestinationAddress" z třídy "Script" */ Script skriptverejnehoklice = new Script(skriptVerejnehoKliceString); BitcoinAddress bitcoinadresamain = skriptverejnehoklice.getdestinationaddress(network.main); Console.WriteLine("Bitcoin adresa (v hlavní síti):\n0}\n", bitcoinadresamain); g) Hash z veřejného klíče je reprezentován třídou KeyId. Hash získáme použitím metody Hash ze třídy PubKey. /* Třída "KeyId" */ /* Využití metody "Hash" z třídy "PubKey" */ KeyId hashverejnyklic = verejnyklic.hash; Console.WriteLine("Hash z veřejného klíče:\n0}\n", hashverejnyklic); 5

obrázek č. 7 4. Transakce a) ID transakce bloku Každá dílčí transakce je uložená v bloku. Při znalosti identifikačního čísla bloku (ID transakce) můžeme prohlížet veškerý obsah bloku, vyhledávat konkrétní transakce, spočítat celkový objem transakcí v bloku apod. Na obrázku č. 7 je ukázka detailu transakce z peněženky Bitcoin Core včetně čísla bloku (ID transakce) 64c68bc2edca4807e0a1b94288845a9847b3782beb715f6fa8f1b966028c54c2. obrázek č. 8 b) Vypsání obsahu bloku nám umožňují třídy Transaction a BlockrTransactionRepository a metoda Get z třídy Transaction. Parametrem metody je číslo bloku (ID transakce). /* Třídy "BlockrTransactionRepository" a "Transaction" */ /* Využití metody "Get" z třídy "Transaction" */ Console.WriteLine("Vypsani transakcniho bloku:"); var blok = new BlockrTransactionRepository(); Transaction transakce = blok.get("64c68bc2edca4807e0a1b94288845a9847b3782beb715f6fa8f1b966028c54c2"); Console.WriteLine(transakce.ToString()); obrázek č. 9 6

c) Celkový objem transakcí v bloku získáme pomocí tříd popsaných v bodě b). Pro výpočet celkové hodnoty bloku použijeme metodu TotalOut, /* Třídy "BlockrTransactionRepository" a "Transaction" */ /* Využití metod "Get" a "TotalOut" z třídy "Transaction" */ var blok = new BlockrTransactionRepository(); Transaction transakce = blok.get("64c68bc2edca4807e0a1b94288845a9847b3782beb715f6fa8f1b966028c54c2"); Console.WriteLine("Celkove hodnota transakci v bloku: 0} satoshi", transakce.totalout.satoshi.tostring()); d) Celkový počet transakcí v bloku obrázek č. 10 /* Třída "Transaction" */ int pocettransakci = transakce.outputs.count; Console.WriteLine("Celkovy pocet transakci v bloku: 0}", pocettransakci); obrázek č. 11 e) Postupný průchod transakčním blokem a vyhledání konkrétní transakce při použití veřejné Bitcoinové adresy V transakčním bloku jsou jednotlivé operace implementovány do datové struktury pole. Průchod je možný realizovat pomocí FOR nebo WHILE cyklu. 1. Transakci budu vyhledávat v transakčním bloku ID: 64c68bc2edca4807e0a1b94288845a9847b3782beb715f6fa8f1b966028c54c2 var blok = new BlockrTransactionRepository(); Transaction transakce = blok.get("64c68bc2edca4807e0a1b94288845a9847b3782beb715f6fa8f1b966028c54c2"); 2. Budou mě zajímat transakce zaslané na veřejnou Bitcoinovou adresu: 1DhSD71uzM6NdwvLesTx69YsivkmHac8qE BitcoinAddress bitcoinadresa = new BitcoinAddress("1DhSD71uzM6NdwvLesTx69YsivkmHac8qE"); 3. Z Bitcoinové adresy musím vygenerovat skript veřejného klíče: Script skriptverejnehoklice = bitcoinadresa.scriptpubkey; 4. Vlastní průchod polem a vyhledávání požadovaných transakcí: double celkem = 0; int pocet = 0; for (int i = 0; i < transakce.outputs.count; i++) 7

pocet++; if (skriptverejnehoklice == transakce.outputs[i].scriptpubkey) Console.WriteLine("0}. nalezena transakce\n------------------------", pocet); Console.WriteLine(transakce.Outputs[i].ScriptPubKey); Console.WriteLine("0} satoshi\n", transakce.outputs[i].value); celkem = celkem + Convert.ToDouble(transakce.Outputs[i].Value); } } Console.WriteLine("Zaverecne hodnoceni\n------------------------"); Console.WriteLine("Pro verejnou Bitcoinovou adresu: 0}", bitcoinadresa); Console.WriteLine("Bylo nalezeno:"); Console.WriteLine("\t- pocet transakci:\t0}", pocet); Console.WriteLine("\t- o celkove hodnote:\t0} satoshi", celkem); obrázek č. 12 f) Postupný průchod transakčním blokem a vyhledání konkrétní transakce při použití privátní Bitcoinové adresy Princip je stejný jako u bodu e. Odlišnosti: 2. Budou mě zajímat transakce zaslané na privátní Bitcoinovou adresu: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX BitcoinSecret bitcoinadresaprivatni = new BitcoinSecret("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); 3. Z Bitcoinové adresy musím vygenerovat skript privátního klíče: Script skriptprivatnihoklice = bitcoinadresaprivatni.scriptpubkey; Ostatní body jsou beze změny. g) Založení nové transakce a odeslání Tento bod popisuje mechanizmus založen a odeslání nové transakce platby (z peněženky odesílatele do peněženky příjemce). 1. Uživatel, který platbu odesílá, musí zadat svou privátní Bitcoinovou adresu: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX BitcoinSecret bitcoinadresaprivatni = new BitcoinSecret("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); 2. Definujeme veřejnou Bitcoinovou adresu příjemce: 16DX9KxJYbiZrbgBjbqt7v1A4tfL9wfkxr 8

BitcoinAddress bitcoinadresaverejna = new BitcoinAddress("16DX9KxJYbiZrbgBjbqt7v1A4tfL9wfkxr"); 3. Prostředky pro převod budou použity z transakčního bloku ID: 64c68bc2edca4807e0a1b94288845a9847b3782beb715f6fa8f1b966028c54c2 var blok = new BlockrTransactionRepository(); Transaction transakce = blok.get("64c68bc2edca4807e0a1b94288845a9847b3782beb715f6fa8f1b966028c54c2"); 4. Zadání nové platby: Transaction platba = new Transaction(); platba.inputs.add(new TxIn() PrevOut = new OutPoint(transakce.GetHash(), 1) }); 5. Částka k převodu: obrázek č. 13 prázdná transakce platba.outputs.add(new TxOut() Value = Money.Coins(0.00005m), ScriptPubKey = bitcoinadresaverejna.scriptpubkey }); 6. Přidání zprávy k transakci (převod 0,0000 satoshi): var zprava = "Splatka pro Toma"; var bytes = Encoding.UTF8.GetBytes(zprava); platba.outputs.add(new TxOut() Value = Money.Zero, ScriptPubKey = TxNullDataTemplate.Instance.GenerateScriptPubKey(bytes) }); 9

7. Podepsání transakce privátním klíčem: obrázek č. 14 připravená transakce bez podpisu platba.inputs[0].scriptsig = bitcoinadresaprivatni.scriptpubkey; platba.sign(bitcoinadresaprivatni, false); 8. Síťové spojení vykonání transakce obrázek č. 15 připravená transakce s podpisem using (var node = Node.ConnectToLocal(Network.Main)) node.versionhandshake(); 10

} node.sendmessage(new InvPayload(InventoryType.MSG_TX, platba.gethash())); node.sendmessage(new TxPayload(platba)); 11