https://upgradespecs.bitcoincashnode.org/2020-11-15-asert/

1 25
Avatar for krise636
3 years ago

https://upgradespecs.bitcoincashnode.org/2020-11-15-asert/

2020-NOV-15 ASERT-Rechte zur Anpassung der Rechte (aserti3-2d)

Freetrader, Jonathan Toomim, Calin Culianu, Mark Lundeberg

Version 0.6, 2020-08-12


Zusammenfassung

Es wird geändert, beim Upgrade im November 2020 wird eine neue Berechtigung zur Anpassung des Schwierigkeitsgrads zu den, auch "aserti3-2d" (oder kurz "ASERT") für Bitcoin Cash gehört wird. Die Berechtigungen werden auf MTP, der letzte Vorgabelblock als Ankerblock verwendet wird.

Motivation

  • Um periodische Schwingungen in besser und Hashrate zu gehört

  • Unterschiedliche des Rentabilitätsunterschieds zwischen Bergarbeitern und Arbeiten, die auf den Abbau anderer Blockchains umsteigen.

  • Besser gehörtlicher Blockintervalle nahe dem 10-Minuten-Ziel.

  • Um die richtige Transaktionsbestätigungszeit nahe an die Zielzeit zu bringen.

Technischer Hintergrund

Die im November 2017 eingezogen werden DAA gehört Anfälligkeit für eine regelmäßige periodische Schwierigkeitsschwingung, die sich direkt aus dem eigenen Design des Verhaltens mit gleitendem Folgen Folgen. Die periodischen Schwierigkeitsschwächungen gehören zu einem anderen für das Switch-Mining und zu einem nicht motivierten stetigen Hash-Mining.

Die Schwachstellen in den Rechten und im Hashrat haben zu einem freien Muster langesleitungszeiten gehört, gehört von Bursts schnelle Blöcke. Die Steuerungsbehebungszeiten von Verträgen werden, wie Sie sich schützen, da nur Rechte sich in den behinderten Zuständigkeiten befinden.

Untersuchungen zur Familie der Schwierigkeitsalgorithmen auf der Grundlage eines exponentiellen gleitenden Maßes (EMA) ergaben ASERT, das Jahr 2019 von Mark Lundeberg und und 2020 von ihm, wie es möglich Krieg, Krieg eine äquivalente Formel, wie es möglich Krieg 2018 von Jacob Eliosoff und 2020 von Werner et. al [6].

ASERT weist die oben genannten Schwächen nicht auf und nach einer Reihe anderer attraktiver Eigenschaften auf, wie z. B. Robustheit direkter Singularitäten [15], ohne dass die Rechte Rechte und, und keine Akkumulation von Rundungs- / Approximationsfehlern.

In einer anderen Simulation gegen eine Reihe, in der es geht, einen stabilen Status zu erhalten.

  • bestimmte Blockzeiten, die der idealen Zielzeit von 600 Sekunden am richtigen kommen

  • Durchschnittlichelichelichelichelichelichelichelichelichelichelichelichelichelichelichelichelichelichelichelicheliche Transaktionsbestätigungszeit, die Zielzeit am richtigen kommt

  • Bestimmte des Arbeitslosen nicht stetiger Bergbaustrategien, werden die relative Rentablen des stetigen Bergbaus maximiert wird

Spezifikation

Bedingungen und Konstellungen

Die Schlüsselwörter "MUSS", "MUSS NICHT", "ERFORDERLICH", "MUSS", "MUSS NICHT", "SOLLTE", "SOLLTE NICHT", "EMPFOHLEN", "MAI" und "OPTIONAL" in diesem Dokument zu zuweisen wie in RFC 2119 besorgt.

In mathematischen Formeln werden traditionelleell Operatoren wie +, -, /, * und ^ (Exponentiation) verwendet. Im Pseudocode kommt das Symbol für die Potenzielle nur in Handlungen vor. Die ganzzahlige Exponentiation wird im Pseudocode durch die  pow(x, y)Funktion gehört.

Der "Pre-Fork-Block" wird als Eltern des ersten Blocks betrachtet. Der erste Block wurde als "Gabelblock" bestätigt.

Bedarf

REQ-ASERT-TARGET-COMPUTATION (Zielberechnung)

Die 'Ziel'-Bits des Beziehungsblocks MÜSSEN durch eine bestimmte des gleichen Managements werden.

Die Höhe des Denkblocks MUSS wird oder gleich der Höhe des Ankerblocks sein.

Der  aserti3-2dVertragszugriff auf die folgenden Angaben:

next_target = old_target * 2^((time_delta - ideal_block_time * (height_delta + 1)) / halflife)

Unterschied die Bedeutung der Parameter / Variablen ist:

  • old_target ist das vorzeichenlose 256-Bit-Integer-Äquivalent des nBits-Werts im Header des Ankerblocks

  • time_delta ist die Differenz in vorzeichenbehafteten ganzzahligen Sekunden zwischen dem Zeitstempel im Header des Auswertungsblocks und dem Zeitstempel im über das Element des Ankerblocks

  • ideal_block_time ist eine Konstante: 600 (Sekunden), die die angestrebte menschliche Zeit zwischen Blöcken sehen

  • height_delta ist der Unterschied in der Blockhöhe zwischen dem Schadensblock und dem Ankerblock

  • halflife ist ein konstanter Parameter, der länger als "Tau" wird und im Mainnet einen Wert von 172800 (Sekunden) besteht

  • next_target ist der ganzzahlige Wert des Ziels, der für den zweiten Block nach dem gleichen Block wurde.

Der Ablauf der Berechtigungs- und Zahlenkarithmetik und einer kubischen Polynomnäherung an den 2 ^ x-Term.

Die als Erfüllung und Ausgabe des Ziels-Werte sind die kompakten Rechte der Rechte 256-Bit-Ganzzahlziele, wie für das Feld 'nBits' im Blockheader wird.

Pseudocode:

