成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

300行ABAP代碼實現一個最簡單的區(qū)塊鏈原型

cikenerd / 1098人閱讀

摘要:我的這篇文章沒有任何高大上的術語,就是行代碼,實現一個最簡單的區(qū)塊鏈原型。檢查該區(qū)塊鏈是否有效。而通過在循環(huán)里不斷嘗試最終得到一個合法的哈希值的這一過程,就是區(qū)塊鏈圈內俗稱的挖礦。

不知從什么時候起,區(qū)塊鏈在網上一下子就火了。

這里Jerry就不班門弄斧了,網上有太多的區(qū)塊鏈介紹文章。我的這篇文章沒有任何高大上的術語,就是300行ABAP代碼,實現一個最簡單的區(qū)塊鏈原型。

我個人覺得,同區(qū)塊鏈本身的實現技術相比,更難的事情是如何找到一個合適的業(yè)務場景,把區(qū)塊鏈集成到SAP產品中去,讓它發(fā)揮出作用。

這篇文章包含三個版本,每個版本在前一版本基礎上增添了一些新的功能。

版本1:區(qū)塊和鏈這兩個數據結構的實現

區(qū)塊鏈,顧名思義,由區(qū)塊組成的一條鏈。

下圖和我們在大學計算機專業(yè)課《數據結構》里學到的單鏈表很像。在這個版本里,每個區(qū)塊包含了最基本的字段:塊索引,塊的創(chuàng)建時間戳,當前塊的哈希值(hash)和前一塊的哈希值。每個區(qū)塊的pHash字段存儲了前一塊的哈希值,這樣就構成了一個鏈表。鏈表的第一個節(jié)點,就是下圖最左邊紅色抬頭的區(qū)塊為創(chuàng)世塊,其索引為0,pHash字段為空。

區(qū)塊的ABAP實現:ZCL_BLOCK。上圖所示的字段都建模在這個類里,出于簡單起見,大部分字段設置為public。

每個區(qū)塊的哈希值是由該區(qū)塊所有其他字段的值作為輸入,通過SHA1算法計算出來,存儲到字段mv_hash里。

鏈的實現:ZCL_BLOCKCHAIN

ADD_BLOCK: 接受一個區(qū)塊的實例作為輸入參數,將該實例的pHash指向當前鏈表尾部的區(qū)塊,這樣該實例成為鏈表新的尾部區(qū)塊。

CONSTRUCTOR: 構造函數,執(zhí)行鏈的初始化操作,創(chuàng)建創(chuàng)世塊區(qū)塊。

GET_BLOCK_BY_INDEX: 根據索引訪問指定的區(qū)塊。

GET_SIZE: 返回鏈里包含的區(qū)塊數量。

IS_VALID: 檢查該區(qū)塊鏈是否有效。具體檢查邏輯在后續(xù)介紹。

第一版的所有代碼在我的github上。

執(zhí)行測試程序ZBLOCKCHAIN_V1,輸入您想創(chuàng)建的區(qū)塊個數,會看到如下輸出:(我選擇的個數是5)

因為SAP GUI沒有鏈表的UI控件,因此我用樹控件模擬。

下圖第21行,我把區(qū)塊鏈里索引為1的區(qū)塊內容篡改為"Change by Jerry", 然后再執(zhí)行第23行的is_valid方法進行檢查:

因為第21行set_data方法修改了第一個區(qū)塊的內容后,會觸發(fā)其哈希值的重新計算。這樣第一個區(qū)塊的哈希發(fā)生了變化(假設從YYY變到了CCC),而第二個區(qū)塊的pHash仍然指向第一個區(qū)塊變化之前的舊哈希值YYY,因此這個區(qū)塊鏈被判定為無效。

上圖的輸出來自校驗方法is_valid: 遍歷鏈里每個區(qū)塊,比較區(qū)塊里存儲前一區(qū)塊哈希值的字段pHash和位于該區(qū)塊前一個位置的區(qū)塊的哈希值是否一致。

版本2:增加挖礦成本,增加對工作量證明(Proof of Work,縮寫為POW)的支持

第二版代碼的地址在我的github上。

這一版的鏈實現類ZCL_BLOCKCHAIN_V2的構造函數增加了一個輸入參數:iv_difficulty。這個參數有什么用?

仔細觀察第一版測試程序的樹狀輸出,可以看到每個區(qū)塊的哈希值沒有任何規(guī)律。而第二版的這個輸入參數就是為了提高哈希值的計算成本,即只有當計算出來的哈希值滿足一定規(guī)則時,該哈希值才能被區(qū)塊鏈所接受。參數iv_difficulty定義了能夠被接受的哈希值的前導零個數。

例如我指定前導零個數為3:

執(zhí)行結果:能看到所有的哈希值的前三位都為零。

這里有兩個問題:

下圖最后一列Nonce的含義是什么?

iv_difficulty這個參數是如何參與哈希值計算的呢?

首先在區(qū)塊的實現類ZCL_BLOCK里增加了一個新的成員字段mv_nonce:

在將一個區(qū)塊實例添加到鏈里的方法add_block里,增加了一個方法mine。

這個方法里是一個循環(huán),在循環(huán)體內計算出一個哈希值,然后檢查其是否包含指定位數的前導零。如果沒有,將mv_nonce加1,然后繼續(xù)循環(huán)。mv_nonce也會作為輸入的一部分參與哈希計算。也就是說,最終區(qū)塊字段mv_nonce的值代表了代表了在得到符合前導零位數要求的合法哈希值之前,一共經過了多少次計算。而通過在循環(huán)里不斷嘗試最終得到一個合法的哈希值的這一過程,就是區(qū)塊鏈圈內俗稱的“挖礦”。

