技术 › 谁收到了?
View tag
让钱包扫描大幅提速的一个字节
简而言之
自 2022 年 8 月(v15 硬分叉)起,每个输出都附带 1 个字节——view tag(查看标签)= Keccak("view_tag" ‖ 8rA ‖ i) 的第一个字节。钱包先比较这个字节,只有匹配时(约 1/256 的概率)才进行昂贵的检查。扫描速度提升约 40%。
问题所在
要检查一个输出是否属于自己,钱包需要做两项昂贵的运算:8·a·R(每笔交易一次)和 Hs(…)·G + B(每个输出一次)。后者——一次基点乘法加一次加法——在同步时间中占相当比重。而 99.99% 的情况下,答案都是“不是我的”。
解决方案
view_tag = Keccak256( "view_tag" ‖ 8·r·A ‖ i )[0]
发送方把这个字节放在输出旁边。接收方算出共享秘密 8·a·R 后,计算同样的哈希(很便宜:只是一次哈希,不是曲线运算),然后比较这个字节。不匹配——这个输出肯定不是我们的,停止。匹配——再做完整检查(其中 1/256 的情况会是巧合)。
代价
每个输出多一个字节。隐私几乎不受影响:view tag 由只有发送方和接收方知道的共享秘密算出,对外人来说它只是一个随机字节。唯一的泄露对象是知道查看私钥的人(例如轻钱包服务器):这个哈希让它能排除别人的输出——但它本来就能做到这一点。
在 Carrot 中
在 Carrot 中,view tag 增加到 3 个字节,密钥交换改用 X25519——扫描更快,误报的概率降低约 65,000 倍。