写智能合约时,确保使用的所有数据结构都是确定性的非常重要。
具体而言,如果使用了HashMap或HashSet,是否可能存在来自Rust标准库的不确定性?
具体而言,如果使用了HashMap或HashSet,是否可能存在来自Rust标准库的不确定性?
由于Wasm运行时没有访问非确定性输入的权限,因此整个执行过程是确定性的。HashSet
和HashMap
使用可用来源的种子,如果在Wasm编译过程中不存在可用来源,则执行结果始终相同。这应该很容易确认。
除了@evgeny-kuzyakov所说的内容外,唯一的非确定性来源是操作系统级别的特性,比如线程、时钟、操作系统随机性、网络、设备、文件系统等。如果合约编译的代码试图访问这些功能,则不会在我们的区块链上执行(虽然可以部署它,因为可以将任何字节序列部署为合约),并且在执行开始之前就会失败并显示错误。
random_get
,并且 WASI 和 emscripten 都具有 I/O 操作。当针对这些平台时,Rust 的 std 默认使用非确定性哈希值。因此,除非您使用wasm32-unknown-unknown
目标,否则您的HashMap
仍将默认为非确定性。 - sinan