Amir Taaki’s libbitcoin har blitt en av de mest avanserte alternative implementeringene av Bitcoin-protokollen som eksisterer. Selv om det nå er dusinvis av alternative implementeringer på markedet, er libbitcoin en av få som implementerer den fullstendige Bitcoin-standarden på nytt, slik at brukerne kan kjøre en deterministisk lommebok, en grensesnitt for signering av elliptisk kurve og, selvfølgelig, en fullt funksjonell Bitcoin-node. Selv multisignature-transaksjoner, som mange populære lommebøker, inkludert blockchain.info og Bitcoin Wallet for Android, fremdeles ikke støtter, håndterer libbitcoin helt fint. Libbitcoin er også unikt i sin modularitet; selve pakken er et programvarebibliotek, som inneholder et sett med komponenter som hver kan kalles programmatisk hver for seg, og unngår behovet for å starte en fullverdig, monolitisk programvaredemon for bare å gjøre noen få enkle transaksjoner eller spørsmål. Hvis du vil ha en full klient som kjører lokalt, kan du bruke libbitcoin til å gjøre det, men du kan også like enkelt bare bruke libbitcoin til transaksjonsadministrasjon og nettverk og stole på andre noder for transaksjonsdata. Uansett hva du trenger, bruker du, og hva du ikke trenger, trenger du rett og slett ikke bry deg med.
Som den første store praktiske bruken av libbitcoin har Amir Taaki nylig gitt ut sx, et sett med kommandolinjeverktøy for å jobbe med Bitcoin-nøkler og transaksjoner. Den grunnleggende hensikten er enkel: Gjør Bitcoin-brukere som er litt teknisk dyktige, men ikke erfarne programmerere, i stand til å samhandle med Bitcoin, ikke bare som et grensesnitt der de skriver inn et beløp og en destinasjonsadresse og bitcoind gjør alt for dem, men fungerer også direkte med de underliggende byggesteinene. Hvert sx-verktøy følger Unix-filosofien: det gjør en ting, og det gjør det bra. genaddr
tar et Electrum-lommebokfrø eller en hovednøkkel og en indeks og returnerer en adresse.
mktx
oppretter usignerte transaksjoner, og
sign-input
signerer transaksjonsinnganger.
historie
returnerer en liste over ubrukte transaksjoner knyttet til en Bitcoin-adresse som kan brukes som innganger – og så videre.
Disse verktøyene er tilgjengelige på kommandolinjen for å konstruere Bitcoin-transaksjoner ett trinn av gangen, eller man kan ringe dem programmatisk (f.eks. Med os.popen (kommando) .les ()
i Python) for å lage Bitcoin-programvare som handelspakker og lommebøker. Inntil nå var det vanskelig å lage en ny Bitcoin-lommebok – man måtte enten implementere alt fra bunnen av, ta en eksisterende lommebok og jobbe hardt for å løse koden for å skille ut transaksjonslogikken fra lommeboklogikken, eller stole på en bitcoind-node som kjører i bakgrunnen. Med libbitcoin og sx er imidlertid verktøyene for å jobbe med Bitcoin-transaksjoner på laveste nivå allerede der – og frigjør utviklere til å jobbe med problemene som virkelig trenger mest arbeid – som å optimalisere sikkerhet og brukeropplevelse.
Mer enn bare et bibliotek
Så hvorfor betyr libbitcoin og SX noe? Som det viser seg, går svaret langt utover det enkle faktum at de er praktiske. Et av hovedproblemene med Bitcoin-økosystemet er at selv om Bitcoin er nominelt desentralisert, kjører gruvearbeiderne som holder nettverket i gang, alle samme Bitcoin-programvare: bitcoind. Bitcoind er den “hodeløse” (dvs. kun kommandolinjen) versjonen av den opprinnelige Bitcoin-klienten som har blitt utviklet helt siden Satoshi ga ut den første versjonen i 2009, og fungerer som programvaren som alle gruvearbeidere og nesten alle bedrifter bruker for å kommunisere med Bitcoin-nettverk.
Dette er usunt av to grunner. For det første kan det å ha monopol potensielt føre til svært forstyrrende blockchain gafler; For eksempel, i mars i år, førte fjerningen av en databasefeil som hindret bitcoind-noder i å behandle en blokk samtidig som det påvirket statusen til mer enn 5000 transaksjoner, at Bitcoin-nettverket ble delt i to i omtrent seks timer som noder med feilen og uten feilen var uenig i gyldigheten av en blokk og begynte å jobbe med to separate blokkjeder. Løsningen: Bitcoin-fellesskapet kom sammen og ble enige om å stenge versjonen 0.8-noder, og la databasefeilen til den offisielle protokollen i to måneder til den kunne fjernes på en kontrollert måte to måneder senere. Hvis det i stedet var fem forskjellige Bitcoin-implementeringer i aktiv og utbredt bruk, ville feilen til noen bare påvirke en liten del av Bitcoin-nettverket – og vanlige brukeres klienter, som vanligvis bare verifiserer transaksjoner og ikke blokkeringer, ville sannsynligvis ikke bli berørt. i det hele tatt som “legitim” blockchain i tilfelle gaffel nesten alltid vil være den som befaler et flertall av nettverket.
Den andre grunnen er politisk. Mange kjerne bitcoind-utviklere, spesielt hovedutvikler Gavin Andresen, er også en del av Bitcoin Foundation, en organisasjon som har tatt klare skritt mot å bruke politisk lobbyvirksomhet som en strategi for å beskytte Bitcoin. Frykten er at regjeringen i fremtiden kan prøve å regulere Bitcoin mer, og gi grunnlaget et ultimatum: du inkluderer visse personvern-eroderende funksjoner (et moderat eksempel kan være en “adressevalideringsavgift” for å motvirke folk fra å dekke sine sporer ved å opprette mange Bitcoin-adresser) i protokollen, eller vi forbyder Bitcoin-børser. Stiftelsen kan godt overholde, og den amerikanske regjeringen vet det. Hvis stiftelsen ikke hadde makten til å gjøre slike endringer i protokollen uten omfattende internasjonalt samtykke, ville imidlertid ikke den amerikanske regjeringen ha dette alternativet – de ville bli tvunget til å enten prøve å forby Bitcoin direkte, på bekostning av massiv velvilje blant tech- og open source-samfunnet i det minste, eller la det være og fokusere på mykere reguleringsstrategier. Dette er grunnen til at Bitcoin-talsmenn som Amir Taaki, Joerg Platzer og andre lenge har støttet diversifisering og internasjonalisering av Bitcoin-økosystemet. Og libbitcoin kan bare være katalysatoren som endelig setter prosessen i gang.
Hvordan bruker du SX?
Installering av sx er veldig enkelt hvis du bruker Linux. på kommandolinjen, wget http://sx.dyne.org/install-sx.sh
etterfulgt av
sudo bash./install-sx.sh
er alt som skal til. Hvis du bruker Windows eller Mac, er ting litt mer kompliserte, men ikke mer enn noen annen lignende programvarepakke; kildekoden er tilgjengelig for nedlasting på https://github.com/genjix/sx, og derfra kan du installere den manuelt.
Når sx er installert, er det noen av tingene du kan gjøre med det. Først grunnleggende adresse og nøkkelmanipulasjoner.
Generer en privat nøkkel / offentlig nøkkel / adressetrippel:
sx nøkkel > pk1cat pk1 | sx pubkey > pub1cat pk1 | sx addr > addr1cat pk1 pub1 addr1
Generer private nøkkel / adressepar fra en Electrum lommebok:
sx newseed > seedfor x i `seq 0 9`; gjøre kattefrø | sx genpriv $ x; kattefrø | sx genaddr $ x; ferdig
Generer bare adressene fra en hovednøkkel:
kattefrø | sx mpk > mpkfor x i `seq 0 9`; gjør katt mpk | sx genaddr $ x; ferdig
Transaksjoner
Nå er det på tide å inngå transaksjoner. For det første er det behov for litt forståelse for hvordan transaksjoner fungerer. Bitcoin har ikke begrepet “kontoer”; i stedet må en transaksjon som bruker penger fra en adresse direkte referere til noen transaksjoner som sender minst like mye penger til den adressen; disse kalles vanligvis “tidligere transaksjonsutganger”. For eksempel, hvis du har en adresse som du sendte 2 BTC, 3 BTC og deretter 4 BTC og ønsker å bruke 5 BTC, bruker du ikke 5 BTC utenfor den adressen; heller bruker du de 2 BTC- og 3 BTC-transaksjonsutgangene. I tillegg kan en utgang ikke “delvis brukes”; selv om du bare vil sende 0,1 BTC, må du konsumere en hel utgang. Du kan unngå å kaste bort 1,9 BTC ved å legge til en spesiell produksjon i transaksjonen, kalt “endring”, der du sender de resterende midlene tilbake til deg selv.
Den grunnleggende kommandoen du vil bruke for å få disse ubrukte transaksjonsutgangene er sx historie
:
sx historie `cat addr1`
Dette returnerer imidlertid i seg selv alle transaksjoner som er koblet til den adressen, ikke bare de vi vil ha, så vi må filtrere utdataene litt. Dette er et komplisert manus; i utgangspunktet ser det først etter ordet “Ubrukte” i historien og får disse linjene pluss transaksjonsdataene i de to linjene over dem. Deretter bruker den grep og awk for å trekke ut bare dataene vi trenger. Merk at kommandoen returnerer verdier i satoshier; 100 millioner satoshier tilsvarer 1 BTC. Send 0,001 BTC til adressen i addr1-filen (cat addr1
å se det, og
sx qrcode `cat addr1` qrcode.png
for å generere en skannbar QR-kode), og kjør følgende kommando:
sx historie `cat addr1` | grep Ubrukte -B 2 | grep-utgang | awk ‘{print $ 2}’ > inputcat input
Nå som vi har historikken, la oss bruke sx til å opprette og sende en transaksjon.
sx mktx txfile.tx `cat input` -o 18qk7SqRHuS4Kf3f6dmsvqqv7iw1xy77Z6: 90000sx rawscript dup hash160 [` cat addr1 | sx decode-addr`] equalverify checksig > raw.scriptcat pk1 | sx sign-input txfile.tx 0 `cat raw.script` > sigsx rawscript [`cat sig`] [` cat pub1`] | sx set-input txfile.tx 0 > txfile2.tx; mv txfile2.tx txfile.txsx kringkasting-tx txfile.tx
Her er hva du skal gjøre hvis du har flere transaksjonsinnganger du vil bruke. Send 0.0002 BTC til adressen din fem ganger, og kjør ovennevnte sx historikkommando igjen og sørg for at den returnerer fem utganger. For å unngå å måtte kopiere og lime inn fem transaksjonsinnganger for hånd, gjør vi litt mer kommandolinjemagi:
sx historie `cat addr1` | grep Ubrukte -B 2 | grep-utgang | awk ‘{print $ 2}’ > temp1cat temp1 | sed ‘s / ^ / – i /’ | tr ‘n’ ” > temp2cat temp2
Legg merke til hvordan temp2 inneholder alle inngangene i nøyaktig riktig format for sx mktx
. Nå splitter vi dem bare inn:
sx mktx txfile.tx `cat temp2` -o 18qk7SqRHuS4Kf3f6dmsvqqv7iw1xy77Z6: 90000sx rawscript dup hash160 [` cat addr1 | sx decode-addr`] equalverify checksig > raw.scriptfor x i `seq 0 4`; gjør katt pk1 | sx sign-input txfile.tx $ x `cat raw.script` > sig $ x; donefor x i `seq 0 4`; do sx rawscript [`cat sig $ x`] [` cat pub1`] | sx set-input txfile.tx $ x > txfile2.tx; mv txfile2.tx txfile.tx; donesx kringkasting-tx txfile.tx,
The Holy Grail: Multisignature Transactions
Først genererer vi tre sett med private nøkler, pubkeys og adresser.
for x i `seq 1 3`; gjør sx nøkkel > pk $ x; donefor x i `seq 1 3`; gjør katt pk $ x | sx pubkey > pub $ x; donefor x i `seq 1 3`; gjør katt pk $ x | sx addr > tillegg $ x; ferdig
Deretter oppretter vi multisig-adressen.
sx rawscript 2 [`cat pub1`] [` cat pub2`] [`cat pub3`] 3 sjekkmultisig > msig.scriptcat msig.script | sx viser scriptcat msig.script | sx skripthash > 3addrcat 3addr
Send 0,001 BTC til adressen (fungerer ikke med alle lommebøker!), Og kjør deretter følgende for å få transaksjonshashen:
sx historie `cat 3addr` | grep Ubrukte -B 2 | grep-utgang | awk ‘{print $ 2}’ > inputcat input
Nå må vi konstruere transaksjonen og signere den, i dette tilfellet bruker vi den første og tredje private nøkkelen (første og andre eller andre og tredje fungerer like bra). Vi sender bare 50000 satoshier, og etterlater 0.0005 BTC som et gebyr.
sx mktx txfile.tx -i `cat input` -o 18qk7SqRHuS4Kf3f6dmsvqqv7iw1xy77Z6: 50000cat pk1 | sx sign-input txfile.tx 0 `cat msig.script` > sig1cat pk3 | sx sign-input txfile.tx 0 `cat msig.script` > sig3sx rawscript zero [`cat sig1`] [` cat sig3`] [`cat msig.script`] > input.scriptcat input.script | sx set-input txfile.tx 0
Og til slutt, send transaksjonen.
sx kringkasting-tx txfile.tx
Ganske kompliserte, men multisignatur-transaksjoner er uansett ikke akkurat enkle. Med sx reduseres imidlertid kompleksiteten til en rekke trinn du bare kan følge, eller til og med innlemme i dine egne programmer for å kjøre når du trenger det. Enten du er en kommandolinjeentusiast, en Bitcoin-utvikler eller bare noen som er interessert i å se nærmere på hvordan Bitcoin-transaksjoner fungerer, er sx verktøyet for deg. Glad hacking!