區(qū)塊鏈難理解程拭?200行代碼教你寫一個(gè)自己的區(qū)塊鏈定踱!

“區(qū)塊鏈”三個(gè)字,無(wú)疑是近一年來(lái)最火的投資概念哺壶。隨著比特幣等區(qū)塊鏈資產(chǎn)

價(jià)格的大幅飆升屋吨,普通投資者對(duì)區(qū)塊鏈,以及數(shù)字貨幣投資的興趣越來(lái)越大山宾,突

然間至扰,似乎全世界都在談?wù)搮^(qū)塊鏈、比特幣资锰。

區(qū)塊鏈就像一次對(duì)全人類經(jīng)濟(jì)層面的入侵敢课,這種入侵,比互聯(lián)網(wǎng)的入侵绷杜,可能還?

要徹底直秆,人們開始轉(zhuǎn)移的,并不是簡(jiǎn)單的信息以及消費(fèi)習(xí)慣鞭盟,而是對(duì)資產(chǎn)的重新

認(rèn)識(shí)和選擇圾结。

區(qū)塊鏈難理解?這里有一篇初學(xué)者指南

我并不明白為什么人們會(huì)覺(jué)得要理解區(qū)塊鏈會(huì)有點(diǎn)難齿诉,而我也想知道為什么自己

并沒(méi)有筝野。

那是在 2013 年,我第一次聽(tīng)說(shuō)有比特幣這個(gè)東西(是的粤剧,知道的太晚啦)歇竟。我

窮得連一個(gè)都買不起,看到這兒你也許已經(jīng)對(duì)此文無(wú)愛(ài)了抵恋。

后來(lái)焕议,我想要去了解一下它所依賴的底層技術(shù),也就是區(qū)塊鏈弧关。 不過(guò)因?yàn)樘?/p>

了盅安,所以遲遲沒(méi)有開始(那就并不存在什么開始不開始了)唤锉。

“區(qū)塊鏈”到底是什么?

區(qū)塊鏈其實(shí)是兩個(gè)東西:一個(gè)是區(qū)塊,一個(gè)是鏈宽堆。說(shuō)玄虛一點(diǎn)腌紧,就是一鏈子的區(qū)

塊。因?yàn)樗谴嬖谟谟?jì)算機(jī)中的東西畜隶,所以我們可以厘定它的一個(gè)物理形態(tài)是啥

樣子的,就是數(shù)字信息被分成一個(gè)一個(gè)區(qū)塊然后把這些區(qū)塊鏈接起來(lái)号胚。

舉個(gè)例子籽慢,下圖中的方塊,每一個(gè)都表示一個(gè)國(guó)家猫胁,而且每一個(gè)都包含了對(duì)應(yīng)國(guó)

家的城市名稱箱亿。

等等,其實(shí)還有更多東西來(lái)著弃秆。這里的每一個(gè)方塊都是一個(gè)叫做哈希的東西届惋。一

個(gè)哈希就是一串字符 (比如 “1hi515AHA5H” )。

哈希是根據(jù)方塊里面所包含的信息來(lái)得到的菠赚。U.S.A 的方塊擁有 New York, Los

Angeles脑豹,還有 Chicago 這幾個(gè)城市,所以它的哈希就是像 “NYLAC” 的東西了

(技術(shù)上其實(shí)遠(yuǎn)非如此衡查,但你理會(huì)精要就行了)瘩欺。

每一個(gè)接續(xù)的方塊都會(huì)包含前一個(gè)方塊的哈希,所以這個(gè)就是(強(qiáng)制性的)將它

們綁到一起的紐帶拌牲。

如果有人擅自篡改了第一個(gè)方塊俱饿,加入了城市 Boston,那么新的哈希就會(huì)是

“NYLACB”塌忽。

然而后面接續(xù)的 India 這個(gè)方塊已經(jīng)存著的哈希還是 “NYLAC”拍埠,這種不匹配就

會(huì)把鏈條打斷。所以哈希的目的就是確保沒(méi)有人可以篡改區(qū)塊土居。

那如果有人修改了一個(gè)方塊的內(nèi)容枣购,然后把后面的接續(xù)方塊的哈希也一并更新會(huì)

如何呢?

