Bitcoins gruvedriftalgoritme fra en programmerer ' s synspunkt

Denne siden: Blocks sa at gruvedrift faktisk er for å løse et matematisk problem, men å lese Block hashing-algoritme gir ikke mye hjelp. Jeg prøvde også å lese bitcoind kildekode, men å lese kode tar mye mer tid enn å lese dokumentasjon 🙂

Og jeg har skrevet en enkel json-rpc-klient for å ringe getwork () -metoden for å hente «data», men hva skal Jeg gjør ved siden av disse «dataene»?

Noen som kan forklare gruveprosessen i programmererens visning?

Kommentarer

  • but what should I do next to this "data"? Her ‘ er en kort referanseimplementering. github.com/jgarzik/pyminer/blob/master/pyminer.py
  • Også explain the mining process in programmer's view er et ganske bredt spørsmål. Hvilket spesifikt problem prøver du å løse?
  • @NickODell Takk for koden din! Nå forstår jeg hvordan jeg lager nye blokker. Men er hver innsendt blokk gyldig (bitcoin-nettverk vil sende bitcoin til denne personen)? Jeg fant Bitcoin wiki sa at bare 6 blokker vil bli opprettet hver time, Anta at 100 mennesker får blokkoverskriften ved å bruke getwork samtidig med samme vanskeligheter, jeg tror mye mer enn 6 blokker vil bli opprettet av disse menneskene. Har jeg rett?
  • Svar i rekkefølge: Nei. Nei.
  • mulig duplikat av Jeg kan ikke finne getwork-api

Svar

Gruvedriftsalgoritmen er som følger:

  • Trinn 0 – Hent hash for forrige blokk fra nettverket.

  • Trinn 1 – Samle en liste over potensielle transaksjoner kjent som en «blokk». Denne listen over transaksjoner kommer fra peer-to-peer bitcoin-nettverket.

  • Trinn 2 – Beregn en hash for en blokk med potensielle transaksjoner sammen med et tilfeldig tall.
  • Trinn 3 – Hvis hasjen er mer enn det for øyeblikket innstilte vanskelighetsnivået, har du utvunnet den blokken. Hvis ikke, start på nytt fra trinn 1. Eventuelle tillegg til listen over transaksjoner fra trinn 1 sammen med endring i tilfeldig antall fra trinn 2 betyr at det er en sjanse for at kriteriet blir oppfylt i neste omgang.

Fra en programmerers visning kan pseudokoden se ut slik:

 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 

Jeg burde advare deg om at det er noen unøyaktigheter i den beskrivelsen, men for det meste bør det være bra nok. Og her er noen flere nyttige avklaringer:

Hva «sa hash?

En hash er en funksjon som konverterer data til et tall innenfor et bestemt område. Hashet har den egenskapen at det å vite at det er utdata er i det vesentlige uforutsigbart (innenfor det gitte området). Den spesifikke hashfunksjonen som brukes til bitcoin mining er SHA256 brukt to ganger.

Hvordan fungerer vanskelighetsgraden?

Denne uforutsigbare karakteren til hash-funksjonen betyr at å legge inn tilfeldige data (transaksjonen + det tilfeldige tallet) i det vesentlige vil gi et tilfeldig tall innenfor et bestemt område. Ytterligere begrensning av ønsket utgangseffekt påvirker hvor sannsynlig det er å finne det i en enkelt runde. Dette skaper en måte å sannsynlig bestemme hvor ofte en løsning vil bli funnet basert på antall ganger algoritmen kan kjøres på nettverket. Spesielt når du hører begrepet «gigahashes» eller «terahashes», refererer dette til antall ganger trinn 3 kan kjøres. Etter hvert som antall hashes per sekund over hele nettverket vokser, øker nettverket automatisk vanskeligheten slik at en løsning blir funnet innen ca. 10 minutter.

Hva skjer når en blokk utvinnes?

Når en blokk utvinnes, sender gruvearbeideren blokken til alle andre gruvearbeidere på nettverket som bevis på at den har funnet det. Denne blokken inneholder en liste over transaksjoner, funnet hash, det spesifikke tilfeldige tallet og en referanse til forrige hash. Når hver gruvearbeider mottar den nylig utvinnede blokken, fjerner den alle transaksjoner som den for tiden gruver som eksisterer i blokken (fordi de allerede er bekreftet i blokkjeden) og sender blokken til andre gruvearbeidere som gjør det samme. forplantning skjer ganske raskt.

Merk: den opprinnelige gruvearbeideren i blokken får en «gruvearbeider» -avgift, som er en belønning som består av eventuelle ubrukte mynter fra transaksjoner i tillegg til en «myntbase» -belønning. Coinbase-belønningen startet med 50 bitcoins og halveres etter hver 210 000 blokker (omtrent en gang hvert fjerde år). Coinbase-belønningen vil etter hvert bli så liten at den vil være liten i forhold til gruvearbeidernes avgifter.

