Borsh 安全高效的二进制序列化Rust 开发者大会 安全高效的二进制序列化 Daniel Wang @ NEAR Borsh • 运行、编码效率 • 确定性 • 跨平台兼容性 二进制序列化的问题 Binary Object Representation Serializer for Hashing • 字节级别确定性 • 执行速度快 Borsh • 轻量级 • 每一个对象与其二进制表示之间都存在一个双射映射 • 不同的对象的二进制表示一定不同 • 便于基于二进制表示进行 Hash 字节级别确定性 • 在 Rust 中, borsh 并没有使用 serde • 全部逻辑原生实现 • 序列化、反序列化速度大幅领先其他解决方案 执行速度 执行速度 benchmark 执行速度 benchmark 执行速度 benchmark 执行速度 benchmark • 编译后的体积更小 • borsh borsh 序列化后的二进制更精简 轻量级 序列化结果体积对比 Borsh 基本用法 Case Study NEAR 智能合约 Case Study Solana 智能合约 Case Study • non self-describing • 保证序列化后的二进制唯一性和确定性 • 主要序列化规则 Borsh 规范 • 整数采用低字节序( little endian) 存储0 码力 | 21 页 | 3.35 MB | 1 年前3
Comprehensive Rust(简体中文) 2024129.4 字符串 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 9.5 练习:几何图形 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 9.5.1 解答 . . . . . . . . . . . . . . . 181 IX Android 185 31 欢迎来到 Android 中的 Rust 186 32 设置 187 33 构建规则 188 33.1 Rust 二进制文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 33.2 Rust 库 . . . . . . (rustc)。你还将获得 rustup,这是一个命令 行实用程序, 你可以用它来安装不同的编译器版本。 安装 Rust 之后,你应当配置你的编辑器或 IDE 以开始使用 Rust。大多数编辑器使用了 rust-analyzer。 它为 VS Code、Emacs、Vim/Neovim 及其他许多编辑器提供了自动补全及定义跳转的功能。同样也可 以使用 RustRover IDE。 • 在 Debian/Ubuntu 上,你也可以通过0 码力 | 359 页 | 1.33 MB | 11 月前3
Rust 程序设计语言 简体中文版 1.85.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 14.4. 使用 cargo install 安装二进制文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317 interface,API)文档! 文本编辑器和集成开发环境(Integrated Development Environments, IDE) 本书不会假设你使用何种工具来编写 Rust 代码。几乎任何文本编辑器都可以搞定!然而,很 多文本编辑器和集成开发环境(IDE)内置了 Rust 支持。你总是可以在 Rust 官网的工具页面 找到很多相对流行的编辑器和 IDE 列表。 离线使用本书 在一些示例中,我们将会使用标准库之外的 Rust,是时候来编写第一个 Rust 程序了。当学习一门新语言的时候,使用该语 言在屏幕上打印 Hello, world! 是一项传统,我们将沿用这一传统! 注意:本书假设你熟悉基本的命令行操作。Rust 对于你的编辑器、工具,以及代码位 于何处并没有特定的要求,如果你更倾向于使用集成开发环境(IDE),而不是命令 行,请尽管使用你喜欢的 IDE。目前很多 IDE 都在一定程度上支持 Rust;查看 IDE 文档以了解更多细节。Rust0 码力 | 562 页 | 3.23 MB | 1 月前3
Rust 程序设计语言简体中文版.................................................................... 362 14.4. 使用 cargo install 安装二进制文件 ........................................................................... 368 14.5. Cargo 自定义扩展命令 rustc 命令并传入源文件名 称,如下: $ rustc main.rs 如果你有 C 或 C++ 背景,就会发现这与 gcc 和 clang 类似。编译成功后,Rust 会输出一个 二进制的可执行文件。 在 Linux、macOS 或 Windows 的 PowerShell 上,在 shell 中输入 ls 命令可以看见这个可 执行文件。 $ ls main main.rs cargo build 构建项目。 21/600 Rust 程序设计语言 简体中文版 • 可以使用 cargo run 一步构建并运行项目。 • 可以使用 cargo check 在不生成二进制文件的情况下构建项目来检查错误。 • 有别于将构建结果放在与源码相同的目录,Cargo 会将其放到 target/debug 目录。 使用 Cargo 的一个额外的优点是,不管你使用什么操作系统,其命令都是一样的。所以从现0 码力 | 600 页 | 12.99 MB | 1 年前3
WebAssembly 简介 - 陈思衡web 中运行高性能应用。它是一种低级语言,设计为编 译器目标,以在 web 浏览器中高效运行。 WebAssembly 介绍 WebAssembly 代码可以以接近原生的速度 运行,且具有很小的二进制大小和快速加 载速度。 # 高性能 WebAssembly 最初由 Mozilla、Google、 Microsoft 等主要浏览器供应商共同设计。 它现已在所有主流浏览器中实现,包括 Chrome、Firefox、Safari 在 Rust 被内置在 std 中。 WASI 实例 WASI 简介 WASM 的应用场景 WASM 使用场景和问题 由于 WASI ,WASM 不仅可以在浏览器中运行,其作为一种通用二进制格式,也适用于浏览器外的许多场景: 1. 物联网设备: WASM 体积小、加载快,很适合运行在物联网设备上。使用 WASM 可以让这些设备运行更复杂的逻 辑,实现设备间的互操作性。 2. 云计算: 的模块化也让云端应用更易于构建和部署。 3. 用户定义函数(UDF):WASM UDF 安全性更高。WASM 运行在沙箱中,访问受限,可以防止恶意 UDF 对数据和系 统产生破坏。与解释执行的 UDF 相比,WASM 作为二进制格式可以获得更高的运行性能。 WASM 中 IO 阻塞问题 WASM 使用场景和问题 在 WASI 和 一些用户自定义的 Host function 中,难免存在一些如网络服务的阻塞行为。当在0 码力 | 24 页 | 773.46 KB | 1 年前3
Rust 语言学习笔记些模块的最基本规则外,由开发者更大范围地自定义模块的存在。 首先在一个 rust 项目中,首先定义了 crate 和 module。 1.1 Crate 1.crate 编译后会形成一个库(例如.so)或二进制可执行文件。crate 分为两种: lib crate 和 bin crate。 2. 一个包可以带有零个或一个 lib crate 和任意多个 bin crate。一个包中必 须有 crate,至少一个,(lib ii.另一个约定如果包目录中包含 src/lib.rs,则包带有与其同名的 lib crate, 且 src/lib.rs 是 crate 根。同样不需要精确到文件。 iii. 包可以带有多个二进制 crate,默认将文件置于 src/bin 目录,但是 也可以自由配置。 举例: [[bin]] name = “base_language_demo” 会自动去寻找 src/bi 到环境变量中即 可。 而 rust 的开发中经常会遇到配置不同的 toolchain 等需求,因此官方开发了 rustup。rustup 功能如下: 1.管理安装多个官方版本的 Rust 二进制程序。 2.配置基于目录的 Rust 工具链。 3.安装和更新来自 Rust 的发布通道: nightly, beta 和 stable。 4.接收来自发布通道更新的通知。 5.从官方安装历史版本的0 码力 | 117 页 | 2.24 MB | 1 年前3
Hello 算法 1.1.0 Rust版float、double ,用于表示小数。 ‧ 字符类型 char ,用于表示各种语言的字母、标点符号甚至表情符号等。 ‧ 布尔类型 bool ,用于表示“是”与“否”判断。 基本数据类型以二进制的形式存储在计算机中。一个二进制位即为 1 比特。在绝大多数现代操作系统中,1 字节(byte)由 8 比特(bit)组成。 基本数据类型的取值范围取决于其占用的空间大小。下面以 Java 为例。 ‧ 整数类型 。这个现象比较反直觉,它的内在原因涉及原码、反码、补码的相关知识。 首先需要指出,数字是以“补码”的形式存储在计算机中的。在分析这样做的原因之前,首先给出三者的定 义。 ‧ 原码:我们将数字的二进制表示的最高位视为符号位,其中 0 表示正数,1 表示负数,其余位表示数字 的值。 ‧ 反码:正数的反码与其原码相同,负数的反码是对其原码除符号位外的所有位取反。 ‧ 补码:正数的补码与其原码相同,负数的补码是在其反码的基础上加 1111 1101 (反码) = 1111 1110 (反码) = 1000 0001 (原码) → −1 另一方面,数字零的原码有 +0 和 −0 两种表示方式。这意味着数字零对应两个不同的二进制编码,这可能 会带来歧义。比如在条件判断中,如果没有区分正零和负零,则可能会导致判断结果出错。而如果我们想处 理正零和负零歧义,则需要引入额外的判断操作,这可能会降低计算机的运算效率。 +0 →0 码力 | 388 页 | 18.50 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Rust 版float、double ,用于表示小数。 ‧ 字符类型 char ,用于表示各种语言的字母、标点符号甚至表情符号等。 ‧ 布尔类型 bool ,用于表示“是”与“否”判断。 基本数据类型以二进制的形式存储在计算机中。一个二进制位即为 1 比特。在绝大多数现代操作系统中,1 字节(byte)由 8 比特(bit)组成。 基本数据类型的取值范围取决于其占用的空间大小。下面以 Java 为例。 ‧ 整数类型 。这个现象比较反直觉,它的内在原因涉及原码、反码、补码的相关知识。 首先需要指出,数字是以“补码”的形式存储在计算机中的。在分析这样做的原因之前,首先给出三者的定 义。 ‧ 原码:我们将数字的二进制表示的最高位视为符号位,其中 0 表示正数,1 表示负数,其余位表示数字 的值。 ‧ 反码:正数的反码与其原码相同,负数的反码是对其原码除符号位外的所有位取反。 ‧ 补码:正数的补码与其原码相同,负数的补码是在其反码的基础上加 1111 1101 (反码) = 1111 1110 (反码) = 1000 0001 (原码) → −1 另一方面,数字零的原码有 +0 和 −0 两种表示方式。这意味着数字零对应两个不同的二进制编码,这可能 会带来歧义。比如在条件判断中,如果没有区分正零和负零,则可能会导致判断结果出错。而如果我们想处 理正零和负零歧义,则需要引入额外的判断操作,这可能会降低计算机的运算效率。 +0 →0 码力 | 387 页 | 18.51 MB | 10 月前3
Hello 算法 1.0.0 Rust版float、double ,用于表示小数。 ‧ 字符类型 char ,用于表示各种语言的字母、标点符号甚至表情符号等。 ‧ 布尔类型 bool ,用于表示“是”与“否”判断。 基本数据类型以二进制的形式存储在计算机中。一个二进制位即为 1 比特。在绝大多数现代操作系统中,1 字节(byte)由 8 比特(bit)组成。 基本数据类型的取值范围取决于其占用的空间大小。下面以 Java 为例。 ‧ 整数类型 。这个现象比较反直觉,它的内在原因涉及原码、反码、补码的相关知识。 首先需要指出,数字是以“补码”的形式存储在计算机中的。在分析这样做的原因之前,首先给出三者的定 义。 ‧ 原码:我们将数字的二进制表示的最高位视为符号位,其中 0 表示正数,1 表示负数,其余位表示数字 的值。 ‧ 反码:正数的反码与其原码相同,负数的反码是对其原码除符号位外的所有位取反。 ‧ 补码:正数的补码与其原码相同,负数的补码是在其反码的基础上加 1111 1101 (反码) = 1111 1110 (反码) = 1000 0001 (原码) → −1 另一方面,数字零的原码有 +0 和 −0 两种表示方式。这意味着数字零对应两个不同的二进制编码,这可能 会带来歧义。比如在条件判断中,如果没有区分正零和负零,则可能会导致判断结果出错。而如果我们想处 理正零和负零歧义,则需要引入额外的判断操作,这可能会降低计算机的运算效率。 +0 →0 码力 | 383 页 | 17.61 MB | 1 年前3
Rust并行编译的挑战与突破2017-2021,Rust编译速度已提升一倍以上 Rust社区编译器性能工作组 Rust编译器并行化 Cargo多crate并行 二进制生成并行 更多更好的并行化? Rust编译器架构 语法树生成 宏展开 命名解析 泛型解析 类型检查 借用检查 单态化 二进制生成 增量编译系统 底层数据 结构 Rust语言编译器结构总览 考虑内部编译流程并行化 Rust并行并发 编译时线程安全检查0 码力 | 25 页 | 4.60 MB | 1 年前3
共 14 条
- 1
- 2













