雖然有些人認為區(qū)塊鏈是一個早晚會出現(xiàn)問題的解決方案,但是毫無疑問,這個創(chuàng)新技術是一個計算機技術上的奇跡。那么,究竟什么是區(qū)塊鏈呢?
區(qū)塊鏈
以比特幣Bitcoin或其它加密貨幣按時間順序公開地記錄交易的數(shù)字賬本。
更通俗的說,它是一個公開的數(shù)據(jù)庫,新的數(shù)據(jù)存儲在被稱之為區(qū)塊block的容器中,并被添加到一個不可變的鏈chain中(因此被稱為區(qū)塊鏈blockchain),之前添加的數(shù)據(jù)也在該鏈中。對于比特幣或其它加密貨幣來說,這些數(shù)據(jù)就是一組組交易,不過,也可以是其它任何類型的數(shù)據(jù)。
區(qū)塊鏈技術帶來了全新的、完全數(shù)字化的貨幣,如比特幣和萊特幣Litecoin,它們并不由任何中心機構管理。這給那些認為當今的銀行系統(tǒng)是騙局并將最終走向失敗的人帶來了自由。區(qū)塊鏈也革命性地改變了分布式計算的技術形式,如以太坊Ethereum就引入了一種有趣的概念:智能合約smart contract。
在這篇文章中,我將用不到 50 行的 Python 2.x 代碼實現(xiàn)一個簡單的區(qū)塊鏈,我把它叫做 SnakeCoin。
不到 50 行代碼的區(qū)塊鏈
我們首先將從定義我們的區(qū)塊是什么開始。在區(qū)塊鏈中,每個區(qū)塊隨同時間戳及可選的索引一同存儲。在 SnakeCoin 中,我們會存儲這兩者。為了確保整個區(qū)塊鏈的完整性,每個區(qū)塊都會有一個自識別的哈希值。如在比特幣中,每個區(qū)塊的哈希是該塊的索引、時間戳、數(shù)據(jù)和前一個區(qū)塊的哈希值等數(shù)據(jù)的加密哈希值。這里提及的“數(shù)據(jù)”可以是任何你想要的數(shù)據(jù)。
真棒,現(xiàn)在我們有了區(qū)塊的結構了,不過我們需要創(chuàng)建的是一個區(qū)塊鏈。我們需要把區(qū)塊添加到一個實際的鏈中。如我們之前提到過的,每個區(qū)塊都需要前一個區(qū)塊的信息。但問題是,該區(qū)塊鏈中的第一個區(qū)塊在哪里?好吧,這個第一個區(qū)塊,也稱之為創(chuàng)世區(qū)塊,是一個特別的區(qū)塊。在很多情況下,它是手工添加的,或通過獨特的邏輯添加的。
我們將創(chuàng)建一個函數(shù)來簡單地返回一個創(chuàng)世區(qū)塊解決這個問題。這個區(qū)塊的索引為 0 ,其包含一些任意的數(shù)據(jù)值,其“前一哈希值”參數(shù)也是任意值。
現(xiàn)在我們可以創(chuàng)建創(chuàng)世區(qū)塊了,我們需要一個函數(shù)來生成該區(qū)塊鏈中的后繼區(qū)塊。該函數(shù)將獲取鏈中的前一個區(qū)塊作為參數(shù),為要生成的區(qū)塊創(chuàng)建數(shù)據(jù),并用相應的數(shù)據(jù)返回新的區(qū)塊。新的區(qū)塊的哈希值來自于之前的區(qū)塊,這樣每個新的區(qū)塊都提升了該區(qū)塊鏈的完整性。如果我們不這樣做,外部參與者就很容易“改變過去”,把我們的鏈替換為他們的新鏈了。這個哈希鏈起到了加密的證明作用,并有助于確保一旦一個區(qū)塊被添加到鏈中,就不能被替換或移除。
這就是主要的部分。
現(xiàn)在我們能創(chuàng)建自己的區(qū)塊鏈了!在這里,這個區(qū)塊鏈是一個簡單的 Python 列表。其第一個的元素是我們的創(chuàng)世區(qū)塊,我們會添加后繼區(qū)塊。因為 SnakeCoin 是一個極小的區(qū)塊鏈,我們僅僅添加了 20 個區(qū)塊。我們通過循環(huán)來完成它。
讓我們看看我們的成果:
別擔心,它將一直添加到 20 個區(qū)塊
很好,我們的區(qū)塊鏈可以工作了。如果你想要在主控臺查看更多的信息,你可以編輯其完整的源代碼并輸出每個區(qū)塊的時間戳或數(shù)據(jù)。
這就是 SnakeCoin 所具有的功能。要使 SnakeCoin 達到現(xiàn)今的產(chǎn)品級的區(qū)塊鏈的高度,我們需要添加更多的功能,如服務器層,以在多臺機器上跟蹤鏈的改變,并通過工作量證明算法(POW)來限制給定時間周期內可以添加的區(qū)塊數(shù)量。
讓這個極小區(qū)塊鏈稍微變大些
這個極小的區(qū)塊鏈及其簡單,自然也相對容易完成。但是因其簡單也帶來了一些缺陷。首先,SnakeCoin 僅能運行在單一的一臺機器上,所以它相距分布式甚遠,更別提去中心化了。其次,區(qū)塊添加到區(qū)塊鏈中的速度同在主機上創(chuàng)建一個 Python 對象并添加到列表中一樣快。在我們的這個簡單的區(qū)塊鏈中,這不是問題,但是如果我們想讓 SnakeCoin 成為一個實際的加密貨幣,我們就需要控制在給定時間內能創(chuàng)建的區(qū)塊(和幣)的數(shù)量。
從現(xiàn)在開始,SnakeCoin 中的“數(shù)據(jù)”將是交易數(shù)據(jù),每個區(qū)塊的“數(shù)據(jù)”字段都將是一些交易信息的列表。接著我們來定義“交易”。每個“交易”是一個 JSON 對象,其記錄了幣的發(fā)送者、接收者和轉移的 SnakeCoin 數(shù)量。注:交易信息是 JSON 格式,原因我很快就會說明。
現(xiàn)在我們知道了交易信息看起來的樣子了,我們需要一個辦法來將其加到我們的區(qū)塊鏈網(wǎng)絡中的一臺計算機(稱之為節(jié)點)中。要做這個事情,我們會創(chuàng)建一個簡單的 HTTP 服務器,以便每個用戶都可以讓我們的節(jié)點知道發(fā)生了新的交易。節(jié)點可以接受 POST 請求,請求數(shù)據(jù)為如上的交易信息。這就是為什么交易信息是 JSON 格式的:我們需要它們可以放在請求信息中傳遞給服務器。
真棒!現(xiàn)在我們有了一種保存用戶彼此發(fā)送 SnakeCoin 的記錄的方式。這就是為什么人們將區(qū)塊鏈稱之為公共的、分布式賬本:所有的交易信息存儲給所有人看,并被存儲在該網(wǎng)絡的每個節(jié)點上。
但是,有個問題:人們從哪里得到 SnakeCoin 呢?現(xiàn)在還沒有辦法得到,還沒有一個稱之為 SnakeCoin 這樣的東西,因為我們還沒有創(chuàng)建和分發(fā)任何一個幣。要創(chuàng)建新的幣,人們需要“挖”一個新的 SnakeCoin 區(qū)塊。當他們成功地挖到了新區(qū)塊,就會創(chuàng)建出一個新的 SnakeCoin ,并獎勵給挖出該區(qū)塊的人(礦工)。一旦挖礦的礦工將 SnakeCoin 發(fā)送給別人,這個幣就流通起來了。
我們不想讓挖新的 SnakeCoin 區(qū)塊太容易,因為這將導致 SnakeCoin 太多了,其價值就變低了;同樣,我們也不想讓它變得太難,因為如果沒有足夠的幣供每個人使用,它們對于我們來說就太昂貴了。為了控制挖新的 SnakeCoin 區(qū)塊的難度,我們會實現(xiàn)一個工作量證明Proof-of-Work(PoW)算法。工作量證明基本上就是一個生成某個項目比較難,但是容易驗證(其正確性)的算法。這個項目被稱之為“證明”,聽起來就像是它證明了計算機執(zhí)行了特定的工作量。
在 SnakeCoin 中,我們創(chuàng)建了一個簡單的 PoW 算法。要創(chuàng)建一個新區(qū)塊,礦工的計算機需要遞增一個數(shù)字,當該數(shù)字能被 9 (“SnakeCoin” 這個單詞的字母數(shù))整除時,這就是最后這個區(qū)塊的證明數(shù)字,就會挖出一個新的 SnakeCoin 區(qū)塊,而該礦工就會得到一個新的 SnakeCoin。
我們差不多就要完成了。在運行了完整的 SnakeCoin 服務器代碼之后,在你的終端可以運行如下代碼。(假設你已經(jīng)安裝了 cCUL)。
對代碼做下美化處理,我們看到挖礦后我們得到的新區(qū)塊的信息:
大功告成!現(xiàn)在 SnakeCoin 可以運行在多個機器上,從而創(chuàng)建了一個網(wǎng)絡,而且真實的 SnakeCoin 也能被挖到了。
你可以根據(jù)你的喜好去修改 SnakeCoin 服務器代碼,并問各種問題了。
-
python
+關注
關注
56文章
4827瀏覽量
86773 -
區(qū)塊鏈
+關注
關注
112文章
15568瀏覽量
108396
原文標題:用python構建一個極小的區(qū)塊鏈
文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
教你用Python從0開始創(chuàng)建一個區(qū)塊鏈

評論