利用多核的Rust快速Merkle tree

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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

centos7 利用nc命令探测某个tcp端口是否在监听

脚本 # 安装nc yum install -y ncnc -vz 192.168.3.128 60001 if [ $? -eq 0 ]; thenecho "tcp succeed" elseecho "tcp failed" fi nc -vz 192.168.3.128 60001 探测192.168.3.128服务器上60001 tcp端口, -vz说明是探测TCP的 端口开启的情况 执行…

用不用Microsoft Defender是你的自由,但不用最好也得有替代品

Microsoft Defender是预装在Windows 11操作系统上的重要安全工具。安全套件已完全集成到操作系统中&#xff0c;以保护你的系统免受恶意软件的攻击&#xff0c;但并不是每个人都喜欢它。你是否更愿意安装另一种防病毒/反间谍软件&#xff0c;以将Microsoft Defender推向绝境&am…

ATA-304功率放大器的电子实验案例(案例合集)

ATA-304功率放大器凭借其优异的指标参数受到不少电子工程师的喜欢&#xff0c;其在电子实验中的应用也非常频繁&#xff0c;下面为大家整理出ATA-304功率放大器的应用案例合集&#xff0c;希望能对领域内各位工程师、研究人员有所帮助。 案例一&#xff1a;ATA-304功率放大器在…

并行与分布式 第4章 数据级并行:向量体系结构和GPU

文章目录 并行与分布式 第4章 数据级并行&#xff1a;向量体系结构和GPU4.1 什么叫数据级并行4.1.1 数据级并行与SPMD4.1.2数据级并行——传统器件的问题4.1.3 数据级并行——向量体系结构和GPU 4.2 向量体系结构4.2.1 向量以及计算方式4.2.2 向量体系结构4.2.3 向量运算的执行…

如何在公网环境下使用内网穿透工具实现用ipad pro进行代码开发

文章目录 前言1. 本地环境配置2. 内网穿透2.1 安装cpolar内网穿透(支持一键自动安装脚本)2.2 创建HTTP隧道 3. 测试远程访问4. 配置固定二级子域名4.1 保留二级子域名4.2 配置二级子域名 5. 测试使用固定二级子域名远程访问6. iPad通过软件远程vscode6.1 创建TCP隧道 7. ipad远…

解锁数据库运维秘籍:掌握AntDB-T动态共享内存,提升进程间通信效率

动态共享内存是AntDB数据库通信的重要手段&#xff0c;本文主要阐述AntDB-T数据库动态共享内存的实现原理、实现方式与使用方法。 AntDB-T数据库是一款企业级通用分布式关系型数据库&#xff0c;其数据库内核是基于进程模型实现的&#xff0c;因此进程间通信&#xff08;IPC&am…

撸源代码破冰杀手锏(一):Spring Security系列

一: 禅悟人生,码砖破冰感悟 二: Spring Security安全阐述 忙着去耍帅,后期补充完整.................

腾讯云服务器标准型S5实例CPU性能如何?配置特性说明

腾讯云服务器CVM标准型S5实例具有稳定的计算性能&#xff0c;CVM 2核2G S5活动优惠价格280.8元一年自带1M带宽&#xff0c;15个月313.2元、2核4G配置748.2元15个月&#xff0c;CPU内存配置还可以选择4核8G、8核16G等配置&#xff0c;公网带宽可选1M、3M、5M或10M&#xff0c;腾…

日期格式转化成星期几部署到linux显示英文

异常收集 原因&#xff1a;解决办法仰天大笑出门去&#xff0c;我辈岂是蓬蒿人 传入一个时间获取这个时间对应的是星期几&#xff0c;在开发环境&#xff08;window系统&#xff09;中显示为星期几&#xff0c;部署到服务器&#xff08;linux系统&#xff09;中会显示英文的时间…

什么是单片机?聊聊它的历史

