Programmering

Bitcoin for nybegynnere, del 3: BitCoinJ API

For Java-utviklere er BitCoinJ et inngangspunkt for å utvikle applikasjoner som samhandler med Bitcoin-nettverket. I denne siste artikkelen i en tredelt serie hjelper Dirk Merkel deg med å sette opp BitCoinJ i et Eclipse-utviklingsmiljø, og går deretter gjennom flere korte øvelser som vil gjøre deg kjent med denne lette implementeringen av Bitcoin-transaksjonsprotokollen.

Tidligere avdrag i denne tredelte serien har introdusert det konseptuelle og teknologiske rammeverket til Bitcoin, et virtuelt valuta- og peer-to-peer-nettverk. Denne artikkelen, en veiledning introduksjon til BitCoinJ API, forutsetter at du er kjent med Bitcoin adresser, transaksjoner, blokker og blokkjeden.

BitCoinJ er en åpen kildekode-Java-implementering av Bitcoin-protokollen. Som sådan er det et praktisk verktøy å ha hvis du vil skrive Java-applikasjoner som samhandler med Bitcoin-nettverket. For å utforske BitCoinJ API, konstruerer vi forskjellige eksempelapplikasjoner som illustrerer programmeringstrinnene som er nødvendige for å konstruere mer komplekse Bitcoin-applikasjoner i Java. Etter å ha brukt Maven til å bygge og sette opp et prosjekt i Eclipse IDE, vil vi øve oss på å lage en Bitcoin-adresse, lagre den i en lommebok og lagre lommeboken på disken. Deretter oppretter vi en forbindelse til Bitcoin testnettverk og henter sin genese-blokk. Til slutt knytter vi prøvekoden vår så langt ved å sende noen Bitcoins til en adresse i testnettverket.

Om BitCoinJ

BitCoinJ er en Java-implementering av Bitcoin-protokollen. Skrevet av Mike Hearn, er BitCoinJ ikke en full implementering av den opprinnelige Bitcoin-klienten, men en mer lett og tilgjengelig versjon. Selv om det er solid nok til å lære av, er BitCoinJ fortsatt under utvikling (for tiden v.0.3) og bør ikke brukes til å flytte et stort antall Bitcoins.

Kom i gang med BitCoinJ

BitCoinJ er vert for Google Code i et Subversion-lager, og kan anonymt sjekkes ut. Når du sjekker ut kofferten til BitCoinJ-prosjektet, kan du enkelt holde den oppdatert. Du vil imidlertid ikke kunne foreta noen endringer.

Du kan bruke Subversion-klienten innebygd i din favoritt IDE eller bare sjekke ut prosjektet fra kommandolinjen, som jeg gjorde:

Når du har koden, vil du kompilere den med Maven, BitCoinJs byggesystem. Maven tar en livssyklus tilnærming til byggeprosjekter og er svært utvidbar med mange kjerne- og tredjeparts plugins. Det Maven gjør veldig bra, er å håndtere avhengigheter. Hvis du ser på Maven pom.xml-filen i BitCoinJs rotkatalog, vil du se at den bare bruker en håndfull avhengigheter; disse inkluderer JUnit og EasyMock for enhetstesting, SLF4J for logging og Bouncy Castle Crypto APIer for kryptografiske operasjoner som hashing og signering.

Kjør fra kommandolinjen mvn ren pakke og Maven vil hente disse og andre avhengigheter, kompilere prosjektet, kjøre enhetstestpakken og pakke den kompilerte koden i et JAR-filbilde. Som vist i figur 2, utfører Maven først den rene livssyklusen for å kvitte seg med gjenstander fra tidligere bygg. Den utfører deretter fasene i standard livssyklus til og med pakkefasen.

Maven har noen flere nyttige triks i ermet. Først utførelse mvn nettsted: nettsted bygger BitCoinJ-dokumentasjonen, inkludert sider om avhengigheter, sporing av spørsmål, adresselister, lisenser, utviklingsteam, kildedepot og andre. Disse sidene pleier å være informative, men enkle. Utfører mvn javadoc: javadoc genererer prosjektets dokumentasjon, som vil være nyttig når vi begynner å utøve BitCoinJ API.

Dokumentasjonen avslører at API er delt inn i fire pakker:

  • Oppdagelse arbeider med peer-to-peer nettverk oppdagelse / kommunikasjon.
  • butikk inneholder datastrukturer for lagring av blokker og blokkjeden.
  • Eksempler inkluderer en håndfull enkle applikasjoner basert på BitCoinJ (disse inspirerte mine egne eksempler for denne artikkelen).
  • Kjerne inneholder flertallet av BitCoinJs klasser og funksjonalitet, inkludert klasser for å kommunisere med node-noder, laste ned blokkjeden og sende og motta transaksjoner.

Sett opp eksempelprosjektet i Eclipse

Vi utvikler eksempelkoden for denne artikkelen i Eclipse, ved å bruke Maven til å administrere BitCoinJ som en avhengighet. Heldigvis har BitCoinJ et kontinuerlig integrasjonsmiljø som bygger prosjektet, samler inn og rapporterer om forskjellige gjenstander, og deponerer et øyeblikksbilde JAR i prosjektets eget Nexus-baserte Maven-arkiv.

Figur 3 viser Eclipse-prosjektopprettingsdialogen som er resultatet av å lage et nytt Maven-prosjekt og velge "hurtigstart" arketype, som genererer et grunnleggende Maven-prosjekt. Koden min for dette prosjektet lever i en pakke som heter com.waferthin.bitcoinj, som produserer en 0.0.1-SNAPSHOT med Maven-bygningen.

Ved å klikke på Fullfør instrueres veiviseren om å lage prosjektet, som betyr å slippe en "Hello World" -klasse i prosjektkatalogen - med navnet src / main / java / com / waferthin / bitcoinj i mitt tilfelle.

Til slutt må vi fortelle Maven at prosjektet avhenger av BitCoinJ-øyeblikksbildet, som vist i Listing 1. Jeg redigerte Mavens veivisergenererte pom.xml-fil for å erklære plasseringen og navnet på BitCoinJs Nexus-arkiv (linje 18 til 28) og angi versjonen som skal avhenge av for bygningen (linje 39 til 45):

Oppføring 1. Maven pom.xm for BitCoinJ-prosjektet

001 | 002 | 4.0.0 003 | 004 | com.waferthin.bitcoinj.explored 005 | bitcoinj-utforsket 006 | 0.0.1-SNAPSHOT 007 | krukke 008 | 009 | bitcoinj-utforsket 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-øyeblikksbilde 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 det er med det. I neste avsnitt importerer vi BitCoinJ-klassene til koden vår og bygger et BitCoinJ-prosjekt med Maven, alt uten å måtte kopiere den faktiske JAR-filen.

Opprette en Bitcoin-adresse

For å sende eller motta Bitcoins trenger du en adresse. Adresser er hentet fra den offentlige delen av et offentlig-privat kryptografisk nøkkelpar (se "Bitcoin for nybegynnere, del 2: Bitcoin som teknologi og nettverk"). Den typen kryptografi som brukes av Bitcoin kalles elliptisk kurve kryptografi (ECC). Den offentlige nøkkelkryptografien de fleste av oss kjenner til er basert på vanskeligheten med å finne hovedfaktorene til store heltall. I kontrast er ECC basert på vanskeligheten med å finne den diskrete logaritmen til en elliptisk kurve. (Å forklare dette nærmere vil ikke bare føre oss ned i kaninhullet til høyere algebra, men vil også raskt overstige min matematikk. Heldigvis trenger vi ikke å vite mer for å kunne bruke BitCoinJs ECKey klasse for å representere og generere nøkkelpar.)

I linje 20 i liste 2 lager vi et nytt nøkkelpar med elliptisk kurve ved å instantiere et objekt av typen ECKey. Merk at klassens standard toString () metoden blir overskrevet for å returnere den offentlige og private nøkkelen i hex notasjon, som brukes på linje 23.

Oppføring 2. Opprette et elliptisk kurvetastepar med ECKey

001 | pakke com.waferthin.bitcoinj; 002 | 003 | importer com.google.bitcoin.core.ECKey; 004 | importer com.google.bitcoin.core.NetworkParameters; 005 | importer com.google.bitcoin.core.Address; 006 | 007 | offentlig klasse CreateAddress 008

