Programmēšana

Bitcoin iesācējiem, 3. daļa: BitCoinJ API

Java izstrādātājiem BitCoinJ ir sākumpunkts tādu lietojumprogrammu izstrādei, kuras mijiedarbojas ar Bitcoin tīklu. Šajā trīsdaļīgo sēriju pēdējā rakstā Dirks Merkels palīdz jums iestatīt BitCoinJ Eclipse izstrādes vidē, pēc tam iziet vairākus īsus vingrinājumus, kas jūs iepazīstinās ar šo Bitcoin transakciju protokola vieglo ieviešanu.

Iepriekšējās šīs trīsdaļīgās sērijas daļas ir ieviesušas Bitcoin, virtuālās valūtas un vienādranga tīkla, konceptuālo un tehnoloģisko sistēmu. Šajā rakstā, BitCoinJ API apmācības ievadā, tiek pieņemts, ka esat iepazinies ar Bitcoin adresēm, darījumiem, blokiem un bloku ķēdi.

BitCoinJ ir atvērtā koda Java ieviešana Bitcoin protokolā. Kā tāds tas ir ērts rīks, kas ir, ja vēlaties rakstīt Java lietojumprogrammas, kas mijiedarbojas ar Bitcoin tīklu. Lai izpētītu BitCoinJ API, mēs izveidosim dažādas piemēru lietojumprogrammas, kas ilustrē programmēšanas darbības, kas nepieciešamas, lai Java izveidotu sarežģītākas Bitcoin lietojumprogrammas. Pēc Maven izmantošanas, lai izveidotu un izveidotu projektu Eclipse IDE, mēs praktizēsim Bitcoin adreses izveidi, glabāšanu seifā un seifa saglabāšanu diskā. Pēc tam mēs izveidosim savienojumu ar Bitcoin testa tīklu un izgūsim tā ģenēzes bloku. Visbeidzot, mēs sasaistīsim līdz šim savu parauga kodu, nosūtot dažus Bitcoins uz adresi testa tīklā.

Par BitCoinJ

BitCoinJ ir Bitcoin protokola Java ieviešana. Raksta Mike Hearn, BitCoinJ nav pilnīga sākotnējā Bitcoin klienta ieviešana, bet vieglāka un pieejamāka versija. Lai gan tas ir pietiekami stingrs, lai no tā mācītos, BitCoinJ joprojām tiek izstrādāts (pašlaik v.0.3 versijā), un to nevajadzētu izmantot, lai pārvietotu lielu skaitu Bitcoins.

Sāciet darbu ar BitCoinJ

BitCoinJ tiek mitināts ar Google Code Subversion krātuvē, un to var anonīmi pārbaudīt. Kad esat pārbaudījis BitCoinJ projekta bagāžnieku, varēsiet to viegli atjaunināt. Tomēr jūs nevarēsiet veikt nekādas izmaiņas.

Jūs varat izmantot Subversion klientu, kas iebūvēts jūsu iecienītākajā IDE, vai vienkārši pārbaudīt projektu no komandrindas, kā es to darīju:

Kad būsiet ieguvis kodu, to apkoposiet ar Maven, BitCoinJ būvēšanas sistēmu. Maven ēku projektos izmanto dzīves cikla pieeju, un tas ir ļoti paplašināms, izmantojot daudzus galveno un trešo pušu spraudņus. Tas, ko Maven veic ārkārtīgi labi, ir atkarību pārvaldīšana. Ja paskatās uz failu Maven pom.xml BitCoinJ saknes direktorijā, redzēsiet, ka tajā tiek izmantotas tikai dažas atkarības; to skaitā ir JUnit un EasyMock vienību testēšanai, SLF4J mežizstrādei un Bouncy Castle Crypto API kriptogrāfiskām darbībām, piemēram, jaukšanai un parakstīšanai.

No komandrindas palaidiet mvn tīrs iepakojums un Maven izgūs šīs un citas atkarības, apkopos projektu, palaidīs vienības testa komplektu un iesaiņos apkopoto kodu momentuzņēmuma JAR failā. Kā parādīts 2. attēlā, Maven vispirms veic tīru dzīves ciklu, lai atbrīvotos no jebkādiem artefaktiem no iepriekšējām būvēm. Pēc tam tā izpilda noklusējuma dzīves cikla fāzes līdz paketes fāzei (ieskaitot).

Mavenam ir vēl daži noderīgi triki. Pirmkārt, izpildot mvn vietne: vietne izveido BitCoinJ dokumentāciju, ieskaitot lapas par atkarībām, problēmu izsekošanu, adresātu sarakstiem, licenci, izstrādes komandu, avotu repozitoriju un citas. Šīs lapas parasti ir informatīvas, bet vienkāršas. Izpilda mvn javadoc: javadoc ģenerē projekta dokumentāciju, kas noderēs, kad sāksim izmantot BitCoinJ API.

Dokumentācija atklāj, ka API ir sadalīta četrās paketēs:

  • Atklāšana nodarbojas ar vienādranga tīkla atklāšanu / saziņu.
  • Veikals satur datu struktūras bloku un bloku ķēdes glabāšanai.
  • Piemēri ietver nedaudz vienkāršu lietojumprogrammu, kuru pamatā ir BitCoinJ (tās iedvesmoja manis paša piemērus šim rakstam).
  • Kodols satur lielāko daļu BitCoinJ klases un funkcionalitātes, ieskaitot klases saziņai ar vienaudžu mezgliem, bloku ķēdes lejupielādi un darījumu sūtīšanu un saņemšanu.

Iestatiet projekta piemēru Eclipse

Mēs izstrādāsim šī raksta koda piemēru Eclipse, izmantojot Maven, lai BitCoinJ pārvaldītu kā atkarību. Par laimi, BitCoinJ ir nepārtraukta integrācijas vide, kas būvē projektu, vāc un ziņo par dažādiem artefaktiem, un noglabā momentuzņēmuma JAR projekta paša Nexus balstītajā Maven repozitorijā.

3. attēlā parādīts Eclipse projekta izveides dialoglodziņš, kas rodas, izveidojot jaunu Maven projektu un izvēloties "quickstart" arhetipu, kas ģenerē Maven pamata projektu. Mans šī projekta kods dzīvo nosaukumā com.waferthin.bitcoinj, kas ar Maven būvējumu rada 0.0.1-SNAPSHOT.

Noklikšķinot uz Pabeigt, vednis uzdod izveidot projektu, kas nozīmē "Hello World" galvenās klases nomešanu projekta direktorijā ar nosaukumu src / main / java / com / waferthin / bitcoinj manā gadījumā.

Visbeidzot, mums jāpasaka Mavenam, ka projekts ir atkarīgs no BitCoinJ momentuzņēmuma, kā parādīts 1. sarakstā. Es rediģēju Maven vedņa ģenerēto pom.xml failu, lai deklarētu BitCoinJ Nexus krātuves atrašanās vietu un nosaukumu (18. līdz 28. rindiņa) un iestatītu versija, no kuras atkarīgs būvējums (39. – 45. rinda):

Saraksts 1. Maven pom.xm projektam BitCoinJ

001 | 002 | 4.0.0 003 | 004 | com.waferthin.bitcoinj.pētīts 005 | bitcoinj izpētītais 006 | 0.0.1-SNAPSHOT 007 | burka 008 | 009 | bitcoinj izpētītais 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-momentuzņēmums 026 | 027 | //nexus.bitcoinj.org/content/repositories/snapshots 028 | 029 | 030 | 031 | 032 | 033 | junit 034 | junit 035 | 3.8.1 036 | pārbaude 037 | 038 | 039 | 040 | 041 | com.google 042 | bitcoinj 043 | 0,3-SNAPSHOT 044 | sastādīt 045 | 046 | 047 |

Tas ir viss, kas tam ir. Nākamajā sadaļā mēs importēsim BitCoinJ klases mūsu kodā un izveidosim BitCoinJ projektu ar Maven, visu to nevajadzējot kopēt faktisko JAR failu.

Bitcoin adreses izveide

Lai nosūtītu vai saņemtu Bitcoins, jums ir nepieciešama adrese. Adreses tiek iegūtas no publiskā un privātā kriptogrāfisko atslēgu pāra publiskās daļas (sk. "Bitcoin iesācējiem, 2. daļa: Bitcoin kā tehnoloģija un tīkls"). Tiek saukts Bitcoin izmantotais kriptogrāfijas veids eliptiskās līknes kriptogrāfija (ECC). Publiskās atslēgas kriptogrāfija, ko lielākā daļa no mums zina, balstās uz grūtībām atrast lielu veselu skaitļu galvenos faktorus. Turpretī ECC pamatā ir grūtības atrast eliptiskas līknes diskrēto logaritmu. (Sīkāk to izskaidrojot, mēs ne tikai novestu mūs pie augstākas algebras truša, bet arī ātri pārsniegtu manu koledžas matemātiku. Par laimi, mums nav jāzina vairāk, lai izmantotu BitCoinJ ECKey klase, lai attēlotu un ģenerētu atslēgu pārus.)

2. saraksta 20. rindā mēs izveidojam jaunu elipsveida līknes atslēgu pāri, veicot tāda veida objekta parādīšanos ECKey. Ņemiet vērā, ka klases noklusējums toString () metode tiek pārrakstīta, lai atgrieztu publisko un privāto atslēgu hex apzīmējumā, ko izmanto 23. rindā.

Saraksts 2. Eliptiskas līknes atslēgu pāra izveide ar ECKey

001 | pakete com.waferthin.bitcoinj; 002 | 003 | importēt com.google.bitcoin.core.ECKey; 004 | importēt com.google.bitcoin.core.NetworkParameters; 005 | importēt vietni com.google.bitcoin.core.Address; 006 | 007 | publiskā klase CreateAddress 008

Jūs varētu atcerēties, ka Bitcoin atslēgu pāra publiskajai daļai jābūt adresei. Bet iepriekš minētā koda radītās atslēgas publiskā daļa sākotnēji neizskatīsies pēc adresēm, kuras Bitcoin klients parāda savā lietotāja saskarnē. Adreses forma, kuru mēs esam pieraduši redzēt Bitcoin darījumā, tiek iegūta, atkārtoti veicot hash operācijas ar publisko atslēgu. Šajā veidlapā ietilpst karodziņš, kas norāda, kuram no diviem Bitcoin tīkliem pieder atslēga - Bitcoin ražošanas tīklam vai tā testa tīklam. (Detalizētāku Bitcoin atslēgu pāru izveidošanas algoritmisko aprakstu skatiet Bitcoin wiki lapā.)

Diferencējot Bitcoin tīklus

Pašlaik ir divi Bitcoin tīkli, viens ražošanai un viens, kas tiek izmantots attīstībai. Abiem tīkliem ir savs ģenēzes bloks un turpmākā bloku ķēde. Vēlāk šajā rakstā mēs izmantosim Bitcoin testnet, lai veiktu Bitcoin darījumu. Pagaidām jums jāzina tikai tas, ka tīkli tiek diferencēti, iepriekš gaidot vienu baitu uz ievadi vienā no ECC algoritma kriptogrāfiskajām jaukšanām: 0x6f norāda ražošanas tīklu un 0x00 testa.

Mums pašiem nav jāpiemēro kriptogrāfisko jaukšanas secību, jo ECKey klase nodrošina tādu pašu funkcionalitāti kā uz adresi() metodi. Pēc šīs metodes izmantošanas un tīkla veida nodošanas, izmantojot a NetworkParameters objektu (skat. 26. rindu 2. sarakstā), uz adresi() metode atgriež Adrese objekts. Šis objekts ir toString () metode iegūs patiesu Bitcoin adresi. Pēc klases sastādīšanas un izpildes es saņemu šādu Bitcoin testa tīkla adresi:

mpJ9UDd4qtNhMiGefK8NM1V5PMq9jMb7ck

Testnet adreses parasti sākas ar m vai n, turpretī ražošanas adreses sākas ar 1. Mēģiniet izpildīt to pašu kodu savā datorā, un jūs saņemsiet citu, unikālu adresi.

Maki un atslēgas

Ja jūs piedalāties Bitcoin ekonomikā, jūs, iespējams, glabājat visas savas bagātības savā makā. The maciņš ir nekas cits kā lokāls datu fails, kas satur sērijveida objektus, kas attēlo visus jūsu Bitcoin darījumus, un neizmantoto adrešu kešatmiņu. Jūsu ienākošo un izejošo darījumu summu summa ir jūsu makā esošo Bitcoins daudzums. Šajā sadaļā mēs izmantosim BitCoinJ Maks objektu, lai izveidotu seifa datu failu, aizpildiet to ar piecām adresēm un saglabājiet to diskā.

The Maks klase īsteno Serializējams interfeiss, lai mēs varētu to saglabāt diskā vai kādā citā pastāvīgākā datu nesējā. Konkrēti, metodes loadFromFile (fails) un attiecīgais saveToFile (fails) lasīt un rakstīt seifa failus. Mēs izmantosim loadFromFile (Fails) lai ierakstītu failā nesen izveidotu seifa objektu.

Piezīme ka BitCoinJ maka faili nav saderīgi ar seifa failiem, kurus izveidojis oficiālais Bitcoin klients.

Atslēgu izveidošana un glabāšana

The Maks klasei ir publisks biedrs ar nosaukumu atslēgu piekariņš tas ir ArrayList veida ECKey, ko izmanto, lai makā glabātu visus EK atslēgu pārus. The addKey (ECKey) metodi izmanto atslēgu pāru pievienošanai, taču pašlaik nav metodes to noņemšanai. Tam ir jēga, jo lietotājiem vai programmām nevajadzētu būt viegli izdzēst privātās atslēgas: privāta atslēga ir nepieciešama, lai piekļūtu līdzekļiem, kas nosūtīti, izmantojot atbilstošo publisko atslēgu. Ja makā nebūtu atslēgu pāra vai kaut kur dublēts, visi nosūtītie līdzekļi tiktu zaudēti uz visiem laikiem.

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