Amir Taakis libbitcoin har blivit en av de mest avancerade alternativa implementeringarna av Bitcoin-protokollet som finns. Även om det nu finns dussintals alternativa implementeringar på marknaden är libbitcoin en av de få som återimplementerar den fullständiga Bitcoin-standarden, så att användarna kan köra en deterministisk plånbok, en gränssnitt för signering av elliptisk kurva och, naturligtvis, en fullt fungerande Bitcoin-nod. Även multisignaturtransaktioner, som många populära plånböcker inklusive blockchain.info och Bitcoin Wallet för Android fortfarande inte stöder, hanterar libbitcoin bara bra. Libbitcoin är också unikt i sin modularitet; själva paketet är ett programvarubibliotek som innehåller en uppsättning komponenter som var och en kan programmeras kallas individuellt, vilket undviker behovet av att starta en fullfjädrad, monolitisk mjukvarudemon för att göra några enkla transaktioner eller frågor. Om du vill ha en fullständig klient som körs lokalt kan du använda libbitcoin för att göra det, men du kan också lika enkelt bara använda libbitcoin för transaktionshantering och nätverk och lita på andra noder för transaktionsdata. Oavsett vad du behöver använder du, och vad du inte behöver behöver du helt enkelt inte bry dig om.
Som den första stora praktiska tillämpningen av libbitcoin har Amir Taaki nyligen släppts sx, en uppsättning kommandoradsverktyg för att arbeta med Bitcoin-nycklar och transaktioner. Den grundläggande avsikten är enkel: ge Bitcoin-användare som är något tekniskt skickliga, men inte erfarna programmerare, att interagera med Bitcoin inte bara som ett gränssnitt där de skriver in ett belopp och en destinationsadress och bitcoind gör allt för dem, men fungerar också direkt med de underliggande byggstenarna. Varje sx-verktyg följer Unix-filosofin: det gör en sak och det gör det bra. genaddr
tar en Electrum-plånbok eller en huvudnyckel och ett index och returnerar en adress.
mktx
skapar osignerade transaktioner och
sign-input
signerar transaktionsingångar.
historia
returnerar en lista över outnyttjade transaktioner associerade med en Bitcoin-adress som kan användas som ingångar – och så vidare.
Dessa verktyg kan nås på kommandoraden för att konstruera Bitcoin-transaktioner ett steg i taget, eller man kan ringa dem programmatiskt (t.ex. med os.popen (kommando). Läs ()
i Python) för att skapa Bitcoin-programvara som handelspaket och plånböcker. Hittills var det svårt att skapa en ny Bitcoin-plånbok – man skulle behöva antingen implementera allt från grunden, ta en befintlig plånbok och arbeta hårt för att lösa ut koden för att separera transaktionslogiken från plånbokslogiken eller förlita sig på en bitcoind-nod som körs i bakgrunden. Med libbitcoin och sx finns emellertid redan verktygen för att arbeta med Bitcoin-transaktioner på lägsta nivå – vilket frigör utvecklare att arbeta med de problem som verkligen behöver mest arbete – som att optimera säkerhet och användarupplevelse.
Mer än bara ett bibliotek
Så varför har libbitcoin och SX betydelse? Som det visar sig går svaret långt utöver det enkla faktum att de är bekväma. Ett av de största problemen med Bitcoin-ekosystemet är att även om Bitcoin är nominellt decentraliserat, så arbetar de gruvarbetare som håller nätverket igång alla i samma bit Bitcoin-programvara: bitcoind. Bitcoind är den “headless” (dvs. endast kommandoraden) versionen av den ursprungliga Bitcoin-klienten som har utvecklats sedan Satoshi släppte den första versionen 2009 och fungerar som programvara som alla gruvarbetare och nästan alla företag använder för att kommunicera med Bitcoin-nätverk.
Detta är ohälsosamt av två skäl. För det första kan ett monopol potentiellt leda till mycket störande blockchain-gafflar; till exempel, i mars i år fick borttagningen av en databasfel som hindrade bitcoind-noder från att behandla ett block samtidigt som påverkade statusen för mer än 5000 transaktioner som orsakade att Bitcoin-nätverket delades i hälften i ungefär sex timmar som noder med felet och utan felet instämde inte i giltigheten av ett block och började arbeta på två separata blockkedjor. Korrigeringen: Bitcoin-communityn kom samman och gick med på att stänga ner version 0.8-noder och lade databasfelet till det officiella protokollet i två månader tills det kunde tas bort på ett kontrollerat sätt två månader senare. Om det i stället fanns fem olika Bitcoin-implementeringar i aktiv och utbredd användning, skulle misslyckandet hos någon bara påverka en liten del av Bitcoin-nätverket – och vanliga användares klienter, som vanligtvis bara verifierar transaktioner och inte block, skulle troligen inte påverkas alls eftersom, i händelse av en gaffel, den “legitima” blockchain nästan alltid skulle vara den som befaller en majoritet av nätverket.
Den andra anledningen är politisk. Många kärnbitcoind-utvecklare, särskilt blyutvecklare Gavin Andresen, ingår också i Bitcoin Foundation, en organisation som har tagit tydliga steg mot att använda politisk lobbyverksamhet som en strategi för att skydda Bitcoin. Rädslan är att regeringen i framtiden kan försöka reglera Bitcoin mer och ge stiftelsen ett ultimatum: du inkluderar vissa sekretess-eroderande funktioner (ett måttligt exempel kan vara en “adressvalideringsavgift” för att avskräcka människor från att täcka sina spår genom att skapa många Bitcoin-adresser) i protokollet, eller så förbjuder vi Bitcoin-börser. Stiftelsen kan mycket väl följa, och den amerikanska regeringen vet det. Om stiftelsen inte hade makten att göra sådana ändringar av protokollet utan utbrett internationellt samtycke, skulle dock den amerikanska regeringen inte ha detta alternativ – de skulle tvingas antingen försöka förbjuda Bitcoin direkt, på bekostnad av massiva välvilja bland teknik och öppen källkod, åtminstone, eller låt det vara och fokusera på mjukare regleringsstrategier. Det är därför som Bitcoin-förespråkare som Amir Taaki, Joerg Platzer och andra länge har stött diversifiering och internationalisering av Bitcoin-ekosystemet. Och libbitcoin kan bara vara katalysatorn som äntligen sätter igång processen.
Hur använder du SX?
Att installera sx är väldigt enkelt om du använder Linux; på kommandoraden, wget http://sx.dyne.org/install-sx.sh
följd av
sudo bash./install-sx.sh
är allt som krävs. Om du använder Windows eller Mac är saker och ting lite mer komplicerade, men inte mer än något annat liknande programvarupaket. källkoden finns att ladda ner på https://github.com/genjix/sx, och därifrån kan du installera den manuellt.
När sx har installerats, här är några av de saker du kan göra med det. Först grundadressen och nyckelmanipulationerna.
Skapa en privat nyckel / offentlig nyckel / adress trippel:
sx nyckel > pk1cat pk1 | sx pubkey > pub1cat pk1 | sx addr > addr1cat pk1 pub1 addr1
Skapa privata nyckel / adresspar från en Electrum-plånbok:
sx newseed > seedfor x i `seq 0 9`; göra kattfrö | sx genpriv $ x; kattfrö | sx genaddr $ x; Gjort
Generera bara adresserna från en allmän huvudnyckel:
kattfrö | sx mpk > mpkfor x i `seq 0 9`; gör katt mpk | sx genaddr $ x; Gjort
Transaktioner
Nu är det dags att gå in i transaktioner. Först behövs lite förståelse för hur transaktioner fungerar. Bitcoin har inte begreppet “konton”; istället måste en transaktion som spenderar pengar från en adress direkt referera till vissa transaktioner som skickar minst lika mycket pengar till den adressen; dessa kallas vanligtvis ”tidigare transaktionsutgångar”. Om du till exempel har en adress till vilken du skickade 2 BTC, 3 BTC och sedan 4 BTC och vill spendera 5 BTC spenderar du inte 5 BTC av den adressen; snarare spenderar du 2 BTC- och 3 BTC-transaktionsutgångar. Dessutom kan en utgång inte “delvis spenderas”; även om du bara vill skicka 0,1 BTC måste du konsumera en hel utgång. Du kan undvika att slösa bort 1,9 BTC genom att lägga till en speciell utgång till transaktionen, kallad “ändra”, där du skickar återstående medel tillbaka till dig själv.
Det grundläggande kommandot som du kommer att använda för att få dessa outnyttjade transaktionsutgångar är sx historik
:
sx historia `cat addr1`
Detta i sig returnerar dock alla transaktioner som är kopplade till den adressen, inte bara de vi vill ha, så vi måste filtrera utdata lite. Detta är ett komplicerat manus; i grund och botten letar det först efter ordet “Okänt” i historiken och får dessa rader plus transaktionsdata i de två raderna ovanför dem. Sedan använder den grep och awk för att extrahera bara de data vi behöver. Observera att kommandot returnerar värden i satoshis; 100 miljoner satoshis är lika med 1 BTC. Skicka 0,001 BTC till adressen i addr1-filen (cat addr1
att se det, och
sx qrcode `cat addr1` qrcode.png
för att generera en skannbar QR-kod) och kör följande kommando:
sx historia `cat addr1` | grep Unspent -B 2 | grep-utdata | awk ‘{skriv ut $ 2}’ > inputcat-ingång
Nu när vi har historiken, låt oss använda sx för att skapa och skicka 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 set-input txfile.tx 0 > txfile2.tx; mv txfile2.tx txfile.txsx broadcast-tx txfile.tx
Här är vad du ska göra om du har flera transaktionsingångar du vill spendera. Skicka 0.0002 BTC till din adress fem gånger och kör ovanstående sx historik kommando igen och se till att den returnerar fem utgångar. För att undvika att kopiera och klistra in fem transaktionsinmatningar för hand gör vi lite mer kommandoradsmagi:
sx historia `cat addr1` | grep Unspent -B 2 | grep-utdata | awk ‘{skriv ut $ 2}’ > temp1cat temp1 | sed ‘s / ^ / – i /’ | tr ‘n’ ” > temp2cat temp2
Lägg märke till hur temp2 innehåller alla ingångar i exakt rätt format för sx mktx
. Nu skar vi bara i dem:
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 katt 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 set-input txfile.tx $ x > txfile2.tx; mv txfile2.tx txfile.tx; donesx broadcast-tx txfile.tx,
The Holy Grail: Multisignature Transactions
Först genererar vi tre uppsättningar privata nycklar, pubkeys och adresser.
för x i `seq 1 3`; gör sx nyckel > pk $ x; donefor x i `seq 1 3`; gör kattpk $ x | sx pubkey > pub $ x; donefor x i `seq 1 3`; gör kattpk $ x | sx addr > addr $ x; Gjort
Sedan skapar vi multisig-adressen.
sx rawscript 2 [`cat pub1`] [` cat pub2`] [`cat pub3`] 3 checkmultisig > msig.scriptcat msig.script | sx visar scriptcat msig.script | sx scripthash > 3addrcat 3addr
Skicka 0,001 BTC till adressen (fungerar inte med alla plånböcker!) Och kör sedan följande för att få transaktionshash:
sx historia `cat 3addr` | grep Unspent -B 2 | grep-utdata | awk ‘{skriv ut $ 2}’ > inputcat-ingång
Nu måste vi konstruera transaktionen och underteckna den, i det här fallet med de första och tredje privata nycklarna (första och andra eller andra och tredje fungerar lika bra). Vi skickar bara 50000 satoshis och lämnar 0,0005 BTC som avgift.
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
Och slutligen sända transaktionen.
sx sändning-tx txfile.tx
Ganska komplicerade, men multisignaturtransaktioner är inte exakt enkla i alla fall. Med sx reduceras dock komplexiteten till en serie steg som du helt enkelt kan följa, eller till och med införliva i dina egna program för att köra när du behöver. Oavsett om du är en entusiast på kommandoraden, en Bitcoin-utvecklare eller bara någon som är intresserad av att titta djupare på hur Bitcoin-transaktioner fungerar, är sx verktyget för dig. Lycklig hacking!