rs-merkle:一个用Rust编写的高级散列树库

rs_merkle: an advanced hash tree library for Rust

rs-merkle是一个高级的Rust merkle树库。基本功能包括构建Merkle树、创建和验证单个和多个元素的Merkle证明,即多重证明。高级功能包括对树进行事务性更改,并回滚到以前提交的任何树状态,类似于Git。该库有两个主要结构。第一个是MerkleTree,它构建了一棵树,可用于验证数据完整性并生成Merkle证明。第二种是MerkleProof,可用于验证集合中是否包含项目。这个库是高度可定制的。哈希算法和树的构建方式可以通过Hasher trait进行配置。

关于Merkle树

Merkle树,也称为散列树,用于验证两个或多个参与方是否拥有相同的数据,而无需交换整个数据集合。Merkle树被用于Git、Mercurial、ZFS、IPFS、比特币、以太坊、Cassandra等许多领域。例如,在Git中,Merkle树用于查找本地和远程存储库状态之间的增量,以便通过网络仅传输它们之间的差异。在比特币中,Merkle树用于验证交易是否包含在区块中,而无需下载整个区块内容。ZFS使用Merkle树快速验证数据完整性,提供保护,防止幻象写入、磁盘固件中的错误、电源浪涌和其他原因导致的静默数据损坏。

示例:验证Merkle证明:

let leaf_values = ["a", "b", "c", "d", "e", "f"];
let leaves: Vec<[u8; 32]> = leaf_values.iter().map(|x| Sha256::hash(x.as_bytes())).collect();let merkle_tree = MerkleTree::<Sha256>::from_leaves(&leaves);
let indices_to_prove = vec![3, 4];
let leaves_to_prove = leaves.get(3..5).ok_or("can't get leaves to prove")?;
let merkle_proof = merkle_tree.proof(&indices_to_prove);
let merkle_root = merkle_tree.root().ok_or("couldn't get the merkle root")?;
// Serialize proof to pass it to the client
let proof_bytes = merkle_proof.to_bytes();// Parse proof back on the client
let proof = MerkleProof::<Sha256>::try_from(proof_bytes)?;assert!(proof.verify(merkle_root, &indices_to_prove, leaves_to_prove, leaves.len()));

项目地址:https://github.com/antouhou/rs-merkle

项目文档:https://docs.rs/rs_merkle/1.0.0/rs_merkle/


在Rust中使用建造者模式

Builder pattern in Rust

由于Rust不支持函数的可选参数和具名参数,也不支持函数重载,建造者模式在Rust中被广泛使用。以下是一个使用建造者模式创建一个User结构体的代码示例:

#[derive(Debug)]
struct User {id: String,email: String,first_name: Option<String>,last_name: Option<String>
}struct UserBuilder {id: String,email: String,first_name: Option<String>,last_name: Option<String>
}impl UserBuilder {fn new(id: impl Into<String>, email: impl Into<String>) -> Self {Self {id: id.into(),email: email.into(),first_name: None,last_name: None,}}fn first_name(mut self, first_name: impl Into<String>) -> Self {self.first_name = Some(first_name.into());self}fn last_name(mut self, last_name: impl Into<String>) -> Self {self.last_name = Some(last_name.into());self}fn build(self) -> User {let Self { id, email, first_name, last_name } = self;User { id, email, first_name, last_name }}
}impl User {fn builder(id: impl Into<String>, email: impl Into<String>) -> UserBuilder {UserBuilder::new(id, email)}
}fn main() {let greyblake = User::builder("13","greyblake@example.com").first_name("Sergey").build();dbg!(greyblake);
}

要点:

  1. 使用UserBuilder来创建User结构体;

  2. 结构体的必要字段通过必选位置显示传入建造者的new方法,可选参数通过setter来设置;

  3. 最后通过build函数返回完整的结构体实例;


sila: 另一个用于团队指导的终端多路复用器。

Another terminal multiplexer for team leads.

sila - 读作[shila],巴利语中代表「道德」;

这是一个简单的终端多路复用器,用rust编写,使用yaml格式的配置文件配置项目。

基本用法

> helplist                      List the terminal names.
pin     <term1> <term2>   Pin one or multiple terminals separated by space. Following commands will be run on top of pinned ones.
unpin   [term1]           Unpin all terminals if no argument is provided or the specific ones.
count                     Count the number of terminals.
exit                      Close the application.

项目地址:https://github.com/alxolr/sila


From 日报小组 odd-cat

社区学习交流平台订阅:

Rust.cc 论坛: 支持 rss

微信公众号:Rust 语言中文社区

