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