當前位置:
首頁 > 最新 > 嘗試用Node.js編寫一個區塊鏈

嘗試用Node.js編寫一個區塊鏈

近一年區塊鏈大火,被稱為顛覆互聯網的下一個產品。各種以區塊鏈概念的產品也以井噴的狀態爆發出來,其中除了最早的應用比特幣外,就是各種在此基礎上分叉出來的各種幣,直至ICO在國內被叫停。現在么,又一大波基於區塊鏈的新應用產生,目標指向智能合約和遊戲寵物。而各種投資區塊鏈產品的大火,甚至引得中國大媽們也忍不住紛紛入場,而區塊鏈一時間變成了一個多面體,是互聯網的顛覆者,也是新時代的風向標,可以是一種信仰,或是一個泡沫,是吸金之地,也是韭菜收割場…… (最近各類幣有所回落)

年初的時候,我加入了一個區塊鏈學習群,裡面除了得到了一堆數字貨幣的白皮書外,其他別無所獲。唯一的一次直播全篇都是在講炒幣的熱潮,並沒有留下有價值的內容。

但是數字貨幣並不是區塊鏈的全部,也不是區塊鏈的唯一產品,那麼區塊鏈到底是什麼,能做什麼?

網上介紹區塊鏈的資料現在也不少,但是真正能剖析區塊鏈的介紹非常少,大多數對區塊鏈的解釋都是圍繞著如何說明區塊鏈是怎樣的一個東西,是好還是壞,是否值得站隊。但是區塊鏈技術本身是否能承載著這麼多期望,越看越覺得疑惑越多。