ALGORITHM aserti3-2d is
    INPUT:  anchor block height h_ref,       ; a block height (0, the genesis block height, is not permitted)
            anchor block parent time t_ref,  ; timestamp (nTime) of parent of anchor block
            anchor block bits b_ref,         ; 'nBits' value of anchor block
            evaluation block height h_eval,  ; height of block at which next target is to be evaluated
            evaluation block time t_eval     ; timestamp of block at which next target is to be evaluated
    OUTPUT: next block bits b_next           ; the 'target' nBits of the next block
    PRECONDITION:  (h_eval >= h_ref > 0) AND (0 < bits_to_target(b_ref) <= max_target)
    POSTCONDITION: (0 < bits_to_target(OUTPUT) <= max_target)
    CONSTANTS: ideal_block_time = 600  ; seconds
               halflife = 172800       ; 2 days (in seconds) on mainnet
               radix = 65536           ; pow(2, 16) , 16 bits for decimal part of fixed-point integer arithmetic
               max_bits = 486604799    ; maximum target in bits representation (0x1d00ffff)
               max_target = bits_to_target( max_bits )  ; maximum target as integer

    target_ref ← bits_to_target( b_ref )  ; convert anchor block nBits to integer
    time_delta ← t_eval - t_ref  ; can be negative
    height_delta ← h_eval - h_ref
    ; Use truncating division - see note 3 below
    exponent ← trunc_div(((time_delta - ideal_block_time * (height_delta + 1)) * radix), halflife)

    ; Compute equivalent of `num_shifts ← floor(exponent / 2^16)`
    num_shifts ← shift_right(exponent, 16)  ; must be arithmetic shift [4]
    exponent ← exponent - num_shifts * radix
    factor ← shift_right(   195766423245049 * exponent
                          + 971821376 * pow(exponent, 2)
                          + 5127 * pow(exponent, 3)
                          + pow(2, 47), 48) + 65536

    next_target ← target_ref * factor

    ; The following if-else construct is equivalent to `next_target ← floor(next_target * 2^factor)`
    IF num_shifts < 0 THEN
        next_target ← shift_right(next_target, -num_shifts)
    ELSE
        ; Implementations should be careful of overflow here (see note 6 below).
        next_target ← shift_left(next_target, num_shifts)
    END IF
    next_target ← shift_right(next_target, 16)

    IF next_target == 0 THEN
        RETURN target_to_bits(1)   ; hardest valid target
    END IF
    IF next_target > max_target THEN
        RETURN max_bits            ; limit on easiest target
    END IF
    RETURN target_to_bits(next_target)

Anmerkung 1: Die Referenzimplementierungsmittel finden vorzeichenbehaftete Ganzzahlarithmetik. Alternative Implementierungen können möglich vorzeichenlose Ganzzahlarithmetik verwendet.

Anmerkung 2: Bei allen Implementierungen sollte die Verwendung von Gleitkomma-Arithmetik bei der Berechnung des Exponenten strikt werden.

Anmerkung 3: Bei der Abrechnung des Exponenten muss, wie vom  trunc_divDivisionsoperator, der Abgabe der Ganzzahldivision [7, 10] verwendet werden, deren Ergebnis ein vorzeichenbehafteter Ganzzahlwert sein soll. Sprachen wie Python, bei denen die Standardverteilung die Unterteilung des Stockwerks verwendet wird, muss die eine Redewendung wie  int(a / b)die von  (a // b).

Anmerkung 4: Die ganzzahlige Potenz  xder Potenz von  ywird im Pseudocode durch die  pow(x, y)Funktion wird.

Anmerkung 5: Die Komfortfunktionen  bits_to_target()und  target_to_bits() sind davonbehindert, für die Umwandlung zwischen kompakten NBITS und vorzeichenlosem 256-Bit - Ganzzahl - Darstellung von Targets zur Verfügung stehen. Beispiele für Funktionsfunktionen sind in den C ++ - und Python3-Referenzimplementierungsfunktionen, die verfügbar sind.

Hinweis 6: Wenn ein Integer-Typ mit einer anderen Breite verwendet wird  next_targetshift_left kann dies zu einer Überlaufausnahme oder zum Stillen Verwerfen der beswerten Wertigen Bits erhalten. Implementieren Sie die Verantwortung für die Wahrnehmung der Wahrnehmung und des Verhaltens einer Kontrolle mit der Begrenzung der Breite. Dies Sie, dass, wenn das Ergebnis ein dieser Punkt ist,  radix * max_targetdann  max_bitskann sofort sofort werden.

Anmerkung 7: Die falscheete Polynomnäherung  factormuss mit einer 64-Bit-Ganzzahlarithmetik ohne Vorzeichen oder besser werden werden. Es  wird  eine signierte 64 - Bit - Integer - Überlauf. Da der Exponent vorzeichenbehaftet ist, muss er in einer vorzeichenlose 64-Bit-Ganzzahlzahl werden. In Sprachen wie Java, in denen lange immer signiert ist, muss eine vorzeichenlose Verschiebung  >>> 48verwendet werden, um durch 2 ^ 48 zu teilen.

REQ-ASERT-ACTIVATION (Aktivierungsmethode)

Der ASERT-negative MUSS mit dem Standard-Netzwerk-Upgrade-Mechanismus MTP (Median-Time-Past) [3] wird werden.

REQ-ASERT-ANCHOR-BLOCK (Ankerblock)

ASERT Wählen Sie die Auswahl eines Ankerblocks, um Ihre Zielberechnungen zu Ebenen.

Der erste Block mit einem MTP, der erste / gleich der Aktivierungszeit für das Upgrade ist, MUSS als Ankerblock für nachträgliche ASERT-Funktionen werden.

Dies bedeutet dem letzten Block, der von den DAA-Regeln vor ASERT abgebaut wurde.

Anmerkung 1: Der Ankerblock ist der Block, seine Höhe und Ziel (nBits) als 'absolute' Basis für das richtige Ziel von ASERT verwendet werden. Der Zeitstempel des  übergeordneten  Ankerblocks wird verwendet.

Hinweis 2: Die Höhe, das Zeitstempel und die nBits dieser Blöcke sind vor dem Upgrade nicht bekannt. Implementierungen MÜSSEN unterscheiden halb des Upgrades dynamisch Handlungen. Wenn das Netzwerk-Upgrade durch die Ketten-Kettenarbeit oder einen Prüfpunkt konsolidiert wurde, können Implementierungen einfach die eigene Höhe, nBits und den zugehörigen Zeitstempel dieses Ankerblocks fest codieren. Implementierungen KÖNNEN auch andere äquivalente Darstellungen hart codieren, z. B. einen nBits-Wert und einen Zeitversatz vom Genesis-Block.

REQ-ASERT-TESTNET-DIFF-RESET (Testnet-Schwierigkeits-Reset)

Im Testnetz MUSS eine andere Regel enthält sein: Jeder Block mit einem Zeitstempel, der mehr als 1200 Sekunden nach dem Zeitstempel Wadengabeneil liegt, MUSS einen nBits-Wert von  max_bits0x1d00ffff) wird.

REQ-ASERT-TESTNET-HALBLEBEN