這也是有可能的,不過(guò)有一件事情我還沒(méi)有告訴你装盯。區(qū)塊鏈的數(shù)據(jù)并不只是存在

于僅僅一臺(tái)計(jì)算機(jī)里面坷虑。一臺(tái)計(jì)算機(jī)里面的區(qū)塊鏈數(shù)據(jù)并不能騙到人,因?yàn)樗鼤?huì)

被復(fù)制到網(wǎng)絡(luò)中每一個(gè)用戶的計(jì)算機(jī)里面去埂奈。

如果你加入了一個(gè)區(qū)塊鏈網(wǎng)絡(luò)迄损,那么你的計(jì)算機(jī)就會(huì)去下載這些區(qū)塊數(shù)據(jù),如果

有人篡改了他擁有的版本账磺,整個(gè)網(wǎng)絡(luò)也會(huì)考慮占多數(shù)的人的計(jì)算機(jī)上所擁有的版

本才是正確的芹敌。

還有一件事痊远,在一個(gè)區(qū)塊鏈網(wǎng)絡(luò)中,不僅是數(shù)據(jù)氏捞,就連整個(gè)系統(tǒng)的程序都被復(fù)制

到了所有的電腦中碧聪。

大多數(shù)互聯(lián)網(wǎng)應(yīng)用都是集中化的,比如 Facebook液茎,她的數(shù)據(jù)和程序都被放在了她

的服務(wù)器上逞姿,你的計(jì)算機(jī)會(huì)從 Facebook 的服務(wù)器上獲取到你一個(gè)人需要知道的

信息。

但在區(qū)塊鏈的世界理捆等,就沒(méi)有存在于中心的東西滞造,它依賴的是用戶的計(jì)算機(jī)來(lái)容

納自己的程序。這就意味著栋烤,如果整個(gè)區(qū)塊鏈網(wǎng)絡(luò)中的每一臺(tái)電腦都關(guān)機(jī)了谒养,那

么這個(gè)區(qū)塊鏈系統(tǒng)就死翹翹了。

公共區(qū)塊鏈

這是不是就意味著區(qū)塊鏈系統(tǒng)其實(shí)就是由一群心懷善意自愿讓他們的計(jì)算機(jī)保持

運(yùn)行的人來(lái)組成的呢? 還有這些防篡改的區(qū)塊是用來(lái)干嘛的呢?

區(qū)塊鏈網(wǎng)絡(luò)的功效不勝枚舉明郭。比特幣是一種數(shù)據(jù)貨幣和一個(gè)支付系統(tǒng)买窟。它所有的

防篡改區(qū)塊中所保存的就是全部交易的分類賬。那些貢獻(xiàn)了他們自己的計(jì)算機(jī)的

人被稱為礦工薯定。系統(tǒng)會(huì)給他們提供比特幣作為獎(jiǎng)勵(lì)始绍。

Ethereum 有一項(xiàng)附加功能。它可以承載你的代碼沉唠,從頭開始發(fā)展出一個(gè)區(qū)塊鏈系

統(tǒng)疆虚。

而要構(gòu)建一個(gè)屬于你自己的系統(tǒng)也許會(huì)非常地困難(記住這得看有人為你犧牲他

們的計(jì)算機(jī)運(yùn)行能力才行哦)。Ethereum 就維護(hù)著這些耗損巨大的運(yùn)算能力满葛,而

你則需要為這些計(jì)算消耗買單径簿。

區(qū)塊鏈應(yīng)用并不非得是支付系統(tǒng)或者加密貨幣。它可以是任何東西嘀韧,像是一個(gè)社

交網(wǎng)絡(luò)篇亭,一個(gè)像 LiveEdu 這樣的學(xué)習(xí)平臺(tái),等等锄贷。

私有區(qū)塊鏈

Bitcoin译蒂,Ethereum 等等這些都是公共區(qū)塊鏈的例子,任何人都可以成為其中的

一分子谊却。

那如果我們想要有一個(gè)私有的區(qū)塊鏈網(wǎng)絡(luò)該如何呢柔昼?有些人想要一個(gè)私有的區(qū)塊

鏈?zhǔn)窍敫陕锬兀磕蔷蛠?lái)瞧瞧下面的故事吧炎辨。

