在编写智能合约时,确保使用的所有数据结构都是确定性的,这一点很重要。
具体来说,如果HashMap
或被HashSet
使用 - 是否存在来自 Rust 标准库的可能的非确定性?
在编写智能合约时,确保使用的所有数据结构都是确定性的,这一点很重要。
具体来说,如果HashMap
或被HashSet
使用 - 是否存在来自 Rust 标准库的可能的非确定性?
由于 Wasm 运行时无法访问非确定性输入,因此整个执行是确定性的。HashSet
并HashMap
使用可用源中的种子,如果 Wasm 编译没有可用源,则执行将始终相同。应该很容易确认。
补充一下@evgeny-kuzyakov 所说的,不确定性的唯一来源是操作系统级别的功能,如线程、时钟、操作系统随机性、网络、设备、文件系统等。如果合约是用试图访问这些功能,它将不会在我们的区块链上执行(尽管可以部署它,因为可以将任何字节序列部署为合约),并且在执行开始之前将失败并出现错误。