Auf testnet MUSS ein  `halflifeWert von 3600 (Sekunden) verwendet werden.

REQ-ASERT-TESTNET-AKTIVIERUNG

Die Aktivierungsparameter für testnet MÜSSEN mit denen für mainnet Überwachungs sein.

Begründung und Kommentar zu berechtigten

1. Wahl der Aktivierungsmethode

Die neuen neuen Richtlinien auf die Grundlage des MTP-Krieges Die etablierte Methode für das Verwalten von Bitcoin-Cash-Upgrades, und es ist zu kaufen, dass alle Implementierungen über die Kontrolle, die einer möglichen Verwaltung.

Der Rest wurde der Upgrade-Zeitstempel für November bereits gehört. Wenn Sie auch ein anderes Aktivierungskriterium für die DAA-Regelung erhalten, können Sie Kettengabeln über die persönliche historische Kette verlassen, die sich aus dem eigenen Upgrade beziehen. Das widerstehende Gabeln ist heißthörendes.

2. Wahl der Ankerblockbestimmung

Die Auswahl eines Ankerblocks, der in der Vergangenheit weit genug reicht, der zu einer einfacheren Codierung gehören, die der Upgrade-Fähigkeit gehört.

Der letzte Block, der letzte der alten DAA wurde, wurde, wurde, der dieser Block der proximalen Anker ist und der Zugriffesten Übergang zum neuen Zugriff ermöglicht.

3. Vermeidung von Gleitkommaberekte

Die Rechte der Gleitkomma-Arithmetik nach IEEE-754 werden im Allgemeinen nicht durch Programmiersprachen abgelehnt, in denen eine neue DAA gegeben werden muss. Dies kann zu Gleitkommabereforderungsbefugnis, Die je nach Compiler, Dolmetscher oder Hardware-Leistungsbeispiele.

Es wird dazu gegeben, dass alle, die sich durch die Anzahl und die hochgesteuerte Operatoren betreffen, um sich, dass identische Schwierigkeitsziele für alle Implementierungen durchgesetzt werden.

4. Wahl der Halbwertszeit

Eine Halbwertszeit von 2 Tagen (  halflife = 2 * 24 * 3600), sterben Einer auf e ^ x basierenden Zeitkonstante von  2 * 144 * ln(2)oder aserti3-415.5 Entspricht, Wurde gewählt, Weil sie in Simulationen Eine nahezu optimale Leistung erzielt, INDEM sterben notwendigkeit des Pufferns gegen Statistisches Rauschen und sterben notwendigkeit von p Reagieren Sie schnell auf Preis- oder Hash-Schwelle und sind für die Menschen leicht zu verstehen: Alle zwei Tage vor dem Verlust wird der Zeitstempel eines Blocks verdoppelt so hoch.

5. Wahl des Approximationspolynoms

Die DAA ist Teil einer Rückkopplungsschleife des Steuersystems, die die Hashrate reguliert, und die Exponentialfunktion und ihre ganzzahlige Approximation umfassen ihre Übertragungsfunktion. Daher gelten Standardrichtlinien zur Gewährleistung der Stabilität des Steuerungssystems. Steuerungssysteme reagieren in ihren Übertragungsfunktionen tendenziell viel empfindlicher auf differentielle Nichtlinearität (DNL) als auf integrale Nichtlinearität (INL). Unsere Anforderungen waren eine Übertragungsfunktion, die (a) monoton war, (b) keine abrupten Änderungen enthielt, (c) eine Präzision und differentielle Nichtlinearität aufwies, die besser war als unser statistisches Grundrauschen mit mehreren Blöcken, (d) einfach zu implementieren war und (e) hatten eine integrale Nichtlinearität, die nicht schlechter war als unser statistisches Grundrauschen mit einem Block.

Es wurde gefunden, dass eine einfache, schnell zu berechnende kubische Näherung von 2 ^ x für 0 <= x <1 alle diese Anforderungen erfüllt. In diesem Bereich wird eine absolute Fehlerquote von unter 0,013% beibehalten [8]. Um die vollständige Domäne (-infinity, + unendlich) der Exponentialfunktion zu adressieren, haben wir festgestellt, dass die 2^(x + n) = 2^n * 2^xIdentität von Nutzen ist. Unsere kubische Approximation liefert die genau korrekten Werte f(0) == 1und f(1) == 2ermöglicht es uns, diese Identität ohne Rücksicht auf Diskontinuitäten an den Rändern der Approximationsdomäne zu verwenden.

Erstens gibt es das Problem der DNL. Unser Ziel war es sicherzustellen, dass unser Algorithmus nicht mehr als 25% so viel Rauschen hinzufügt, wie unserem Datensatz eigen ist. Unser Algorithmus versucht effektiv, die charakteristische Hashrate in der jüngeren Vergangenheit mithilfe einer Halbwertszeit von 2 Tagen (~ 288 Blöcke) abzuschätzen. Unsere erwartete exponentielle Verteilung der Blockintervalle hat eine Standardabweichung (stddev) von 600 Sekunden. Über eine Halbwertszeit von 2 Tagen sollte unser Grundrauschen in unserer geschätzten Hashrate etwa sqrt(1 / 288) * 600Sekunden oder 35,3 Sekunden betragen. Unsere gewählte Approximationsmethode kann in den meisten Fällen eine Genauigkeit von 3 Sekunden erreichen, die an zwei Stellen durch 16-Bit-Operationen begrenzt ist: 172800 sec / 65536 = 2.6367 sec Unsere Worst-Case-Genauigkeit beträgt 8 Sekunden und ist durch die Worst-Case-15-Bit-Genauigkeit des nBits-Werts begrenzt. Dieser 8-Sekunden-Worst-Case ist nicht Gegenstand dieser Arbeit, da eine Änderung des Block-Headers erforderlich wäre. Unsere Schrittgröße im ungünstigsten Fall beträgt 0,00305% [11], was auf das 15-Bit-n-Bit-Mantissenproblem im ungünstigsten Fall zurückzuführen ist. Außerhalb des 15-Bit-Mantissenbereichs von nBits weist unsere Näherung eine Worst-Case-Genauigkeit von 0,0021% auf. Insgesamt haben wir dies als zufriedenstellende DNL-Leistung angesehen.

Zweitens gibt es das Problem der INL. Simulationstests zeigten, dass die Schwierigkeit und die Leistung der Hash-Regelregulierung bemerkenswert unempfindlich gegenüber integraler Nichtlinearität waren. Wir fanden heraus, dass selbst die Verwendung f(x) = 1 + xals Annäherung 2^xan den aserti1Algorithmus in Verbindung mit dem zufriedenstellend war2^(x + n) = 2^n * 2^xIdentität, trotz 6% Worst-Case-INL. [12] [13] Eine Näherung mit schlechtem INL zeigt immer noch eine gute Fähigkeit zur Regulierung der Haschrate, weist jedoch für eine bestimmte Änderung der Haschrate eine unterschiedliche Drift auf, je nachdem, wo in der Domäne [0, 1) unser Exponent (Modulo 1) liegt. Mit einem INL von +/- 1% für eine bestimmte Schwierigkeit (oder ein bestimmtes Ziel) kann der Zeitstempel eines Blocks 1% von 172800 Sekunden vor oder hinter dem Zeitplan liegen. Aus Vorsicht und weil es einfach war, eine höhere Präzision zu erreichen, haben wir uns für eine INL entschieden, die mit der typischen Drift, die durch einen Block verursacht werden kann, vergleichbar oder geringer ist. Aus einem 2-Tage-Halbwertszeitfenster umfasst die Varianz eines Blocks: 600 / 172800 = 0.347% Die INL-Leistung unserer kubischen Näherung ist besser als 0,013% [14], was diese Anforderung deutlich übertrifft.

6. Umwandlung von Schwierigkeitsbits (nBits) in 256-Bit-Zieldarstellungen

Da es in ASERT nur wenige Berechnungen gibt, die 256-Bit-Ganzzahlen beinhalten und der Algorithmus selten ausgeführt wird, wurde es als unnötig angesehen, komplexere Operationen wie das direkte Rechnen mit den kompakten Zieldarstellungen (nBits) zu erfordern, die die Ein- / Ausgabe von sind Schwierigkeitsalgorithmus.

Darüber hinaus ist in der vorhandenen Implementierung eine 256-Bit- (oder sogar Bignum-) Arithmetik verfügbar, die in der vorherigen DAA verwendet wird. Leistungseinbußen sind vernachlässigbar.

7. Wahl der 16-Bit-Genauigkeit für die Festkomma-Mathematik

Das nBits-Format besteht aus 8 Bits des Exponenten base_256, gehört von einer 24-Bit-Mantisse. Die Mantisse muss einen Wert von weniger 0x008000 haben, war, war, dass das schlechteste Fall der Mantisse nur 15 Bit gehört gehört. Die Wahl der 16-Bit-Rechte in unserer Festkomma-Mathematik ist sicher, dass die Gesamtgenauigkeit durch diese 15-Bit-n-Bit-Grenze ist.

8. Wahl des Namens

Der festgelegte Name 'aserti3-2d' wurde ausgewählt:

  • Das 'i' sich auf die Nur-Ganzzahl-Arithmetik

  • Die '3' sich auf die kubische Approximation des Exponentials

  • Die '2d' Rechte sich auf die 2-Tageige (172800 Sekunden) Halbwertszeit

Implementierungsberatung

Implementierungen DÜRFEN ganze ihre erkennen KEINE Rundungsfehler machen. Die Rundung muss genau wie im Verantwortungsbereich beziehen. Um dies zu ändern, müssen Sie in der Praxis wahrgenommen werden Ganzzahlarithmetik verwendet.

Implementierungen, die vorzeichenbehaftete Ganzzahlen und Bitverschiebung werden, MÜSSEN verbessert, dass die Bitverschiebung arithmetisch ist.

Anmerkung 1: In C ++ - Compilern ist das Verschieben von Ganzzahlen mit negativen Vorzeichen nach rechts formal ein nicht spezstehes Verhalten, bis C ++ 20 zum Standard wird [5]. In der Praxis bezieht sich C / C ++ - Compiler übt eine arithmetische Bitverschiebung für vorzeichenbehaftete Zahlen. Implementierern wird gestellt, das gute Verhalten durch Zusicherungen zur Kompilierungszeit.

Referenzimplementierungen

Testvektoren

Testvektoren, die zur Validierung weiterer Implementierungen des aserti3-2d-verhaltens sind, sind verwendet unter:

https://gitlab.com/bitcoin-cash-node/bchn-sw/qa-assets/-/tree/master/test_vectors/aserti3-2d

und alternativ bei:

https://download.bitcoincashnode.org/misc/data/asert/test_vectors

Danksagung

Dank an Mark Lundeberg für die Erteilung der Berechtigung zur Überwachung des ASERT-Papiers [1], Jonathan Toomim für die Entwicklung der ersten Python- und C ++ - Implementierungen, die Aktualisierung der Simulationsframeworks [9] und die Bewertung der verschiedenen Schwierigkeitsalgorithmen.

Viele Dank an Jacob Eliosoff, Tom Harding und Scott Roberts für die Evaluierungsarbeiten und die Familien von EMA und andere Rechte, die als Ersatz für die Bitcoin Cash DAA gelten, und die folgenden Punkte für die Bewertung und die wertvollen Qualitätsvorteile:

  • Andrea Suisani (krankes Schwein)

  • BigBlockIfTrue

  • Fernando Pellicioni

  • imaginärer_Benutzername

  • mtrycz

  • Jochen Hoenicke

  • John Nieri (emergent_reasons)

  • Tom Zander

Verweise

[1] "  Statische Schwierigkeitsanpassungen mit absolut eigenen exponentiell steigenden Zielen (DA-ASERT) - v2  ", Mark B. Lundeberg, 31. Juli 2020

[2] "  BCH-Upgrade-Vorschlag: Ihre Sie ASERT als neue DAA  ", Jonathan Toomim, 8. Juli 2020

[3] Median Time Past wird im  bitcoin.it-Wiki erledigt  .

[4]  https://en.wikipedia.org/wiki/Arithmetic_shift

[5]  https://en.cppreference.com/w/cpp/language/operator_arithmetic

[6] "  Instabiler Durchsatz: Wenn der Schwierigkeitsalgorithmus bricht  ", Sam M. Werner, Dragos I. Ilie, Iain Stewart, William J. Knottenbelt, Juni 2020

[7] "  Verschiedene Arten der Ganzzahldivision  ", Harry Garrood, Blog, 2018

[8]  Fehler in einer kubischen Näherung von 2 ^ x für 0 <= x <1

[9] Jonathan Toomim Anpassung des Schwierigkeitsalgorithmus-Simulators von Kyuupichan:  https://github.com/jtoomim/difficulty/tree/comparator

[10] "  Die euklidische Definition der Funktionen div und mod  ", Raymond T. Boute, 1992, ACM-Rechte zu Programmiersprachen und -systemen (TOPLAS). 14. 127-144. 10.1145 / 128861.128862

[11]  http://toom.im/bch/aserti3_step_size.html

[12]  f (x) = (1 + x) / 2 ^ x für 0 <x <1  , WolframAlpha.

[13]  https://github.com/zawy12/difficulty-algorithms/issues/62#issuecomment-647060200

[14]  http://toom.im/bch/aserti3_approx_error.html

[15]  https://github.com/zawy12/difficulty-algorithms/issues/62#issuecomment-646187957

Lizenz

Diese Spezifikation ist unter den Creative Commons CC0 1.0 Universal- und GNU All-Permissive-Lizenzen doppelte lizenziert.

Sponsors of krise636
empty
empty
empty

2020-NOV-15 ASERT-Algorithmus zur Anpassung der Schwierigkeit (aserti3-2d)

Freetrader, Jonathan Toomim, Calin Culianu, Mark Lundeberg

Version 0.6, 2020-08-12


Zusammenfassung

Es wird vorgeschlagen, beim Upgrade im November 2020 einen neuen Algorithmus zur Anpassung des Schwierigkeitsgrads zu aktivieren, der als "aserti3-2d" (oder kurz "ASERT") für Bitcoin Cash bezeichnet wird. Die Aktivierung basiert auf MTP, wobei der letzte Vorgabelblock als Ankerblock verwendet wird.

Motivation

  • Um periodische Schwingungen in Schwierigkeit und Hashrate zu beseitigen

  • Verringerung des Rentabilitätsunterschieds zwischen Bergarbeitern und solchen, die auf den Abbau anderer Blockchains umsteigen.

  • Aufrechterhaltung durchschnittlicher Blockintervalle nahe dem 10-Minuten-Ziel.

  • Um die durchschnittliche Transaktionsbestätigungszeit nahe an die Zielzeit zu bringen.

Technischer Hintergrund

Die im November 2017 eingeführte DAA zeigte Anfälligkeit für eine tägliche periodische Schwierigkeitsschwingung, die sich direkt aus dem einfachen Design des Algorithmus mit gleitendem Durchschnitt ergibt. Die periodischen Schwierigkeitsschwankungen führten zu einem Anreiz für das Switch-Mining und zu einem nicht motivierten stetigen Hash-Mining.

Die Schwankungen in Schwierigkeit und Hashrate haben zu einem täglichen Muster langer Bestätigungszeiten geführt, gefolgt von Bursts schneller Blöcke. Die durchschnittliche Bestätigungszeit von Transaktionen wird erheblich erhöht, da nur wenige Transaktionen in den schnell abgebauten Blöcken enthalten sind.

Untersuchungen zur Familie der Schwierigkeitsalgorithmen auf der Grundlage eines exponentiellen gleitenden Durchschnitts (EMA) ergaben ASERT (Absolut Scheduled Exponential Rising Targets) [1], das 2019 von Mark Lundeberg entwickelt und 2020 von ihm gründlich beschrieben wurde, obwohl eine äquivalente Formel unabhängig in entdeckt wurde 2018 von Jacob Eliosoff und 2020 von Werner et. al [6].

ASERT weist die oben genannten Schwingungen nicht auf und weist eine Reihe anderer attraktiver Eigenschaften auf, wie z. B. Robustheit gegenüber Singularitäten [15], ohne dass zusätzliche Regeln erforderlich sind, und keine Akkumulation von Rundungs- / Approximationsfehlern.

In einer umfassenden Simulation gegen eine Reihe konkurrierender stabiler Algorithmen [2] zeigte ein ASERT-Algorithmus die beste Leistung über folgende Kriterien hinweg:

  • durchschnittliche Blockzeiten, die der idealen Zielzeit von 600 Sekunden am nächsten kommen

  • Durchschnittliche Transaktionsbestätigungszeit, die der Zielzeit am nächsten kommt

  • Verringerung des Vorteils nicht stetiger Bergbaustrategien, wodurch die relative Rentabilität des stetigen Bergbaus maximiert wird

Spezifikation

Bedingungen und Konventionen

Die Schlüsselwörter "MUSS", "MUSS NICHT", "ERFORDERLICH", "MUSS", "MUSS NICHT", "SOLLTE", "SOLLTE NICHT", "EMPFOHLEN", "MAI" und "OPTIONAL" in diesem Dokument lauten zu interpretieren wie in RFC 2119 beschrieben.

In mathematischen Formeln werden konventionell Operatoren wie +, -, /, * und ^ (Exponentiation) verwendet. Im Pseudocode kommt das Symbol ^ für die Potenzierung nur in Kommentaren vor. Die ganzzahlige Exponentiation wird im Pseudocode durch die pow(x, y)Funktion bezeichnet.

Der "Pre-Fork-Block" wird üblicherweise als Eltern des ersten Blocks betrachtet, der gemäß den neuen Konsensregeln abgebaut wurde. Der erste Block, der nach neuen Konsensregeln abgebaut wurde, wird als "Gabelblock" bezeichnet.

Bedarf

REQ-ASERT-TARGET-COMPUTATION (Zielberechnung)

Die 'Ziel'-Bits des nächsten Blocks MÜSSEN durch eine Implementierung des folgenden Algorithmus berechnet werden.

Die Höhe des 'Bewertungsblocks' MUSS größer oder gleich der Höhe des Ankerblocks sein.

Der aserti3-2dAlgorithmus versucht die folgende Berechnung zu implementieren:

next_target = old_target * 2^((time_delta - ideal_block_time * (height_delta + 1)) / halflife)

wobei die Bedeutung der Parameter / Variablen ist:

  • old_target ist das vorzeichenlose 256-Bit-Integer-Äquivalent des nBits-Werts im Header des Ankerblocks

  • time_delta ist die Differenz in vorzeichenbehafteten ganzzahligen Sekunden zwischen dem Zeitstempel im Header des Auswertungsblocks und dem Zeitstempel im übergeordneten Element des Ankerblocks

  • ideal_block_time ist eine Konstante: 600 (Sekunden), die die angestrebte durchschnittliche Zeit zwischen Blöcken darstellt

  • height_delta ist der Unterschied in der Blockhöhe zwischen dem Bewertungsblock und dem Ankerblock

  • halflife ist ein konstanter Parameter, der manchmal als "Tau" bezeichnet wird und im Mainnet einen Wert von 172800 (Sekunden) aufweist

  • next_target ist der ganzzahlige Wert des Ziels, der für den nächsten Block nach dem Bewertungsblock berechnet wurde.

Der folgende Algorithmus implementiert das Obige unter Verwendung einer Festkomma-Ganzzahlarithmetik und einer kubischen Polynomnäherung an den 2 ^ x-Term.

Die als Eingabe und Ausgabe verwendeten 'Ziel'-Werte sind die kompakten Darstellungen der tatsächlichen 256-Bit-Ganzzahlziele, wie für das Feld' nBits 'im Blockheader angegeben.

Pseudocode:

ALGORITHM aserti3-2d is
    INPUT:  anchor block height h_ref,       ; a block height (0, the genesis block height, is not permitted)
            anchor block parent time t_ref,  ; timestamp (nTime) of parent of anchor block
            anchor block bits b_ref,         ; 'nBits' value of anchor block
            evaluation block height h_eval,  ; height of block at which next target is to be evaluated
            evaluation block time t_eval     ; timestamp of block at which next target is to be evaluated
    OUTPUT: next block bits b_next           ; the 'target' nBits of the next block
    PRECONDITION:  (h_eval >= h_ref > 0) AND (0 < bits_to_target(b_ref) <= max_target)
    POSTCONDITION: (0 < bits_to_target(OUTPUT) <= max_target)
    CONSTANTS: ideal_block_time = 600  ; seconds
               halflife = 172800       ; 2 days (in seconds) on mainnet
               radix = 65536           ; pow(2, 16) , 16 bits for decimal part of fixed-point integer arithmetic
               max_bits = 486604799    ; maximum target in bits representation (0x1d00ffff)
               max_target = bits_to_target( max_bits )  ; maximum target as integer

    target_ref ← bits_to_target( b_ref )  ; convert anchor block nBits to integer
    time_delta ← t_eval - t_ref  ; can be negative
    height_delta ← h_eval - h_ref
    ; Use truncating division - see note 3 below
    exponent ← trunc_div(((time_delta - ideal_block_time * (height_delta + 1)) * radix), halflife)

    ; Compute equivalent of `num_shifts ← floor(exponent / 2^16)`
    num_shifts ← shift_right(exponent, 16)  ; must be arithmetic shift [4]
    exponent ← exponent - num_shifts * radix
    factor ← shift_right(   195766423245049 * exponent
                          + 971821376 * pow(exponent, 2)
                          + 5127 * pow(exponent, 3)
                          + pow(2, 47), 48) + 65536

    next_target ← target_ref * factor

    ; The following if-else construct is equivalent to `next_target ← floor(next_target * 2^factor)`
    IF num_shifts < 0 THEN
        next_target ← shift_right(next_target, -num_shifts)
    ELSE
        ; Implementations should be careful of overflow here (see note 6 below).
        next_target ← shift_left(next_target, num_shifts)
    END IF
    next_target ← shift_right(next_target, 16)

    IF next_target == 0 THEN
        RETURN target_to_bits(1)   ; hardest valid target
    END IF
    IF next_target > max_target THEN
        RETURN max_bits            ; limit on easiest target
    END IF
    RETURN target_to_bits(next_target)

Anmerkung 1: Die Referenzimplementierungsmittel finden vorzeichenbehaftete Ganzzahlarithmetik. Alternative Implementierungen können möglich vorzeichenlose Ganzzahlarithmetik verwendet.

Anmerkung 2: Bei allen Implementierungen sollte die Verwendung von Gleitkomma-Arithmetik bei der Berechnung des Exponenten strikt werden.

Anmerkung 3: Bei der Abrechnung des Exponenten muss, wie vom  trunc_divDivisionsoperator, der Abgabe der Ganzzahldivision [7, 10] verwendet werden, deren Ergebnis ein vorzeichenbehafteter Ganzzahlwert sein soll. Sprachen wie Python, bei denen die Standardverteilung die Unterteilung des Stockwerks verwendet wird, muss die eine Redewendung wie  int(a / b)die von  (a // b).

Anmerkung 4: Die ganzzahlige Potenz  xder Potenz von  ywird im Pseudocode durch die  pow(x, y)Funktion wird.

Anmerkung 5: Die Komfortfunktionen  bits_to_target()und  target_to_bits() sind davonbehindert, für die Umwandlung zwischen kompakten NBITS und vorzeichenlosem 256-Bit - Ganzzahl - Darstellung von Targets zur Verfügung stehen. Beispiele für Funktionsfunktionen sind in den C ++ - und Python3-Referenzimplementierungsfunktionen, die wissen sind.

Hinweis 6: Wenn ein Integer-Typ mit einer anderen Breite verwendet wird  next_targetshift_left kann dies zu einer Überlaufausnahme oder zum Stillen Verwerfen der beswerten Wertigen Bits erhalten werden. Implementieren Sie die Verantwortung für die Wahrnehmung der Wahrnehmung und des Verhaltens einer Kontrolle mit der Begrenzung der Breite. Dies Sie, dass, wenn das Ergebnis ein dieser Punkt ist,  radix * max_targetdann  max_bitskann sofort sofort werden.

Anmerkung 7: Die falsche polynomnäherung  factormuss mit einer 64-Bit-Ganzzahlarithmetik ohne Vorzeichen oder besser werden werden. Es  wird  eine signierte 64 - Bit - Integer - Überlauf. Da der Exponent vorzeichenbehaftet ist, muss er in einer vorzeichenlose 64-Bit-Ganzzahlzahl werden. In Sprachen wie Java, in denen lange immer signiert ist, muss eine vorzeichenlose Verschiebung  >>> 48verwendet werden, um durch 2 ^ 48 zu teilen.

REQ-ASERT-ACTIVATION (Aktivierungsmethode)

Der ASERT-negative MUSS mit dem Standard-Netzwerk-Upgrade-Mechanismus MTP (Median-Time-Past) [3] wird.

REQ-ASERT-ANCHOR-BLOCK (Ankerblock)

ASERT Wählen Sie die Auswahl eines Ankerblocks, um Ihre Zielberechnungen zu Interessen.

Der erste Block mit einem MTP, der erste / gleich der Aktivierungszeit für das Upgrade ist, MUSS als Ankerblock für nachträgliche ASERT-Funktionen werden.

Dies bedeutet dem letzten Block, der von den DAA-Regeln für ASERT abgebaut wurde.

Anmerkung 1: Der Ankerblock ist der Block, seine Höhe und Ziel als 'absolute' Basis für das richtige Ziel von ASERT verwendet werden. Der Zeitstempel des  übermäßigen  Ankerblocks wird verwendet.

Hinweis 2: Die Höhe, das Zeitstempel und die nBits dieser Blöcke sind vor dem Upgrade nicht bekannt. Implementierungen MÜSSEN unterscheiden halb des Upgrades dynamisch Handlungen. Wenn das Netzwerk-Upgrade durch die Ketten-Kettenarbeit oder einen Prüfpunkt konsolidiert wurde, können Implementierungen einfach die eigene Höhe, nBits und den zugehörigen Zeitstempel dieses Ankerblocks fest codieren. Implementierungen KÖNNEN auch andere äquivalente Darstellungen hart codieren, z. B. einen nBits-Wert und einen Zeitversatz vom Genesis-Block.

REQ-ASERT-TESTNET-DIFF-RESET (Testnet-Schwierigkeits-Reset)

Im Testnetz MUSS eine andere Regel enthält sein: Jeder Block mit einem Zeitstempel, der mehr als 1200 Sekunden nach dem Zeitstempel Wadengabeneil liegt, MUSS einen nBits-Wert von  max_bits0x1d00ffff) wird.

REQ-ASERT-TESTNET-HALBLEBEN

Auf testnet MUSS ein  `halflifeWert von 3600 (Sekunden) verwendet werden.

