Προγραμματισμός

Bitcoin για αρχάριους, Μέρος 3: Το API BitCoinJ

Για προγραμματιστές Java, το BitCoinJ είναι ένα σημείο εισόδου στην ανάπτυξη εφαρμογών που αλληλεπιδρούν με το δίκτυο Bitcoin. Σε αυτό το τελικό άρθρο σε μια σειρά τριών μερών, ο Dirk Merkel σάς βοηθά να ρυθμίσετε το BitCoinJ σε ένα περιβάλλον ανάπτυξης Eclipse και, στη συνέχεια, ακολουθείτε αρκετές σύντομες ασκήσεις που θα σας εξοικειώσουν με αυτήν την ελαφριά εφαρμογή του πρωτοκόλλου συναλλαγών Bitcoin.

Προηγούμενες δόσεις σε αυτήν τη σειρά τριών μερών έχουν εισαγάγει το εννοιολογικό και τεχνολογικό πλαίσιο του Bitcoin, ενός εικονικού νομίσματος και ενός δικτύου peer-to-peer. Αυτό το άρθρο, μια εκπαιδευτική εισαγωγή στο BitCoinJ API, προϋποθέτει ότι είστε εξοικειωμένοι με τις διευθύνσεις Bitcoin, τις συναλλαγές, τα μπλοκ και την αλυσίδα μπλοκ.

Το BitCoinJ είναι μια εφαρμογή ανοιχτού κώδικα Java του πρωτοκόλλου Bitcoin. Ως εκ τούτου, είναι ένα εύχρηστο εργαλείο εάν θέλετε να γράψετε εφαρμογές Java που αλληλεπιδρούν με το δίκτυο Bitcoin. Προκειμένου να εξερευνήσουμε το BitCoinJ API, θα κατασκευάσουμε διάφορα δείγματα εφαρμογών που απεικονίζουν τα βήματα προγραμματισμού που είναι απαραίτητα για την κατασκευή πιο σύνθετων εφαρμογών Bitcoin στην Java. Αφού χρησιμοποιήσουμε το Maven για να δημιουργήσουμε και να δημιουργήσουμε ένα έργο στο Eclipse IDE, θα εξασκηθούμε στη δημιουργία μιας διεύθυνσης Bitcoin, την αποθήκευση σε ένα πορτοφόλι και την αποθήκευση του πορτοφολιού στο δίσκο. Στη συνέχεια, θα δημιουργήσουμε μια σύνδεση με το δοκιμαστικό δίκτυο Bitcoin και θα ανακτήσουμε το μπλοκ προέλευσης. Τέλος, θα συνδέσουμε το δείγμα κώδικα μέχρι στιγμής στέλνοντας μερικά Bitcoin σε μια διεύθυνση στο δοκιμαστικό δίκτυο.

Σχετικά με το BitCoinJ

Το BitCoinJ είναι μια εφαρμογή Java του πρωτοκόλλου Bitcoin. Γράφτηκε από τον Mike Hearn, το BitCoinJ δεν αποτελεί πλήρη εφαρμογή του αρχικού προγράμματος-πελάτη Bitcoin, αλλά μια πιο ελαφριά και προσβάσιμη έκδοση. Ενώ είναι αρκετά συμπαγές για να μάθει κανείς, το BitCoinJ βρίσκεται ακόμη υπό ανάπτυξη (επί του παρόντος στο v.0.3) και δεν πρέπει να χρησιμοποιείται για τη μετακίνηση μεγάλου αριθμού Bitcoins.

Ξεκινήστε με το BitCoinJ

Το BitCoinJ φιλοξενείται από τον Κώδικα Google σε ένα αποθετήριο Subversion και μπορεί να ελεγχθεί ανώνυμα. Μόλις ελέγξετε τον κορμό του έργου BitCoinJ, θα μπορείτε να το ενημερώνετε εύκολα. Ωστόσο, δεν θα μπορείτε να πραγματοποιήσετε αλλαγές.