前言 1946年2月15日&#xff0c;第一台电子数字计算机 ENIAC问世&#xff0c;这标志着计算机时代的到来。 ENIAC 是电子管计算机&#xff0c;时钟频率虽然仅有 100 kHz&#xff0c;但能在1s 的时间内完成 5000 次加法运算。与现代的计算机相比&#xff0c;ENIAC有许多不足&am…

腾讯云标准型s5和s6有什么区别?CPU处理器有差异吗?

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

KyLin离线安装OceanBase

去OceanBase下载若干文件 1 首先安装ob-deploy-2.3.1-2.el7.x86_64.rpm rpm -ivh ob-deploy-2.3.1-2.el7.x86_64.rpm# 运行此命令的时候他会报错 RPM should not be used directly install RPM packages, use Alien instead! 这个需要用Alien去转换为deb的包&#xff0c;不…

Linux中,查看Tomcat版本、如何查看Tomcat版本

方法 在tomcat的bin目录下&#xff0c;执行version.sh命令即可 结果

Pytorch完整的模型训练套路

Pytorch完整的模型训练套路 文章目录 Pytorch完整的模型训练套路以CIFAR10为例实践 数据集加载步骤 使用适当的库加载数据集&#xff0c;例如torchvision、TensorFlow的tf.data等。 将数据集分为训练集和测试集&#xff0c;并进行必要的预处理&#xff0c;如归一化、数据增强等…

桌面运维。

Windows运行命令&#xff1a; color 01/02切换字符颜色cls 清屏ipconfig 设备的ip信息ipconfig /all 设备ip的所有信息 破解系统密码&#xff1a; 进PE系统&#xff0c;使用里面的工具破解 vmware workstation安装 网卡 网卡&#xff1a;ncpa.cpl window远程控制 mstsc …

【JavaEE】Spring核心与设计思想(控制反转式程序演示、IoC、DI)

一、什么是Spring&#xff1f; 通常所说的 Spring 指的是 Spring Framework&#xff08;Spring 框架&#xff09;&#xff0c;它是⼀个开源框架&#xff0c;有着活跃⽽庞⼤的社区&#xff0c;这就是它之所以能⻓久不衰的原因。Spring ⽀持⼴泛的应⽤场景&#xff0c;它可以让 …

人工智能对我们的生活影响有多大

随着科技的飞速发展&#xff0c;人工智能已经渗透到我们生活的方方面面&#xff0c;并且越来越受到人们的关注。从智能语音助手到自动驾驶汽车&#xff0c;从智能家居系统到医疗诊断&#xff0c;人工智能技术正在改变着我们的生活方式。那么&#xff0c;人工智能对我们的生活影…

【C++上层应用】5. 文件和流

文章目录 【 1. 打开文件 】1.1 open 函数1.2 open 多种模式的结合使用 【 2. 关闭文件 】【 3. 写入 & 读取文件 】【 4. 文件位置指针 】 和 iostream 库中的 cin 标准输入流和 cout 标准输出流类似&#xff0c;C中另一个库 fstream 也存在文件的读取流和标准写入流。fst…

erlang语言为什么天生支持高并发

Erlang 语言天生支持高并发的主要原因可以归结于它的设计哲学和一些核心特性。以下是 Erlang 支持高并发的几个关键方面&#xff1a; 轻量级进程&#xff1a;Erlang 使用轻量级的并发实体&#xff0c;通常称为“进程”&#xff0c;这些进程在Erlang虚拟机内部运行&#xff0c;而…

腾讯云轻量应用服务器三年租用价格表_免去续费困扰

腾讯云服务器续费贵所以一次性买3年或5年&#xff0c;腾讯云轻量应用服务器3年价格有优惠&#xff0c;CVM云服务器5年有特价&#xff0c;腾讯云3年轻量和5年云服务器CVM优惠活动入口&#xff0c;3年轻量应用服务器配置可选2核2G4M和2核4G5M带宽&#xff0c;5年CVM云服务器可以选…