Mark 和 Sara

Mark 已經(jīng)五個(gè)月沒(méi)交房租了捕透,當(dāng) Sara 找他要的時(shí)候,他就說(shuō)晚點(diǎn)會(huì)給她。她付

不起律師費(fèi)乙嘀,而法院強(qiáng)制執(zhí)行訴訟就需要 8 個(gè)月甚至一年末购,所以唯一的選擇就是

去說(shuō)服 Mark。

Joe 的生意

Joe 是一個(gè)商人虎谢,他經(jīng)常要跟不同的公司做生意盟榴。幾個(gè)月之前他和一家零售商簽

了一份合同,盡管合同條款都已經(jīng)履約了婴噩,可零售商卻拒絕付款擎场。

這幫人利用法律制度中的漏洞來(lái)游說(shuō) Joe,想以此達(dá)到少付錢的目的讳推。Joe 在這

以前就是有這方面經(jīng)驗(yàn)的顶籽,在某些情況下,他會(huì)找法院求助银觅,但這樣做所耗費(fèi)的

時(shí)間和金錢卻要損失他自己的利潤(rùn)。

我們?cè)撊绾螏椭?Sara 和 Joe 呢?

我們是不是能在其他地方解決這個(gè)問(wèn)題呢? 在 Sara 遇到的這種情況中坏为,我們需

要讓 Mark 按月支付房租究驴,這其實(shí)就是一個(gè)基于時(shí)間的觸發(fā)機(jī)制。你的日歷程序

使用這樣的觸發(fā)器來(lái)給你提供預(yù)設(shè)事件的通知匀伏。

在 Joe 遇到的場(chǎng)景中洒忧,一旦合約中的條款都滿足了,當(dāng)事人就得付款够颠,這其實(shí)就

是一個(gè)基于條件的觸發(fā)機(jī)制熙侍。你想想上次從 Amazon 買電子書的時(shí)候,是不是得

先確認(rèn)付款了履磨,Amazon 才會(huì)把電子書發(fā)給你蛉抓?

重點(diǎn)是,計(jì)算機(jī)程序會(huì)始終如一的執(zhí)行諸如此類的指令剃诅。當(dāng)你點(diǎn)擊著這篇文章巷送,

向下滾動(dòng),諸如這類的操作矛辕,它也會(huì)照著執(zhí)行不誤笑跛。為了能幫助到 Sara ,我們

需要將合同的條款轉(zhuǎn)變成代碼聊品。

Sara 和 Mark 之間所訂立的智能合同的偽代碼

If today’s date is 30th and rent is not paid then

Transfer $500 from Mark’s account to Sara’s account

可是我們?cè)谀膬翰渴疬@些代碼呢? 它就應(yīng)該被部署到所有參與者的計(jì)算機(jī)上飞蹂。

Sara 的還有 Mark 的銀行都會(huì)是這一個(gè)私有區(qū)塊鏈網(wǎng)絡(luò)的一部分。

Joe 和 Sara 會(huì)簽署一份編碼的協(xié)議(也就是智能合同)翻屈,然后這份協(xié)議會(huì)被分發(fā)

到網(wǎng)絡(luò)中去陈哑,Mark 的和 Sara 的銀行都會(huì)有一份拷貝。

在每個(gè)月的 30 號(hào),當(dāng)時(shí)鐘跳動(dòng)到 12 點(diǎn)整芥颈,協(xié)議好的金額就會(huì)從 Mark 的賬戶

轉(zhuǎn)移到 Sara 的賬戶上去惠勒。Joe 也開始使用智能合同來(lái)強(qiáng)制讓他的客戶支付協(xié)議

好的貨款。

Sara 高興了爬坑,因?yàn)樗僖膊挥萌┬?Mark 會(huì)不會(huì)如約付房租了纠屋。Joe 也高

興,因?yàn)樗膊挥谜曳ㄔ阂f(shuō)法了盾计,省下這些精力售担,他可以繼續(xù)發(fā)展自己的生

意了。

私有區(qū)塊鏈只限于業(yè)務(wù)中涉及到的相關(guān)各方署辉,因此 Joe 不會(huì)是 Sara 和 Mark 所

屬區(qū)塊鏈網(wǎng)絡(luò)的一部分族铆。