Μπορείτε να χρησιμοποιήσετε το πρόγραμμα-πελάτη Subversion που είναι ενσωματωμένο στο αγαπημένο σας IDE ή απλά να δείτε το έργο από τη γραμμή εντολών, όπως έκανα:

Μόλις έχετε τον κωδικό, θα τον μεταγλωττίσετε με το Maven, το σύστημα κατασκευής του BitCoinJ. Η Maven ακολουθεί μια προσέγγιση κύκλου ζωής για την κατασκευή έργων και είναι εξαιρετικά επεκτάσιμη με πολλά πρόσθετα πυρήνα και τρίτου μέρους. Αυτό που κάνει πολύ καλά ο Maven είναι η διαχείριση εξαρτήσεων. Εάν κοιτάξετε το αρχείο Maven pom.xml στον ριζικό κατάλογο του BitCoinJ, θα δείτε ότι χρησιμοποιεί μόνο λίγες εξαρτήσεις. Σε αυτά περιλαμβάνονται τα JUnit και EasyMock για δοκιμή μονάδας, SLF4J για καταγραφή, και Bouncy Castle Crypto API για κρυπτογραφικές λειτουργίες όπως κατακερματισμός και υπογραφή.

Από τη γραμμή εντολών, εκτελέστε καθαρό πακέτο mvn και ο Maven θα ανακτήσει αυτές και άλλες εξαρτήσεις, θα συντάξει το έργο, θα εκτελέσει τη μονάδα δοκιμής μονάδας και θα συσκευάσει τον μεταγλωττισμένο κώδικα σε ένα αρχείο JAR στιγμιότυπου. Όπως φαίνεται στο Σχήμα 2, ο Maven εκτελεί πρώτα τον καθαρό κύκλο ζωής για να απαλλαγούμε από τυχόν αντικείμενα από προηγούμενες κατασκευές. Στη συνέχεια εκτελεί τις φάσεις του προεπιλεγμένου κύκλου ζωής έως και τη φάση του πακέτου.

Το Maven έχει μερικά ακόμη χρήσιμα κόλπα στο μανίκι του. Πρώτον, εκτέλεση mvn site: site δημιουργεί την τεκμηρίωση του BitCoinJ, συμπεριλαμβανομένων σελίδων σχετικά με εξαρτήσεις, παρακολούθηση ζητημάτων, λίστες αλληλογραφίας, άδεια, ομάδα ανάπτυξης, αποθετήριο πηγών και άλλα. Αυτές οι σελίδες τείνουν να είναι ενημερωτικές αλλά βασικές. Εκτελεί mvn javadoc: javadoc δημιουργεί την τεκμηρίωση του έργου, το οποίο θα είναι χρήσιμο όταν αρχίσουμε να ασκούμε το BitCoinJ API.

Η τεκμηρίωση αποκαλύπτει ότι το API χωρίζεται σε τέσσερα πακέτα:

  • Ανακάλυψη ασχολείται με την ανακάλυψη / επικοινωνία δικτύου peer-to-peer.
  • Κατάστημα περιέχει δομές δεδομένων για την αποθήκευση μπλοκ και την αλυσίδα μπλοκ.
  • Παραδείγματα περιλαμβάνει μια χούφτα απλών εφαρμογών που βασίζονται στο BitCoinJ (αυτά εμπνέουν τα δικά μου παραδείγματα για αυτό το άρθρο).
  • Πυρήνας περιέχει την πλειονότητα των κλάσεων και της λειτουργικότητας του BitCoinJ, συμπεριλαμβανομένων κλάσεων για επικοινωνία με ομότιμους κόμβους, λήψη της μπλοκ αλυσίδας και αποστολή και λήψη συναλλαγών.

Ρυθμίστε το παράδειγμα έργου στο Eclipse

Θα αναπτύξουμε τον κώδικα παραδείγματος για αυτό το άρθρο στο Eclipse, χρησιμοποιώντας το Maven για να διαχειριστούμε το BitCoinJ ως εξάρτηση. Ευτυχώς, το BitCoinJ έχει ένα περιβάλλον συνεχούς ολοκλήρωσης που δημιουργεί το έργο, συλλέγει και αναφέρει διάφορα αντικείμενα και καταθέτει ένα στιγμιότυπο JAR στο αποθετήριο Maven που βασίζεται στο Nexus του έργου.