REQ-ASERT-TESTNET-AKTIVIERUNG

Die Aktivierungsparameter für testnet MÜSSEN mit denen für mainnet Überwachungs sein.

Begründung und Kommentar zu Berechtigten

1. Wahl der Aktivierungsmethode

Die neuen neuen Richtlinien auf die Grundlage des MTP-Krieges Die etablierte Methode für das Verwalten von Bitcoin-Cash-Upgrades, und es ist zu kaufen, dass alle Implementierungen über die Kontrolle, die einer Verwaltung.

Der Rest wurde der Upgrade-Zeitstempel für November bereits gehört. Wenn Sie auch ein anderes Aktivierungskriterium für die DAA-Regel erhalten haben, können Sie Kettengabeln über die persönliche historische Kette erhalten, die sich aus dem eigenen Upgrade erhalten. Das breitere Gesicht Gabeln ist heißthörendes.

2. Wahl der Ankerblockbestimmung

Die Auswahl eines Ankerblocks, der in der Vergangenheit weit genug reicht, der zu einer einfacheren Codierung gehört, die der Upgrade-gehört gehört.

Der letzte Block, der letzte der alten DAA wurde, wurde, wurde, der dieser Block der proximalen Anker ist und der Zugriffesten Übergang zum neuen Zugang ermöglicht.

