Het bitcoin mining-algoritme van een programmeur ' s standpunt

Deze pagina: Blocks zei dat mijnbouw eigenlijk bedoeld is om een wiskundig probleem op te lossen, maar het lezen van Block hashing-algoritme biedt niet veel hulp. Ik heb ook geprobeerd het lezen van bitcoind-broncode, maar het lezen van code kost veel meer tijd dan het lezen van documentatie 🙂

En ik heb een eenvoudige json-rpc-client geschreven om de methode getwork () aan te roepen om de “gegevens” op te halen, maar wat moet Doe ik naast deze “gegevens”?

Zou iemand het mijnbouwproces kunnen uitleggen in de weergave van de programmeur?

Reacties

  • but what should I do next to this "data"? Hier ‘ is een korte referentie-implementatie. github.com/jgarzik/pyminer/blob/master/pyminer.py
  • Ook explain the mining process in programmer's view is een vrij brede vraag. Welk specifiek probleem probeer je op te lossen?
  • @NickODell Bedankt voor je code! Nu begrijp ik hoe ik nieuwe blokken moet maken. Maar is elk ingediend blok geldig (bitcoin-netwerk stuurt bitcoin naar deze persoon)? Ik ontdekte dat de Bitcoin-wiki zei dat er elk uur slechts 6 blokken worden gemaakt. Stel dat 100 mensen de blokheader krijgen door tegelijkertijd getwork te gebruiken met dezelfde moeilijkheidsgraad, ik denk dat deze mensen veel meer dan 6 blokken zullen maken. Heb ik gelijk?
  • Antwoord in de volgende volgorde: Nee. Nee.
  • mogelijk duplicaat van Ik kan de getwork-api niet vinden

Answer

Het mijnbouwalgoritme is als volgt:

  • Stap 0 – Haal de hash van het vorige blok op van het netwerk.

  • Stap 1 – Verzamel een lijst met potentiële transacties die bekend staan als een “blok”. Deze lijst met transacties is afkomstig van het peer-to-peer bitcoin-netwerk.

  • Stap 2 – Bereken een hash voor een blok potentiële transacties samen met een willekeurig getal.
  • Stap 3 – Als de hash hoger is dan de momenteel ingestelde moeilijkheidsgraad, dan heb je dat blok gedolven. Als dit niet het geval is, begint u opnieuw vanaf stap 1. Alle toevoegingen aan de lijst met transacties uit stap 1 samen met een verandering in het willekeurige getal uit stap 2 betekenen dat er een kans is dat aan het criterium wordt voldaan bij de volgende ronde.

Vanuit het standpunt van een programmeur zou de pseudocode er ongeveer zo uit kunnen zien:

 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 

Ik zou je moeten waarschuwen dat er een paar onnauwkeurigheden in die beschrijving, maar voor het grootste deel zou dat goed genoeg moeten zijn. En hier zijn nog een paar nuttige verduidelijkingen:

Wat “sa hash?

Een hash is een functie die gegevens omzet in een getal binnen een bepaald bereik. De hash heeft de eigenschap dat het kennen van de output in wezen onvoorspelbaar is (binnen het opgegeven bereik). De specifieke hash-functie die wordt gebruikt voor bitcoin-mijnbouw is SHA256 tweemaal toegepast.

Hoe werkt het moeilijkheidsniveau?

Deze onvoorspelbare aard van de hash-functie betekent dat het invoeren van willekeurige gegevens (de transactie + het willekeurige getal) in wezen een willekeurig getal binnen een bepaald bereik oplevert. Het verder beperken van het bereik van de gewenste output heeft invloed op hoe waarschijnlijk het is om het in één ronde te vinden. Dit creëert een manier om probabilistisch te bepalen hoe vaak een oplossing wordt gevonden op basis van het aantal keren dat het algoritme op het netwerk kan worden uitgevoerd. Specifiek, als je de term “gigahashes” of “terahashes” hoort, verwijst dit naar het aantal keren dat stap 3 kan worden uitgevoerd. Naarmate het aantal hashes per seconde over het hele netwerk toeneemt, verhoogt het netwerk automatisch de moeilijkheidsgraad, zodat er binnen ongeveer 10 minuten een oplossing wordt gevonden.

Wat gebeurt er wanneer een blok wordt gemined?

Wanneer een blok wordt gemined, stuurt de mijnwerker het blok naar alle andere mijnwerkers op het netwerk als bewijs dat het gevonden. Dit blok bevat een lijst met transacties, de gevonden hash, het specifieke willekeurige nummer en een verwijzing naar de vorige hash. Als elke miner het nieuw gedolven blok ontvangt, verwijdert het alle transacties die het momenteel aan het minen is binnen het blok (omdat ze al bevestigd zijn in de blokketen) en verzendt het blok naar andere mijnwerkers die hetzelfde doen. propagatie gebeurt vrij snel.

Opmerking: de oorspronkelijke miner van het blok krijgt een “miners” -vergoeding, wat een beloning is die bestaat uit niet-uitgegeven munten van transacties naast een “coinbase” -beloning. De coinbase-beloning begon bij 50 bitcoins en halveert na elke 210.000 blokken (ongeveer eens per 4 jaar). De coinbase-beloning zal uiteindelijk zo klein worden dat deze minuscuul zal zijn in vergelijking met de vergoedingen voor mijnwerkers.

