Programmering

Bitcoin til begyndere, del 3: BitCoinJ API

For Java-udviklere er BitCoinJ et udgangspunkt for at udvikle applikationer, der interagerer med Bitcoin-netværket. I denne sidste artikel i en tredelt serie hjælper Dirk Merkel dig med at oprette BitCoinJ i et Eclipse-udviklingsmiljø og går derefter gennem flere korte øvelser, der gør dig bekendt med denne lette implementering af Bitcoin-transaktionsprotokollen.

Tidligere rater i denne tredelte serie har introduceret den konceptuelle og teknologiske ramme for Bitcoin, en virtuel valuta og et peer-to-peer-netværk. Denne artikel, en introduktion til tutorial til BitCoinJ API, antager, at du er fortrolig med Bitcoin-adresser, transaktioner, blokke og block chain.

BitCoinJ er en open source Java-implementering af Bitcoin-protokollen. Som sådan er det et praktisk værktøj at have, hvis du vil skrive Java-applikationer, der interagerer med Bitcoin-netværket. For at udforske BitCoinJ API konstruerer vi forskellige eksempler på applikationer, der illustrerer de nødvendige programmeringstrin til at konstruere mere komplekse Bitcoin-applikationer i Java. Efter at have brugt Maven til at oprette og oprette et projekt i Eclipse IDE, vil vi øve os i at oprette en Bitcoin-adresse, gemme den i en tegnebog og gemme tegnebogen på disken. Vi opretter derefter en forbindelse til Bitcoin-testnetværket og henter dets oprindelsesblok. Endelig binder vi vores prøvekode indtil videre ved at sende nogle Bitcoins til en adresse på testnetværket.

Om BitCoinJ

BitCoinJ er en Java-implementering af Bitcoin-protokollen. Skrevet af Mike Hearn, BitCoinJ er ikke en fuld implementering af den oprindelige Bitcoin-klient, men en mere let og tilgængelig version. Mens det er solidt nok til at lære af, er BitCoinJ stadig under udvikling (i øjeblikket v.0.3) og bør ikke bruges til at flytte et stort antal Bitcoins.

Kom godt i gang med BitCoinJ

BitCoinJ er hostet af Google Code i et Subversion-arkiv og kan anonymt tjekkes ud. Når du har tjekket bagagerummet til BitCoinJ-projektet, kan du nemt holde det opdateret. Du kan dog ikke foretage ændringer.

Du kan bruge Subversion-klienten indbygget i din yndlings-IDE eller bare tjekke projektet fra kommandolinjen, som jeg gjorde:

Når du har koden, kompilerer du den med Maven, BitCoinJs byggesystem. Maven tager en livscyklus tilgang til bygningsprojekter og er meget udvidelig med mange kerne- og tredjeparts-plugins. Hvad Maven gør meget godt, er at styre afhængigheder. Hvis du ser på Maven pom.xml-filen i BitCoinJs rodmappe, vil du se, at den kun bruger en håndfuld afhængigheder; disse inkluderer JUnit og EasyMock til enhedstest, SLF4J til logning og Bouncy Castle Crypto API'er til kryptografiske operationer som hashing og signering.

Kør fra kommandolinjen mvn ren pakke og Maven vil hente disse og andre afhængigheder, kompilere projektet, køre enhedstestpakken og pakke den kompilerede kode i et snapshot-JAR-fil. Som vist i figur 2 udfører Maven først den rene livscyklus for at slippe af med artefakter fra tidligere builds. Derefter udføres faserne i standardlivscyklussen til og med pakkefasen.

Maven har et par flere nyttige tricks i ærmet. Først udførelse mvn site: site bygger BitCoinJ-dokumentationen, herunder sider om afhængigheder, sporing af emner, mailinglister, licens, udviklingsteam, kildelager og andre. Disse sider har tendens til at være informative, men grundlæggende. Udfører mvn javadoc: javadoc genererer projektets dokumentation, som vil være praktisk, når vi begynder at udøve BitCoinJ API.

