首页 > 其他分享 >编写一段 ABAP 代码构造 merklet 树

编写一段 ABAP 代码构造 merklet 树

时间:2023-11-16 21:55:21浏览次数:29  
标签:leafhash merklet leafnode ABAP 哈希 merkelline 编写 TYPE 节点

*&---------------------------------------------------------------------*
*& Report ZBLOCKTREE
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zblocktree.
PARAMETERS: leafnode TYPE i.
TYPES: BEGIN OF ty_merkletree,
         leafvalue     TYPE string,
         leafhash      TYPE string,
         level         TYPE int4,
         leftleafhash  TYPE string,
         rightleafhash TYPE string,
       END OF ty_merkletree.

DATA: treeheight  TYPE int4,
      count       TYPE int4,
      merkeldata1 TYPE TABLE OF ty_merkletree,
      merkeldata2 TYPE TABLE OF ty_merkletree,
      merkeldata  TYPE TABLE OF ty_merkletree.

START-OF-SELECTION.

  IF leafnode MOD 2 <> 0.
    leafnode = leafnode + 1.
  ENDIF.

  " Calculate tree height
  treeheight = leafnode / 2.
  count = 0.

  DATA: lv_tabix    TYPE string,
        merkelline  TYPE ty_merkletree,
        merkelline1 TYPE ty_merkletree,
        merkelline2 TYPE ty_merkletree.

  DO leafnode TIMES.
    lv_tabix = sy-index.
    CONCATENATE 'Leaf' lv_tabix INTO merkelline-leafvalue  .
    PERFORM dohash USING merkelline-leafvalue CHANGING merkelline-leafhash.
    merkelline-level = treeheight.
    merkelline-leftleafhash = ''.
    merkelline-rightleafhash = ''.
    APPEND merkelline TO merkeldata.
  ENDDO.
  merkeldata1 = merkeldata.

  PERFORM recursivehashing.

  BREAK-POINT.

FORM recursivehashing.
  ""Check number of nodes to be hashed if odd add the last node again.
  DESCRIBE TABLE merkeldata1 LINES DATA(leafcount).
  IF leafcount MOD 2 <> 0.
    READ TABLE merkeldata1 INTO merkelline1 INDEX leafcount.
    APPEND merkelline1 TO merkeldata1.
  ENDIF.

  DESCRIBE TABLE merkeldata1 LINES leafcount.
  DATA(iteration) = leafcount / 2.
  " Combine the number of nodes based on iteration count.
  DO iteration TIMES.
    DATA(count) = sy-index * 2.
    DATA(count2) = count - 1.
    READ TABLE merkeldata INTO merkelline1 INDEX count.
    READ TABLE merkeldata INTO merkelline2 INDEX count2.

    CONCATENATE merkelline1-leafvalue merkelline2-leafvalue INTO merkelline-leafvalue.
    CONCATENATE merkelline1-leafhash merkelline2-leafhash   INTO merkelline-leafhash.
    PERFORM dohash USING  merkelline-leafhash CHANGING merkelline-leafhash.
    merkelline-leftleafhash = merkelline1-leafhash.
    CONCATENATE merkelline1-leafhash merkelline2-leafhash INTO merkelline-leafhash  .
    merkelline-rightleafhash = merkelline2-leafhash.

    merkelline-level = treeheight - count.
    APPEND merkelline TO merkeldata2.
  ENDDO.
  " Add the processed nodes to master table and call the subroutine again with processed node data
  "CLEAR adddummy.
  INSERT LINES OF merkeldata2 INTO merkeldata INDEX 1.
  CLEAR merkeldata1.
  merkeldata1 = merkeldata2.
  CLEAR merkeldata2.
  DESCRIBE TABLE merkeldata1 LINES leafcount.
  IF leafcount <> 1.
    PERFORM recursivehashing.
  ENDIF.
ENDFORM.

FORM dohash USING inputvalue TYPE string CHANGING hashvalue TYPE string.
  CALL METHOD cl_abap_message_digest=>calculate_hash_for_char
    EXPORTING
      if_algorithm  = 'SHA1'
      if_data       = inputvalue
    IMPORTING
      ef_hashstring = hashvalue.
ENDFORM.

这段ABAP代码是用于创建一个Merkle树(Merkle Tree)的程序。Merkle树是一种数据结构,通常用于验证大型数据集的完整性,特别是在分布式系统和加密领域中。它的核心思想是通过逐层哈希计算来构建一个树结构,最终生成一个根哈希值,以验证数据的一致性。这个Merkle树程序首先生成叶节点的哈希值,然后逐层组合这些叶节点,最终生成根哈希值。

以下是代码中不同部分的详细解释:

  1. 程序说明和数据定义部分:

    • REPORT zblocktree:报告的名称。
    • PARAMETERS: leafnode TYPE i:定义了一个输入参数,用于指定叶子节点的数量。
    • TYPES:定义了一个自定义数据类型ty_merkletree,用于表示Merkle树的节点。
    • DATA:声明了一些变量用于存储Merkle树的信息和数据。
  2. START-OF-SELECTION 部分:

    • 这是程序执行的起始点。
  3. 叶子节点的生成:

    • 通过循环生成叶子节点。DO leafnode TIMES 循环,其中 leafnode 是叶子节点的数量。
    • 对每个叶子节点,将其值存储在 merkelline-leafvalue 中,然后通过 dohash 函数计算叶子节点的哈希值,将其存储在 merkelline-leafhash 中。
    • 设置 merkelline-level 为树的高度,并将左右子叶哈希值设置为空。
    • 最后,将节点添加到 merkeldata 表中。
  4. recursivehashing 子例程:

    • 这是一个递归子例程,用于逐层组合叶子节点以构建Merkle树。
    • 首先检查节点数是否为奇数,如果是,添加最后一个节点再进行哈希计算。
    • 然后,计算迭代次数,并在每次迭代中,组合两个节点的值和哈希,计算其父节点的哈希值。
    • 将父节点添加到 merkeldata2 表中,并清空 merkeldata1 表。
    • 递归调用 recursivehashing 直到只剩下一个节点。
  5. dohash 子例程:

    • 这个子例程用于计算给定输入值的哈希值,使用了 cl_abap_message_digest 类中的 calculate_hash_for_char 方法,采用SHA-1算法。