3. Vermeidung von Gleitkommaberekte

Die Rechte der Gleitkomma-Arithmetik nach IEEE-754 werden im Allgemeinen nicht durch Programmiersprachenrechte, in denen eine neue DAA gegeben werden muss. Dies kann zu Gleitkommabereforderungsbefugnis, Die je nach Compiler, Dolmetscher oder Hardware-Leistungsbeispiele.

Es wird dazu gegeben, dass alle, die sich durch die Anzahl und die hochgesteuerte Operatoren betreffen, um sich, dass identische Schwierigkeitsziele für alle Implementierungen durch festgelegt werden.

4. Wahl der Halbwertszeit

Eine Halbwertszeit von 2 Tagen (  halflife = 2 * 24 * 3600), sterben Einer auf e ^ x basierende Zeitkonstante von  2 * 144 * ln(2)oder aserti3-415.5 Sie schnell auf Preis- oder Hash-Schwelle und sind für die Menschen leicht zu verstehen: Alle zwei Tage vor dem Verlust wird der Zeitstempel eines Blocks verdoppelt so hoch.

5. Wahl des Approximationspolynoms

Die DAA ist Teil einer Rückkopplungsschleife des Steuersystems, die Hashratzahl und die Exponentialfunktion und ihre ganzzahlige Annäherung an ihre Verbindungsungsfunktion. Daher gelten Standard Richtlinien zur Gewährleistung der Steuerungen. Steuerliche Regelungsbefugnisse in ihren nicht wahrheitsbezogenen Nichtlinearität (DNL) als auf integrale Nichtlinearität (INL). Unsere Rechte waren eine falsche Lungenfunktion, die (a) Monotonenkrieg, (b) keine abrupten Rechte, (c) eine Präzision und differentielle Nichtlinearität aufwies, die besser als unser statistisches Grundrauschen mit verschiedenen Blöcken, (d) einfach zu fähigen Krieg und (e) hatte eine integrale Nichtlinearität,

