首页 > 其他分享 >使用 ABAP 代码生成区块链

使用 ABAP 代码生成区块链

时间:2023-11-16 21:57:00浏览次数:40  
标签:nonce 代码生成 blockdataline data tree ABAP 区块 TYPE

源代码如下:

*&---------------------------------------------------------------------*
*& Report ZBLOCKCHAIN
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zblockchain.

PARAMETERS: diffle  TYPE char5 default '00000',
            noblock TYPE i DEFAULT 2.

DATA:blockdata TYPE zcl_abap_blockchain_tool=>tt_block .

DATA:blockdataline LIKE LINE OF blockdata,
     timestamp     TYPE timestampl,
     combineddata  TYPE string,
     prevblockdata LIKE LINE OF blockdata,
     nonce         TYPE i VALUE 1,
     noncestring   TYPE string,
     flag          TYPE c,
     difflength    TYPE i,
     gethash       TYPE REF TO cl_abap_message_digest.

blockdataline-index = 0.
blockdataline-data = 'Jerry first Genesis block'.
blockdataline-phash = '000000'.
GET TIME STAMP FIELD timestamp.
blockdataline-timestamp = timestamp.
blockdataline-nonce  = 0.
CONCATENATE blockdataline-index blockdataline-data blockdataline-phash blockdataline-timestamp blockdataline-nonce INTO combineddata.
CALL METHOD cl_abap_message_digest=>calculate_hash_for_char
  EXPORTING
    if_algorithm  = 'SHA1'
    if_data       = combineddata
  IMPORTING
    ef_hashstring = blockdataline-chash.
APPEND blockdataline TO blockdata.

noblock = noblock - 1.
difflength = strlen( diffle ).

DO noblock TIMES.
  blockdataline-index = sy-tabix.
  CONCATENATE `Jerry's Block ` blockdataline-index INTO blockdataline-data SEPARATED BY '-'.
  READ TABLE blockdata INTO prevblockdata INDEX blockdataline-index.
  IF sy-subrc EQ 0.
    blockdataline-phash = prevblockdata-chash.
  ENDIF.
  GET TIME STAMP FIELD timestamp.
  blockdataline-timestamp = timestamp.

  WHILE flag EQ abap_false.
    noncestring = nonce.
    CONCATENATE blockdataline-index blockdataline-data blockdataline-phash blockdataline-timestamp noncestring INTO combineddata.
    CALL METHOD cl_abap_message_digest=>calculate_hash_for_char
      EXPORTING
        if_algorithm  = 'SHA1'
        if_data       = combineddata
      IMPORTING
        ef_hashstring = blockdataline-chash.

    IF blockdataline-chash(difflength) = diffle.
      flag = 'X'.
      blockdataline-nonce  = nonce.
      APPEND blockdataline TO blockdata.
      nonce = 1.
      CLEAR:blockdataline.
    ENDIF.
    nonce = nonce + 1.
  ENDWHILE.
  CLEAR flag.
ENDDO.

DATA: g_alv_tree TYPE REF TO cl_gui_alv_tree,
      gt_data    TYPE STANDARD TABLE OF zcl_abap_blockchain_tool=>ty_displayed_node,
      ok_code    LIKE sy-ucomm,
      save_ok    LIKE sy-ucomm,
      ls_data    LIKE LINE OF gt_data.
  FIELD-SYMBOLS: <field> TYPE LINE OF LVC_T_FCAT.

  DATA(lo_tool) = NEW zcl_abap_blockchain_tool( blockdata ).
  DATA(lt_fieldcat) = lo_tool->get_fieldcat_by_data( ls_data ).
  PERFORM change_label.
  CALL SCREEN 100.

DEFINE define_label.

  READ TABLE lt_fieldcat ASSIGNING <field> INDEX &1.
  <field>-seltext = <field>-reptext = <field>-scrtext_m = <field>-scrtext_s = <field>-scrtext_l = &2.
  <field>-outputlen = &3.

END-OF-DEFINITION.

FORM change_label.
  define_label 1 'Block Data' 20.
  define_label 2 'Hash' 40.
  define_label 3 'Nonce' 10.
  define_label 4 'Timestamp' 20.

ENDFORM.
FORM init_tree.
  g_alv_tree = lo_tool->get_tree( ).
  DATA l_hierarchy_header TYPE treev_hhdr.
  PERFORM build_hierarchy_header CHANGING l_hierarchy_header.
  CALL METHOD g_alv_tree->set_table_for_first_display
    EXPORTING
      is_hierarchy_header = l_hierarchy_header
    CHANGING
      it_fieldcatalog     = lt_fieldcat
      it_outtab           = gt_data.
  PERFORM create_tree.
  g_alv_tree->frontend_update( ).
  lo_tool->expand( ).
ENDFORM.
FORM create_tree.
  lo_tool->render_tree( ).
ENDFORM.
FORM build_hierarchy_header CHANGING p_hierarchy_header TYPE treev_hhdr.
  p_hierarchy_header-heading = 'BlockChain list'.
  p_hierarchy_header-width = 30.
  p_hierarchy_header-width_pix = ' '.
ENDFORM.

FORM exit_program.
  LEAVE PROGRAM.
ENDFORM.

MODULE pbo OUTPUT.
  SET PF-STATUS 'MAIN100'.
  SET TITLEBAR 'MAINTITLE'.
  IF g_alv_tree IS INITIAL.
    PERFORM init_tree.
    CALL METHOD cl_gui_cfw=>flush
      EXCEPTIONS
        cntl_system_error = 1
        cntl_error        = 2.
    ASSERT sy-subrc = 0.
  ENDIF.
ENDMODULE.

MODULE pai INPUT.
  save_ok = ok_code.
  CLEAR ok_code.
  CASE save_ok.
    WHEN 'EXIT' OR 'BACK' OR 'CANC'.
      PERFORM exit_program.
    WHEN OTHERS.
      CALL METHOD cl_gui_cfw=>dispatch.
  ENDCASE.
  CALL METHOD cl_gui_cfw=>flush.
ENDMODULE.

代码解释如下:

首先,它定义了一个报告 ZBLOCKCHAIN,该报告有两个参数 difflenoblockdiffle 是一个五个字符的字符串,用于定义区块链的难度,而 noblock 是一个整数,用于定义区块链中区块的数量。

然后,它定义了一些数据对象,包括 blockdata,它是一个表,用于存储区块链中的区块; blockdataline,它代表一个区块,包含了区块的索引、数据、前一个区块的哈希值、时间戳和随机数; timestamp 是一个时间戳; combineddata 是一个字符串,用于存储区块的信息,并用于生成哈希值; prevblockdata 用于存储前一个区块的信息; nonce 是一个随机数,用于生成哈希值; noncestringnonce 的字符串表示; flag 是一个标志,用于控制循环; difflengthdiffle 的长度; gethash 是一个对象引用,用于生成哈希值。

接下来,它创建了创世区块,也就是区块链的第一个区块。创世区块的索引为 0,数据为 Jerry first Genesis block,前一个区块的哈希值为 000000,时间戳为当前时间,随机数为 0。然后,它将这些信息连接成一个字符串,然后调用 cl_abap_message_digest=>calculate_hash_for_char 方法生成哈希值,并将哈希值存储在 blockdataline-chash 中。最后,它将 blockdataline 添加到 blockdata 中。

接着,它创建了其余的区块。这是通过一个循环实现的,循环的次数是 noblock - 1。在每次循环中,它首先设置区块的索引和数据,然后读取前一个区块的信息,将其哈希值设置为当前区块的 phash,设置当前区块的时间戳,然后在一个内部循环中,生成随机数,连接区块的信息,生成哈希值,如果哈希值的前 difflength 个字符和 diffle 相等,那么就退出内部循环,将当前区块添加到 blockdata 中,否则,增加随机数,然后继续内部循环。

标签:nonce,代码生成,blockdataline,data,tree,ABAP,区块,TYPE
From: https://www.cnblogs.com/sap-jerry/p/17837355.html

相关文章

  • 编写一段 ABAP 代码构造 merklet 树
    *&---------------------------------------------------------------------**&ReportZBLOCKTREE*&---------------------------------------------------------------------**&*&---------------------------------------------------------------......
  • 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......
  • ABAP使用异步远程RFC实现并行处理
    1、使用场景当开发复杂报表,需要处理大量数据,不管怎么优化计算和查询语句,程序的运行效率还是达不到用户要求,怎么办?为了解决这个问题,就需要程序实现并行处理。本文档就是通过异步调用远程RFC的办法,实现对大量数据的计算,以并行的方式,更快的计算出最终结果。2、代码实现在实现并......
  • 关于SAP ABAP ALV开发的吐槽
    我认为ALV开发时ABAPer第二无聊的工作,非必要千万别做,浪费青春;实在要做也要提高效率少花时间在ALV展示上,集中精力处理后台逻辑。常见的callFM或者OO+Dialog的实现方式,都要手动设置fieldcat、layout,挺烦人的。我比较喜欢用SAP标准的SALV类来做,或者使用国外大神封装的FastAL......
  • 从HumanEval到CoderEval: 你的代码生成模型真的work吗?
    本文分享自华为云社区《从HumanEval到CoderEval:你的代码生成模型真的work吗?》,作者:华为云软件分析Lab。本文主要介绍了一个名为CoderEval的代码生成大模型评估基准,并对三个代码生成模型(CodeGen、PanGu-Coder和ChatGPT)在该基准上的表现进行了评估和比较。研究人员从真实的开源项......
  • HyperLedger Fabric 1.2 区块链技术形成(1.2)
    在比特币诞生之时,没有区块链技术概念,当人们看到比特币在无中心干预的前提下,还能安全、可靠的运行,比特币网络打开了人们的想象空间;技术专家们开始研究比特币的底层技术,并抽象提取出来,形成区块链技术,或者称分布式账本技术。   区块链技术:简称BT(Blockchaintechnology),也称为分......
  • HyperLedger Fabric 1.2 区块链技术定义(2.1)
    区块链技术指使用点对点传输、共识机制、加密算法等技术,保证分布式数据库区块写入链中数据的一致性,达到去中心化和不可篡改的目的。    区块链就是一种特殊的分布式数据库,使用现有的各种成熟的技术,把各种技术集成在一起,实现多方共识、去中心化、分布式和不可篡改等技术特点......
  • HyperLedger Fabric 1.2 区块链工作过程(2.3)
    区块链的工作过程分交易产生、交易广播、节点计算、获取记账权、记账权广播、接收区块、验证区块和完成记账七个过程。1)交易产生:用户向区块链发了一笔交易信息,将产生交易;2)交易广播:当一笔新交易产生时,区块链网络会广播出去,网络中的其它节点都会收到该交易信息;3)节点计算:收到......
  • HyperLedger Fabric 1.2 区块链技术原理(2.2)
    区块链从字面上理解:数据记录在区块中,通过一定的算法把区块连成一个链。    区块链通过哈希(Hash)算法,生成一串字符串,保存在区块的头部中,一个的区块通过指向上一个Hash值,加入到区块链中;Hash算法是一种加密算法,指对原始信息进行特定的转换运算,换算成对应的加密值(称为Hash值);是一......