现在,让我们来看一个示例来说明这个ABAP程序是如何工作的。假设 leafnode 参数的值为 4,这意味着有4个叶子节点。程序将如下工作:

  1. 创建四个叶子节点,每个节点都包含一个值和相应的哈希值。
  2. 递归地组合这些叶子节点,生成中间节点,然后继续递归,直到生成根节点。
  3. 最终,Merkle树将包含根节点,该节点的哈希值可用于验证整个数据集的完整性。

Merkle树的结构如下:

Root Hash
|
|--- Intermediate Hash 1
|   |
|   |--- Leaf Hash 1
|   |
|   |--- Leaf Hash 2
|
|--- Intermediate Hash 2
|   |
|   |--- Leaf Hash 3
|   |
|   |--- Leaf Hash 4

根哈希值将被用于验证整个数据集是否与原始数据相匹配。这是一种常见的数据完整性验证方法,特别适用于分布式系统和加密领域。

标签:leafhash,merklet,leafnode,ABAP,哈希,merkelline,编写,TYPE,节点
From: https://www.cnblogs.com/sap-jerry/p/17837365.html

相关文章

  • SAP ABAP调用REST服务
    就是调用为外部HTTP接口 zcl_json=>deserialize因为版本问题 自定义的json转换函数 根据自己的版本使用对应函数就好reportztest25.data:urltypestring,"接口地址gv_json_intypestring,"输入参数(账号密码啥的)jso......
  • ABAP 内表转CSV文件推送SAP服务器和SFTP到对方服务器
    1、内表转CSV文件,老ECC个别版本该函数有BUG,I类型字段会dumpDATA:lt_csv_vbak TYPE ztruxs_t_text_data,"ztruxs_t_text_data长度为8192CALLFUNCTION'ZSAP_CONVERT_TO_CSV_FORMAT'TABLESi_tab_sap_data=lt_vbakCHANGINGi_tab_conve......
  • 第9章 窗口和布局综合应用--编写云对象存储浏览器主界面(综合运用,非常重要!)
    除了每章小结以外,这节课是对前面所学知识点的综合运用,非常重要非常重要看完每一小节再跟着敲窗口和布局综合应用--编写云对象存储浏览器主界面(巩固加深课)很重要!界面最好是手敲,跟敲......
  • windows bat批处理 hack小工具的文件编写(除了library要自己调整外都可以用)
    @echooffcolor0Amodeconcols=1500lines=1500mshtavbscript:msgbox("welcometothe江南的江万能工具箱")(window.close)title"hackjiang":HACKclsecho[][][][][][][][][][][][][][][][][][][][][]......
  • ABAP使用异步远程RFC实现并行处理
    1、使用场景当开发复杂报表,需要处理大量数据,不管怎么优化计算和查询语句,程序的运行效率还是达不到用户要求,怎么办?为了解决这个问题,就需要程序实现并行处理。本文档就是通过异步调用远程RFC的办法,实现对大量数据的计算,以并行的方式,更快的计算出最终结果。2、代码实现在实现并......
  • 在Dash中更灵活地编写回调函数
    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/dash-master大家好我是费老师,使用Dash开发过交互式应用的朋友,想必都不会对回调函数感到陌生,作为Dash应用中实现各种交互逻辑的“万金油”方式,不管是常规的@app.callback(),还是对应浏览器端回调的app.clientsid......
  • 软件测试|详解 Pytest 参数化:简化测试用例的编写
    简介Pytest是一个广泛使用的Python测试框架,它提供了丰富的功能来编写和执行测试用例。其中一个强大的特性是参数化,它允许我们通过一种简洁的方式运行多个输入参数的相似测试用例,从而减少冗余的代码。本文将详细介绍Pytest的参数化功能以及如何使用它来简化测试用例的编写。......
  • 关于SAP ABAP ALV开发的吐槽
    我认为ALV开发时ABAPer第二无聊的工作,非必要千万别做,浪费青春;实在要做也要提高效率少花时间在ALV展示上,集中精力处理后台逻辑。常见的callFM或者OO+Dialog的实现方式,都要手动设置fieldcat、layout,挺烦人的。我比较喜欢用SAP标准的SALV类来做,或者使用国外大神封装的FastAL......
  • vscode编写js canvas无代码提示的解决方法
    解决方法:如果是2d上下文,则在获取上下文的前一句加上/**@type{CanvasRenderingContext2D}*/如果是3d上下文,则加上/**@type{WebGLRenderingContext}*/letdrawing=document.querySelector("#canvas")if(drawing.getContext){/**@type......
  • 面向对象的 ABAP 里,全局类和局部类有什么区别,以及各自使用场合试读版
    本教程之前的文章,第一次介绍了ABAP面向对象编程领域的类,实例,方法等概念。20.面向对象的ABAP编程初探-什么是类,实例,和Public方法在ABAP很多帮助文档里,我们都能看到SAP在提到类的时候,总是将GlobalClass(全局类)和LocalClass(局部类,有时也称本地类,内部类)相提并论。......