【Rust日报】2021-10-19 rs-merkle:一个用Rust编写的高级散列树库相关推荐

  1. 2021.10.19练习2

    1 谐均值计算(4分) 题目内容: 两数值的谐均值可以这样计算:首先对两数值的倒数取平均值,最后再取倒数.编写一个带有两个double参数的函数,计算这两个参数的谐均值.函数原型为: double C ...

  2. C语言系列之初识C语言(二)2021.10.19

    接着上期的内容,对C语言的重要知识做一个概述 目录 一.初识选择语句 二.初识循环语句 ​​ 三.函数 四.数组 五.操作符 六.关键字 一.初识选择语句 人生中会遇到很多选择,无论对应的结果是怎样, ...

  3. [2021.10.19]<呆头熊的开发日记>怪物AI(2)

    把之前写好的蝙蝠精整合导入. 蝙蝠精行为逻辑也很简单,主要是: 1.在固定范围内飞行:2.轨迹随机:3.不主动攻击:4.触碰则受伤 using System.Collections; using Sy ...

  4. 2021.10.19股票小计

    今日大盘还可以,上证涨了0.7个点,深证涨了1.04个点,创业板涨了0.64个点,今天证券板块加了1w左右,加了1100股华林证券,其他无操作,今日证券板块涨了0.68个点,华林证券涨了0.5个点,钢 ...

  5. 【Rust日报】 2019-06-01:知乎开源了Rust实现的搜索引擎 rucene

    rucene 知乎开源了Rust实现的搜索引擎 rucene 据@Chaos了解,目前开源的部分只包括 lucene library 部分,搜索引擎的部分太多业务内容而且跟内部的一个分布式框架有强绑定 ...

  6. 【Rust 日报】2021-07-04 如何在面试中确定 Rust 程序员水平?

    如何在面试中确定 Rust 程序员水平? 对于这个问题,张汉东老师在 RustFriday 飞书群线上沙龙第十三期中进行了分享: 视频:RustFriday 飞书群线上沙龙 第十三期 | [讨论]如何 ...

  7. 【Rust 日报】2021-11-26 使用 PyO3 从 Python 调用 Rust

    使用 PyO3 从 Python 调用 Rust PyO3 让 Python 调用 Rust 代码变得容易.用户可以编写 Rust 库,并依靠 PyO3 和生态系统中maturin的支持工具的组合 P ...

  8. 【Rust日报】2021-09-05 perseus:完全支持 SSR 和 SSG 的 Rust 高端前端开发框架

    rust-tui-template:使用 tui-rs 和 crossterm 引导 Rust TUI 应用程序的模板 项目结构如下: src/ ├── app.rs -> holds the ...

  9. Functional Options: Go中实现优雅的API的方法 | Gopher Daily (2021.10.22)

    每日一谚:学会不要马上增加太多的功能,要把核心思想建立起来并进行测试 - Leah Culver Go技术生态 Go很大可能在go 1.19版本中支持编译器的FGO(feedback-guided o ...

最新文章

  1. 线程的挂起是错误的概念实际是线程的阻塞,挂起只针对进程,将进程挂起会将进程从内存空间交换到磁盘空间的过程
  2. 大厂首发!java敏捷开发模式面试题
  3. ubuntu10.04下安装windows7
  4. leetcode235. 二叉搜索树的最近公共祖先
  5. Python+django网页设计入门(7):常用ORM操作
  6. 慕课学习--DNS的作用
  7. 【solitidy】生成随机数算法
  8. antd 的form 表单怎么回显数据_antd design Form动态增减表单项(多个),组装数据及编辑回显,选择初始值,控制添加减少表单项数量等...
  9. 基础SQL第二课:约束
  10. Linux操作命令分类详解 - 目录文件(二)
  11. mysql 节假日判断_sql 节假日判断(春节、中秋、国庆、周末等)
  12. java中linux下反斜杠,Linux下反斜杠号\引发的思考
  13. Zookeeper之Curator分布式锁简单模拟12306抢票
  14. 帆软数据分析:BI物流可视化
  15. 记账的目的和好处是什么
  16. 无刷电动车控制器设计要点
  17. postgresq的日志
  18. 计算机玩游戏不能全屏,电脑屏幕有黑边怎么调全屏 玩游戏不能全屏是什么情况...
  19. blur事件与click事件冲突的解决办法
  20. 35 岁,真的是职场荣枯线 吗?

热门文章

  1. gradle从7.0.2降级到6.5 报错
  2. 【海思篇】【Hi3516DV300】十七、创建swap分区
  3. 敏捷Agile: Epic vs UserStory vs Task
  4. IP-guard 打印水印和屏幕水印使用说明
  5. Java数据结构之链表、树、堆、图手写双向非循环链表
  6. wandb 安装与使用
  7. OA系统软件怎么选型?
  8. 酷我音乐盒html代码,如何使用酷我音乐盒的界面及标签?
  9. 夏普SH6310C使用小结
  10. python基础数据类型(二)