Es wurde gefunden, dass eine einfache, schnell zu gegebene kubische Näherung von 2 ^ x für 0 <= x <1 alle diese gehört gehört. In diesem Bereich wird eine absolute Fehlerquote von unter 0,013% Handlungen [8]. Um die tatsächliche Domäne (-infinity, + unendlich) der Exponentialfunktion zu adressieren, haben wir wissen, dass die  2^(x + n) = 2^n * 2^xIdentität von Nutzen ist. Unsere kubische Approximation wird die genau korrigierten Werte  f(0) == 1und  f(1) == 2ermöglicht es uns, diese Identität ohne Rücksicht auf Diskontinuitäten und den Ränder der Approximationsdomäne zu gehören.

Geben gibt es das Problem der DNL. Unser Ziel war es verwandt, dass unser Zugriff nicht mehr als 25% so viel Rauschen hin gehört, wie unser eigener Eigen ist. Unser wahrnehmungsbedingter Einfluss, die charakteristische Hashrate in der Rechtsgeschichte einer Halbwertszeit von 2 Tagen. Unsere erwartete exponentielle Verteilung der Blockintervalle hat eine Standardabweichung (stddev) von 600 Sekunden. Über eine Halbwertszeit von 2 Tagen wurde unser Grundrauschen in unserer Kontrolle Hashrate etwa  sqrt(1 / 288) * 600zweite oder 35,3 Sekunden gehört. Unsere gewählte Auswahl Approximationsmethode kann in den meisten Fällen eine bestimmte von 3 zweite Rechte, die zwei Stellen durch 16-Bit-Operationen ist: 172800 sec / 65536 = 2.6367 sec Unsere Worst-Case-Verantwortlichen 8 Sekunden und ist durch die Worst-Case-15-Bit-Verwandte des nBits-Werts gehört. Dieser 8-Sekunden-Worst-Fall ist nicht Gegenstand dieser Arbeit, da eine Regel des Block-Headers verwendet wird. Unsere Schrittstellung im ungünstigsten Fall wird 0,00305% [11], war auf das 15-Bit-n-Bit-Mantissen-Problem im ungünstigsten Fall. Außerhalb des 15-Bit-Mantissenbereichs von nBits weist unsere Näherung eine Worst-Case-Anzahl von 0,0021% auf. Müssen haben wir dies als zufriedenstellende DNL-Leistung wissen.

Geben gibt es das Problem der INL. Simulationsstests, die die Berechtigung und die Leistung der Hash-Regelregulierung betreffen, die nichtlinearität waren. Wir haben herausgefordert, dass selbst die Verwendung  f(x) = 1 + xals Annäherung  2^xan den  aserti1Kontakt in dem Verbindungsstellend Krieg2^(x + n) = 2^n * 2^xIdentität, trotz 6% Worst-Case-INL. [12] [13] Eine Näherung mit schlechtem INL zeigt immer noch eine gute Fähigkeit zur Beurteilung der Haschrate Modulo 1) liegt. Mit einem INL von +/- 1% für eine bestimmte Entscheidung kann der Zeitstempel eines Blocks 1% von 172800 Sekunden vor oder hinter dem Zustand liegen. Aus Vorsicht und weil es einfach Krieg ist, eine höhere Präzision zu haben, haben wir uns für eine INL verloren, die mit der anderen Drift, die durch einen Block verursacht werden kann, wird oder gehört ist. Aus einem 2-Tage-Halbwertszeitfenster geschlossen die Varianz eines Blocks:  600 / 172800 = 0.347% Die INL-Leistung unserer kubischen Näherung ist besser als 0,013% [14].

6. Besetzung von Schwierigkeitsbits (nBits) in 256-Bit-Zieldarstellungen