前行之路

現(xiàn)在你對(duì)此是不是已經(jīng)有點(diǎn)概念了?如果還是不理解哭尝,看看小編之前發(fā)布的文章

技術(shù)人再不懂區(qū)塊鏈哥攘,你就OUT了?不過(guò)下面這篇文章也能讓你秒懂區(qū)塊鏈材鹦。

區(qū)塊鏈與裸照:一個(gè)去中心化的色情網(wǎng)站是什么樣的逝淹?

“區(qū)塊鏈”概念已火,雖然大部分人對(duì)“區(qū)塊鏈”好奇桶唐,甚至眼饞栅葡,但不少還處

于不求甚解的懵逼階段.....正好最近我一直在研究區(qū)塊鏈,同時(shí)也見(jiàn)了幾個(gè)圈內(nèi)

人深聊了下尤泽,就想為大家寫一個(gè)“入門級(jí)”的區(qū)塊鏈介紹文章欣簇。

為了通俗易懂,我決定不惜自毀清譽(yù)坯约,用充滿荷爾蒙的比喻熊咽。因?yàn)榧祭顺泵看未_

實(shí)都性感得讓人荷爾蒙爆炸啊,性(huang)感(bao)內(nèi)容開始鬼店。

以前网棍,大家想看陳老師的裸照,都要去一個(gè)叫 1025 的網(wǎng)站妇智,這就是中心化滥玷。

后來(lái),1025 網(wǎng)站被和諧掉了巍棱,大部分猥瑣男們傻逼了沒(méi)有網(wǎng)站看片了惑畴,因?yàn)樗麄?/p>

太相信中心化組織了,還天天被 1025 彈窗“皇家澳門賭場(chǎng)”的小廣告真是活該

啊航徙。

不過(guò)沒(méi)關(guān)系如贷,陳老師的 2100 張裸照,幸存在 100 萬(wàn)個(gè)猥瑣男的電腦里,除非地

球毀滅杠袱,不然陳老師的裸照不可能絕跡尚猿。這就是去中心化,數(shù)據(jù)分布式存儲(chǔ)楣富。

后來(lái)凿掂,有個(gè)叫“中本粗”的超級(jí)猥瑣男,是陳老師 2100 張裸照的超級(jí)發(fā)騷友纹蝴。

為了2100張照片永遠(yuǎn)不消失庄萎,為世人所享用,他做了一個(gè)互聯(lián)網(wǎng)共享文件夾“陳

老師plus”塘安。

如果猥瑣男們想獲取“陳老師plus”2100 張的觀看權(quán)糠涛,就必須加入一個(gè)電子協(xié)議

中:不得復(fù)制、修改兼犯、P 任何“陳老師plus”中的照片忍捡,用戶在“陳老師

plus”發(fā)生的任何行為,都會(huì)按時(shí)間戳記錄切黔!

例如锉罐,“小張?jiān)?2018 年 1 月 9 日中午 12:00,查看了編號(hào)為 103 的照片绕娘,

并在 13:00 刪除了編號(hào) 1-100 的 100 張照片.....”

小張的行為被記錄并廣播給其他 100 萬(wàn)個(gè)猥瑣男,“陳老師plus”的 2100 張照

片會(huì)得到保護(hù)栽连,小張電腦中“陳老師plus”會(huì)按時(shí)間戳中最新記錄险领,同步其他

100 萬(wàn)個(gè)猥瑣男的電腦里的數(shù)據(jù),復(fù)原小張電腦中的數(shù)據(jù)...

小張永遠(yuǎn)別想對(duì)“陳老師plus”搞修改破壞秒紧,且所有行為都同步記錄在其他猥瑣

男的電腦里绢陌。

這就是區(qū)塊鏈,數(shù)據(jù)分散存儲(chǔ)熔恢,去中心化脐湾,按時(shí)間戳廣播記錄所有行為,無(wú)法修

改叙淌、破壞數(shù)據(jù)源或造假秤掌,除非同一時(shí)刻炸掉 100 萬(wàn)個(gè)猥瑣男的電腦,或互聯(lián)網(wǎng)消

失鹰霍,或世界毀滅.....

當(dāng)然闻鉴,也有唯一一種特殊情況,可以增加“陳老師plus”文件夾中的照片茂洒,這種

情況叫做“區(qū)塊鏈共識(shí)層”,顧名思義,這是 100 萬(wàn)猥瑣男達(dá)成的增加照片共

識(shí)男摧,你不能瞎增加的。

中本粗最初設(shè)定協(xié)議時(shí)斤贰,把“猥瑣男們可以用 X 相機(jī),在每年 XX 時(shí)間次询,拍陳老

師的裸照荧恍,前 100 張可以添加進(jìn)入‘陳老師plus’中增加作為文件夾照片”,那

么渗蟹,“陳老師plus”每年就可以增長(zhǎng) 100 張照片了块饺。

當(dāng)然,你還可以給照片估價(jià)嘛雌芽,發(fā)行“陳老師plus”幣授艰。因?yàn)椋瓣惱蠋?/p>

plus”中每張照片都是不可造假破壞的世落,所以具有唯一性淮腾,還有單獨(dú)編號(hào),我們

就給每一張照片估價(jià)屉佳,它不就值錢了嗎谷朝?就像現(xiàn)實(shí)世界中無(wú)法復(fù)制的名畫一樣

啊武花!

怎么估值圆凰?就進(jìn)行所謂的 ICO(Initial Coin Offering)啊,就是我和李哭來(lái)老

師成立一個(gè)基金体箕,舉行一張發(fā)布會(huì)专钉,就說(shuō)我們給這 2100 張照片估值個(gè) 1.05

億!每張照片 5 萬(wàn)累铅!

我們先丟 5050 萬(wàn)進(jìn)去認(rèn)購(gòu)前 1100 張跃须,其他猥瑣男可以眾籌 5000 萬(wàn)買剩下的

1000 張照片,不想要了娃兽?賣給我和李哭來(lái)基金就行菇民,我們認(rèn)它值錢啊,我們這么

牛逼不會(huì)騙你的投储。

自從有了區(qū)塊鏈——我們?cè)僖膊慌?1025 們作惡第练,給我們彈窗小廣告,給我們下

病毒了轻要;再也不怕陳老師的照片丟失被破壞了复旬,1984 老大哥復(fù)活都做不到.....

當(dāng)然,也有煩惱冲泥,就是有炒名畫的現(xiàn)在來(lái)炒“陳老師plus”照片了驹碍,把價(jià)格搞得

很高壁涎。

還有的更猥瑣,為了賺錢志秃,自己拍了一堆裸照按照這個(gè)模式弄了個(gè)“某某老師

plus”東施效顰收割韭菜怔球,這就叫山寨幣,現(xiàn)在大概快一百種了吧浮还。

看到這里竟坛,你肯定能明白區(qū)塊鏈了......最后,教大家怎么用 200 行 Go 代碼寫

一個(gè)自己的區(qū)塊鏈钧舌!

只用 200 行 Go 代碼寫一個(gè)自己的區(qū)塊鏈

這篇文章就是幫助你使用 Go 語(yǔ)言來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的區(qū)塊鏈担汤,用不到 200 行代碼

來(lái)揭示區(qū)塊鏈的原理!

“用不到 200 行 Go 代碼就能實(shí)現(xiàn)一個(gè)自己的區(qū)塊鏈洼冻!” 聽(tīng)起來(lái)有意思嗎崭歧?有

什么能比開發(fā)一個(gè)自己的區(qū)塊鏈更好的學(xué)習(xí)實(shí)踐方法呢?那我們就一起來(lái)實(shí)踐

下撞牢!

因?yàn)槲覀兪且患覐氖箩t(yī)療健康領(lǐng)域的科技公司率碾,所以我們采用人類平靜時(shí)的心跳

數(shù)據(jù)(BPM 心率)作為這篇文章中的示例數(shù)據(jù)。

讓我們先來(lái)統(tǒng)計(jì)一下你一分鐘內(nèi)的心跳數(shù)屋彪,然后記下來(lái)所宰,這個(gè)數(shù)字可能會(huì)在接下

來(lái)的內(nèi)容中用到。

通過(guò)本文畜挥,你將可以做到:

創(chuàng)建自己的區(qū)塊鏈

理解 hash 函數(shù)是如何保持區(qū)塊鏈的完整性

如何創(chuàng)造并添加新的塊

多個(gè)節(jié)點(diǎn)如何競(jìng)爭(zhēng)生成塊

通過(guò)瀏覽器來(lái)查看整個(gè)鏈

所有其他關(guān)于區(qū)塊鏈的基礎(chǔ)知識(shí)

但是仔粥,對(duì)于比如工作量證明算法(PoW)以及權(quán)益證明算法(PoS)這類的共識(shí)算

法文章中將不會(huì)涉及。

同時(shí)為了讓你更清楚得查看區(qū)塊鏈以及塊的添加蟹但,我們將網(wǎng)絡(luò)交互的過(guò)程簡(jiǎn)化

了件炉,關(guān)于 P2P 網(wǎng)絡(luò)比如“全網(wǎng)廣播”這個(gè)過(guò)程等內(nèi)容將在下一篇文章中補(bǔ)上。讓

我們開始吧矮湘!

設(shè)置

我們假設(shè)你已經(jīng)具備一點(diǎn) Go 語(yǔ)言的開發(fā)經(jīng)驗(yàn)。在安裝和配置 Go 開發(fā)環(huán)境后之

后口糕,我們還要獲取以下一些依賴:

go get http://github.com/davecgh/go-spew/spew

spew 可以幫助我們?cè)?console 中直接查看 struct 和 slice 這兩種數(shù)據(jù)結(jié)構(gòu)缅阳。

go get http://github.com/gorilla/mux

Gorilla 的 mux 包非常流行, 我們用它來(lái)寫 Web handler景描。

go get http://github.com/joho/godotenv

godotenv 可以幫助我們讀取項(xiàng)目根目錄中的 .env 配置文件十办,這樣我們就不用將

http port 之類的配置硬編碼進(jìn)代碼中了。比如像這樣:

ADDR=8080

接下來(lái)超棺,我們創(chuàng)建一個(gè) main.go 文件向族。之后我們的大部分工作都圍繞這個(gè)文件,

讓我開始編碼吧棠绘!

導(dǎo)入依賴

我們將所有的依賴包以聲明的方式導(dǎo)入進(jìn)去:

數(shù)據(jù)模型

接著我們來(lái)定義一個(gè)結(jié)構(gòu)體件相,它代表組成區(qū)塊鏈的每一個(gè)塊的數(shù)據(jù)模型:

Index 是這個(gè)塊在整個(gè)鏈中的位置再扭。

Timestamp 顯而易見(jiàn)就是塊生成時(shí)的時(shí)間戳。

Hash 是這個(gè)塊通過(guò) SHA256 算法生成的散列值夜矗。

PrevHash 代表前一個(gè)塊的 SHA256 散列值泛范。

BPM 每分鐘心跳數(shù),也就是心率紊撕。還記得文章開頭說(shuō)到的嗎罢荡?

接著,我們?cè)俣x一個(gè)結(jié)構(gòu)表示整個(gè)鏈对扶,最簡(jiǎn)單的表示形式就是一個(gè) Block 的

slice:

var Blockchain []Block

我們使用散列算法(SHA256)來(lái)確定和維護(hù)鏈中塊和塊正確的順序区赵,確保每一個(gè)

塊的 PrevHash 值等于前一個(gè)塊中的 Hash 值,這樣就以正確的塊順序構(gòu)建出

鏈:

散列和生成塊

我們?yōu)槭裁葱枰⒘欣四希恐饕莾蓚€(gè)原因:

在節(jié)省空間的前提下去唯一標(biāo)識(shí)數(shù)據(jù)笼才。散列是用整個(gè)塊的數(shù)據(jù)計(jì)算得

出,在我們的例子中逞泄,將整個(gè)塊的數(shù)據(jù)通過(guò) SHA256 計(jì)算成一個(gè)定長(zhǎng)不可

偽造的字符串患整。

維持鏈的完整性。通過(guò)存儲(chǔ)前一個(gè)塊的散列值喷众,我們就能夠確保每個(gè)塊

在鏈中的正確順序各谚。任何對(duì)數(shù)據(jù)的篡改都將改變散列值,同時(shí)也就破壞了

鏈到千。 以我們從事的醫(yī)療健康領(lǐng)域?yàn)槔常热缬幸粋€(gè)惡意的第三方為了調(diào)

整“人壽險(xiǎn)”的價(jià)格,而修改了一個(gè)或若干個(gè)塊中的代表不健康的 BPM

值憔四,那么整個(gè)鏈都變得不可信了膀息。

我們接著寫一個(gè)函數(shù),用來(lái)計(jì)算給定的數(shù)據(jù)的 SHA256 散列值:

這個(gè) calculateHash 函數(shù)接受一個(gè)塊了赵,通過(guò)塊中的 Index潜支,Timestamp,BPM柿汛,以

及 PrevHash 值來(lái)計(jì)算出 SHA256 散列值冗酿。

接下來(lái)我們就能便攜一個(gè)生成塊的函數(shù):

其中,Index 是從給定的前一塊的 Index 遞增得出络断,時(shí)間戳是直接通過(guò)

time.Now() 函數(shù)來(lái)獲得的裁替,Hash 值通過(guò)前面的 calculateHash 函數(shù)計(jì)算得出,

PrevHash 則是給定的前一個(gè)塊的 Hash 值貌笨。

校驗(yàn)塊

搞定了塊的生成弱判,接下來(lái)我們需要有函數(shù)幫我們判斷一個(gè)塊是否有被篡改。檢查

Index 來(lái)看這個(gè)塊是否正確得遞增锥惋,檢查 PrevHash 與前一個(gè)塊的 Hash 是否一

致昌腰,再來(lái)通過(guò) calculateHash 檢查當(dāng)前塊的 Hash 值是否正確开伏。

通過(guò)這幾步我們就能寫出一個(gè)校驗(yàn)函數(shù):

除了校驗(yàn)塊以外,我們還會(huì)遇到一個(gè)問(wèn)題:兩個(gè)節(jié)點(diǎn)都生成塊并添加到各自的鏈

上剥哑,那我們應(yīng)該以誰(shuí)為準(zhǔn)硅则?這里的細(xì)節(jié)我們留到下一篇文章,這里先讓我們記住

一個(gè)原則:始終選擇最長(zhǎng)的鏈株婴。

通常來(lái)說(shuō)怎虫,更長(zhǎng)的鏈表示它的數(shù)據(jù)(狀態(tài))是更新的,所以我們需要一個(gè)函數(shù)能

幫我們將本地的過(guò)期的鏈切換成最新的鏈:

到這一步困介,我們基本就把所有重要的函數(shù)完成了大审。接下來(lái),我們需要一個(gè)方便直

觀的方式來(lái)查看我們的鏈座哩,包括數(shù)據(jù)及狀態(tài)徒扶。通過(guò)瀏覽器查看 Web 頁(yè)面可能是最

合適的方式!

Web 服務(wù)

我猜你一定對(duì)傳統(tǒng)的 Web 服務(wù)及開發(fā)非常熟悉根穷,所以這部分你肯定一看就會(huì)姜骡。

借助 Gorilla/mux 包,我們先寫一個(gè)函數(shù)來(lái)初始化我們的 Web 服務(wù):

其中的端口號(hào)是通過(guò)前面提到的 .env 來(lái)獲得屿良,再添加一些基本的配置參數(shù)圈澈,這

個(gè) web 服務(wù)就已經(jīng)可以 listen and serve 了!

接下來(lái)我們?cè)賮?lái)定義不同 endpoint 以及對(duì)應(yīng)的 handler尘惧。例如康栈,對(duì)“/”的 GET

請(qǐng)求我們可以查看整個(gè)鏈,“/”的 POST 請(qǐng)求可以創(chuàng)建塊喷橙。

GET 請(qǐng)求的 handler:

為了簡(jiǎn)化啥么,我們直接以 JSON 格式返回整個(gè)鏈,你可以在瀏覽器中訪問(wèn)

localhost:8080 或者 127.0.0.1:8080 來(lái)查看(這里的 8080 就是你在 .env 中

定義的端口號(hào) ADDR)贰逾。

POST 請(qǐng)求的 handler 稍微有些復(fù)雜悬荣,我們先來(lái)定義一下 POST 請(qǐng)求的

payload:

再看看 handler 的實(shí)現(xiàn):

我們的 POST 請(qǐng)求體中可以使用上面定義的 payload,比如:

{"BPM":75}

還記得前面我們寫的 generateBlock 這個(gè)函數(shù)嗎疙剑?它接受一個(gè)“前一個(gè)塊”參

數(shù)隅熙,和一個(gè) BPM 值。

POST handler 接受請(qǐng)求后就能獲得請(qǐng)求體中的 BPM 值核芽,接著借助生成塊的函數(shù)

以及校驗(yàn)塊的函數(shù)就能生成一個(gè)新的塊了!

除此之外酵熙,你也可以:

使用 spew.Dump 這個(gè)函數(shù)可以以非常美觀和方便閱讀的方式將

struct轧简、slice 等數(shù)據(jù)打印在控制臺(tái)里,方便我們調(diào)試匾二。

測(cè)試 POST 請(qǐng)求時(shí)哮独,可以使用 POSTMAN 這個(gè) chrome 插件拳芙,相比

curl它更直觀和方便。

POST 請(qǐng)求處理完之后皮璧,無(wú)論創(chuàng)建塊成功與否舟扎,我們需要返回客戶端一個(gè)響應(yīng):

快要大功告成了

接下來(lái),我們把這些關(guān)于區(qū)塊鏈的函數(shù)悴务,Web 服務(wù)的函數(shù)“組裝”起來(lái):

這里的 genesisBlock (創(chuàng)世塊)是 main 函數(shù)中最重要的部分睹限,通過(guò)它來(lái)初始

化區(qū)塊鏈,畢竟第一個(gè)塊的 PrevHash 是空的讯檐。

哦耶羡疗!完成了

你們可以從這里獲得完整的代碼:Github repo[1]

讓我們來(lái)啟動(dòng)它:

go run main.go

在終端中,我們可以看到 web 服務(wù)器啟動(dòng)的日志信息别洪,并且打印出了創(chuàng)世塊的信

息:

接著我們打開瀏覽器叨恨,訪問(wèn) localhost:8080 這個(gè)地址,我們可以看到頁(yè)面中展

示了當(dāng)前整個(gè)區(qū)塊鏈的信息(當(dāng)然挖垛,目前只有一個(gè)創(chuàng)世塊):

接著痒钝,我們?cè)偻ㄟ^(guò) POSTMAN 來(lái)發(fā)送一些 POST 請(qǐng)求:

刷新剛才的頁(yè)面,現(xiàn)在的鏈中多了一些塊痢毒,正是我們剛才生成的送矩,同時(shí)你們可以

看到,塊的順序和散列值都正確闸准。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末益愈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子夷家,更是在濱河造成了極大的恐慌蒸其,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件库快,死亡現(xiàn)場(chǎng)離奇詭異摸袁,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)义屏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門靠汁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人闽铐,你說(shuō)我怎么就攤上這事蝶怔。” “怎么了兄墅?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵踢星,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我隙咸,道長(zhǎng)沐悦,這世上最難降的妖魔是什么成洗? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮藏否,結(jié)果婚禮上瓶殃,老公的妹妹穿的比我還像新娘。我一直安慰自己副签,他們只是感情好遥椿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著继薛,像睡著了一般修壕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上遏考,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天慈鸠,我揣著相機(jī)與錄音,去河邊找鬼灌具。 笑死青团,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咖楣。 我是一名探鬼主播督笆,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼诱贿!你這毒婦竟也來(lái)了娃肿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤珠十,失蹤者是張志新(化名)和其女友劉穎料扰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焙蹭,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晒杈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了孔厉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拯钻。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖撰豺,靈堂內(nèi)的尸體忽然破棺而出粪般,到底是詐尸還是另有隱情,我是刑警寧澤污桦,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布亩歹,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏捆憎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一梭纹、第九天 我趴在偏房一處隱蔽的房頂上張望躲惰。 院中可真熱鬧,春花似錦变抽、人聲如沸础拨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)诡宗。三九已至,卻和暖如春击儡,著一層夾襖步出監(jiān)牢的瞬間塔沃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工阳谍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛀柴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓矫夯,卻偏偏與公主長(zhǎng)得像鸽疾,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子训貌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容