利用多核的Rust快速Merkle tree

news2024/10/7 2:30:41

1. 引言

利用多核的Rust快速Merkle tree,开源代码见:

  • https://github.com/anoushk1234/fast-merkle-tree(Rust)

其具有如下属性:

  • 可调整为任意高度
  • 构建root复杂度为O(n)
  • 提供了插入和获取叶子节点的方法
  • 获取某叶子节点的opening proof,并基于某root验证该proof
  • 抽象化的哈希函数,可任意替换为其它哈希函数。
  • 默认叶子节点为h(0)
  • 可选择使用multi processing(多重处理)

cargo test来做测试用例测试。cargo bench来做benchmark。

在这里插入图片描述
在做代码优化时,通常需权衡代码效率和代码可读以及可维护性。
https://github.com/anoushk1234/fast-merkle-tree 代码实现和优化时,试图兼顾了三者(效率、可读性、可维护性)。

具体的算法优化有:

  • 1)由于所有的叶子节点都预填充了默认值,实际插入时,无法简单将data hash推入,直观方法是轮询找到某叶子节点然后替换为data hash。这样复杂度为 O ( n ! ) O(n!) O(n!)。本文会记录Merkle tree的当前可添加叶子节点的index,这样有助于跟踪那个index可被替换,从而将插入平均时长缩短了约800ms。
    之前方案:
    在这里插入图片描述
    现在方案:
    在这里插入图片描述
  • 2)由于已知Merkle tree的容量,可提前预分配向量,来节约在heap中没必要的分配,从而节约调用syscall的开销(因需做上下文切换)。
  • 3)将DEFAULT_LEAF等值用作常量值,节约在运行时对其进行哈希的时间。

同时,还做了如下并行优化:

  • 1)不是顺序插入叶子节点,而是使用多个线程来哈希叶子节点,然后一次性附加到数组中,可节约约70ms到80ms的时间。
  • 2)即使对Merkle tree进行了预填充,由于向量已分配,可使用par_extend来并行预填充,但性能改进可忽略,此处倾向于简化for循环中的逻辑。

代码可读性改进:

  • 1)当计算level length或tree height时,可使用浮点数计算,如:
    (current_level_len as f64 / 2.0).ceil() as usize
    
    或者,采用整数运算,如:
    if current_level_len % 2 == 0 {
        current_level_len / 2
    } else {
        (current_level_len + 1) / 2
    }
    
    浮点数运算需要的计算量多一点,这种性能差异在特定应用场景下(特别是当 h < = 10 h<=10 h<=10时)可忽略不计。不过个人倾向于采用整数运算。

未来性能改进点:

  • 1)AVX-512 Accelarated SHA256,已有一些开源实现。
  • 2)定制Heap Allocator:使用定制allocator来分配单个dram page,然后每次需给向量分配heap时,使用该定制allocator。可节约向内核做syscall的额外开销。类似如Hoard Allocator。
  • 3)向量化:不同于 使用多个变量来存储不同的值,可使用搭个matrix/vector来存储不同的值。但这将牺牲可读性。
  • 4)使用Blake4而不是SHA-256。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1233190.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

『C++成长记』类和对象

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;C &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、类的引入 二、类的定义 三、类的访问限定符 四、类的作用域 五、类的实例化…

给新手教师的成长建议

随着教育的不断发展和进步&#xff0c;越来越多的新人加入到教师这个行列中来。从学生到教师&#xff0c;这是一个华丽的转身&#xff0c;需要我们不断地学习和成长。作为一名新手老师&#xff0c;如何才能快速成长呢&#xff1f;以下是一名老师教师给的几点建议&#xff1a; 一…

腾讯云服务器标准型S5和CVM标准型S6区别对比_选择攻略

腾讯云服务器CVM标准型S5和S6有什么区别&#xff1f;都是标准型云服务器&#xff0c;标准型S5是次新一代云服务器规格&#xff0c;标准型S6是最新一代的云服务器&#xff0c;S6实例的CPU处理器主频性能要高于S5实例&#xff0c;同CPU内存配置下的标准型S6实例要比S5实例性能更好…

2023 羊城杯 final

前言 笔者并未参加此次比赛, 仅仅做刷题记录. 题目难度中等偏下吧, 看你记不记得一些利用手法了. arrary_index_bank 考点: 数组越界 保护: 除了 Canary, 其他保护全开, 题目给了后门 漏洞点: idx/one 为 int64, 是带符号数, 所以这里存在向上越界, 并且 buf 为局部变量,…

谈谈你对mvc和mvvm的理解

MVC和MVVM是软件开发中两种常见的架构模式&#xff0c;各自有不同的优缺点。 MVC&#xff08;Model-View-Controller&#xff09;是一种经典的架构模式&#xff0c;将应用程序分为三个部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和…

buildadmin+tp8表格操作(5)自定义组装搜索的查询

有时候我们会自定义组装一些数据&#xff0c;发送给后端&#xff0c;让后端来进行筛选&#xff0c;这里有一个示例 const onComSearchIdEq () > {// 展开公共搜索baTable.table.showComSearch true/*** 公共搜索表单赋值* 范围搜索有两个输入框&#xff0c;输入框绑定变量…

如何通过数环通,让企业吸引和留住更多优秀人才?

企业招聘员工以及员工入职&#xff0c;不仅仅只是人力资源重要职能之一&#xff0c;它们更是整个企业成功的关键。 市场永远充满竞争&#xff0c;“战争”一直都在&#xff0c;为了赢得胜利&#xff0c;让最优秀的人选加入是最好的选择。但优秀的人才永远不缺机会&#xff0c;市…