Dokumentationen afslører, at API'et er opdelt i fire pakker:

  • Opdagelse beskæftiger sig med peer-to-peer netværk opdagelse / kommunikation.
  • butik indeholder datastrukturer til lagring af blokke og blokkæden.
  • Eksempler inkluderer en håndfuld enkle applikationer baseret på BitCoinJ (disse inspirerede mine egne eksempler til denne artikel).
  • Kerne indeholder størstedelen af ​​BitCoinJs klasser og funktionalitet, herunder klasser til at kommunikere med peer-noder, downloade block chain og sende og modtage transaktioner.

Opret eksempelprojektet i Eclipse

Vi udvikler eksempelkoden til denne artikel i Eclipse ved hjælp af Maven til at styre BitCoinJ som en afhængighed. Heldigvis har BitCoinJ et kontinuerligt integrationsmiljø, der bygger projektet, indsamler og rapporterer om forskellige artefakter og deponerer et øjebliksbillede af JAR i projektets eget Nexus-baserede Maven-arkiv.

Figur 3 viser dialogboksen Eclipse-projektoprettelse, der er resultatet af oprettelse af et nyt Maven-projekt og valg af "hurtigstart" -arketypen, som genererer et grundlæggende Maven-projekt. Min kode til dette projekt lever i en pakke med navnet com.waferthin.bitcoinj, der producerer en 0.0.1-SNAPSHOT med Maven-build.

Klik på Udfør instruerer guiden til at oprette projektet, hvilket betyder at droppe en "Hello World" -klasse i projektmappen - navngivet src / main / java / com / waferthin / bitcoinj i mit tilfælde.

Endelig er vi nødt til at fortælle Maven, at projektet afhænger af BitCoinJ-øjebliksbillede, som vist i liste 1. Jeg redigerede Mavens guiden-genererede pom.xml-fil for at erklære placeringen og navnet på BitCoinJs Nexus-lager (linie 18 til 28) og indstille den version, der skal afhænge af for buildet (linje 39 til 45):

Notering 1. Maven pom.xm til BitCoinJ-projektet

001 | 002 | 4.0.0 003 | 004 | com.waferthin.bitcoinj.explored 005 | bitcoinj-udforsket 006 | 0.0.1-SNAPSHOT 007 | krukke 008 | 009 | bitcoinj-udforsket 010 | //maven.apache.org 011 | 012 | 013 | UTF-8 014 | 015 | 016 | 017 | 018 | 019 | bitcoinj-frigivelse 020 | 021 | 022 | //nexus.bitcoinj.org/content/repositories/releases 023 | 024 | 025 | bitcoinj-øjebliksbillede 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 | kompilere 045 | 046 | 047 |

Det er alt der er ved det. I det næste afsnit importerer vi BitCoinJ-klasser til vores kode og bygger et BitCoinJ-projekt med Maven, alt sammen uden at skulle kopiere den faktiske JAR-fil.

Oprettelse af en Bitcoin-adresse

For at sende eller modtage Bitcoins skal du have en adresse. Adresser stammer fra den offentlige del af et offentligt-privat kryptografisk nøglepar (se "Bitcoin for begyndere, del 2: Bitcoin som teknologi og netværk"). Den slags kryptografi, der bruges af Bitcoin kaldes elliptisk kurve kryptografi (ECC). Den offentlige nøglekryptografi, som de fleste af os kender, er baseret på vanskeligheden ved at finde de primære faktorer for store heltal. I modsætning hertil er ECC baseret på vanskeligheden ved at finde den diskrete logaritme af en elliptisk kurve. (At forklare dette mere detaljeret ville ikke kun føre os ned ad kaninhullet i højere algebra, men ville også hurtigt overstige min college-matematik. Heldigvis behøver vi ikke vide mere for at kunne bruge BitCoinJs ECKey klasse til at repræsentere og generere nøglepar.)

I linje 20 i liste 2 opretter vi et nyt nøglepar med elliptisk kurve ved at instantiere et objekt af typen ECKey. Bemærk, at klassens standard er toString () metoden overskrives for at returnere den offentlige og private nøgle i hex notation, som bruges på linje 23.

