“區(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í)你們可以
看到,塊的順序和散列值都正確闸准。