Programiranje

Bitcoin za začetnike, 3. del: API BitCoinJ

Za razvijalce Jave je BitCoinJ vstopna točka za razvoj aplikacij, ki sodelujejo z Bitcoin omrežjem. V tem zadnjem članku v tridelni seriji vam Dirk Merkel pomaga nastaviti BitCoinJ v razvojnem okolju Eclipse, nato pa se je sprehodil skozi nekaj kratkih vaj, ki vas bodo seznanile s to lahkotno izvedbo protokola transakcij Bitcoin.

Prejšnji obroki v tej tridelni seriji so uvedli konceptualni in tehnološki okvir Bitcoina, virtualne valute in omrežja peer-to-peer. Ta članek, uvod v uvod v BitCoinJ API, predvideva, da poznate naslove Bitcoin, transakcije, bloke in verigo blokov.

BitCoinJ je odprtokodna implementacija Java protokola Bitcoin. Kot takšno je priročno orodje, če želite pisati programe Java, ki komunicirajo z Bitcoin omrežjem. Da bi raziskali API BitCoinJ, bomo sestavili različne vzorčne aplikacije, ki ponazarjajo korake programiranja, potrebne za izdelavo bolj zapletenih programov Bitcoin v Javi. Po uporabi Mavena za izdelavo in nastavitev projekta v Eclipse IDE bomo vadili ustvarjanje naslova Bitcoin, njegovo shranjevanje v denarnici in denarnico shranili na disk. Nato bomo vzpostavili povezavo s testnim omrežjem Bitcoin in pridobili njegov blok nastanka. Končno bomo doslej povezali našo vzorčno kodo tako, da bomo nekaj bitcoinov poslali na naslov v testnem omrežju.

O BitCoinJ

BitCoinJ je Java izvedba protokola Bitcoin. Kot je zapisal Mike Hearn, BitCoinJ ni popolna izvedba prvotnega odjemalca Bitcoin, temveč bolj lahka in dostopna različica. Čeprav je dovolj trden za učenje, je BitCoinJ še vedno v fazi razvoja (trenutno je v.0.3) in se ne sme uporabljati za premikanje velikega števila bitcoinov.

Začnite z BitCoinJ

BitCoinJ gosti Google Code v odlagališču Subversion in ga je mogoče anonimno odjaviti. Ko si ogledate prtljažnik projekta BitCoinJ, ga boste lahko enostavno posodabljali. Vendar ne boste mogli sprejeti nobenih sprememb.

Lahko uporabite odjemalca Subversion, vgrajenega v vaš najljubši IDE, ali preprosto preverite projekt v ukazni vrstici, kot sem storil:

Ko dobite kodo, jo sestavite z Mavenom, sistemom za gradnjo BitCoinJ. Maven se pri gradnji projektov loti življenjskega cikla in je zelo razširljiv s številnimi jedrnimi in neodvisnimi vtičniki. Maven izjemno dobro počne upravljanje odvisnosti. Če pogledate datoteko Maven pom.xml v korenskem imeniku BitCoinJ, boste videli, da uporablja le nekaj odvisnosti; Sem spadajo JUnit in EasyMock za enotno testiranje, SLF4J za beleženje in Bouncy Castle Crypto API-ji za kriptografske operacije, kot so zgoščevanje in podpisovanje.

V ukazni vrstici zaženite mvn čist paket in Maven bo pridobil te in druge odvisnosti, prevedel projekt, zagnal paket enote za preskušanje in zbral prevedeno kodo v datoteko JAR posnetka. Kot je prikazano na sliki 2, Maven najprej izvede čisti življenjski cikel, da se znebi kakršnih koli artefaktov iz prejšnjih zgradb. Nato izvede faze privzetega življenjskega cikla do vključno faze paketa.

Maven ima v rokavu še nekaj koristnih trikov. Najprej izvršitev mvn stran: stran gradi dokumentacijo BitCoinJ, vključno s stranmi o odvisnostih, sledenju težavam, poštnimi seznami, licencami, razvojno skupino, shrambo virov in drugimi. Te strani so ponavadi informativne, a osnovne. Izvršitev mvn javadoc: javadoc ustvari projektno dokumentacijo, ki nam bo prišla prav, ko bomo začeli izvajati API BitCoinJ.

Dokumentacija razkriva, da je API razdeljen na štiri pakete:

  • Odkritje se ukvarja z odkrivanjem / komunikacijo omrežij peer-to-peer.
  • Shrani vsebuje podatkovne strukture za shranjevanje blokov in verige blokov.
  • Primeri vključuje peščico preprostih aplikacij, ki temeljijo na BitCoinJ (te so navdihnile moje primere za ta članek).
  • Jedro vsebuje večino razredov in funkcionalnosti BitCoinJ, vključno z razredi za komunikacijo z enakovrednimi vozlišči, prenos blokovne verige ter pošiljanje in sprejemanje transakcij.

Nastavite primer projekta v Eclipse

Primer kode za ta članek bomo razvili v Eclipse, pri čemer bomo uporabili Maven za upravljanje BitCoinJ kot odvisnosti. Na srečo ima BitCoinJ neprekinjeno integracijsko okolje, ki gradi projekt, zbira in poroča o različnih artefaktih ter posname posnetek JAR v lastno skladišče Maven, ki temelji na projektu Nexus.

Na sliki 3 je prikazano pogovorno okno za ustvarjanje projektov Eclipse, ki je rezultat ustvarjanja novega projekta Maven in izbire arhetipa "quickstart", ki ustvari osnovni projekt Maven. Moja koda za ta projekt živi v paketu z imenom com.waferthin.bitcoinj, ki ustvari 0.0.1-SNAPSHOT z gradnjo Maven.

Če kliknete Finish, čarovniku naročite, da ustvari projekt, kar pomeni, da v imenik projekta s imenom spustite glavni razred "Hello World" src / main / java / com / waferthin / bitcoinj v mojem primeru.

Na koncu moramo Mavenu povedati, da je projekt odvisen od posnetka BitCoinJ, kot je prikazano v seznamu 1. Urejal sem Mavenovo datoteko pom.xml, ki jo je ustvaril čarovnik, da je navedel lokacijo in ime repozitorija Nexus BitCoinJ (vrstice od 18 do 28) in nastavil različica, ki bo odvisna za gradnjo (vrstice 39 do 45):

Seznam 1. Maven pom.xm za projekt BitCoinJ

001 | 002 | 4.0.0 003 | 004 | com.waferthin.bitcoinj.explored 005 | bitcoinj-raziskan 006 | 0.0.1-SNAPSHOT 007 | kozarec 008 | 009 | bitcoinj-raziskan 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-posnetek 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 | sestavi 045 | 046 | 047 |

To je vse. V naslednjem razdelku bomo v našo kodo uvozili razrede BitCoinJ in z Mavenom izdelali projekt BitCoinJ, ne da bi morali kopirati dejansko datoteko JAR.

Ustvarjanje naslova Bitcoin

Za pošiljanje ali prejemanje bitcoinov potrebujete naslov. Naslovi izhajajo iz javnega dela para javno-zasebnih kriptografskih ključev (glejte "Bitcoin za začetnike, 2. del: Bitcoin kot tehnologija in omrežje"). Imenuje se vrsta kriptografije, ki jo uporablja Bitcoin kriptografija eliptične krivulje (ECC). Kriptografija z javnimi ključi, ki jo večina od nas pozna, temelji na težavah pri iskanju glavnih faktorjev velikih celih števil. V nasprotju s tem ECC temelji na težavah pri iskanju diskretnega logaritma eliptične krivulje. (Podrobnejša razlaga tega nas ne bi le vodila navzdol po zajčji luknji višje algebre, temveč bi tudi hitro presegla matematiko moje fakultete. Na srečo nam ni treba vedeti več, da bi lahko uporabili BitCoinJ ECKey razred za predstavitev in ustvarjanje parov ključev.)

V vrstici 20 na seznamu 2 ustvarimo nov par ključev eliptične krivulje z instanciranjem predmeta tipa ECKey. Upoštevajte, da je razred privzet toString () metoda se prepiše, da vrne javni in zasebni ključ v šestnajstiškem zapisu, ki se uporablja v vrstici 23.

Seznam 2. Ustvarjanje para ključev eliptične krivulje z ECKey

001 | paket 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 | javni razred CreateAddress 008

Morda se spomnite, da mora biti javni del para bitcoin ključev naslov. Toda javni del ključa, ki ga generira zgornja koda, na začetku ne bo videti kot naslovi, ki jih odjemalec Bitcoin prikaže v svojem uporabniškem vmesniku. Naslovni obrazec, ki smo ga vajeni pri Bitcoin transakciji, izhaja iz ponavljajočih se zgoščevalnih operacij z javnim ključem. Ta obrazec vključuje zastavico, ki označuje, kateremu od obeh Bitcoin omrežij pripada ključ - Bitcoin-ovi proizvodni mreži ali njeni testni mreži. (Za podrobnejši opis algoritemskega ustvarjanja parov ključev Bitcoin glejte stran wiki Bitcoin.)

Razlikovanje Bitcoin omrežij

Trenutno obstajata dve Bitcoin omrežji, eno za proizvodnjo in drugo, ki se uporablja za razvoj. Obe mreži imata svoj genezni blok in nadaljnjo verigo blokov. Kasneje v tem članku bomo za izvedbo Bitcoin transakcije uporabili Bitcoin testnet. Zaenkrat morate samo vedeti, da se omrežja razlikujejo tako, da se en bajt predhodno čaka na vhod v enega od kriptografskih zgoščevalnih znakov v algoritmu ECC: 0x6f označuje proizvodno omrežje, 0x00 pa preskusno.

Ni nam treba uporabiti zaporedja kriptografskih zgoščenk, ker ECKey razred ponuja enako funkcionalnost kot nasloviti() metoda. Po klicu te metode in prenosu vrste omrežja prek a NetworkParameters (glej vrstico 26 v seznamu 2), nasloviti() metoda vrne Naslov predmet. Ta predmet je toString () metoda bo dala pravi Bitcoin naslov. Po sestavi in ​​izvedbi predavanja dobim naslednji naslov za testno omrežje Bitcoin:

mpJ9UDd4qtNhMiGefK8NM1V5PMq9jMb7ck

Naslovi testne mreže se običajno začnejo z m ali n, medtem ko se proizvodni naslovi začnejo z 1. Poskusite izvršiti isto kodo na svojem računalniku in dobili boste drugačen, edinstven naslov.

Denarnice in ključi

Če sodelujete v Bitcoin gospodarstvu, verjetno vse svoje bogastvo hranite v svoji denarnici. The denarnico ni nič drugega kot lokalna podatkovna datoteka, ki vsebuje zaporedne predmete, ki predstavljajo vse vaše Bitcoin transakcije, in predpomnilnik neuporabljenih naslovov. Vsota zneskov dohodnih in odhodnih transakcij je znesek Bitcoinov v vaši denarnici. V tem razdelku bomo uporabili BitCoinJ Denarnica ustvarite podatkovno datoteko denarnice, jo zapolnite s petimi naslovi in ​​shranite na disk.

The Denarnica razred izvaja Serializabilno vmesnik, ki nam omogoča, da ga obdržimo na disku ali drugem trajnejšem nosilcu podatkov Natančneje, metode loadFromFile (datoteka) in ustrezna saveToFile (datoteka) branje in pisanje datotek denarnice. Uporabili bomo loadFromFile (datoteka) da v datoteko napišete na novo ustvarjen predmet denarnice.

Opomba da datoteke denarnice BitCoinJ niso združljive z datotekami denarnice, ki jih je ustvaril uradni odjemalec Bitcoin.

Ustvarjanje in shranjevanje ključev

The Denarnica razred ima javnega člana z imenom obesek za ključe to je ArrayList vrste ECKey, ki se uporablja za shranjevanje vseh parov EC ključev v denarnici. The addKey (ECKey) metoda se uporablja za dodajanje parov ključev, vendar trenutno ni metode za njihovo odstranitev. To je smiselno, ker uporabnikom ali programom ne bi smelo biti enostavno izbrisati zasebnih ključev: zasebni ključ je potreben za dostop do sredstev, poslanih prek ustreznega javnega ključa. Brez para ključev v denarnici ali nekje z varnostno kopijo bi bila vsa poslana sredstva za vedno izgubljena.

$config[zx-auto] not found$config[zx-overlay] not found