区块随机 seed 的生成
警告
此信息在撰写时是最新的。它可能会在任何网络升级时发生变化。
偶尔,在TON上会创建一个彩票合约。通常它使用不安全的方法来处理随机性,因此生成的值可以被用户预测,彩票可能被耗尽。
但是,利用随机数生成中的弱点通常涉及使用代理合约,如果随机值正确,代理合约会转发消息。存在有关钱包合约的提案,这些合约将能够执行链上任意代码(当然由用户指定和签名),但大多数流行的钱包版本不支持这样做。那么,如果彩票检查赌徒是否通过钱包合约参与,它是否安全?
或者,这个问题可以这样表述。外部消息能否被包含在随机值正好符合发送者需求的区块中?
当然,发送者无法以任何方式影响随机性。但是生成区块并包含提议的外部消息的验证者可以。
验证者如何影响seed
即使在白皮书中,关于这一点的信息也不多,所以大多数开发者都感到困惑。这是关于区块随机的唯一提及,在 TON白皮书 中:
为每个分片(w, s) 选择验证者任务组的算法是确定性伪随机的。它使用验证者嵌入到每个主链区块中的伪随机数(通过使用阈值签名达成共识)来创建随机seed,然后为每个验证者计算例如Hash(code(w). code(s).validator_id.rand_seed)。
然而,唯一被保证真实且最新的是代码。所以让我们看看 collator.cpp:
{
// generate rand seed
prng::rand_gen().strong_rand_bytes(rand_seed->data(), 32);
LOG(DEBUG) << "block random seed set to " << rand_seed->to_hex();
}