Opmerkingen

  • De beloning wordt elke 210000-blokken gehalveerd .- > Zag dat nu net en denk dat het netjes is: bitcoinclock.com
  • Oh , en de moeilijkheidsgraad wordt elke 2016-blokken aangepast door aan te nemen dat het netwerk zal blijven werken met de gemiddelde hash-snelheid van de laatste 2016-blokken en de nieuwe moeilijkheidsgraad zo in te stellen dat deze hashrate zou resulteren in een blokcyclus van ongeveer 10 minuten.
  • Ik zou het mis kunnen hebben, maar ik denk dat het blok ook de hash van het laatste blok bevat. En zo worden blokken achterwaarts geketend, wat leidt tot de term blockchain.
  • @Murch, de moeilijkheidsgraad wordt feitelijk elk blok aangepast op basis van hoe lang het duurde om het vorige blok te vinden, en op dit punt moeilijkheid kan alleen maar toenemen. Elke 2016 blokken, de moeilijkheidsgraad wordt aangepast ten opzichte van de laatste 2016 blokken en kan omhoog of omlaag gaan. Dit helpt beschermen tegen plotselinge dalingen in rekenkracht, die er anders toe zouden leiden dat de tijd om een blok te vinden oploopt tot meer dan 10 minuten.
  • @ Tarandeep-Gill, dat ‘ s correct! De hash van het vorige blok wordt samen met de lijst met transacties gehasht. Dit doet me eigenlijk denken dat mijn uitleg van hashing een beetje onvolledig is – De specifieke hash-functie is niet SHA256 tweemaal toegepast zoals vermeld, maar eerder die functie toegepast op verschillende delen van het blok (inclusief transacties en de hash van het vorige blok) op verschillende manieren. Dit is een van die ” onnauwkeurigheden ” waarvoor ik je heb gewaarschuwd. Ik vraag me af of je de anderen kunt vinden …

Antwoord

Het doel van het oplossen van een “puzzel” is om (a) het minen van het blok te vertragen tot gemiddeld 10 minuten en (b) om reële kosten te maken voor het minen van een blok (verbruik van cpu-stroom, dus energie). De kosten zijn er om een Sybil-aanval te voorkomen (veel mijnwerkersmachines aan het werk zetten om een aanval van 51% uit te voeren).

De vertraging is bedoeld om een goed blok over de hele wereld te verspreiden naar alle andere mijnwerkers , zonder de mijnwerker die zojuist het nieuwe blok heeft geslagen een voorsprong te geven. Daarvoor moet de blokkeertijd (10 minuten) een orde van grootte groter zijn dan de voortplantingsvertraging (een paar seconden).

Dus het soort puzzel is in zekere zin niet relevant, het kan net zo goed een gigantische Sudoku zijn.

Answer

Elke hash is een geldige hash. De vraag is of je hasj aan onze criteria voldoet. Wat je hasj is eigenlijk een paar dingen (we komen hier nog op terug) die samen een string vormen die een string is met een bepaalde lengte. Je hasht dan die hele string. Beschouw uw resulterende hash als een getal. Wat we willen is dat het resulterende getal kleiner is dan een doelgetal. Het is dus alsof je een miljardzijdige dobbelsteen gooit en een getal bedenkt onder het doelnummer. Dat doelnummer wordt als moeilijkheid beschouwd. Naarmate meer mensen met de dobbelsteen gooien, verlagen we wat dat doelnummer is om de kans te verkleinen elke die-roll zal raken.

Zo belangrijk is dat sommige van die dingen die we in de string plaatsen die we hasjen, dingen zijn die we mogen aanpassen. Hashen is niet precies hetzelfde als de dobbelsteen gooien, want als we steeds hetzelfde hebben, krijgen we steeds weer hetzelfde resultaat. Maar zelfs een kleine aanpassing in wat we hasj kunnen een grote invloed hebben op wat de resulterende hasj is. Het primaire item dat we kunnen manipuleren wordt de “nonce” genoemd. In principe kiezen we een nonce om in de string te gebruiken, hash de hele string en kijken wat we krijgen. Als de hash niet wordt geraakt, passen we de nonce aan en proberen we het opnieuw . De nonce zelf is niet erg groot, dus er is een beperkt aantal variaties op de nonce die je kunt proberen. Het volgende item dat we kunnen wijzigen, is een tijdstempel. We mogen ook de tijdstempel wiebelen. Elke keer dat de tijdstempel beweegt, kunnen we de hele reeks mogelijke nonce-waarden opnieuw doorlopen. We herhalen dit proces van het uitputten van de nonce-mogelijkheden en vervolgens de tijdstempel steeds weer wiebelen tot de resulterende hash is lager dan de moeilijkheidsgraad.

Als dat gebeurt, verkondigen we aan de wereld dat dit tijdstempel plus deze nonce werkt om het blok op te lossen. Anderen valideren dat het waar is en het wordt toegevoegd aan de blokketen. Een blok wordt als “gevalideerd” beschouwd zodra het een bepaald aantal blokken “diep” in de blokketen is, wat betekent dat het een historisch blok is vergeleken met het huidige blok. Validatie is hier een beetje een verkeerde benaming omdat het niet al bekend is dat het blok geldig is. Wat we opnieuw valideren, is het bewijs van werk, wat betekent dat als dat historische blok eenmaal ver genoeg is begraven, de hoeveelheid moeite die nodig is om die geschiedenis te creëren onoverkomelijk is voor iemand anders om te proberen een andere variant van de geschiedenis te creëren. Ze zouden moeten creëren hun eigen versie van dat blok (de enige reden is om in hun eigen versie van de transacties te schrijven, dwzmunten stelen), los het dan zelf op, los dan het volgende blok op en het blok erna enzovoort en “inhalen” met alle anderen. Dit betekent dat ze de wereld moeten verslaan in het dobbelspel. Misschien heeft iemand ooit in de geschiedenis van het universum geluk gehad met twee of drie blokken rug aan rug, maar met de 120 blokken die de meeste mining pools en exchanges nu nodig hebben? Zal nooit gebeuren.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *