Programavimas

„Bitcoin“ pradedantiesiems, 3 dalis: „BitCoinJ“ API

„Java“ kūrėjams „BitCoinJ“ yra pradinis taškas kuriant programas, kurios sąveikauja su „Bitcoin“ tinklu. Šiame paskutiniame trijų dalių serijos straipsnyje Dirkas Merkelis padeda jums nustatyti „BitCoinJ“ „Eclipse“ kūrimo aplinkoje, tada eina per keletą trumpų pratimų, kurie supažindins jus su šiuo lengvu „Bitcoin“ operacijų protokolo įgyvendinimu.

Ankstesnėse šios trijų dalių serijos dalyse pristatyta konceptuali ir technologinė „Bitcoin“ sistema, virtuali valiuta ir „peer-to-peer“ tinklas. Šiame straipsnyje, „BitCoinJ“ API mokomojoje įžangoje, daroma prielaida, kad esate susipažinę su „Bitcoin“ adresais, operacijomis, blokais ir blokų grandine.

„BitCoinJ“ yra „Java“ atvirojo kodo „Bitcoin“ protokolo įgyvendinimas. Tai yra patogus įrankis, jei norite rašyti „Java“ programas, kurios sąveikauja su „Bitcoin“ tinklu. Norėdami ištirti „BitCoinJ“ API, sukursime įvairias pavyzdines programas, iliustruojančias programavimo veiksmus, reikalingus norint sukurti sudėtingesnes „Bitcoin“ programas „Java“. Pasinaudoję „Maven“ sukūrę ir sukūrę projektą „Eclipse IDE“, mes praktikuosime kurti „Bitcoin“ adresą, išsaugoti jį piniginėje ir išsaugoti piniginę diske. Tada mes sukursime ryšį su „Bitcoin“ testų tinklu ir atkursime jo genezės bloką. Galiausiai susiesime savo pavyzdinį kodą iki šiol, išsiųsdami keletą bitkoinų bandomojo tinklo adresu.

Apie „BitCoinJ“

„BitCoinJ“ yra „Bitcoin“ protokolo „Java“ diegimas. Parašė Mike'as Hearnas, „BitCoinJ“ nėra visiškai įdiegtas originalus „Bitcoin“ klientas, bet lengvesnė ir prieinamesnė versija. Nors „BitCoinJ“ yra pakankamai tvirta, kad iš to būtų galima mokytis, „BitCoinJ“ vis dar kuriamas (šiuo metu yra v.0.3) ir neturėtų būti naudojamas norint perkelti daugybę „Bitcoins“.

Pradėkite naudotis „BitCoinJ“

„BitCoinJ“ talpina „Google Code“ „Subversion“ saugykloje, todėl ją galima anonimiškai patikrinti. Kai patikrinsite „BitCoinJ“ projekto bagažinę, galėsite lengvai jį atnaujinti. Tačiau negalėsite atlikti jokių pakeitimų.

Galite naudoti „Subversion“ klientą, integruotą į savo mėgstamą IDE, arba tiesiog patikrinti komandą iš komandinės eilutės, kaip aš:

Kai turėsite kodą, sukompiliuosite jį su „Maven“, „BitCoinJ“ kūrimo sistema. „Maven“ per visą gyvavimo ciklą žiūri į pastatų projektus ir yra labai išplėstas naudodamas daugelį pagrindinių ir trečiųjų šalių papildinių. Tai, ką Mavenas daro nepaprastai gerai, yra valdyti priklausomybes. Jei pažvelgsite į „Maven pom.xml“ failą „BitCoinJ“ šakniniame kataloge, pamatysite, kad jis naudoja tik keletą priklausomybių; tai apima „JUnit“ ir „EasyMock“, skirtus vienetams išbandyti, SLF4J - medienos ruoša, ir „Bouncy Castle Crypto“ API kriptografinėms operacijoms, tokioms kaip maiša ir pasirašymas.

Iš komandinės eilutės paleiskite mvn švari pakuotė ir Mavenas nuskaitys šias ir kitas priklausomybes, sukompiliuos projektą, paleis vieneto testų rinkinį ir supakuotą kompiliuojamą kodą sudarys JAR momentinio failo failą. Kaip parodyta 2 paveiksle, Mavenas pirmiausia atlieka švarų gyvenimo ciklą, kad atsikratytų bet kokių ankstesnių kūrinių artefaktų. Tada jis vykdo numatytojo gyvavimo ciklo etapus iki paketo fazės.

Mavenas turi dar keletą naudingų triukų ant rankovės. Pirma, vykdymas mvn site: site sukuria „BitCoinJ“ dokumentaciją, įskaitant puslapius apie priklausomybes, problemų stebėjimą, adresų sąrašus, licenciją, kūrimo komandą, šaltinio saugyklą ir kt. Šie puslapiai paprastai yra informatyvūs, bet pagrindiniai. Vykdoma mvn javadoc: javadoc sugeneruoja projekto dokumentaciją, kuri bus naudinga, kai pradėsime naudoti „BitCoinJ“ API.

Dokumentai rodo, kad API yra padalinta į keturis paketus:

  • Atradimas užsiima tarpusavio tinklo atradimu / bendravimu.
  • Parduotuvė yra duomenų struktūros blokams ir blokų grandinei saugoti.
  • Pavyzdžiai apima keletą paprastų programų, pagrįstų „BitCoinJ“ (tai įkvėpė mano paties pavyzdžius šiam straipsniui).
  • Šerdis yra dauguma „BitCoinJ“ klasių ir funkcijų, įskaitant klases, skirtas bendrauti su bendraamžių mazgais, atsisiųsti blokų grandinę ir siųsti bei gauti operacijas.

„Eclipse“ nustatykite projekto pavyzdį

Mes sukursime šio straipsnio kodo pavyzdį „Eclipse“, naudodami „Maven“ valdydami „BitCoinJ“ kaip priklausomybę. Laimei, „BitCoinJ“ turi nuolatinę integravimo aplinką, kuri kuria projektą, renka įvairius artefaktus ir teikia ataskaitas apie juos, o JAR momentinę kopiją talpina projekto „Nexus“ pagrįstoje „Maven“ saugykloje.

3 paveiksle parodytas „Eclipse“ projekto kūrimo dialogas, sukurtas sukūrus naują „Maven“ projektą ir pasirinkus „greitojo paleidimo“ archetipą, kuris sukuria pagrindinį „Maven“ projektą. Mano kodas šiam projektui gyvena pakete pavadinimu com.waferthin.bitcoinj, kuris sukuria 0.0.1-SNAPSHOT su „Maven“ komponavimu.

Spustelėjus Baigti, vedlys nurodo sukurti projektą, o tai reiškia, kad „Hello World“ pagrindinė klasė bus įtraukta į projekto katalogą, pavadintą src / main / java / com / waferthin / bitcoinj Mano atveju.

Galiausiai turime pasakyti Mavenui, kad projektas priklauso nuo „BitCoinJ“ momentinės nuotraukos, kaip parodyta 1 sąraše. Aš redagavau „Maven“ vedlio sugeneruotą pom.xml failą, norėdamas deklaruoti „BitCoinJ“ „Nexus“ saugyklos vietą ir pavadinimą (18–28 eilutės) ir nustatyti versija, nuo kurios priklauso sukūrimas (39–45 eilutės):

Sąrašas 1. „Maven pom.xm“, skirtas „BitCoinJ“ projektui

001 | 002 | 4.0.0 003 | 004 | com.waferthin.bitcoinj. ištirtas 005 | bitcoinj tyrinetas 006 | 0.0.1-SNAPSHOT 007 | stiklainis 008 | 009 | bitcoinj tyrinėtas 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-snapshot 026 | 027 | //nexus.bitcoinj.org/content/repositories/snapshots 028 | 029 | 030 | 031 | 032 | 033 | junit 034 | junit 035 | 3.8.1 036 | testas 037 | 038 | 039 | 040 | 041 | com.google 042 | bitcoinj 043 | 0,3-SNAPSHOT 044 | sudaryti 045 | 046 | 047 |

Tai viskas. Kitame skyriuje mes importuosime „BitCoinJ“ klases į savo kodą ir sukursime „BitCoinJ“ projektą su „Maven“, be to, nereikia kopijuoti tikrojo JAR failo.

„Bitcoin“ adreso sukūrimas

Norėdami siųsti ar gauti „Bitcoins“, turite adresą. Adresai gaunami iš viešosios ir privačios kriptografinių raktų poros dalies (žr. „Bitcoin pradedantiesiems, 2 dalis: Bitcoin kaip technologija ir tinklas“). Vadinama tokia kriptografijos rūšis, kurią naudoja Bitcoin elipsinės kreivės kriptografija (ECC). Daugelio iš mūsų žinoma viešojo rakto kriptografija pagrįsta sunkumais surasti svarbiausius didelių sveikųjų skaičių veiksnius. Priešingai, ECC yra pagrįstas sunkumais surasti atskirą elipsės kreivės logaritmą. (Tai paaiškinus išsamiau, mes ne tik nuvestume aukštesnės algebros triušio skylę, bet ir greitai viršytume mano kolegijos matematiką. Laimei, mums nereikia žinoti daugiau, kad galėtume naudoti „BitCoinJ“ ECKey klasės atstovauti ir generuoti raktų poras.)

2 sąrašo 20 eilutėje sukuriame naują elipsinės kreivės raktų porą, išjudindami tipo objektą ECKey. Atkreipkite dėmesį, kad klasės numatytasis nustatymas toString () metodas yra perrašomas, kad būtų galima grąžinti viešąjį ir privatųjį raktą šešioliktainiu būdu, kuris naudojamas 23 eilutėje.

