Amir Taakis libbitcoin er blevet en af de mest avancerede alternative implementeringer af den eksisterende Bitcoin-protokol. Selvom der nu er snesevis af alternative implementeringer på markedet, er libbitcoin en af de få, der genimplementerer den komplette Bitcoin-standard, så brugerne kan køre en deterministisk tegnebog, en interface til signering af elliptisk kurve og selvfølgelig en fuldt funktionel Bitcoin-node. Selv multisignatur-transaktioner, som mange populære tegnebøger, herunder blockchain.info og Bitcoin Wallet til Android, stadig ikke understøtter, håndterer libbitcoin helt fint. Libbitcoin er også unik i sin modularitet; selve pakken er et softwarebibliotek, der indeholder et sæt komponenter, som hver kan programmeres kaldes individuelt, hvilket undgår behovet for at starte en fuldt udviklet, monolitisk softwaredemon, bare for at foretage et par enkle transaktioner eller forespørgsler. Hvis du vil have en fuld klient, der kører lokalt, kan du bruge libbitcoin til at gøre det, men du kan også lige så let kun bruge libbitcoin til transaktionsstyring og netværk og stole på andre noder til transaktionsdata. Uanset hvad du har brug for, bruger du, og hvad du ikke har brug for, gider du simpelthen ikke.
Som den første store praktiske anvendelse af libbitcoin har Amir Taaki for nylig frigivet sx, et sæt kommandolinjeværktøjer til at arbejde med Bitcoin nøgler og transaktioner. Den grundlæggende hensigt er enkel: Giv Bitcoin-brugere, der er noget teknisk dygtige, men ikke erfarne programmører, mulighed for at interagere med Bitcoin ikke kun som en grænseflade, hvor de indtaster et beløb, og en destinationsadresse og bitcoind gør alt for dem, men fungerer også direkte med de underliggende byggesten. Hvert sx-værktøj følger Unix-filosofien: det gør en ting, og det gør det godt. genaddr
tager et Electrum-tegnebogsfrø eller en hovednøgle og et indeks og returnerer en adresse.
mktx
opretter usignerede transaktioner, og
sign-input
underskriver transaktionsinput.
historie
returnerer en liste over ubrugte transaktioner tilknyttet en Bitcoin-adresse, der kan bruges som input – og så videre.
Disse værktøjer kan tilgås på kommandolinjen til at konstruere Bitcoin-transaktioner et trin ad gangen, eller man kan kalde dem programmatisk (f.eks. Med os.popen (kommando). Læs ()
i Python) for at oprette Bitcoin-software som handelspakker og tegnebøger. Indtil nu var det svært at oprette en ny Bitcoin-tegnebog – man skulle enten genimplementere alt fra bunden, tage en eksisterende tegnebog og arbejde hårdt på at løse koden for at adskille transaktionslogikken fra tegnebogslogikken eller stole på en bitcoind-node, der kører i baggrunden. Med libbitcoin og sx er værktøjerne til at arbejde med Bitcoin-transaktioner på det laveste niveau dog allerede der – frigør udviklere til at arbejde på de problemer, der virkelig har brug for mest arbejde – som at optimere sikkerhed og brugeroplevelse.
Mere end bare et bibliotek
Så hvorfor betyder libbitcoin og SX noget? Som det viser sig, går svaret langt ud over det enkle faktum, at de er praktiske. Et af hovedproblemerne med Bitcoin-økosystemet er, at selv om Bitcoin nominelt er decentraliseret, kører minearbejdere, der holder netværket i gang, alle det samme stykke centrale Bitcoin-software: bitcoind. Bitcoind er den “headless” (dvs. kun kommandolinje) version af den oprindelige Bitcoin-klient, der er blevet udviklet lige siden Satoshi udgav den første version i 2009, og fungerer som den software, som alle minearbejdere og næsten alle virksomheder bruger til at kommunikere med Bitcoin-netværk.
Dette er usundt af to grunde. For det første kan et monopol potentielt føre til meget forstyrrende blockchain gafler; for eksempel i marts i år fik fjernelse af en databasefejl, der forhindrede bitcoind-noder i at behandle en blok, der samtidig påvirker status på mere end 5.000 transaktioner, Bitcoin-netværket opdelt i halvdelen i cirka seks timer som noder med bugten og uden fejlen var uenig i gyldigheden af en blok og begyndte at arbejde på to separate blockchains. Fixen: Bitcoin-samfundet kom sammen og blev enige om at lukke version 0.8-noder og tilføjede databasefejlen til den officielle protokol i to måneder, indtil den kunne fjernes på en kontrolleret måde to måneder senere. Hvis der i stedet var fem forskellige Bitcoin-implementeringer i aktiv og udbredt anvendelse, ville en persons svigt kun påvirke en lille del af Bitcoin-netværket – og almindelige brugeres klienter, som typisk kun verificerer transaktioner og ikke blokke, ville sandsynligvis ikke blive påvirket overhovedet som, i tilfælde af en gaffel, ville den “legitime” blockchain næsten altid være den, der befalede et flertal af netværket.
Den anden grund er politisk. Mange centrale bitcoindudviklere, især blyudvikler Gavin Andresen, er også en del af Bitcoin Foundation, en organisation, der har taget klare skridt mod at bruge politisk lobbyvirksomhed som en strategi til beskyttelse af Bitcoin. Frygten er, at regeringen i fremtiden muligvis vil forsøge at regulere Bitcoin mere og give fundamentet et ultimatum: du inkluderer visse privatlivets eroderende funktioner (et moderat eksempel kan være et “adressegodkendelsesgebyr” for at afskrække folk fra at dække deres sporer ved at oprette mange Bitcoin-adresser) i protokollen, eller vi forbyder Bitcoin-udvekslinger. Fonden kan godt overholde, og den amerikanske regering ved det. Hvis fonden ikke havde beføjelse til at foretage sådanne ændringer i protokollen uden udbredt internationalt samtykke, ville den amerikanske regering dog ikke have denne mulighed – de ville blive tvunget til enten at prøve at forbyde Bitcoin direkte, på bekostning af massiv i det mindste goodwill blandt tech- og open source-samfundet, eller lad det være og fokusere på blødere reguleringsstrategier. Dette er grunden til, at Bitcoin-fortalere som Amir Taaki, Joerg Platzer og andre længe har støttet diversificering og internationalisering af Bitcoin-økosystemet. Og libbitcoin kan bare være katalysatoren, der endelig sætter processen i gang.
Hvordan bruger du SX?
Installation af sx er meget enkel, hvis du bruger Linux; på kommandolinjen, wget http://sx.dyne.org/install-sx.sh
efterfulgt af
sudo bash./install-sx.sh
er alt, hvad der kræves. Hvis du bruger Windows eller Mac, er tingene noget mere komplicerede, men ikke mere end nogen anden lignende softwarepakke; kildekoden kan downloades på https://github.com/genjix/sx, og derfra kan du installere den manuelt.
Når sx er installeret, er her nogle af de ting, du kan gøre med det. For det første den grundlæggende adresse og nøgle manipulationer.
Generer en privat nøgle / offentlig nøgle / adresse tredobbelt:
sx nøgle > pk1cat pk1 | sx pubkey > pub1cat pk1 | sx addr > addr1cat pk1 pub1 addr1
Generer private nøgle / adressepar fra en Electrum tegnebog:
sx nyfrø > seedfor x i `seq 0 9`; laver kattefrø | sx genpriv $ x; kattefrø | sx genaddr $ x; Færdig
Generer bare adresserne fra en offentlig hovednøgle:
kattefrø | sx mpk > mpkfor x i `seq 0 9`; gør katte mpk | sx genaddr $ x; Færdig
Transaktioner
Nu er det tid til at gå ind i transaktioner. For det første er der brug for en lille forståelse af, hvordan transaktioner fungerer. Bitcoin har ikke begrebet “konti”; i stedet skal en transaktion, der bruger penge fra en adresse, direkte henvise til nogle transaktioner, der sender mindst en lige stor mængde penge til den adresse; disse kaldes normalt “tidligere transaktionsoutputs”. For eksempel, hvis du har en adresse, som du sendte 2 BTC, 3 BTC og derefter 4 BTC til og vil bruge 5 BTC, bruger du ikke 5 BTC ud af den adresse; snarere bruger du de 2 BTC og 3 BTC transaktionsoutputs. Derudover kan et output ikke “delvist bruges”; selvom du kun vil sende 0,1 BTC, skal du forbruge en hel output. Du kan undgå at spilde 1,9 BTC ved at tilføje en speciel output til transaktionen, kaldet “ændring”, hvor du sender de resterende midler tilbage til dig selv.
Den grundlæggende kommando, som du vil bruge til at få disse ubrugte transaktionsoutputs, er sx historie
:
sx historie `cat addr1`
Dette returnerer dog i sig selv alle transaktioner, der er knyttet til den adresse, ikke kun dem, vi ønsker, så vi skal filtrere outputen lidt. Dette er et kompliceret script; dybest set ser det først efter ordet “Uudnyttet” i historien og får disse linjer plus transaktionsdataene i de to linjer over dem. Derefter bruger det grep og awk til kun at udtrække de data, vi har brug for. Bemærk, at kommandoen returnerer værdier i satoshier; 100 millioner satoshier er lig med 1 BTC. Send 0,001 BTC til adressen indeholdt i addr1-filen (cat addr1
at se det, og
sx qrcode `cat addr1` qrcode.png
for at generere en scannbar QR-kode), og kør følgende kommando:
sx historie `cat addr1` | grep Uudnyttet -B 2 | grep output | awk ‘{print $ 2}’ > inputcat input
Nu hvor vi har historien, lad os bruge sx til at oprette og sende en transaktion.
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 sæt-input txfile.tx 0 > txfile2.tx; mv txfile2.tx txfile.txsx broadcast-tx txfile.tx
Her skal du gøre, hvis du har flere transaktionsinput, du vil bruge. Send 0.0002 BTC til din adresse fem gange, og kør ovenstående sx historik-kommando igen og sørg for, at den returnerer fem output. For at undgå at skulle kopiere og indsætte fem transaktionsindgange manuelt, gør vi lidt mere kommandolinjemagi:
sx historie `cat addr1` | grep Uudnyttet -B 2 | grep output | awk ‘{print $ 2}’ > temp1cat temp1 | sed ‘s / ^ / – i /’ | tr ‘n’ ” > temp2cat temp2
Læg mærke til, hvordan temp2 indeholder alle input i nøjagtigt det rette format til sx mktx
. Nu splitter vi dem bare i:
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`; gør kat pk1 | sx sign-input txfile.tx $ x `cat raw.script` > sig $ x; donefor x i `seq 0 4`; gør sx rawscript [`cat sig $ x`] [` cat pub1`] | sx sæt-input txfile.tx $ x > txfile2.tx; mv txfile2.tx txfile.tx; donesx broadcast-tx txfile.tx,
Den hellige gral: multisignaturtransaktioner
Først genererer vi 3 sæt private nøgler, pubkeys og adresser.
for x i `seq 1 3`; gør sx nøgle > pk $ x; donefor x i `seq 1 3`; gør kat pk $ x | sx pubkey > pub $ x; donefor x i `seq 1 3`; gør kat pk $ x | sx addr > addr $ x; Færdig
Derefter opretter vi multisig-adressen.
sx rawscript 2 [`cat pub1`] [` cat pub2`] [`cat pub3`] 3 checkmultisig > msig.scriptcat msig.script | sx viser scriptcat msig.script | sx scripthash > 3addrcat 3addr
Send 0,001 BTC til adressen (fungerer ikke med alle tegnebøger!), Og kør derefter følgende for at få transaktionshash:
sx historie `cat 3addr` | grep Uudnyttet -B 2 | grep output | awk ‘{print $ 2}’ > inputcat input
Nu skal vi konstruere transaktionen og underskrive den, i dette tilfælde ved hjælp af den første og tredje private nøgle (første og anden eller anden og tredje fungerer lige så godt). Vi sender kun 50000 satoshier og efterlader 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 sæt-input txfile.tx 0
Og endelig send transaktionen.
sx udsendelse-tx txfile.tx
Ret komplicerede, men multisignaturtransaktioner er under ingen omstændigheder ligefrem enkle. Med sx reduceres kompleksiteten imidlertid til en række trin, som du simpelthen kan følge eller endda indarbejde i dine egne programmer for at køre, når du har brug for det. Uanset om du er en kommandolinjeentusiast, en Bitcoin-udvikler eller bare en person, der er interesseret i at se nærmere på, hvordan Bitcoin-transaktioner fungerer, er sx værktøjet for dig. Glad hacking!