Servus Leute,
also, folgendes: Basierend auf der Idee von rico
https://bitcointalksearch.org/topic/rfc-burst-crowdmining-shares-1-pb-miner-1962866habe ich mir mal die Technikalitäten beim Burst-Mining angeschaut. Und es ist
tatsächlich so, dass man
mit ein wenig GPU-Power einen ordentlichen Hebel-Effekt erreichen
kann. Ich möchte das hier mal ausführen.
Das Whitepaper ist mMn recht nutzlos,
ein Blick auf das Schaubild verrät eigentlich alles:
Zunächst muss man sich im klaren sein, wie das Prinzip im Normalfall abläuft:
Wer konventionell minert, der erstellt sich zuerst die Plots. Jeder Plot ist 250 kb gross
("Plot" als output vom Plotter im Schaubild) und ist unterteilt in 4096 Scoops (oder "Chunks"?
Im Zweifelsfall berichtige man mich.. Gemeint sind die 32-byte-words "Plot[ i ]" im Schaubild). Jedes
Scoop ist ein 32-byte Word. Auf eurer Platte liegen viele viele solcher Plots, und die
sind durchnummeriert mit den Nonces. Die Scoops werden errechnet aus eurer Burst-ID und
der Nonce des entsprechnden Plots, und im Wesentlichen ist der i-te Scoop im Plot zur Nonce N gerade
Shabal^i(BurstID,N), also Shabal i-mal angewandt auf das Word das aus eurer
Burst-ID und der Nonce N zusammengesetzt ist. Dh um nur einen Plot auszurechnen, muss
4096-mal Shabal angewandt werden. Das passiert beim plotten und benötigt entsprechend viel Rechenzeit.
Shabal ausrechnen können GPUs relativ effizient, vor allem wenn die Daten parallel vorliegen (d.h.
wir rechnen in einem Aufwasch den ersten Scoop zu den nonces 1 bis z.B. 1000 aus,
dann den 2. Scoop zu den nonces 1 bis 1000, usw. Das ist übrigens auch der Grund, warum
GPU-Plots noch nicht optimiert sind, aber das soll uns hier egal sein.)
Beim Mining macht man folgendes: Man ist i.W. konfrontiert mit einer ScoopNumber M und einem
Datensatz GenSig, und die Aufgabe ist nun, Plots (oder besser: Nonces N) zu finden, deren M-ter Scoop (nennen wir ihn S_(M,N)) folgende Eigenschaft erfüllt:
Shabal(GenSig, S_(M,N)) ist klein.
Was macht also die Mining-Software? Sie liest aus jedem Plot (d.h. für jede Nonce N die ihr beim plotten
reingenommen habt) den M-ten Scoop aus, berechnet
Shabal(GenSig, S_(M,N)) und submittet, wenn das Ergebnis "klein genug" ist. Da wir für jeden Block nur einen fixen Scoop auslesen
müssen, wird nur auf ein 4096-tel der Mining-Kapazität lesend zugegriffen. Für 100 tb immerhin noch
250 25 GB
die verarbeitet werden müssen!
Aufwand (konventionell) für x MB Mining-Kapazität: x MB Plattenplatz, x*4 Shabal-Berechnungen, x/4096 MB DatendurchsatzJe nach HW sind nun entweder die Shabal-Berechnungen das bottleneck (gerne bei cpu-minern) oder
der Datendurchsatz (üblicherweise bei GPU-minern).
Nun springt einem
folgende Alternative gradezu ins Gesicht: Ich erkläre es für den Hebel-Faktor H=2:
Der Plotter rechnet aus was er immer ausrechnet, nur speichert er nicht den ganzen Plot, sondern nur jeden
zweiten Scoop. Plus den Final Hash, der wird konventionell verworfen, wir brauchen ihn aber. Insgesamt ist
jetzt der Plot zu einer gegebenen Nonce nur minimal mehr als halb so groß wie konventionell.
Der Miner macht folgendes (Fallunterscheidung je nach Parität der Scoop-Number):
Glücklicher Fall: Ist für einen Block eine gerade Scoop-Nummer M angesagt, so schaut er einfach
an die M/2-te Stelle in den Blöcken, denn die graden Scoops haben wir ja abgespeichert (Puh
). Dann muss
natürlich noch ge-Shabal-t werden für die Deadline, aber gegenüber konventionell hat sich am Aufwand gar nichts
geändert.
Nicht-so-glücklicher Fall: Ist M ungerade, so müssen wir an PlotChunk[M-1] rankommen, um darauf Shabal anzuwenden, denn
das ist gerade PlotChunk[M] und daraus bekommen wir per xOR mit Final Hash den benötigten M-ten Scoop!
An PlotChunk[M-1] kommen wir aber easy, wir müssen nur an die (M/2-1/2)-te Stelle in unserem Plot schauen
und das xOR-en mit Final Hash rückgängig machen. (
Die ganze xOR-Geschichte lasse ich grade mal nur halb
erklärt. Das ist eine Rechnung die lächerlich schnell ist im Vergleich zu Shabal, also quasi eine Formalität die man
für die Aufwandsabschätzung vernachlässigen kann. Auch das coden ist straightforward und Bestandteil von
meinetwegen 3 Codezeilen.) Wir müssen also pro Block zwei mal Shabalen.
Nun treten die beiden Fälle auf lange Sicht gleich häufig auf, wir bekommen also:
Aufwand (Hebel H=2) für x MB Mining-Kapazität: x/2 MB Plattenplatz, x*6 Shabal-Berechnungen, x/4096 MB DatendurchsatzAlternativ: Für eine gegebene Kapazität verdoppelt sich die "minebare Kapazität", aber der Rechenaufwand steigt um 50%, der
Datendurchsatz sogar um 100%.
Das lässt sich auf offensichtliche Weise für beliebige H realisieren (ich würde aber der Einfachheit halber auf Zweierpotenzen setzen, sonst verschenkt
man auch etwas Platz). Einmal arithmetischen Reihe für Drittklässler liefert:
Aufwand (Hebel H beliebig) für x MB Mining-Kapazität: x/H MB Plattenplatz, x*2*(H+1) Shabal-Berechnungen, x/4096 MB DatendurchsatzBemerkungen:
- Nur ein Time-Memory-Tradeoff? Man gewinnt nichts?
Jein.. Es ist ein Tradeoff, aber vor allem zeigt es dass wir sehr ineffizient minen, insbesondere die unter uns die GPU-mining betreiben.
Jeder GPU-Burst-Miner möge sich die Frage beantworten: Würde ich gerne (ohne zusätzliche Investitionen) mit doppelter Kapazität minen, wenn
dafür meine round time (im Mittel) um 50% steigt? Mit dreifacher Kapazität, wenn dafür meine round time um 100% steigt? Allerdings kann man
nicht beliebig skalieren: Wenn der Hebel H hochgeht, dann steigt nicht nur die nötige Rechenleistung, sondern auch der Datendurchsatz.
Ich habe keine große Ahnung von den Performance-Werten, aber ich würde sagen H=8 oder 16 wäre ein möglicher Sweetspot bei 100tb und
ner sauberen GraKa. H=64 oder 128 ist vielleicht machbar bei 8 Hammer-GPUs und mit SSDs. Müsste man testen..
- Eine theoretische Spielerei?
Quatsch, das lässt sich ohne weiteres in die Realität holen. Man muss sich nur eine neue Struktur für die Plot-Files überlegen (bzw einfach
sicherstellen, dass der geforkte Miner den Final Hash da sucht, wo der geforkte Plotter ihn hingelegt hat) und diesen Hebel-Parameter
als Argument in die Config-File von jminer bzw als Argument vom Plotter einpflegen, und halt die zwei Programme abändern. Ich denke, wenn
alles fertig ist, hat man vielleicht 50-100 Zeilen Code insgesamt geändert/hinzugefügt. Blago oder Luxe brauchen dafür vlt 2 Stunden mit testen usw.
- Warum erkläre ich euch das hier und programmiere nicht meinen Miner? Jup, habe ich versucht, aber ich bin ein unerfahrener
Programmierer und der Nachmittag heute hat mich schon in den Wahnsinn getrieben. Weniger der Code, als vielmehr die zig Abhängigkeiten,
OpenCL-Versionen, was weiss ich. Dafür ist mir meine Zeit zu schade und ich bin auch nicht geneigt, einen entsprechenden Miner aufzusetzen
wo sich das lohnen würde. Burst ist nicht mehr lange profitabel. Trotzdem, wenn sich jemand berufen fühlt, das zu coden, wäre ich über eine
Kopie natürlich nicht undankbar. Am besten wäre es vermutlich, wenn das gleich open source gemacht wird.
Den Ausschlag hat allerdings gegeben, dass mir rico mit seinem Bakshish-Kommentar, gelinde gesagt, ein weeenig unsympathisch geworden ist.
Da mache ich die Überlegungen hier lieber gleich öffentlich. Ist eh im Sinne des open source Gedankens
- Wenn es so einfach ist, warum ist noch niemand auf die Idee gekommen in den Jahren seit Burst existiert?
Das ist allerdings eine Frage, auf die ich keine Antwort habe... Die einzige Vorstellung, in der mein Weltbild konsistent bleibt,
ist dass Luxe und Blago und deren Kumpels schon länger so minen oder gemined haben. Es ist für mich völlig unvorstellbar, dass man
so etwas wie jminer programmiert und nicht auf die Idee kommt, das einzubauen. (Luxe's Code ist übrigens um Lichtjahre professioneller
als Blago's, wenigstens eine Erkenntnis des heutigen Nachmittages^^)
Edit: Oha, einen kleinen Fehler habe ich noch gefunden.. Ist in Arbeit