Es müssten ganz genau 20999999,9769 sein, aber das spricht sich so schlecht.
Mal ganz davon abgesehen, dass geschätzt 3-6 Mio. BTC sowieso für immer verloren sind (Private Key vergessen etc.), was die Gesamtmenge eh deutlich auf unter 21 Mio. bringt.
So wie ich das verstehe prüft die Funktion MoneyRange, ob 0 ≤ nValue ≤ 21000000 gilt. Wann bzw. auf welche Argumente wird diese Funktion denn zur Prüfung während der Laufzeit angewendet? Das konnte ich aus dem Kommentar nicht wirklich herauslesen.
Funktion GetBlockSubsidy
Die Funktion GetBlockSubsidy bekommt die Blockhöhe und die Consenus Parameter, und spuckt die aktuelle Subsidy aus. (für den Code einfach ins Profil von @satoshi schauen )
Alle 210000 Blöcke soll die Subsidy halbiert werden. Deshalb wird in GetBlockSubsidy zuerst die Anzahl der Halvings berechnet. Anschließend werden alle Bits in der Ursprungssubsidy von 5e+9 sat durch einen Rightshift Operator um die Anzahl der Halvings nach rechts verschoben, so dass die Subsidy dementsprechend oft halbiert wird.
Haben bereits ≥ 64 Halvings stattgefunden wird der Ausgabewert der Funktion direkt auf 0 gesetzt.
Allerdings wird die Subsidy beim 33. Halving im Jahr 2140 auf einen Wert < 1 sat halbiert. Nach 33 Rightshifts müsste Subsidy dann also schon exakt 0 sein. Warum gibt es dann die Bedingung mit den 64 Halvings?