Sąrašas 2. Elipsinės kreivės klavišų poros sukūrimas naudojant ECKey

001 | paketas com.waferthin.bitcoinj; 002 | 003 | importuoti com.google.bitcoin.core.ECKey; 004 | importuoti com.google.bitcoin.core.NetworkParameters; 005 | importuoti com.google.bitcoin.core.adresas; 006 | 007 | viešoji klasė „CreateAddress 008“

Galite prisiminti, kad viešoji „Bitcoin“ raktų poros dalis turėtų būti adresas. Tačiau pirmiau minėto kodo sugeneruota rakto viešoji dalis iš pradžių atrodys kaip adresai, kuriuos „Bitcoin“ klientas rodo savo vartotojo sąsajoje. Adreso forma, kurią mes įpratome matyti atliekant „Bitcoin“ operaciją, gaunama pakartotinėmis maišos operacijomis viešajam raktui. Šioje formoje yra žymė, nurodanti, kuriam iš dviejų „Bitcoin“ tinklų priklauso raktas - „Bitcoin“ gamybos tinklui ar jo bandomajam tinklui. (Išsamesnį algoritminio „Bitcoin“ raktų porų kūrimo aprašymą rasite „Bitcoin wiki“ puslapyje.)

Diferencijuojant Bitcoin tinklus

Šiuo metu yra du „Bitcoin“ tinklai, vienas skirtas gamybai, o kitas - plėtrai. Abu tinklai turi savo genezės bloką ir tolesnę blokinę grandinę. Vėliau šiame straipsnyje naudosime „Bitcoin testnet“, kad įvykdytume Bitcoin operaciją. Kol kas reikia tik žinoti, kad tinklai yra diferencijuojami iš anksto laukiant vieno baito įėjimo į vieną iš kriptografinių maišų ECC algoritme: 0x6f nurodo gamybos tinklą, o 0x00 - bandomąjį.

Mums nereikia patiems taikyti kriptografinių maišų sekos, nes ECKey klasė teikia tą pačią funkciją su Adresuoti() metodas. Pasinaudojus tuo metodu ir perduodant tinklo tipą per a Tinklo parametrai objektas (žr. 26 eilutę 2 sąraše), Adresuoti() metodas grąžina Adresas objektas. Tas objektas toString () metodas suteiks tikrą Bitcoin adresą. Sudarius ir įvykdžius klasę, gaunu šį Bitcoin testavimo tinklo adresą:

mpJ9UDd4qtNhMiGefK8NM1V5PMq9jMb7ck

Testnet adresai paprastai prasideda m arba n, o gamybos adresai prasideda 1. Pabandykite tą patį kodą vykdyti savo kompiuteryje ir gausite kitą, unikalų adresą.

Piniginės ir raktai

Jei dalyvausite „Bitcoin“ ekonomikoje, greičiausiai visus savo turtus laikysite piniginėje. piniginė yra ne kas kita, kaip vietinis duomenų failas, kuriame yra serijiniai objektai, vaizduojantys visas jūsų „Bitcoin“ operacijas, ir nenaudojamų adresų talpykla. Jūsų gaunamų ir siunčiamų operacijų sumų suma yra „Bitcoins“ kiekis jūsų piniginėje. Šiame skyriuje naudosime „BitCoinJ“ Piniginė objektas sukurti piniginės duomenų failą, užpildykite jį penkiais adresais ir išsaugokite diske.

Piniginė klasė įgyvendina Serijinis sąsają, kad galėtume ją išsaugoti diske ar kitoje nuolatinėje laikmenoje. Tiksliau, metodai loadFromFile (failas) ir atitinkamas saveToFile (failas) skaityti ir rašyti piniginės failus. Mes naudosime loadFromFile (failas) parašyti naujai sukurtą piniginės objektą į failą.

Pastaba kad „BitCoinJ“ piniginės failai nesuderinami su piniginės failais, kuriuos sukūrė oficialus „Bitcoin“ klientas.

Raktų kūrimas ir saugojimas

Piniginė klasėje yra viešas narys, vardu raktų pakabukas tai yra „ArrayList“ tipo ECKey, kuri naudojama visoms EB raktų poroms laikyti piniginėje. „addKey“ (ECKey) metodas naudojamas raktų poroms pridėti, tačiau šiuo metu nėra metodo jiems pašalinti. Tai prasminga, nes vartotojams ar programoms neturėtų būti lengva ištrinti privačius raktus: norint pasiekti lėšas, atsiųstas per atitinkamą viešąjį raktą, reikalingas privatus raktas. Neturint raktų poros piniginėje ar kur nors nesukūrus atsarginių kopijų, visos atsiųstos lėšos būtų prarastos visiems laikams.

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