最近有人在我的 SolVantityCL 的项目里提了一个 Issue,说了一个很有意思的问题:某字符串在分别作为前缀和后缀时,找到满足要求的地址耗费的时间是不一样的,差距还很大。我一开始没太把这个问题当一回事,只是简单回复了一下他,说这个是算法的问题,因为 Solana 即使私钥连续递增,但公钥的变化仍然是无序的,因此按照概率去预估耗费的时间可能会有误差。但是他又回复说他使用 Solana 的官方 Keygen 命令发现同样的字符串在前缀和后缀的难易程度的差距并没有使用我的工具表现的差距这么大。这就有很有意思了,也引起了我的兴趣。所以我专门花了点时间研究了一下这个问题的背后原因。因为我很确认,我使用的 ED25519 密钥生成的算法是正确的,不然的话公钥也不会和 Solana 的 Cli 算出相同的结果了。正因如此,这才是我感觉到奇怪的地方。所以我去翻了一下 Solana-Keygen 的源码,有收获,但和我预想的并不一样。我以为是它的随机数种子获取的方式的和我不一样,但查看之后我发现它用的仍然是从系统的随机数种子取的字节(rand_os::OsRng);不过我发现它还额外包括了剪枝操作。这个操作本身是在用户指定某些前缀的情况下,在匹配前缀前,就过滤掉某些非法的地址。这样能稍微省略掉一些前缀 / 后缀模式匹配的时间。但是,这仍然无法省略掉通过私钥派生出公钥的过程。举个例子:当用户
...
继续阅读
(6)