摘要:我的這篇文章沒(méi)有任何高大上的術(shù)語(yǔ),就是行代碼,實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的區(qū)塊鏈原型。檢查該區(qū)塊鏈?zhǔn)欠裼行?。而通過(guò)在循環(huán)里不斷嘗試最終得到一個(gè)合法的哈希值的這一過(guò)程,就是區(qū)塊鏈圈內(nèi)俗稱的挖礦。
不知從什么時(shí)候起,區(qū)塊鏈在網(wǎng)上一下子就火了。
這里Jerry就不班門弄斧了,網(wǎng)上有太多的區(qū)塊鏈介紹文章。我的這篇文章沒(méi)有任何高大上的術(shù)語(yǔ),就是300行ABAP代碼,實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的區(qū)塊鏈原型。
我個(gè)人覺(jué)得,同區(qū)塊鏈本身的實(shí)現(xiàn)技術(shù)相比,更難的事情是如何找到一個(gè)合適的業(yè)務(wù)場(chǎng)景,把區(qū)塊鏈集成到SAP產(chǎn)品中去,讓它發(fā)揮出作用。
這篇文章包含三個(gè)版本,每個(gè)版本在前一版本基礎(chǔ)上增添了一些新的功能。
版本1:區(qū)塊和鏈這兩個(gè)數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)區(qū)塊鏈,顧名思義,由區(qū)塊組成的一條鏈。
下圖和我們?cè)诖髮W(xué)計(jì)算機(jī)專業(yè)課《數(shù)據(jù)結(jié)構(gòu)》里學(xué)到的單鏈表很像。在這個(gè)版本里,每個(gè)區(qū)塊包含了最基本的字段:塊索引,塊的創(chuàng)建時(shí)間戳,當(dāng)前塊的哈希值(hash)和前一塊的哈希值。每個(gè)區(qū)塊的pHash字段存儲(chǔ)了前一塊的哈希值,這樣就構(gòu)成了一個(gè)鏈表。鏈表的第一個(gè)節(jié)點(diǎn),就是下圖最左邊紅色抬頭的區(qū)塊為創(chuàng)世塊,其索引為0,pHash字段為空。
區(qū)塊的ABAP實(shí)現(xiàn):ZCL_BLOCK。上圖所示的字段都建模在這個(gè)類里,出于簡(jiǎn)單起見(jiàn),大部分字段設(shè)置為public。
每個(gè)區(qū)塊的哈希值是由該區(qū)塊所有其他字段的值作為輸入,通過(guò)SHA1算法計(jì)算出來(lái),存儲(chǔ)到字段mv_hash里。
鏈的實(shí)現(xiàn):ZCL_BLOCKCHAIN
ADD_BLOCK: 接受一個(gè)區(qū)塊的實(shí)例作為輸入?yún)?shù),將該實(shí)例的pHash指向當(dāng)前鏈表尾部的區(qū)塊,這樣該實(shí)例成為鏈表新的尾部區(qū)塊。
CONSTRUCTOR: 構(gòu)造函數(shù),執(zhí)行鏈的初始化操作,創(chuàng)建創(chuàng)世塊區(qū)塊。
GET_BLOCK_BY_INDEX: 根據(jù)索引訪問(wèn)指定的區(qū)塊。
GET_SIZE: 返回鏈里包含的區(qū)塊數(shù)量。
IS_VALID: 檢查該區(qū)塊鏈?zhǔn)欠裼行?。具體檢查邏輯在后續(xù)介紹。
第一版的所有代碼在我的github上。
執(zhí)行測(cè)試程序ZBLOCKCHAIN_V1,輸入您想創(chuàng)建的區(qū)塊個(gè)數(shù),會(huì)看到如下輸出:(我選擇的個(gè)數(shù)是5)
因?yàn)镾AP GUI沒(méi)有鏈表的UI控件,因此我用樹(shù)控件模擬。
下圖第21行,我把區(qū)塊鏈里索引為1的區(qū)塊內(nèi)容篡改為"Change by Jerry", 然后再執(zhí)行第23行的is_valid方法進(jìn)行檢查:
因?yàn)榈?1行set_data方法修改了第一個(gè)區(qū)塊的內(nèi)容后,會(huì)觸發(fā)其哈希值的重新計(jì)算。這樣第一個(gè)區(qū)塊的哈希發(fā)生了變化(假設(shè)從YYY變到了CCC),而第二個(gè)區(qū)塊的pHash仍然指向第一個(gè)區(qū)塊變化之前的舊哈希值YYY,因此這個(gè)區(qū)塊鏈被判定為無(wú)效。
上圖的輸出來(lái)自校驗(yàn)方法is_valid: 遍歷鏈里每個(gè)區(qū)塊,比較區(qū)塊里存儲(chǔ)前一區(qū)塊哈希值的字段pHash和位于該區(qū)塊前一個(gè)位置的區(qū)塊的哈希值是否一致。
版本2:增加挖礦成本,增加對(duì)工作量證明(Proof of Work,縮寫為POW)的支持第二版代碼的地址在我的github上。
這一版的鏈實(shí)現(xiàn)類ZCL_BLOCKCHAIN_V2的構(gòu)造函數(shù)增加了一個(gè)輸入?yún)?shù):iv_difficulty。這個(gè)參數(shù)有什么用?
仔細(xì)觀察第一版測(cè)試程序的樹(shù)狀輸出,可以看到每個(gè)區(qū)塊的哈希值沒(méi)有任何規(guī)律。而第二版的這個(gè)輸入?yún)?shù)就是為了提高哈希值的計(jì)算成本,即只有當(dāng)計(jì)算出來(lái)的哈希值滿足一定規(guī)則時(shí),該哈希值才能被區(qū)塊鏈所接受。參數(shù)iv_difficulty定義了能夠被接受的哈希值的前導(dǎo)零個(gè)數(shù)。
例如我指定前導(dǎo)零個(gè)數(shù)為3:
執(zhí)行結(jié)果:能看到所有的哈希值的前三位都為零。
這里有兩個(gè)問(wèn)題:
下圖最后一列Nonce的含義是什么?
iv_difficulty這個(gè)參數(shù)是如何參與哈希值計(jì)算的呢?
首先在區(qū)塊的實(shí)現(xiàn)類ZCL_BLOCK里增加了一個(gè)新的成員字段mv_nonce:
在將一個(gè)區(qū)塊實(shí)例添加到鏈里的方法add_block里,增加了一個(gè)方法mine。
這個(gè)方法里是一個(gè)循環(huán),在循環(huán)體內(nèi)計(jì)算出一個(gè)哈希值,然后檢查其是否包含指定位數(shù)的前導(dǎo)零。如果沒(méi)有,將mv_nonce加1,然后繼續(xù)循環(huán)。mv_nonce也會(huì)作為輸入的一部分參與哈希計(jì)算。也就是說(shuō),最終區(qū)塊字段mv_nonce的值代表了代表了在得到符合前導(dǎo)零位數(shù)要求的合法哈希值之前,一共經(jīng)過(guò)了多少次計(jì)算。而通過(guò)在循環(huán)里不斷嘗試最終得到一個(gè)合法的哈希值的這一過(guò)程,就是區(qū)塊鏈圈內(nèi)俗稱的“挖礦”。
在我的測(cè)試系統(tǒng)里,創(chuàng)建10個(gè)區(qū)塊,前導(dǎo)零個(gè)數(shù)為4,總共花費(fèi)了10秒鐘。
從這個(gè)花費(fèi)的時(shí)間能體會(huì)出,POW其實(shí)是一種機(jī)制,通過(guò)引入需要一定工作量的哈希計(jì)算來(lái)避免區(qū)塊鏈被垃圾填充或者區(qū)塊內(nèi)容被篡改。
版本3:使用區(qū)塊鏈記錄交易明細(xì),增加挖礦獎(jiǎng)勵(lì)這一版的源代碼:
https://github.com/i042416/Kn...
使用ZCL_TRANSACTION來(lái)代表一筆交易,包含三個(gè)字段:mv_from_address(支付方),mv_to_address(收款方)和mv_amount(交易金額)。
在這一版本里,首先被增強(qiáng)的是ZCL_BLOCK3: 去掉了前兩個(gè)版本使用的mv_index和mv_data字段,增加了一個(gè)字段mt_transaction, 存儲(chǔ)的是交易的集合。
在計(jì)算哈希值時(shí),交易類的每一個(gè)字段也要參與計(jì)算:
類ZCL_BLOCKCHAIN_V3增加了一個(gè)新的成員變量mt_pending_trans。每次調(diào)用方法create_transaction,并不會(huì)創(chuàng)建一個(gè)新的區(qū)塊用于記錄該條交易,只是簡(jiǎn)單地把該條交易添加到待處理任務(wù)隊(duì)列mt_pending_trans里。
字段mv_mine_reward存儲(chǔ)了挖礦的獎(jiǎng)勵(lì),硬編碼成100。
這個(gè)待處理任務(wù)隊(duì)列僅當(dāng)方法mine_pending_trans被調(diào)用時(shí)才會(huì)得到處理。
第6行的區(qū)塊實(shí)例的mine方法調(diào)用之后,計(jì)算出一個(gè)符合前導(dǎo)零規(guī)范的哈希值。接著待處理任務(wù)隊(duì)列被清空,然后一個(gè)新的交易記錄在第13行被創(chuàng)建出來(lái),作為挖礦的獎(jiǎng)勵(lì),獎(jiǎng)勵(lì)方的賬號(hào)信息由輸入?yún)?shù)iv_award_address定義。
既然現(xiàn)在交易信息存儲(chǔ)在了每個(gè)區(qū)塊里,那么簡(jiǎn)單遍歷這些區(qū)塊,就能得出某個(gè)賬號(hào)最后的余額是多少。采用的邏輯是,遍歷每個(gè)區(qū)塊記錄的每筆交易,如果某帳號(hào)出現(xiàn)在交易記錄的支付方,則余額減去當(dāng)前這筆交易的交易金額(第5行), 反之賬號(hào)如果出現(xiàn)在發(fā)送方,則余額加上交易金額(第9行)。
測(cè)試程序如下。因?yàn)門om轉(zhuǎn)了100元給Jerry,Jerry又轉(zhuǎn)了10元給Tom,然后第15行挖礦設(shè)置的獎(jiǎng)勵(lì)賬號(hào)是Jerry,故最后Jerry的余額是100-10+100 = 190元。
希望您讀完本文之后,對(duì)區(qū)塊鏈的工作原理有一個(gè)最基本的認(rèn)識(shí)。感謝閱讀。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/94743.html
摘要:我的這篇文章沒(méi)有任何高大上的術(shù)語(yǔ),就是行代碼,實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的區(qū)塊鏈原型。檢查該區(qū)塊鏈?zhǔn)欠裼行?。而通過(guò)在循環(huán)里不斷嘗試最終得到一個(gè)合法的哈希值的這一過(guò)程,就是區(qū)塊鏈圈內(nèi)俗稱的挖礦。 不知從什么時(shí)候起,區(qū)塊鏈在網(wǎng)上一下子就火了。 showImg(https://segmentfault.com/img/remote/1460000014744826); 這里Jerry就不班門弄斧了,網(wǎng)上...
摘要:在她的幫助下,原型發(fā)布順利完成。節(jié)點(diǎn)收到一個(gè)交易后,會(huì)根據(jù)判斷標(biāo)準(zhǔn)對(duì)該交易進(jìn)行有效性校驗(yàn),無(wú)效的交易會(huì)被廢棄。負(fù)責(zé)權(quán)限管理,成員身份相關(guān)證書(shū)管理和維護(hù)交易相關(guān)證書(shū)管理等等。 今天的文章來(lái)自Wen Aviva, 坐Jerry面對(duì)面的程序媛。 Jerry在之前的公眾號(hào)文章《在SAP UI中使用純JavaScript顯示產(chǎn)品主數(shù)據(jù)的3D模型視圖》已經(jīng)介紹過(guò)Aviva了,SAP成都C4C開(kāi)發(fā)團(tuán)...
摘要:實(shí)現(xiàn)步驟非常簡(jiǎn)單,在標(biāo)準(zhǔn)程序的內(nèi)創(chuàng)建一個(gè)隱式增強(qiáng)。禁止在測(cè)試服務(wù)器和生產(chǎn)服務(wù)器使用否則由此造成的一切負(fù)面后果,本人及概不負(fù)責(zé)。 最近Jerry在忙一個(gè)項(xiàng)目,技術(shù)棧換成了nodejs平臺(tái),語(yǔ)言換成了JavaScript,因?yàn)橼s項(xiàng)目進(jìn)度,一直沒(méi)時(shí)間更新公眾號(hào)。感謝大家的支持,關(guān)注人數(shù)還是慢慢地增長(zhǎng)到了3000。 showImg(https://segmentfault.com/img/re...
摘要:比如的的個(gè)性化設(shè)置是這樣的,字體必須用程序猿專用的等寬開(kāi)源字體,這樣顯得比較專業(yè)。我覺(jué)得網(wǎng)上流傳的程序猿和工具的鄙視鏈很無(wú)聊,與其有時(shí)間去鄙視別人,不如把這時(shí)間用來(lái)深入研究自己每天用的,進(jìn)一步提高自己?jiǎn)挝粫r(shí)間內(nèi)的工作效率。 Jerry和SAP成都研究院一些新同事聊天時(shí),談到ABAP和SAP GUI這個(gè)話題。很多新同事在加入SAP成都之前,是做Java和C++開(kāi)發(fā)的,習(xí)慣了Eclipse...
摘要:而且這種現(xiàn)象在德國(guó)的法定節(jié)假日里更加突出。所以本文提到的這些東西都是在德國(guó)節(jié)假日里無(wú)聊的產(chǎn)物,對(duì)于顧問(wèn)的實(shí)際工作可能幫助不大。這也是在這篇文章里介紹的眾多用搞出來(lái)的無(wú)聊的東西里唯一被官方認(rèn)可的工具,囧。直接用執(zhí)行里的事務(wù)碼或者函數(shù)。 國(guó)慶大假馬上就要來(lái)臨了,我們聊點(diǎn)輕松的話題,關(guān)于假期。 Jerry的成都同事李貝寧(Li Ben), 《SAP成都研究院李三郎:SCP Applicati...
閱讀 2458·2021-11-19 09:40
閱讀 3586·2021-11-17 17:08
閱讀 3784·2021-09-10 10:50
閱讀 2214·2019-08-27 10:56
閱讀 1942·2019-08-27 10:55
閱讀 2638·2019-08-26 12:14
閱讀 994·2019-08-26 11:58
閱讀 1493·2019-08-26 10:43