Bitcoin Core #36535 summiert das Paketgewicht in int64_t und schließt einen 32-Bit-Überlauf
Bitcoin Core hat am 16. Oktober 2026 den Pull Request #36535 „policy: sum package weight in int64_t“ übernommen. Er ändert eine Zeile in IsWellFormedPackage, der Funktion, die ein Transaktionspaket als package-too-large abweist, wenn sein Gesamtgewicht MAX_PACKAGE_WEIGHT überschreitet.
Der Fehler. Die Funktion addiert die Gewichte der Transaktionen eines Pakets mit std::accumulate und beginnt dabei mit einer schlichten 0. Wie ein früherer Pull Request zum selben Problem erläutert, übernimmt std::accumulate den Typ des Akkumulators vom Startwert; die laufende Summe war also ein int, und das 64-Bit-Ergebnis jeder Addition wurde bei jedem Schritt wieder auf 32 Bit verkürzt. Ein Paket mit einem tatsächlichen Gesamtgewicht über INT_MAX würde deshalb auf einen kleinen oder negativen Wert überlaufen und die Gewichtsprüfung bestehen. Laut dem früheren Pull Request ist dies die einzige Stelle, an der MAX_PACKAGE_WEIGHT durchgesetzt wird; die beiden benachbarten Summen für Gewicht und Gebühren auf dem Annahmepfad für Pakete beginnen bereits mit einem 64-Bit-Wert.
Die Korrektur. Die Summe startet jetzt mit int64_t{0}, so wie es die Summe der virtuellen Größen in validation.cpp schon tut. Der Autor, fametrano, hat die Ein-Zeilen-Änderung aus #35473 übernommen, der mit einer entsprechenden Einladung geschlossen worden war. Einen Test gibt es nicht, weil der in #35473 vorgeschlagene abgelehnt worden war. Stattdessen beschreibt der Autor eine lokale Wegwerf-Prüfung: Eine Transaktion mit 88 Millionen Gewichtseinheiten wird 25-mal in ein Paket gelegt. Vor der Korrektur wurde das Paket als package-contains-duplicates abgewiesen, danach als package-too-large.

Wie ernst das war. Beide Pull Requests stufen die Auswirkungen als begrenzt und rein richtlinienbezogen ein, nicht als Konsensproblem. Der Autor von #36535 hält fest, dass ein so großes Paket die Prüfung heute nicht erreicht: RPC-Anfragen sind auf 32 MiB, P2P-Nachrichten auf 4 MB begrenzt; die Änderung ist also eine zusätzliche Absicherung. #35473 ergänzt, dass übergroße Transaktionen ohnehin einzeln von den später laufenden Gewichts- und Standardprüfungen abgewiesen worden wären; der Effekt hätte nur darin bestanden, dass die frühe Abweisung auf Paketebene ausbleibt und der Knoten mehr Arbeit leistet, bevor er das Paket ablehnt. Als Weg zur Prüfung nannte er den RPC submitpackage.
Am selben Tag übernommen. #35724 verbessert die Protokollierung beim Wiederaufbau von Compact Blocks: Mit debuglevel=trace werden alle fehlenden Transaktionen eines empfangenen cmpctblock und alle beim Knoten angefragten fehlenden Transaktionen erfasst; außerdem protokolliert der Knoten Größen und Anzahl der Transaktionen aus dem Prefill, dem Mempool und dem Extra-Pool sowie überflüssige Transaktionen im Prefill-Abschnitt. Die Änderung wurde aus einer größeren Reihe zum Prefilling von Compact Blocks herausgelöst.
Quelle: bitcoin/bitcoin, Pull Request #36535 — https://github.com/bitcoin/bitcoin/pull/36535 ; frühere Diskussion: https://github.com/bitcoin/bitcoin/pull/35473