基于RFID手持终端的服装门店管理解决方案

一、方案背景 基于RFID技术的RFID手持终端服装门店应用整体解决方案旨在解决服装门店在订单管理、库存管理、盘点和调配等方面面临的问题&#xff0c;该方案利用RFID标签和RFID手持终端设备&#xff0c;实现对服装产品的追踪、扫描、查询和操作&#xff0c;提高管理效率和准确…

循环链表2

循环链表的实现 对于数据结构中所有的结构而言&#xff0c;每一次都是用之前初始化&#xff08;处理一开始的随机值&#xff09;一下&#xff0c; 用完销毁&#xff08;不管有没有malloc都能用&#xff0c;用了可以保证没有动态内存泄漏了&#xff09;一下 而在C里面&#x…

请简要说明 Mysql 中 MyISAM 和 InnoDB 引擎的区别

“请简要说明 Mysql 中 MyISAM 和 InnoDB 引擎的区别”。 屏幕前有多少同学在面试过程与遇到过类似问题&#xff0c; 可以在评论区留言&#xff1a;遇到过。 考察目的 对于 xxxx 技术的区别&#xff0c;在面试中是很常见的一个问题 一般情况下&#xff0c;面试官会通过这类…

优思学院|现代质量管理实践与六西格玛方法论如何融合?

企业要解决质量问题必然需要涉及管理&#xff0c;然而&#xff0c;如果仅仅将六西格玛法视为一种质量管理方法&#xff0c;必定会导致六西格玛管理法的失败。六西格玛法是一种具有特定战略性的管理方法&#xff0c;它涉及到市场、顾客、产品、服务、流程、质量、价值链以及财务…

【Java】线程状态

1、线程状态 初始-NEW: Thread : 对象已经创建&#xff0c;但start 方法还没调用. 终止-TERMINATED: Thread 对象还在,内核中的线程已经没了 运行-RUNNABLE: 就绪状态(线程已经在 cpu 上执行了/线程正在排队等待上 cpu 执行) 超时等待-TIMED WAITING: 阻塞.由于 sleep 这种固定…

2023年中国羽绒制品需求现状、市场规模及细分产品规模分析[图]

羽绒羽毛指生长在水禽类动物&#xff08;鹅、鸭&#xff09;腋下、腹部羽绒和羽毛的统称&#xff0c;属于上游鹅鸭肉食品工业副产品的综合利用&#xff0c;是下游羽绒制品的填充料。根据国家标准&#xff0c;绒子含量≥50%的称为羽绒&#xff0c;绒子含量&#xff1c;50%的称为…

使用 RAFT 的光流:第 1 部分

一、说明 在这篇文章中&#xff0c;我们将了解一种旗舰的光流深度学习方法&#xff0c;该方法获得了 2020 年 ECCV 最佳论文奖&#xff0c;并被引用超过 1000 次。它也是KITTI基准测试中许多性能最佳的模型的基础。该模型称为 RAFT&#xff1a;Recurrent All-Pairs Field Trans…

白炽灯护眼还是LED护眼?眼科专家都推荐的护眼台灯分享

白炽灯和LED灯相比&#xff0c;我认为还是LED灯会更护眼一些。因为LED灯长时间照射&#xff0c;温度也不会变得很高&#xff0c;这就说明了LED灯的散热效果好&#xff0c;安全性高&#xff0c;而且光线散发会比较均匀。 白炽灯是通过发热发光的&#xff0c;大部分能量都转化为了…

深入分析TaskView源码之触摸相关

问题背景 hi&#xff0c;粉丝朋友们&#xff1a; 大家好&#xff01;android 10以后TaskView作为替代ActivityView的容器&#xff0c;在课程的分屏pip自由窗口专题也进行了相关的详细介绍分析。 这里再补充一下相关的TaskView和桌面内嵌情况下的触摸分析 主要问题点&#xff…

Power Apps-灵活高度库和普通库的区别

点击插入&#xff0c;可以选择布局中的灵活高度库或其他库 两种库同样把item大小设置得比组件排列起来的小 实现效果&#xff1a; 根据实践发现&#xff0c;如果item中组件排列大小超出item本身大小&#xff0c;灵活高度的库会按照组件排列大小自适应高度&#xff0c;其他库则严…

SVN 修改版本库地址url路径

一、win11用户 1. win11系统右链菜单比较优秀&#xff0c;如果菜单中选择“TortoiseSVN”找不到“重新定位”&#xff0c;如下图所示&#xff0c;则需要添加右键菜单&#xff1a; 2.添加右键菜单&#xff1a;选择“TortoiseSVN”&#xff0c;点击设置&#xff0c;如下图所示&a…

qt和window抓包程序

1.思路 使用原始套接字&#xff0c;将网卡设置为混杂模式&#xff0c;监听该网卡的数据。 2. 了解协议封包和协议层 下图是tcp封包详细过程 数据包传输情况 在TCP/IP协议栈中的每一层为了能够正确解析出上层的数据包&#xff0c;从而使用一些“协议类型”来标记&#xff0c;详…

redis的高可用

redis-cli -h 192.168.233.10 -p 6379 redis的数据类型的增删改查 redis的高可用在集群当中有一个非常重要的指标&#xff0c;提供正常服务的时间的百分比(365天) 99.9% redis的高可用含义更加广泛&#xff0c;正常服务是指标之一&#xff0c;数据容量的扩展&#xff0c;数据…