Το σχήμα 3 δείχνει το διάλογο δημιουργίας έργου Eclipse που προκύπτει από τη δημιουργία ενός νέου έργου Maven και την επιλογή του αρχέτυπου "γρήγορης εκκίνησης", που δημιουργεί ένα βασικό έργο Maven. Ο κωδικός μου για αυτό το έργο βρίσκεται σε ένα πακέτο με το όνομα com.waferthin.bitcoinj, που παράγει 0,0,1-SNAPSHOT με το Maven build.

Κάνοντας κλικ στο Φινίρισμα δίνει εντολή στον οδηγό να δημιουργήσει το έργο, πράγμα που σημαίνει την απόρριψη μιας κύριας τάξης "Hello World" στον κατάλογο έργου - που ονομάζεται src / main / java / com / waferthin / bitcoinj στην περίπτωσή μου.

Τέλος, πρέπει να πούμε στον Maven ότι το έργο εξαρτάται από το στιγμιότυπο BitCoinJ, όπως φαίνεται στην Λίστα 1. Επεξεργαστήκαμε το αρχείο pom.xml που δημιουργήθηκε από τον οδηγό του Maven για να δηλώσω τη θέση και το όνομα του αποθετηρίου Nexus του BitCoinJ (γραμμές 18 έως 28) και να ορίσω την έκδοση στην οποία εξαρτάται το build (γραμμές 39 έως 45):

Λίστα 1. Maven pom.xm για το έργο BitCoinJ

001 | 002 | 4.0.0 003 | 004 | com.waferthin.bitcoinj.explored 005 | bitcoinj-εξερεύνηση 006 | 0.0.1-SNAPSHOT 007 | βάζο 008 | 009 | bitcoinj-εξερεύνηση 010 | //maven.apache.org 011 | 012 | 013 | UTF-8 014 | 015 | 016 | 017 | 018 | 019 | έκδοση bitcoinj 020 | 021 | 022 | //nexus.bitcoinj.org/content/repositories/releases 023 | 024 | 025 | bitcoinj-στιγμιότυπο 026 | 027 | //nexus.bitcoinj.org/content/repositories/snapshots 028 | 029 | 030 | 031 | 032 | 033 | junit 034 | junit 035 | 3.8.1 036 | δοκιμή 037 | 038 | 039 | 040 | 041 | com.google 042 | bitcoinj 043 | 0,3-SNAPSHOT 044 | μεταγλώττιση 045 | 046 | 047 |

Αυτό είναι το μόνο που υπάρχει. Στην επόμενη ενότητα θα εισαγάγουμε τις κλάσεις BitCoinJ στον κώδικα μας και θα δημιουργήσουμε ένα έργο BitCoinJ με το Maven, όλα χωρίς να χρειάζεται να αντιγράψουμε το πραγματικό αρχείο JAR.

Δημιουργία διεύθυνσης Bitcoin

Για να στείλετε ή να λάβετε Bitcoin, χρειάζεστε μια διεύθυνση. Οι διευθύνσεις προέρχονται από το δημόσιο τμήμα ενός ζεύγους κλειδιού δημόσιου-ιδιωτικού τομέα (βλ. "Bitcoin για αρχάριους, Μέρος 2: Το Bitcoin ως τεχνολογία και δίκτυο"). Το είδος της κρυπτογραφίας που χρησιμοποιείται από το Bitcoin ονομάζεται κρυπτογραφία ελλειπτικής καμπύλης (ECC). Η κρυπτογραφία δημόσιου κλειδιού που γνωρίζουμε οι περισσότεροι από εμάς βασίζεται στη δυσκολία εύρεσης των πρωταρχικών παραγόντων μεγάλων ακεραίων. Αντιθέτως, το ECC βασίζεται στη δυσκολία εύρεσης του διακριτού λογάριθμου μιας ελλειπτικής καμπύλης. (Το να εξηγήσουμε αυτό με περισσότερες λεπτομέρειες όχι μόνο θα μας οδηγήσει κάτω από την τρύπα του κουνελιού της ανώτερης άλγεβρας, αλλά επίσης θα ξεπεράσει γρήγορα τα μαθηματικά μου στο κολέγιο. Ευτυχώς, δεν χρειάζεται να μάθουμε περισσότερα για να χρησιμοποιήσουμε το BitCoinJ's ECKey τάξη για αναπαραγωγή και δημιουργία ζευγών κλειδιών.)

Στη γραμμή 20 της καταχώρισης 2, δημιουργούμε ένα νέο ζεύγος ελλειπτικών κλειδιών καμπυλών με την παρουσίαση ενός αντικειμένου τύπου ECKey. Σημειώστε ότι η προεπιλογή της τάξης toString () Η μέθοδος αντικαθίσταται για να επιστρέψει το δημόσιο και ιδιωτικό κλειδί στη δεκαεξαδική σημειογραφία, η οποία χρησιμοποιείται στη γραμμή 23.

Λίστα 2. Δημιουργία ενός ελλειπτικού ζεύγους κλειδιών καμπύλης με το ECKey

001 | πακέτο com.waferthin.bitcoinj; 002 | 003 | εισαγωγή com.google.bitcoin.core.ECKey; 004 | εισαγωγή com.google.bitcoin.core.NetworkParameters; 005 | εισαγωγή com.google.bitcoin.core.Address; 006 | 007 | δημόσια τάξη CreateAddress 008

Ίσως θυμάστε ότι το δημόσιο μέρος ενός ζεύγους κλειδιών Bitcoin πρέπει να είναι μια διεύθυνση. Αλλά το δημόσιο μέρος του κλειδιού που δημιουργείται από τον παραπάνω κώδικα αρχικά δεν θα μοιάζει με τις διευθύνσεις που εμφανίζει ο πελάτης Bitcoin στο περιβάλλον χρήστη του. Η φόρμα διεύθυνσης που συνηθίζουμε να βλέπουμε σε μια συναλλαγή Bitcoin προέρχεται από επαναλαμβανόμενες λειτουργίες κατακερματισμού στο δημόσιο κλειδί. Αυτή η φόρμα περιλαμβάνει μια σημαία που δείχνει σε ποιο από τα δύο δίκτυα Bitcoin ανήκει το κλειδί - το δίκτυο παραγωγής του Bitcoin ή το δοκιμαστικό του δίκτυο. (Δείτε τη σελίδα wiki του Bitcoin για μια πιο λεπτομερή περιγραφή της αλγοριθμικής δημιουργίας ζευγών κλειδιών Bitcoin.)

Διαφοροποίηση δικτύων Bitcoin

Επί του παρόντος υπάρχουν δύο δίκτυα Bitcoin, ένα για παραγωγή και ένα που χρησιμοποιείται για ανάπτυξη. Και τα δύο δίκτυα έχουν το δικό τους μπλοκ γένεσης και την επόμενη μπλοκ αλυσίδα. Αργότερα σε αυτό το άρθρο, θα χρησιμοποιήσουμε το Bitcoin testnet για να εκτελέσουμε μια συναλλαγή Bitcoin. Προς το παρόν, το μόνο που χρειάζεται είναι να γνωρίζετε ότι τα δίκτυα διαφοροποιούνται με εκκρεμότητα ενός byte στην είσοδο σε έναν από τους κρυπτογραφικούς κατακερματισμούς του αλγορίθμου ECC: 0x6f δείχνει το δίκτυο παραγωγής και 0x00 το δοκιμαστικό.

Δεν χρειάζεται να εφαρμόσουμε την ακολουθία των κρυπτογραφικών κατακερματισμών, επειδή το ECKey κλάση παρέχει την ίδια λειτουργικότητα με το στη διεύθυνση() μέθοδος. Μετά την επίκληση αυτής της μεθόδου και τη μετάδοση του τύπου δικτύου μέσω α Παράμετροι δικτύου αντικείμενο (βλέπε γραμμή 26 στη λίστα 2), το στη διεύθυνση() η μέθοδος επιστρέφει ένα Διεύθυνση αντικείμενο. Αυτό το αντικείμενο είναι toString () Η μέθοδος θα αποδώσει μια πραγματική διεύθυνση Bitcoin. Μετά τη σύνταξη και την εκτέλεση της τάξης, λαμβάνω την ακόλουθη διεύθυνση για το δοκιμαστικό δίκτυο του Bitcoin:

mpJ9UDd4qtNhMiGefK8NM1V5PMq9jMb7ck

Οι διευθύνσεις Testnet ξεκινούν συνήθως με Μ ή ν, ενώ οι διευθύνσεις παραγωγής ξεκινούν με 1. Δοκιμάστε να εκτελέσετε τον ίδιο κωδικό στο δικό σας μηχάνημα και θα λάβετε μια διαφορετική, μοναδική διεύθυνση.

Πορτοφόλια και κλειδιά

Εάν συμμετέχετε στην οικονομία του Bitcoin, πιθανότατα θα διατηρήσετε όλο το πλούτο σας στο πορτοφόλι σας. ο πορτοφόλι δεν είναι τίποτα περισσότερο από ένα τοπικό αρχείο δεδομένων που περιέχει σειριακά αντικείμενα που αντιπροσωπεύουν όλες τις συναλλαγές σας Bitcoin και μια κρυφή μνήμη διευθύνσεων που δεν χρησιμοποιούνται. Το άθροισμα των ποσών των εισερχόμενων και εξερχόμενων συναλλαγών σας είναι το ποσό των Bitcoin στο πορτοφόλι σας. Σε αυτήν την ενότητα θα χρησιμοποιήσουμε τα BitCoinJ's Πορτοφόλι αντικείμενο για να δημιουργήσετε ένα αρχείο δεδομένων πορτοφολιού, να το συμπληρώσετε με πέντε διευθύνσεις και να το αποθηκεύσετε στο δίσκο.

ο Πορτοφόλι τάξη εφαρμόζει το Σειριοποιήσιμο διεπαφή για να μας επιτρέψει να το διατηρήσουμε στο δίσκο ή σε κάποιο άλλο πιο μόνιμο μέσο αποθήκευσης Συγκεκριμένα, μέθοδοι loadFromFile (Αρχείο) και το αντίστοιχο saveToFile (Αρχείο) διαβάστε και γράψτε αρχεία πορτοφολιού. Θα χρησιμοποιούμε loadFromFile (Αρχείο) για να γράψετε ένα νέο αντικείμενο πορτοφολιού σε ένα αρχείο.

Σημείωση ότι τα αρχεία πορτοφολιών BitCoinJ δεν είναι συμβατά με αρχεία πορτοφολιού που δημιουργήθηκαν από τον επίσημο πελάτη Bitcoin.

Δημιουργία και αποθήκευση κλειδιών

ο Πορτοφόλι Η τάξη έχει ένα δημόσιο μέλος που ονομάζεται μπρελόκ αυτό είναι ένα Λίστα Array του τύπου ECKey, το οποίο χρησιμοποιείται για την αποθήκευση όλων των ζευγών κλειδιών EC στο πορτοφόλι. ο addKey (ECKey) χρησιμοποιείται μέθοδος για την προσθήκη ζευγών κλειδιών, αλλά προς το παρόν δεν υπάρχει μέθοδος για την κατάργησή τους. Αυτό έχει νόημα επειδή δεν πρέπει να είναι εύκολο για τους χρήστες ή τα προγράμματα να διαγράψουν ιδιωτικά κλειδιά: απαιτείται ένα ιδιωτικό κλειδί για την πρόσβαση σε χρήματα που αποστέλλονται μέσω του αντίστοιχου δημόσιου κλειδιού. Χωρίς ζεύγος κλειδιών στο πορτοφόλι ή αντίγραφα ασφαλείας κάπου, τυχόν αποσταλμένα χρήματα θα χαθούν για πάντα.

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