Programování

Bitcoin pro začátečníky, část 3: API BitCoinJ

Pro vývojáře Java je BitCoinJ vstupním bodem pro vývoj aplikací, které interagují se sítí bitcoinů. V tomto závěrečném článku třídílné série vám Dirk Merkelová pomůže nastavit BitCoinJ ve vývojovém prostředí Eclipse a poté projde několika krátkými cvičeními, která vás seznámí s touto odlehčenou implementací transakčního protokolu Bitcoin.

Předchozí splátky v této třídílné sérii představily koncepční a technologický rámec bitcoinu, virtuální měny a sítě peer-to-peer. Tento článek, úvodní cvičení k rozhraní BitCoinJ API, předpokládá, že jste obeznámeni s bitcoinovými adresami, transakcemi, bloky a blokovým řetězcem.

BitCoinJ je open source implementace Java protokolu Bitcoin. Jako takový je to užitečný nástroj, který chcete mít, pokud chcete psát aplikace Java, které interagují se sítí bitcoinů. Abychom prozkoumali API BitCoinJ, vytvoříme různé ukázkové aplikace, které ilustrují programovací kroky nezbytné pro konstrukci složitějších bitcoinových aplikací v Javě. Po použití Mavenu k sestavení a nastavení projektu v prostředí Eclipse IDE si procvičíme vytvoření bitcoinové adresy, její uložení do peněženky a uložení peněženky na disk. Poté navážeme připojení k testovací síti bitcoinů a načteme její genesis blok. Nakonec spojíme dohromady náš ukázkový kód tak, že pošleme nějaké bitcoiny na adresu v testovací síti.

O společnosti BitCoinJ

BitCoinJ je implementace protokolu Bitcoin v prostředí Java. BitCoinJ, který napsal Mike Hearn, není úplnou implementací původního bitcoinového klienta, ale odlehčenější a přístupnější verzí. I když je dostatečně pevný, aby se z něj mohl učit, BitCoinJ je stále ve vývoji (aktuálně ve verzi 0.3) a neměl by se používat k přesunu velkého počtu bitcoinů.

Začněte s BitCoinJ

BitCoinJ je hostitelem Google Code v úložišti Subversion a lze jej anonymně odhlásit. Jakmile se podíváte na kmen projektu BitCoinJ, budete jej moci snadno aktualizovat. Nebudete však moci provádět žádné změny.

Můžete použít klienta Subversion zabudovaného do vašeho oblíbeného IDE nebo jednoduše zkontrolovat projekt z příkazového řádku, jako jsem to udělal:

Jakmile budete mít kód, zkompilujete jej pomocí systému sestavení Maven, BitCoinJ. Maven k projektům staví celoživotní přístup a je vysoce rozšiřitelný o mnoho doplňků jádra a třetích stran. To, co Maven dělá mimořádně dobře, je správa závislostí. Pokud se podíváte na soubor Maven pom.xml v kořenovém adresáři BitCoinJ, uvidíte, že používá pouze několik závislostí; mezi ně patří JUnit a EasyMock pro testování jednotek, SLF4J pro protokolování a rozhraní Bouncy Castle Crypto API pro kryptografické operace, jako je hašování a podepisování.

Z příkazového řádku spusťte čistý balíček mvn a Maven načte tyto a další závislosti, zkompiluje projekt, spustí testovací sadu jednotek a zabalí zkompilovaný kód do souboru JAR snímku. Jak je znázorněno na obrázku 2, Maven nejprve provede čistý životní cyklus, aby se zbavil veškerých artefaktů z předchozích sestavení. Poté provede fáze výchozího životního cyklu až do fáze balíčku včetně.

Maven má v rukávu několik dalších užitečných triků. Nejprve vykonání mvn site: stránky vytváří dokumentaci BitCoinJ, včetně stránek o závislostech, sledování problémů, seznamů adresátů, licencí, vývojového týmu, zdrojového úložiště a dalších. Tyto stránky bývají informativní, ale základní. Provádění mvn javadoc: javadoc generuje dokumentaci projektu, která se bude hodit, když začneme cvičit API BitCoinJ.

Dokumentace odhaluje, že API je rozděleno do čtyř balíčků:

  • Objev se zabývá zjišťováním / komunikací v síti peer-to-peer.
  • Obchod obsahuje datové struktury pro ukládání bloků a blokového řetězce.
  • Příklady obsahuje několik jednoduchých aplikací založených na BitCoinJ (tyto inspirovaly mé vlastní příklady pro tento článek).
  • Jádro obsahuje většinu tříd a funkcí BitCoinJ, včetně tříd pro komunikaci s uzly peer, stahování blokového řetězce a odesílání a přijímání transakcí.

Nastavte ukázkový projekt v Eclipse

Ukázkový kód pro tento článek vyvineme v Eclipse pomocí Mavenu ke správě BitCoinJ jako závislosti. Naštěstí má BitCoinJ prostředí pro nepřetržitou integraci, které staví projekt, shromažďuje a reportuje různé artefakty a ukládá snímek JAR do vlastního úložiště Maven projektu založeného na Nexus.

Obrázek 3 ukazuje dialog pro vytvoření projektu Eclipse, který je výsledkem vytvoření nového projektu Maven a výběru archetypu „rychlý start“, který generuje základní projekt Maven. Můj kód pro tento projekt žije v balíčku s názvem com.waferthin.bitcoinj, který vytváří 0,0.1-SNAPSHOT s sestavením Maven.

Klepnutím na tlačítko Dokončit zadáte průvodci vytvoření projektu, což znamená přetažení hlavní třídy „Hello World“ do adresáře projektu - s názvem src / main / java / com / waferthin / bitcoinj v mém případě.

Nakonec musíme Mavenovi sdělit, že projekt závisí na snímku BitCoinJ, jak je ukázáno v Seznamu 1. Upravil jsem soubor pom.xml vytvořený kouzelníkem Maven, abych deklaroval umístění a název úložiště Nexus BitCoinJ (řádky 18 až 28) a nastavil verze, na které bude záviset sestavení (řádky 39 až 45):

Výpis 1. Maven pom.xm pro projekt BitCoinJ

001 | 002 | 4.0.0 003 | 004 | com.waferthin.bitcoinj.prozkoumaný 005 | bitcoinj prozkoumaný 006 | 0.0.1-SNAPSHOT 007 | sklenice 008 | 009 | bitcoinj prozkoumáno 010 | //maven.apache.org 011 | 012 | 013 | UTF-8 014 | 015 | 016 | 017 | 018 | 019 | bitcoinj-release 020 | 021 | 022 | //nexus.bitcoinj.org/content/repositories/releases 023 | 024 | 025 | bitcoinj-snímek 026 | 027 | //nexus.bitcoinj.org/content/repositories/snapshots 028 | 029 | 030 | 031 | 032 | 033 | junit 034 | junit 035 | 3.8.1 036 | test 037 | 038 | 039 | 040 | 041 | com.google 042 | bitcoinj 043 | 0,3-SNAPSHOT 044 | kompilace 045 | 046 | 047 |

To je vše. V další části naimportujeme třídy BitCoinJ do našeho kódu a vytvoříme projekt BitCoinJ s Mavenem, aniž bychom museli kopírovat skutečný soubor JAR.

Vytvoření bitcoinové adresy

K odesílání nebo přijímání bitcoinů potřebujete adresu. Adresy jsou odvozeny z veřejné části páru kryptografických klíčů veřejného a soukromého sektoru (viz „Bitcoin pro začátečníky, část 2: Bitcoin jako technologie a síť“). Říká se druh kryptografie používaný bitcoiny kryptografie eliptické křivky (ECC). Kryptografie veřejného klíče, kterou většina z nás ví, je založena na obtížnosti nalezení hlavních faktorů velkých celých čísel. Naproti tomu ECC je založeno na obtížnosti nalezení diskrétního logaritmu eliptické křivky. (Podrobnější vysvětlení by nás nejen přivedlo do králičí nory vyšší algebry, ale také by rychle překonalo moji vysokoškolskou matematiku. Naštěstí nepotřebujeme vědět víc, abychom mohli používat BitCoinJ ECKey třídy reprezentovat a generovat páry klíčů.)

V řádku 20 Výpisu 2 vytvoříme novou dvojici klíčů eliptické křivky vytvořením instance objektu typu ECKey. Všimněte si, že třída je výchozí toString () metoda je přepsána tak, aby vrátila veřejný a soukromý klíč v hexadecimální notaci, která se používá na řádku 23.

Výpis 2. Vytvoření páru klíčů eliptické křivky s ECKey

001 | balíček com.waferthin.bitcoinj; 002 | 003 | import com.google.bitcoin.core.ECKey; 004 | import com.google.bitcoin.core.NetworkParameters; 005 | import com.google.bitcoin.core.Address; 006 | 007 | veřejná třída CreateAddress 008

Možná si vzpomenete, že veřejnou součástí páru bitcoinových klíčů by měla být adresa. Veřejná část klíče generovaná výše uvedeným kódem ale zpočátku nebude vypadat jako adresy, které bitcoinový klient zobrazuje ve svém uživatelském rozhraní. Formulář adresy, který jsme zvyklí vidět v bitcoinové transakci, je odvozen opakovanými hašovacími operacemi na veřejný klíč. Tento formulář obsahuje příznak, který označuje, ke které ze dvou bitcoinových sítí klíč patří - produkční síť bitcoinu nebo jeho testovací síť. (Podrobnější popis algoritmického vytváření párů bitcoinových klíčů najdete na wiki stránce Bitcoin.)

Diferenciace bitcoinových sítí

V současné době existují dvě bitcoinové sítě, jedna pro produkci a druhá pro vývoj. Obě sítě mají svůj vlastní genesis block a následný block chain. Dále v tomto článku použijeme k provedení bitcoinové transakce testovací síť bitcoinů. Prozatím potřebujete pouze vědět, že se sítě rozlišují předběžným čekáním na jediný bajt na vstupu do jednoho z kryptografických hashů v algoritmu ECC: 0x6f označuje produkční síť a 0x00 testovací.

Nepotřebujeme použít sekvenci kryptografických hashů, protože ECKey třída poskytuje stejnou funkčnost s na adresu() metoda. Po vyvolání této metody a předání typu sítě pomocí a NetworkParameters objekt (viz řádek 26 v seznamu 2), na adresu() metoda vrací Adresa objekt. Ten objekt je toString () metoda získá skutečnou adresu bitcoinu. Po kompilaci a provedení třídy dostanu následující adresu pro testovací síť bitcoinů:

mpJ9UDd4qtNhMiGefK8NM1V5PMq9jMb7ck

Testnet adresy obvykle začínají m nebo n, zatímco výrobní adresy začínají 1. Zkuste spustit stejný kód na svém vlastním stroji a dostanete jinou, jedinečnou adresu.

Peněženky a klíče

Pokud se účastníte bitcoinové ekonomiky, pravděpodobně si veškeré své bohatství ponecháte v peněžence. The peněženka není nic jiného než lokální datový soubor, který obsahuje serializované objekty představující všechny vaše bitcoinové transakce a mezipaměť nepoužívaných adres. Součet částek vašich příchozích a odchozích transakcí je množství bitcoinů v peněžence. V této části použijeme BitCoinJ Peněženka objekt k vytvoření datového souboru peněženky, naplnění pěti adresami a uložení na disk.

The Peněženka třída implementuje Serializovatelné rozhraní, které nám umožní přetrvávat na disk nebo na nějaké jiné trvalejší paměťové médium. Konkrétně metody loadFromFile (soubor) a odpovídající saveToFile (soubor) číst a zapisovat soubory peněženky. Budeme používat loadFromFile (soubor) zapsat nově vytvořený objekt peněženky do souboru.

Poznámka že soubory peněženky BitCoinJ nejsou kompatibilní se soubory peněženky vytvořenými oficiálním bitcoinovým klientem.

Vytváření a ukládání klíčů

The Peněženka třída má veřejného člena s názvem klíčenka to je ArrayList typu ECKey, který slouží k uložení všech párů klíčů EC do peněženky. The addKey (ECKey) metoda se používá k přidání párů klíčů, ale v současné době neexistuje žádná metoda pro jejich odstranění. To dává smysl, protože pro uživatele nebo programy by nemělo být snadné odstranit soukromé klíče: soukromý klíč je vyžadován pro přístup k prostředkům odeslaným prostřednictvím odpovídajícího veřejného klíče. Bez páru klíčů v peněžence nebo někde zálohovaného by všechny zaslané prostředky byly navždy ztraceny.