View Tags
Ein Byte, das das Durchsuchen in der Wallet deutlich beschleunigt
Seit August 2022 (Hard Fork v15) trägt jeder Output 1 Byte – den View Tag = das erste Byte von Keccak("view_tag" ‖ 8rA ‖ i). Die Wallet vergleicht zuerst dieses Byte und macht nur bei einer Übereinstimmung (≈1 von 256) die teure Prüfung. Das Durchsuchen wird etwa 40 % schneller.
Das Problem
Um zu prüfen, ob ein Output uns gehört, macht die Wallet zwei teure Operationen: 8·a·R (eine pro Transaktion) und Hs(…)·G + B (eine für jeden Output). Letztere – eine Multiplikation mit dem Basispunkt plus eine Addition – macht einen spürbaren Teil der Synchronisationszeit aus. Und in 99,99 % der Fälle lautet die Antwort „nicht unserer“.
Die Lösung
Der Sender legt dieses Byte neben den Output. Der Empfänger berechnet, nachdem er das gemeinsame Geheimnis 8·a·R berechnet hat, denselben Hash (billig: ein Hash, keine Kurvenoperation) und vergleicht das Byte. Keine Übereinstimmung – der Output ist sicher nicht unserer, Schluss. Übereinstimmung – volle Prüfung (in 1/256 der Fälle stellt sie sich als Zufall heraus).
Der Preis
Ein zusätzliches Byte pro Output. Die Privatsphäre leidet kaum: Der View Tag wird aus dem gemeinsamen Geheimnis berechnet, das nur Sender und Empfänger kennen, für Außenstehende ist er also ein zufälliges Byte. Das einzige Leck betrifft jemanden, der den View Key kennt (z. B. ein Light-Wallet-Server): Der Hash erlaubt ihm, fremde Outputs zu verwerfen – aber das könnte er ohnehin.
In Carrot wächst der View Tag auf 3 Bytes, und der Schlüsselaustausch wechselt zu X25519 – das Durchsuchen wird noch schneller, und Fehltreffer werden ~65.000-mal seltener.