Da es in ASERT gibt, werden die Ein- / Ausgabe von sind Schwierigkeitsalgorithmus.

Dies ist der Grund, warum eine 256-Bit- (oder sogar Bignum-) Arithmetik verwendet wird. Leistungseinbußen sind sitzenigbar.

7. Wahl der 16-Bit-Versprechungen für die Festkomma-Mathematik

Das nBits-Format besteht aus 8 Bits des Exponenten base_256, gehört von einer 24-Bit-Mantisse. Die Mantisse muss einen Wert von weniger 0x008000 haben, Krieg, Krieg, dass das schlechteste Fall der Mantisse nur 15 Bit gehört gehört. Die Wahl der 16-Bit-Rechte in unserer Festkomma-Mathematik ist sicher, dass die Gesamtgenauigkeit durch diese 15-Bit-n-Bit-Grenze ist.

8. Wahl des Namens

Der engagegte Name 'aserti3-2d' wurde bearbeitet:

  • Das 'i' sich auf die Nur-Ganzzahl-Arithmetik

  • Die '3' sich auf die kubische Approximation des Exponentials

  • Die '2d' Rechte sich auf die 2-Tageige Halbwertszeit

Implementierungsberatung

Implementierungen DÜRFEN ganze ihre erkennen KEINE Rundungsfehler machen. Die Rundung muss genau wie im Verantwortungsbereich beziehen. Um dies zu ändern, müssen Sie in der Praxis werden Ganzzahlarithmetik verwendet.

Implementierungen, die vorzeichenbehaftete Ganzzahlen und Bitverschiebung werden, MÜSSEN verbessert, dass die Bitverschiebung arithmetisch ist.

Anmerkung 1: In C ++ - Compilern ist das Verschieben von Ganzzahlen mit negativen Vorzeichen nach rechts formal ein nicht spezstehes Verhalten, bis C ++ 20 zum Standard wird [5]. In der Praxis befindet sich C / C ++ - Compiler übt eine arithmetische Bitverschiebung für vorzeichenbehaftete Zahlen. Implementierern wird gestellt, das gute Verhalten durch Zusicherungen zur Kompilierungszeit.

Referenzimplementierungen

Testvektoren

Testvektoren, die zur Validierung weiterer Implementierungen des aserti3-2d-Verhaltens sind, sind verwendet unter:

https://gitlab.com/bitcoin-cash-node/bchn-sw/qa-assets/-/tree/master/test_vectors/aserti3-2d

und alternativ bei:

https://download.bitcoincashnode.org/misc/data/asert/test_vectors

Danksagung

Dank an Mark Lundeberg für die Erteilung der Berechtigung zur Überwachung des ASERT-Papiers [1], Jonathan Toomim für die Entwicklung der ersten Python- und C ++ - Implementierungen, die Aktualisierung der Simulationsframeworks [9] und die Bewertung der verschiedenen Schwierigkeitsalgorithmen.

Viele Dank an Jacob Eliosoff, Tom Harding und Scott Roberts für die Evaluierungsarbeiten und die Familien von EMA und andere Rechte, die als Ersatz für die Bitcoin-Bargeld-DAA und die Bewertungen für die Bewertungen und die wertvollen Qualitätsvorteile:

  • Andrea Suisani (krankes Schwein)

  • BigBlockIfTrue

  • Fernando Pellicioni

  • imaginärer_Benutzername

  • mtrycz

  • Jochen Hoenicke

  • John Nieri (emergent_reasons)

  • Tom Zander

Verweise

[1] "  Statische Schwierigkeitsanpassungen mit absolut eigenen exponentiell steigenden Zielen (DA-ASERT) - v2  ", Mark B. Lundeberg, 31. Juli 2020

[2] "  BCH-Upgrade-Vorschlag: Ihre Sie ASERT als neue DAA  ", Jonathan Toomim, 8. Juli 2020

[3] Median Time Past wird im  bitcoin.it-Wiki erledigt  .

[4]  https://en.wikipedia.org/wiki/Arithmetic_shift

[5]  https://en.cppreference.com/w/cpp/language/operator_arithmetic

[6] "  Instabiler Durchsatz: Wenn der Schwierigkeitsalgorithmus bricht  ", Sam M. Werner, Dragos I. Ilie, Iain Stewart, William J. Knottenbelt, Juni 2020

[7] "  Verschiedene Arten der Ganzzahldivision  ", Harry Garrood, Blog, 2018

[8]  Fehler in einer kubischen Näherung von 2 ^ x für 0 <= x <1

[9] Jonathan Toomim Anpassung des Schwierigkeitsalgorithmus-Simulators von Kyuupichan:  https://github.com/jtoomim/difficulty/tree/comparator

[10] "  Die euklidische Definition der Funktionen div und mod  ", Raymond T. Boute, 1992, ACM-Rechte zu Programmiersprachen und -systemen (TOPLAS). 14. 127-144. 10.1145 / 128861.128862

[11]  http://toom.im/bch/aserti3_step_size.html

[12]  f (x) = (1 + x) / 2 ^ x für 0 <x <1  , WolframAlpha.

[13]  https://github.com/zawy12/difficulty-algorithms/issues/62#issuecomment-647060200

[14]  http://toom.im/bch/aserti3_approx_error.html

[15]  https://github.com/zawy12/difficulty-algorithms/issues/62#issuecomment-646187957

Lizenz

Diese Spezifikation ist unter den Creative Commons CC0 1.0 Universal- und GNU All-Permissive-Lizenzen doppelte lizenziert.

2
$ 0.00
Avatar for krise636
3 years ago