码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 利用多核的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
      
      • 1
      或者,采用整数运算,如:
      if current_level_len % 2 == 0 {
          current_level_len / 2
      } else {
          (current_level_len + 1) / 2
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      浮点数运算需要的计算量多一点,这种性能差异在特定应用场景下(特别是当 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。
  • 相关阅读:
    组合计数3以及高斯消元
    一看就会 MotionLayout使用的几种方式
    非常经典的一道SQL报错注入题目[极客大挑战 2019]HardSQL 1(两种解法!)
    [附源码]Python计算机毕业设计 社区老人健康服务跟踪系统
    R语言使用MASS包的polr函数构建有序多分类logistic回归模型、使用summary函数获取模型汇总统计信息
    CAS:1445723-73-8 DSPE-PEG-NHS 磷脂-聚乙二醇-活性酯常用活性磷脂之一
    AVX | 关于RC电路耦合、相移、滤波、微分、积分的那些事儿~
    C# 中的类、结构和记录概述
    聚焦采购全方位风险管理,全面提升工程企业采购效率与效益
    Python数据类型 ——— 列表
  • 原文地址:https://blog.csdn.net/mutourend/article/details/134528599
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号