哪些 Rust 数据结构是不确定的

Posted

技术标签:

【中文标题】哪些 Rust 数据结构是不确定的【英文标题】:Which Rust data structures are non deterministic 【发布时间】:2020-09-15 20:17:24 【问题描述】:

在编写智能合约时,确保使用的所有数据结构都是确定性的很重要。

具体来说,如果使用 HashMapHashSet - 是否存在来自 Rust 标准库的可能的不确定性?

【问题讨论】:

【参考方案1】:

由于 Wasm 运行时无法访问非确定性输入,因此整个执行是确定性的。 HashSetHashMap 使用来自可用源的种子,如果 Wasm 编译没有可用源,则执行将始终相同。应该很容易确认。

【讨论】:

请记住,WASI 有random_get,并且 WASI 和 emscripten 都有 I/O 操作。在针对这些平台时,Rust 的 std 默认使用非 det 哈希。因此,除非您使用 wasm32-unknown-unknown 目标,否则默认情况下您的 HashMaps 仍然是 non-det。【参考方案2】:

补充一下@evgeny-kuzyakov 所说的,不确定性的唯一来源是操作系统级别的功能,如线程、时钟、操作系统随机性、网络、设备、文件系统等。如果使用代码编译合约尝试访问这些功能的它将不会在我们的区块链上执行(尽管可以部署它,因为可以将任何字节序列部署为合约)并且在执行开始之前会失败并出现错误。

【讨论】:

以上是关于哪些 Rust 数据结构是不确定的的主要内容,如果未能解决你的问题,请参考以下文章

rust的常见整数类型

Rust—数据类型

Rust 是不是将添加到向量中的单个项目装箱?

使用数据库、php、js 确定餐厅现在是不是营业(就像 yelp 一样)

23.Rust-集合(Collections)

Rust 中带括号的结构与双括号