Fortegnelse 2. Oprettelse af et elliptisk kurvetastpar med ECKey

001 | pakke 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 | offentlig klasse CreateAddress 008

Du husker måske, at den offentlige del af et Bitcoin-nøglepar skal være en adresse. Men den offentlige del af nøglen, der genereres af ovenstående kode, ser oprindeligt ikke ud som de adresser, som Bitcoin-klienten viser i dets brugergrænseflade. Adresseformularen, vi er vant til at se i en Bitcoin-transaktion, stammer fra gentagne hashoperationer til den offentlige nøgle. Denne formular inkluderer et flag, der angiver, hvilket af de to Bitcoin-netværk nøglen tilhører - Bitcoins produktionsnetværk eller dets testnetværk. (Se Bitcoin-wiki-siden for en mere detaljeret beskrivelse af den algoritmiske oprettelse af Bitcoin-nøglepar.)

Differentiering af Bitcoin-netværk

I øjeblikket er der to Bitcoin-netværk, et til produktion og et, der bruges til udvikling. Begge netværk har deres egen genese-blok og efterfølgende block chain. Senere i denne artikel bruger vi Bitcoin testnet til at udføre en Bitcoin-transaktion. For øjeblikket behøver du kun at vide, at netværkene er differentieret ved at afvente en enkelt byte til input til en af ​​de kryptografiske hashes i ECC-algoritmen: 0x6f angiver produktionsnetværket og 0x00 testet.

Vi behøver ikke selv at anvende sekvensen af ​​kryptografiske hashes, fordi ECKey klasse giver den samme funktionalitet med toAddress () metode. Efter at have påberåbt sig denne metode og overført typen af ​​netværk via en Netværksparametre objekt (se linje 26 i liste 2), toAddress () metode returnerer en Adresse objekt. Det er objektet toString () metode giver en ægte Bitcoin-adresse. Efter kompilering og eksekvering af klassen får jeg følgende adresse til Bitcoins testnetværk:

mpJ9UDd4qtNhMiGefK8NM1V5PMq9jMb7ck

Testnet-adresser starter typisk med m eller n, hvorimod produktionsadresser starter med 1. Prøv at udføre den samme kode på din egen maskine, så får du en anden, unik adresse.

Tegnebøger og nøgler

Hvis du deltager i Bitcoin-økonomien, beholder du sandsynligvis al din formue i din tegnebog. Det tegnebog er intet andet end en lokal datafil, der indeholder serieobjekter, der repræsenterer alle dine Bitcoin-transaktioner og en cache med ubrugte adresser. Summen af ​​dine indgående og udgående transaktionsbeløb er mængden af ​​Bitcoins i din tegnebog. I dette afsnit bruger vi BitCoinJ'er Tegnebog mod at oprette en tegnebogsfil, udfyld den med fem adresser og gem den på disken.

Det Tegnebog klasse implementerer Serialiserbar interface, der gør det muligt for os at fortsætte den til disken eller et andet mere permanent lagringsmedium. Specifikt metoder loadFromFile (fil) og det tilsvarende saveToFile (fil) læse og skrive tegnebogsfiler. Vi bruger loadFromFile (fil) for at skrive et nyoprettet tegnebogsobjekt til en fil.

Bemærk at BitCoinJ tegnebog-filer ikke er kompatible med tegnebog-filer oprettet af den officielle Bitcoin-klient.

Oprettelse og opbevaring af nøgler

Det Tegnebog klasse har et offentligt medlem ved navn nøglering det er en ArrayList af typen ECKey, som bruges til at gemme alle EC-nøglepar i tegnebogen. Det addKey (ECKey) metoden bruges til at tilføje nøglepar, men der er i øjeblikket ingen metode til at fjerne dem. Dette giver mening, fordi det ikke burde være let for brugere eller programmer at slette private nøgler: en privat nøgle kræves for at få adgang til midler, der sendes via den tilsvarende offentlige nøgle. Uden et nøglepar i tegnebogen eller sikkerhedskopieret et eller andet sted ville eventuelle sendte midler gå tabt for evigt.

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