Kommentarer

  • Belønningen halveres hver 210000 kvartal .- > Bare så det nå og synes det er pent: bitcoinclock.com
  • Åh , og Vanskeligheten justeres hver 2016-blokk ved å anta at nettverket vil fortsette å operere med den gjennomsnittlige hash-frekvensen for de siste 2016-blokkene, og sette den nye vanskeligheten slik at denne hashrate vil resultere i en omtrent 10 minutters blokkeringssyklus.
  • Jeg kan ta feil, men jeg tror at blokken også inneholder hasjen fra den siste blokken. Og det er slik blokker lenkes bakover, noe som fører til begrepet blockchain.
  • @Murch, vanskeligheten blir faktisk justert hver blokk basert på hvor lang tid det tok å finne den forrige blokken, og på dette punktet, vanskeligheter kan bare gå opp. Hver 2016-blokk blir vanskeligheten justert i forhold til de siste 2016-blokkene, og den kan gå enten opp eller ned. Dette hjelper deg med å beskytte mot plutselige fall i datakraften, noe som ellers vil resultere i tiden for å finne en blokk som øker til mer enn 10 minutter.
  • @ Tarandeep-Gill, at ‘ er riktig! Hashet fra forrige blokk er hash sammen med listen over transaksjoner. Dette får meg faktisk til å tenke at forklaringen min på hashing er litt ufullstendig – Den spesifikke hashfunksjonen brukes ikke SHA256 to ganger som nevnt, men heller den funksjonen som brukes på forskjellige deler av blokken (inkludert transaksjoner og hash fra forrige blokk) på forskjellige måter. Dette er en av de » unøyaktighetene » Jeg advarte deg om. Jeg lurer på om du finner de andre …

Svar

Formålet med å løse et «puslespill» er å (a) utsette gruvedriften av blokken til gjennomsnittlige 10 minutter og (b) å pådra seg virkelige kostnader for gruvedrift av en blokk (bruke CPU-kraft, altså energi). Kostnadene er der for å forhindre et Sybil-angrep (å sette mange gruvearbeidere på jobb for å gjøre et 51% -angrep).

Forsinkelsen settes inn for å tillate at en god blokk spres over hele kloden til alle andre gruvearbeidere. , uten å gi gruvearbeideren som nettopp har laget den nye blokken en fordel. For det må blokkeringstiden (10 minutter) være størrelsesorden større enn forplantningsforsinkelsen (noen sekunder).

Så den typen puslespillet er på en måte irrelevant, det kan like godt være en gigantisk Sudoku.

Svar

Enhver hash er en gyldig hash. Spørsmålet er om du er hash oppfyller våre kriterier. Det du hash er egentlig et par ting (vi kommer tilbake til dette) som stilt opp sammen, lager en streng som er en streng av en bestemt lengde. Du has deretter hele strengen. Tenk på den resulterende hasjen din som et tall. Det vi ønsker er at det resulterende tallet skal være mindre enn et målnummer. Så det er som å rulle en milliard ensidig dør, og komme opp med et tall under målnummeret. Det målnummeret betraktes som «vanskeligheter». Når flere mennesker ruller dør, senker vi det som er målet for å redusere sannsynligheten. en hvilken som helst terningrull vil treffe.

Så viktigere er det at noen av de tingene vi stiller opp i strengen vi har, er ting som vi har lov til å justere. Hashing er ikke akkurat som å rulle terningen, for hvis vi har det samme om og om igjen, får vi det samme resultatet om og om igjen. Selv en mindre justering av det vi har, kan ha stor innvirkning på hva den resulterende hasjen er. primær element som vi kan manipulere kalles «nonce». I utgangspunktet velger vi en nonce som skal brukes i strengen, hasj hele strengen og ser hva vi får. Hvis hash ikke er en hit, endrer vi nonce og prøver igjen . Selve nonce er ikke veldig stor, så det er et begrenset antall varianter av nonce du kan prøve. Neste element vi kan endre er en tidsstempel. Vi har lov til å vri på tidsstemplet også. Hver vri på tidsstempelet tillater oss gjennom hele settet av mulige nonce-verdier på nytt. Vi gjentar denne prosessen med å utnytte nonce-mulighetene, og deretter vrir vi tidsstemplet om og om igjen til den resulterende hasjen er lavere enn vanskelighetsmålnummeret.

Når det skjer, forkynner vi overfor verden at dette tidsstemplet pluss dette nonce fungerer for å løse blokken. Andre bekrefter at det er sant, og det er lagt til blokkjede. En blokk betraktes som «validert» når den er et visst antall blokker «dyp» i blokkjeden, noe som betyr at den er en historisk blokk sammenlignet med den nåværende blokken. Validering er litt feilaktig her, fordi det ikke er at blokken ikke allerede er kjent for å være gyldig. Det vi validerer er beviset på arbeidet, noe som betyr at når den historiske blokken er begravd langt nok, er den innsatsen som er involvert for å skape historien uoverstigelig for noen andre å prøve å skape en annen variant av historien. De måtte lage sin egen versjon av den blokken (den eneste grunnen er å skrive i sin egen versjon av transaksjonene, dvs.stjele mynter) og deretter løse det selv, så løse neste blokk og den etterpå og så videre og «ta igjen» alle andre. Dette betyr at de må konkurrere over hele verden i terningkast. En gang i universets historie kan det hende noen kan være heldige på tampen med to eller tre blokker rygg mot rygg, men med de 120 blokker som de fleste gruvebassenger og sentraler krever nå? Kommer aldri til å skje.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *