Bitcoins gruvalgoritm från en programmerare ' s synpunkt

Denna sida: Block sa att gruvdrift faktiskt är för att lösa ett matematiskt problem, men att läsa Blockera hashingalgoritm ger inte mycket hjälp. Jag försökte också läsa bitcoind-källkod, men att läsa kod tar mycket mer tid än att läsa dokumentation 🙂

Och jag har skrivit en enkel json-rpc-klient för att ringa getwork () -metoden för att hämta ”data”, men vad ska Jag gör bredvid dessa ”data”?

Vem som helst kan förklara gruvprocessen i programmerarens vy?

Kommentarer

  • but what should I do next to this "data"? Här ’ är en kortreferensimplementering. github.com/jgarzik/pyminer/blob/master/pyminer.py
  • Dessutom explain the mining process in programmer's view är en ganska bred fråga. Vilket specifikt problem försöker du lösa?
  • @NickODell Tack för din kod! Nu förstår jag hur man skapar nya block. Men är varje inlämnat block giltigt (bitcoin-nätverket skickar bitcoin till den här personen)? Jag hittade att Bitcoin wiki sa att endast 6 block kommer att skapas varje timme, Antag att 100 personer får blockhuvudet genom att använda getwork samtidigt med samma svårighet, jag tror att mycket mer än 6 block kommer att skapas av dessa människor. Har jag rätt?
  • Svarar i ordning: Nej. Nej.
  • möjlig duplikat av Jag kan inte räkna ut getwork-api

Svar

Gruvalgoritmen är som följer:

  • Steg 0 – Hämta hash från föregående block från nätverket.

  • Steg 1 – Samla en lista över potentiella transaktioner som kallas ett ”block”. Denna lista över transaktioner kommer från peer-to-peer bitcoin-nätverket.

  • Steg 2 – Beräkna en hash för ett block av potentiella transaktioner tillsammans med ett slumptal.
  • Steg 3 – Om hashen är mer än den för närvarande inställda svårighetsgraden, har du brytt det blocket. Om inte, börja om från steg 1. Eventuella tillägg till listan över transaktioner från steg 1 tillsammans med förändring av slumpmässiga siffror från steg 2 innebär att det finns en chans att kriteriet kommer att uppfyllas i nästa omgång.

Från en programmerares syn kan pseudokoden se ut så här:

 P := The hash of the previously mined block B := A block of transactions H := A hash function D := Difficulty Level 0 Retreive P 1 Construct/Modify B 2 IF H(P, B, Some Random Number) > D END 3 GOTO 1 

Jag borde varna dig för att det finns några felaktigheter i beskrivningen, men för det mesta borde det vara tillräckligt bra. Och här är några fler användbara förtydliganden:

Vad ”sa hash?

En hash är en funktion som omvandlar data till ett tal inom ett visst område. Hashet har den egenskapen att det är i princip oförutsägbart att veta att det är utdata (inom det angivna intervallet). Den specifika hashfunktionen som används för bitcoinbrytning används SHA256 två gånger.

Hur fungerar svårighetsgraden?

Den här oförutsägbara karaktären hos hashfunktionen innebär att sätta in slumpmässiga data (transaktionen + slumpmässiga siffran) i huvudsak ger ett slumptal inom ett visst intervall. Ytterligare begränsning av intervallet för den önskade utgången påverkar hur troligt att man hittar den i en enda omgång. Detta skapar ett sätt att probabilistiskt avgöra hur ofta en lösning kommer att hittas baserat på hur många gånger algoritmen kan köras i nätverket. När du specifikt hör ordet ”gigahashes” eller ”terahashes” hänvisar detta till antalet gånger som steg 3 kan köras. Eftersom antalet hashningar per sekund i hela nätverket växer ökar nätverket automatiskt svårigheten så att en lösning kommer att hittas inom cirka 10 minuter.

Vad händer när ett block bryts?

När ett block bryts skickar gruvarbetaren blocket till alla andra gruvarbetare i nätverket som bevis för att det har hittade det. Detta block innehåller en lista med transaktioner, den hittade hash, det specifika slumptalet och en hänvisning till föregående hash. När varje gruvarbetare tar emot det nyminerade blocket tar det bort alla transaktioner som det för närvarande bryter som finns inom blocket (eftersom de redan har bekräftats i blockkedjan) och sänder blocket till andra gruvarbetare som gör samma sak. förökning sker ganska snabbt.

Obs! Den ursprungliga gruvarbetaren i blocket får en ”gruvarbetare” -avgift, vilket är en belöning som består av eventuella outnyttjade mynt från transaktioner utöver en ”myntbas” -belöning. Coinbase-belöningen startade med 50 bitcoins och halverades efter 210 000 block (ungefär en gång vart fjärde år). Coinbase-belöningen blir så småningom så liten att den blir liten jämfört med gruvarbetarens avgifter.

