Below you will find pages that utilize the taxonomy term “Borsh”
May 17, 2025
零拷贝bytemuck与 borsh
"\u003cp\u003e在上一篇博文《\u003ca href=\"https://blog.haohtml.com/posts/serde-vs-bincode-vs-borsh-in-the-rust/\"\u003e深入理解 Serde、Bincode 与 Borsh 的关系与区别\u003c/a\u003e》介绍了常用的几种解析二进制数据的方法,主要有 bincode 与 borsh, 并提到过在区块链领域里一般推荐使用 borsh 解析数据。但随着合约的开发使用borsh的地方越来越多,会经常遇到提示超出 4K Stack 大小的错误。这是因为在solana里,虚拟机 sbf 限制了一个合约最大允许使用的statck大小上限为 4k。尽管我们使用完一个大变量通过一些方法,如变量作用域、通过Box将内存移动到heap、或手动drop立即释放内存。但仍有些场景是没有采用这种办法的,这时应该如何办呢?\u003c/p\u003e\n\u003cp\u003e如果经常看一些优秀的开源项目的话,会发现有一个 \u003ccode\u003ebytemuck\u003c/code\u003e 的crate,它是一个 \u003ccode\u003ezerocopy\u003c/code\u003e 库,可以避免内存复制带来的开销,加速解析数据速度,这里给出一个测试代码\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003euse\u003c/span\u003e borsh::{BorshDeserialize, BorshSerialize};\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003euse\u003c/span\u003e bytemuck::{Pod, Zeroable};\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003euse\u003c/span\u003e solana_program::pubkey::Pubkey;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003euse …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
April 22, 2025
深入理解 Serde、Bincode 与 Borsh 的关系与区别
"\u003cp\u003e在Rust开发中,无论是构建网络服务、存储数据还是开发区块链程序,**序列化(Serialization)和反序列化(Deserialization)**都是不可或缺的操作。序列化是将内存中的数据结构(struct)转换成字节序列或者其他格式(JSON, vec\u003cu8\u003e),以便存储或传输;反序列化则是将字节序列还原成原来的数据结构。\u003c/p\u003e\n\u003cp\u003eRust 生态中常用的序列化工具包括 \u003cstrong\u003eSerde\u003c/strong\u003e、\u003cstrong\u003eBincode\u003c/strong\u003e 和 \u003cstrong\u003eBorsh\u003c/strong\u003e。初学者在阅读文档或实际开发中可能会发现它们名字都很熟悉,但它们的定位、使用方式和特点却不完全相同。\u003c/p\u003e\n\u003cp\u003e本文将系统梳理三者的关系、差异和使用场景。\u003c/p\u003e\n\u003ch2 id=\"serde\"\u003eSerde\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eSerde(Serialization / Deserialization)\u003c/strong\u003e 是 Rust官方生态最流行的序列化框架。它提供了一种 \u003cstrong\u003e抽象接口\u003c/strong\u003e,让你可以将 Rust 类型序列化为多种格式,而不关心底层具体实现。\u003c/p\u003e\n\u003ch3 id=\"特点\"\u003e特点\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e通用性强\u003c/strong\u003e:支持 JSON、YAML、TOML、Bincode 等多种格式。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e灵活\u003c/strong\u003e:可以自定义序列化逻辑。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e宏支持\u003c/strong\u003e:通过 \u003ccode\u003e#[derive(Serialize, Deserialize)]\u003c/code\u003e 自动生成序列化代码。 …\u003c/li\u003e\u003c/ul\u003e"