Du husker kanskje at den offentlige delen av et Bitcoin-nøkkelpar skal være en adresse. Men den offentlige delen av nøkkelen som genereres av koden ovenfor, vil i utgangspunktet ikke se ut som adressene Bitcoin-klienten viser i brukergrensesnittet. Adresseskjemaet vi er vant til å se i en Bitcoin-transaksjon er avledet av gjentatte hasjoperasjoner til den offentlige nøkkelen. Dette skjemaet inkluderer et flagg som indikerer hvilket av de to Bitcoin-nettverkene nøkkelen tilhører - Bitcoins produksjonsnettverk eller testnettverket. (Se Bitcoin-wiki-siden for en mer detaljert beskrivelse av den algoritmiske opprettelsen av Bitcoin-nøkkelpar.)

Differensiere Bitcoin-nettverk

For tiden er det to Bitcoin-nettverk, et for produksjon og et som brukes til utvikling. Begge nettverkene har sin egen genese-blokk og påfølgende blokkjede. Senere i denne artikkelen bruker vi Bitcoin testnet til å utføre en Bitcoin-transaksjon. Foreløpig trenger du bare å vite at nettverkene er differensiert ved å forhåndsavvente en enkelt byte til inngangen til en av de kryptografiske hasjene i ECC-algoritmen: 0x6f indikerer produksjonsnettverket og 0x00 testen.

Vi trenger ikke å bruke sekvensen av kryptografiske hashes selv fordi ECKey klasse gir den samme funksjonaliteten med til adresse() metode. Etter å ha påkalt denne metoden og sendt inn typen nettverk via en NetworkParameters objekt (se linje 26 i oppføring 2), til adresse() metoden returnerer en Adresse gjenstand. Det objektet er toString () metoden vil gi en ekte Bitcoin-adresse. Etter å ha samlet og gjennomført klassen får jeg følgende adresse for Bitcoins testnettverk:

mpJ9UDd4qtNhMiGefK8NM1V5PMq9jMb7ck

Testnet-adresser starter vanligvis med m eller n, mens produksjonsadresser starter med 1. Prøv å utføre den samme koden på din egen maskin, så får du en annen, unik adresse.

Lommebøker og nøkler

Hvis du deltar i Bitcoin-økonomien, vil du sannsynligvis beholde all rikdommen din i lommeboken. De lommebok er ikke noe mer enn en lokal datafil som inneholder serieobjekter som representerer alle dine Bitcoin-transaksjoner og en cache med ubrukte adresser. Summen av innkommende og utgående transaksjonsbeløp er mengden Bitcoins i lommeboken. I denne delen bruker vi BitCoinJ Lommebok objekt for å opprette en lommebokdatafil, fylle den ut med fem adresser, og lagre den på disken.

De Lommebok klasse implementerer Serialiserbar grensesnitt for å gjøre det mulig for oss å fortsette den til disken eller et annet mer permanent lagringsmedium. Nærmere bestemt metoder loadFromFile (File) og det tilsvarende saveToFile (File) lese og skrive lommebokfiler. Vi bruker loadFromFile (File) for å skrive et nylig opprettet lommebokobjekt til en fil.

Merk at BitCoinJ lommebokfiler ikke er kompatible med lommebokfiler opprettet av den offisielle Bitcoin-klienten.

Opprette og lagre nøkler

De Lommebok klasse har et offentlig medlem som heter nøkkelring det er en ArrayList av typen ECKey, som brukes til å lagre alle EC-nøkkelpar i lommeboken. De addKey (ECKey) metoden brukes til å legge til nøkkelpar, men det er foreløpig ingen metode for å fjerne dem. Dette er fornuftig fordi det ikke skal være enkelt for brukere eller programmer å slette private nøkler: det kreves en privat nøkkel for å få tilgang til midler som sendes via den tilsvarende offentlige nøkkelen. Uten nøkkelpar i lommeboken eller sikkerhetskopiert et eller annet sted, vil eventuelle sendte midler gå tapt for alltid.

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