Kommentarer

  • Belöningen halveras var 210000 kvarter .- > Såg bara det nu och tycker att det är snyggt: bitcoinclock.com
  • Åh , och svårigheten justeras varje kvartal 2016 genom att anta att nätverket kommer att fortsätta att fungera med den genomsnittliga hashfrekvensen för de senaste blocken 2016 och ställa in den nya svårigheten så att detta hash skulle resultera i en cirka 10 minuters blockcykel.
  • Jag kan ha fel, men jag tror att blocket också innehåller hash från det senaste blocket. Och det är så block kedjats bakåt, vilket leder till termen blockchain.
  • @Murch, svårigheten justeras faktiskt varje block baserat på hur lång tid det tog att hitta det tidigare blocket, och vid denna tidpunkt, svårigheter kan bara gå upp. Varje 2016-block justeras svårigheten i förhållande till de senaste 2016-blocken och den kan gå antingen upp eller ner. Detta hjälper till att skydda mot plötsliga nedgångar i datorkraft, vilket annars skulle leda till att det är dags att hitta ett block som ökar till mer än 10 minuter.
  • @ Tarandeep-Gill, att ’ är korrekt! Hashet från det föregående blocket hashades tillsammans med listan över transaktioner. Detta får mig faktiskt att tro att min förklaring av hashing är lite ofullständig – Den specifika hashfunktionen tillämpas inte SHA256 två gånger som sagt, utan snarare den funktionen som tillämpas på olika delar av blocket (inklusive transaktioner och hash från föregående block) på olika sätt. Det här är en av dessa ” felaktigheter ” Jag varnade dig för. Jag undrar om du kan hitta de andra …

Svar

Syftet med att lösa ett ”pussel” är att (a) fördröja brytningen av blocket till genomsnittliga 10 minuter och (b) att ådra sig verkliga kostnader för att bryta ett block (spendera CPU-kraft, alltså energi). Kostnaderna är där för att förhindra en Sybil-attack (sätta många gruvarbetare på jobbet för att göra en 51% -attack).

Förseningen läggs in för att tillåta ett bra block att sprida sig över hela världen till alla andra gruvarbetare , utan att ge gruvarbetaren som just präglade det nya blocket en fördel med fördel. För detta måste blocktiden (10 minuter) vara i storleksordning större än utbredningsfördröjningen (några sekunder).

Så pussels slag är på sätt och vis irrelevant, det kan lika gärna vara en jätte Sudoku.

Svar

Vilken hash som helst är en giltig hash. Frågan är om du ”hash uppfyller våra kriterier. Vad du hash är egentligen ett par saker (vi kommer tillbaka till detta) som uppradade tillsammans gör en sträng som är en sträng av en viss längd. Du hasar sedan hela strängen. Tänk på din resulterande hash som ett nummer. Vad vi vill är att det resulterande antalet ska vara mindre än ett målnummer. Så det är som att rulla en miljard sidig matris och komma fram till ett nummer under målnumret. Det målantalet anses vara ”svårighet”. När fler människor rullar munstycket sänker vi vad målnumret är för att minska sannolikheten någon en-roll kommer att träffa.

Så viktigt är att några av de saker som vi ställer upp i strängen som vi har är saker som vi får justera. Hashing är inte precis som att rulla formen, för om vi har samma sak om och om igen får vi samma resultat om och om igen. Men även en mindre justering av vad vi har kan ha stor inverkan på vad den resulterande haschen är. primärt objekt som vi kan manipulera kallas ”nonce”. I grund och botten väljer vi ett nonce att använda i strängen, hash hela strängen och ser vad vi får. Om hash inte är en hit, ändrar vi nonce och försöker igen . Själva nonce är inte så stort så det finns ett begränsat antal variationer av nonce som du kan prova. Nästa artikel vi kan ändra är en tidsstämpel. Vi får också vinkla tidsstämpeln. Varje vinkling i tidsstämpeln tillåter oss igenom hela uppsättningen av möjliga nonce-värden igen. Vi upprepar denna process för att uttömma nonce-möjligheterna och sedan vrida tidsstämpeln om och om igen tills den resulterande hash är lägre än svårighetsmålnumret.

När det händer förkunnar vi sedan för världen att denna tidsstämpel plus denna nonce fungerar för att lösa blocket. Andra validerar att det är sant och det läggs till blockkedja. Ett block betraktas som ”Validerat” när det är ett visst antal block ”djupt” i blockkedjan, vilket betyder att det är ett historiskt block jämfört med det aktuella blocket. Validering är lite felaktig här eftersom det inte är att blocket inte redan är känt för att vara giltigt. Det vi validerar är beviset på arbetet, vilket betyder att när det historiska blocket har begravts tillräckligt långt är den ansträngning som krävs för att skapa historien oöverstiglig för någon annan att försöka skapa en annan variation av historien. sin egen version av det blocket (det enda skälet är att skriva i sin egen version av transaktionerna, dvs.stjäla mynt) lösa det sedan själva, lösa sedan nästa block och det efter och så vidare och ”komma ikapp” med alla andra. Det betyder att de måste tävla om världen i tärningspelet. Kanske en gång i universums historia kan någon ha tur på nonce med två eller tre kvarter rygg mot rygg, men med de 120 block som de flesta gruvbassänger och växlar kräver nu? Kommer inte att hända någonsin.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *