Bitcoin GetBlockWork()-Funktion

Die Implementierung von GetBlockWork()in der Quelle von Bitcoin v0.9.3 ( https://github.com/bitcoin/bitcoin/blob/v0.9.3/src/main.h#L815-L822 ) erscheint mir seltsam. Der Code ist der Einfachheit halber unten angegeben.

CBigNum GetBlockWork() const
{
    CBigNum bnTarget;
    bnTarget.SetCompact(nBits);
    if (bnTarget <= 0)
        return 0;
    return (CBigNum(1)<<256) / (bnTarget+1);
}
  1. Warum das +1 im Nenner?
  2. Und sollte der Zähler nicht die maximal mögliche 256-Bit-Ganzzahl sein, anstatt 2^256?

Als Umsetzung würde ich folgendes erwarten:

CBigNum GetBlockWork() const
{
    CBigNum bnTarget;
    bnTarget.SetCompact(nBits);
    if (bnTarget <= 0)
        return 0;
    CBigNum bnMax;
    bnMax.SetHex("0xFFFFFFFFFFFFFFFF"); // Max 256 bit int
    return (bnMax / bnTarget);
}

Antworten (1)

Dies scheint eine Funktion zu sein, um die durchschnittliche Anzahl von Hashes zu berechnen, die zum Generieren eines bestimmten Blocks benötigt werden. (Dies unterscheidet sich von der Schwierigkeit.)

Ich finde diese Funktion richtig. Um zu erklären, warum, stellen Sie sich vor, dass Bitcoin 4-Bit-Hashes anstelle von 256-Bit-Hashes verwendet hat. Dies würde den Bereich der möglichen Werte auf 0 bis 15 erweitern.

Wenn das Ziel 15 wäre, würde das bedeuten, dass jeder Hash gültig wäre. Daher sollte es durchschnittlich 1 Hash dauern, um einen gültigen Arbeitsnachweis zu finden:

= (maximum possible hash + 1) / (target + 1)
= (15 + 1) / (15 + 1)
= 1

Wenn das Ziel 7 wäre, würde dies bedeuten, dass die Hälfte der Hashes gültig wäre. Daher sollte es im Durchschnitt 2 Hashes dauern, um einen gültigen Arbeitsnachweis zu finden:

= (maximum possible hash + 1) / (target + 1)
= (15 + 1) / (7 + 1)
= 2

Denken Sie daran, dass ein Arbeitsnachweis gültig ist, wenn er kleiner oder gleich dem Zielwert ist. Siehe auch CheckProofOfWork().

Ob das irgendwo verwendet wird, kann ich nicht sagen. Diese Funktion scheint in der neusten Version entfernt worden zu sein.

Das +1 im Nenner liegt also im Grunde daran, dass es target+1Werte gibt, die kleiner oder gleich dem Zielwert sind, was Sinn macht. Und der Zähler ist `1+maxtarget', weil es 1+maxtarget-Werte gibt, die kleiner oder gleich dem maximalen Ziel sind. Damit ist es geklärt, danke!
Hallo, also schließlich, basierend auf den neuesten Litecoin-Quellen, wie kann man codieren, um den Genesis-Block tatsächlich abzubauen? Dies basiert beispielsweise auf der Litecoin-Quelle der Version 0.8. pastebin.com/du2XdxCC Wie sollte davon geändert werden? Danke.