近期看了一篇譯文《【譯】區塊鏈是如何工作的——用JavaScript演示》(https://zhuanlan.zhihu.com/p/29223615),展示了如何搭建一個瀏覽器版本的區塊鏈模型。順著文章的思路,我也用Node.js實現了一個基於命令行的版本,目的僅僅在於了解一下區塊鏈從技術上是如何實現的。

說起區塊鏈,不可避免還是要先說到比特幣。從中本聰的比特幣白皮書里可以看到區塊鏈技術是如何定義的。從技術層面來說,區塊鏈技術本身是不複雜的,基本上可以歸納為有以下幾點:

區塊鏈由有限的區塊組成,類似現實世界裡的金礦產量是有限的

每個區塊可以存儲有限的內容

每個區塊都有一個全局唯一的ID來標識,我們稱之為hash

每個除了第一個區塊即創世區塊外,所有區塊都要記錄上一個區塊的hash,這樣便形成了鏈狀結構,即區塊鏈

區塊的hash值通過一個演算法計算獲得,並通過一定的複雜度保證計算結果的獲得難度,這個過程被稱為挖礦,挖礦的人就是礦工了。

每個區塊被挖出來,礦工都能得到一定的獎勵

計算區塊的hash值可能會有很多人同時進行的,這樣就有概率同時產生有兩個區塊被掛在同一個區塊下的情況,這樣就形成了兩個分支。現在需要有一個規則來決定哪個分支是有效的,目前而言就是誰最先達到6個區塊,就保留哪個分支

所有區塊的計算都是分散式,就是沒有一個核心權威來表明自己產生的區塊是有效的,每個設備都可以通過計算產生區塊

每個區塊的挖掘時間是通過演算法控制的,目前十分鐘產生一個區塊,區塊鏈的交易也不可避免地會受到這個影響而變慢

區塊鏈一旦被寫入是無法修改的,這是由演算法保證的,因為如果區塊的內容被篡改,會導致hash值和上一個區塊的hash值不符合

在實現區塊鏈模型之前,先定義出區塊的模型,再把多個區塊串聯起來,就是一個區塊鏈。

一個區塊簡單地可以定義為:

index:當前區塊在鏈中的位置

timestamp:區塊的創建時間戳

data:區塊的內容

nonce:計算一個有效Hash所用的次數

difficulty: hash計算的複雜度

prev_hash:上一個區塊的hash

hash:區塊的hash

說明一下其中的定義::自然就是每個區塊的序號,從創世區塊0開始,實際上這個值是否存在並不重要,因為hash值已經保證唯一,而區塊在整個區塊鏈的第幾個位置並不是必需的,在這裡我們只是為了能夠更清晰的觀察數據。:創建這個區塊的時間戳。所謂時間戳就是指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總秒數。而在Javascript裡面通過Date.now()獲取的時間戳是帶毫秒的,這個對結構也沒有影響,為了計算方便,也就定義了帶毫秒的時間戳。:區塊的內容就是在區塊中存儲的信息。說起區塊鏈有一個定義就是「分散式數據存儲」,而大多數人都是用賬本來比喻說明區塊鏈的,既然是賬本,肯定要記賬,那麼data裡面就是所存儲的內容。這個內容是什麼?可以是文本,可以是圖片,甚至是視頻。但是在比特幣裡面並不會存儲太多內容,因為要把每筆交易都同步到所有的設備上,這個冗餘要有多大?但是我們在模型里可以簡單的設置為文本,這樣也是為了方便觀察數據。:每次計算hash值所需要的隨機數,隨機數的加入當然是為了增加複雜度,而我們在這裡可以用一個流水號來簡單地記錄嘗試計算hash值的次數,這樣在觀察數據時能知道每個區塊是通過多少次計算才能得到hash的。:計算hash的複雜度,即得到的hash值前n位必須是0:上一個區塊的hash值。在計算新區塊的hash時,要先知道具體從哪個區塊繼續,這個區塊就是我們這次新區塊的上一級區塊,通過這樣的結構,就把一個個區塊串聯成一個鏈條,這就是從區塊到區塊鏈的形成。:當前區塊的hash計算可以這樣定義:把上一個區塊的hash值、時間、區塊內容以及計算當前區塊時產生的一個隨機數合成,通過SHA512演算法計算而成,同時要求獲得的hash值必須符合某個規律比如前10位必須都是0。而其中的隨機數也可以用計算這個區塊的次數來代替。這樣誰先計算出一個區塊的hash值,掛到前一個區塊下,這就是一個新的區塊。因為要計算的hash值有一定的限制,使得在挖礦的時候需要長時間的嘗試,這個過程也被稱之為。

通過這些簡單的設置,我們就能快速地實現並了解區塊鏈模型。 但是,我們在模擬實現區塊鏈的時候,並不需要真的計算十幾甚至幾十分鐘來模擬得到一個hash值吧,比如我們只需定義即hash的前4位為0,這樣就可以加快計算hash的時間,能快速地計算出一個新區塊。

通過這些代碼並不能實現一個真正的區塊鏈應用,但是可以幫助我們理解區塊鏈的形成,從中驗證白皮書的定義,進而理解技術本身的優勢和實際應用中的不足。

通過比特幣的白皮書可以知道規則設定都是基於演算法實現,而在實際應用中,卻是不會有人關心演算法,那麼人們最看中區塊鏈的特點是什麼?除了方便割韭菜,我的理解就是和。

我們可以知道每個區塊的hash是通過演算法根據當前區塊的內容和pre_hash計算而來的,所以區塊內任意內容發生了變化,都會導致hash和pre_hash的驗證不通過,進而實現了。任何設備都可以獨立計算出區塊,並追加到整個鏈中,而如果發生了兩台設備同時追加區塊,又有來決定最後的區塊,這樣也就是的形成。

現在再從代碼來看區塊鏈的形成過程,這不就是一個鏈表嗎?但凡學過《C語言入門》之類的課程,都能感受到指針鏈表的影子。至此,可以看出區塊鏈就是一種數據存儲的結構,加上了和的特性,自然就變成了一個。

以本人有限的知識層面考慮區塊鏈技術,我對區塊鏈的看法是:

區塊鏈技術重點是用演算法實現分散式運算的一致性,打破一個中心的絕對環境,但是最終還是需要有多個中心來分攤原先一個中心的職責。但是多個中心之間是互相牽制、互相不信任的,並且多中心是可以隨時增減的。

區塊鏈技術成熟之後,必然會成為一個底層技術,而更多人是在此基礎上搭建多個層次的應用。

區塊鏈的交易速度和安全性是目前可知的幾個需要完善的部分。交易速度會隨著技術的發展必然有所提升,而安全性問題通常是容易被忽視的。區塊鏈技術本身的不可篡改僅僅保證的是區塊的合法性驗證,而針對區塊鏈平台和交易所的安全攻擊卻是頻頻發生。

胡思亂想

區塊鏈的效率低下是有目共睹的,想想POW,想想從一根鏈條的一端不停追溯到創世區塊才能真正驗證有效性。如果我們捨棄那麼長的鏈,簡化POW,把每個交易的生命周期都定義成一根鏈,那麼是不是就能形成一個BlockNet或BlockTree了?

既然區塊鏈的技術白皮書已經出來了,我們必須跟著白皮書走嗎?


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 凌波微步 的精彩文章:

TAG:凌波微步 |