在我的測試系統(tǒng)里,創(chuàng)建10個區(qū)塊,前導零個數為4,總共花費了10秒鐘。

從這個花費的時間能體會出,POW其實是一種機制,通過引入需要一定工作量的哈希計算來避免區(qū)塊鏈被垃圾填充或者區(qū)塊內容被篡改。

版本3:使用區(qū)塊鏈記錄交易明細,增加挖礦獎勵

這一版的源代碼:

https://github.com/i042416/Kn...

使用ZCL_TRANSACTION來代表一筆交易,包含三個字段:mv_from_address(支付方),mv_to_address(收款方)和mv_amount(交易金額)。

在這一版本里,首先被增強的是ZCL_BLOCK3: 去掉了前兩個版本使用的mv_index和mv_data字段,增加了一個字段mt_transaction, 存儲的是交易的集合。

在計算哈希值時,交易類的每一個字段也要參與計算:

類ZCL_BLOCKCHAIN_V3增加了一個新的成員變量mt_pending_trans。每次調用方法create_transaction,并不會創(chuàng)建一個新的區(qū)塊用于記錄該條交易,只是簡單地把該條交易添加到待處理任務隊列mt_pending_trans里。

字段mv_mine_reward存儲了挖礦的獎勵,硬編碼成100。

這個待處理任務隊列僅當方法mine_pending_trans被調用時才會得到處理。

第6行的區(qū)塊實例的mine方法調用之后,計算出一個符合前導零規(guī)范的哈希值。接著待處理任務隊列被清空,然后一個新的交易記錄在第13行被創(chuàng)建出來,作為挖礦的獎勵,獎勵方的賬號信息由輸入參數iv_award_address定義。

既然現在交易信息存儲在了每個區(qū)塊里,那么簡單遍歷這些區(qū)塊,就能得出某個賬號最后的余額是多少。采用的邏輯是,遍歷每個區(qū)塊記錄的每筆交易,如果某帳號出現在交易記錄的支付方,則余額減去當前這筆交易的交易金額(第5行), 反之賬號如果出現在發(fā)送方,則余額加上交易金額(第9行)。

測試程序如下。因為Tom轉了100元給Jerry,Jerry又轉了10元給Tom,然后第15行挖礦設置的獎勵賬號是Jerry,故最后Jerry的余額是100-10+100 = 190元。

希望您讀完本文之后,對區(qū)塊鏈的工作原理有一個最基本的認識。感謝閱讀。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/94743.html

相關文章

  • 300ABAP代碼實現一個簡單區(qū)塊原型

    摘要:我的這篇文章沒有任何高大上的術語,就是行代碼,實現一個最簡單的區(qū)塊鏈原型。檢查該區(qū)塊鏈是否有效。而通過在循環(huán)里不斷嘗試最終得到一個合法的哈希值的這一過程,就是區(qū)塊鏈圈內俗稱的挖礦。 不知從什么時候起,區(qū)塊鏈在網上一下子就火了。 showImg(https://segmentfault.com/img/remote/1460000014744826); 這里Jerry就不班門弄斧了,網上...

    DangoSky 評論0 收藏0
  • Hyperledger Fabric on SAP Cloud Platform

    摘要:在她的幫助下,原型發(fā)布順利完成。節(jié)點收到一個交易后,會根據判斷標準對該交易進行有效性校驗,無效的交易會被廢棄。負責權限管理,成員身份相關證書管理和維護交易相關證書管理等等。 今天的文章來自Wen Aviva, 坐Jerry面對面的程序媛。 Jerry在之前的公眾號文章《在SAP UI中使用純JavaScript顯示產品主數據的3D模型視圖》已經介紹過Aviva了,SAP成都C4C開發(fā)團...

    codergarden 評論0 收藏0
  • ABAP程序給佛祖開過光么?來試試Jerry這個小技巧

    摘要:實現步驟非常簡單,在標準程序的內創(chuàng)建一個隱式增強。禁止在測試服務器和生產服務器使用否則由此造成的一切負面后果,本人及概不負責。 最近Jerry在忙一個項目,技術棧換成了nodejs平臺,語言換成了JavaScript,因為趕項目進度,一直沒時間更新公眾號。感謝大家的支持,關注人數還是慢慢地增長到了3000。 showImg(https://segmentfault.com/img/re...

    SQC 評論0 收藏0
  • 不喜歡SAP GUI?那試試用Eclipse進ABAP開發(fā)吧

    摘要:比如的的個性化設置是這樣的,字體必須用程序猿專用的等寬開源字體,這樣顯得比較專業(yè)。我覺得網上流傳的程序猿和工具的鄙視鏈很無聊,與其有時間去鄙視別人,不如把這時間用來深入研究自己每天用的,進一步提高自己單位時間內的工作效率。 Jerry和SAP成都研究院一些新同事聊天時,談到ABAP和SAP GUI這個話題。很多新同事在加入SAP成都之前,是做Java和C++開發(fā)的,習慣了Eclipse...

    jkyin 評論0 收藏0
  • 我用ABAP做過那些無聊事情

    摘要:而且這種現象在德國的法定節(jié)假日里更加突出。所以本文提到的這些東西都是在德國節(jié)假日里無聊的產物,對于顧問的實際工作可能幫助不大。這也是在這篇文章里介紹的眾多用搞出來的無聊的東西里唯一被官方認可的工具,囧。直接用執(zhí)行里的事務碼或者函數。 國慶大假馬上就要來臨了,我們聊點輕松的話題,關于假期。 Jerry的成都同事李貝寧(Li Ben), 《SAP成都研究院李三郎:SCP Applicati...

    wuaiqiu 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<