【发布时间】:2020-09-15 20:17:24
【问题描述】:
在编写智能合约时,确保使用的所有数据结构都是确定性的很重要。
具体来说,如果使用 HashMap 或 HashSet - 是否存在来自 Rust 标准库的可能的不确定性?
【问题讨论】:
标签: rust nearprotocol
在编写智能合约时,确保使用的所有数据结构都是确定性的很重要。
具体来说,如果使用 HashMap 或 HashSet - 是否存在来自 Rust 标准库的可能的不确定性?
【问题讨论】:
标签: rust nearprotocol
由于 Wasm 运行时无法访问非确定性输入,因此整个执行是确定性的。 HashSet 和 HashMap 使用来自可用源的种子,如果 Wasm 编译没有可用源,则执行将始终相同。应该很容易确认。
【讨论】:
random_get,并且 WASI 和 emscripten 都有 I/O 操作。在针对这些平台时,Rust 的 std 默认使用非 det 哈希。因此,除非您使用 wasm32-unknown-unknown 目标,否则默认情况下您的 HashMaps 仍然是 non-det。
补充一下@evgeny-kuzyakov 所说的,不确定性的唯一来源是操作系统级别的功能,如线程、时钟、操作系统随机性、网络、设备、文件系统等。如果使用代码编译合约尝试访问这些功能的它将不会在我们的区块链上执行(尽管可以部署它,因为可以将任何字节序列部署为合约)并且在执行开始之前会失败并出现错误。
【讨论】: