當前位置:
首頁 > 最新 > 從零開始用 Python 打造自己的區塊鏈

從零開始用 Python 打造自己的區塊鏈

本文來自作者Frank在GitChat上分享 「從零開始用 Python 打造自己的區塊鏈」

編輯 | 毛利


前言

2018 年 4 月以來,隨著加密貨幣價格的回升,各種關於區塊鏈的話題甚囂塵上,各大媒體對其商業性質、技術原理、發展前景各個方面,都有各種非常深入的探討。

同時,新的項目、概念也層出不窮,讓人眼花繚亂。筆者認為,「區塊鏈」 本質上還是一種軟體算計 / 架構上的創新。

只有自己搭建環境,編寫代碼,實現從建立賬本到完成交易的全過程,才能真正體會區塊鏈的精髓。

比特幣近十年來的價格逐波上升

本場 Chat 的目的是,就是幫助廣大的區塊鏈愛好者或者開發人員,從零開始打造屬於您自己的區塊鏈應用。

力求用最簡單的語言,介紹這個最熱門的技術,沒有任何基礎的讀者也能按圖索驥,一窺究竟,消除各種專家為其增添的很多迷思。

本文首先將介紹一些區塊鏈的背景知識,而後將循序漸進地介紹在本地開發區塊鏈應用所需要的模塊和演算法,做出一個簡單的區塊鏈交易程序。

在此過程中,會穿插很多關於相關名字、術語、演算法的解釋。相關源代碼都保存在筆者的 GitHub 項目中(https://github.com/marmul2/blockchain),歡迎讀者直接使用或者提交修改申請(pull request)。

GitHub 是一個面向開源及個人軟體項目的託管平台,因為只支持 git 作為唯一的版本管理格式,故名 GitHub。

因為這裡聚集了超過 350 萬開發者,其中又以男性程序員為主,所以被戲稱為 「全球最大同性交友網站」。

它不光支持代碼的發布、管理,還提供了訂閱、討論組、文本渲染、在線文件編輯器、協作圖譜、代碼片段分享等功能。

任何用戶都可以在其上保存和發布自己的個人項目,很多知名的開源項目如 Ruby on Rails、jQuery、python 等都託管在該平台上。

一位名為 「中本聰」 (Satoshi Nakamoto) 的人於 2008 年 11 月 1 日,在 metzdowd.com網站的密碼學郵件列表中,發表了一篇名為《比特幣:一種點對點式的電子現金系統》(Bitcoin: A Peer to Peer Electronic Cash System) 的論文,首次提出了 「區塊鏈」(Blockchain)的概念。

白皮書發布之後不久,中本聰於 2009 年 1 月 3 日,開發出首個實現了比特幣演算法的客戶端程序,並進行了首次 「採礦」,獲得了第一批 50 個比特幣。

這標誌著比特幣的正式誕生。中本聰出於知識分享和推廣的理念,把比特幣程序的代碼全部開源,與世界各地的軟體開發人員共同分享。

中本聰的原始論文

經過這十年的發展,區塊鏈已經發展成為全球最具影響力的創新技術之一。

從金融行業、製造產品到教育機構的各行各業,都可能會被這項技術全面改造。它的三大最主要的特點是:

去中心化交易

區塊鏈的本質是一種分散在所有用戶電腦上(即所謂的 「分散式」)的計算機賬本,每個分散的賬本會記錄區塊鏈上進行的所有交易活動的信息。所以,它不需要一個集中的機構、網站、公司來管理這些信息。

法國大作家大仲馬在 1884 這年出版的小說《三個火槍手》中有這麼一句著名的話,「人人為我,我為人人」(All for one, one for all)。用這句話來形容區塊鏈的去中心化特徵非常貼切。

信息不可篡改,一旦寫入無法改變

作為一個記錄交易的賬本,人們最不希望的是它被壞人惡意篡改。任何一個用戶,都可以通過交易編號,訪問區塊鏈上發生的所有交易記錄和注釋。

由於中本聰巧妙的演算法設計,配合密碼限制和共識機制,如果要修改區塊鏈中的某一個數據,就必須更改其後發生的所有數據記錄,計算量無可想像,非常龐大,幾乎不可能實現。

實際上,比特幣誕生到現在已經接近 10 年,每天都有無數的黑客絞盡腦汁攻擊這個系統,但是從來沒有發生過一起交易記錄被篡改的事件,這足以證明了它的安全性。

完全匿名

在互聯網誕生初期,有句話說:「在互聯網上,沒人知道你是一隻狗。」 這強調的是在互聯網上的匿名訪問性。

在區塊鏈世界裡,所有的賬戶(或者說 「錢包」)都是通過一個密碼來訪問。如果你失去了密碼,也就失去了賬戶裡面的所有貨幣。

在現實生活中,如果你忘記了密碼或者丟失了銀行卡,你可以去銀行櫃檯申請補辦,手續很簡單。

但是在 「去中心化」 的區塊鏈世界裡,沒有這樣的 「銀行櫃檯」,誰也不知道你是誰,你也無法向別人證明你是某個錢包的主人。

當然,與大部分技術一樣,區塊鏈也是一個 「雙刃劍」,有它的不足之處:

過度消耗能源

想要生成一個新的區塊,必須要大量伺服器資源進行大量無謂的嘗試性計算進行 「挖礦」,嚴重耗費電能(後文將詳細介紹 「挖礦」 的過程)。

信息的網路延遲

以比特幣為例,任何一筆交易數據都需要同步到其他所有節點,同步過程中難免會受到網路傳輸延遲的影響,帶來較長的耗時。

區塊鏈應用的實際開發,可以分為以下幾步。下面我們將針對每個步驟詳細介紹。

除了主要介紹環境配置的第二節和介紹交易步驟的第七節以外,其他步驟都分為概念介紹、代碼實現、深入講解這三個部分。

所有代碼均已放在我的 GitHub 項目之中,您可以直接下載使用。如果對具體的代碼實現不感興趣,您也可以直接只關注每節中的概念介紹和深入講解這兩個部分。

如果您對具體的演算法也不感興趣,沒關係,您可以直接跳過這些部分,進入第七節,逐步嘗試自己完成 「虛擬交易」。


為了便於初學者學習,筆者會儘可能詳細地記錄開發環境配置的每一個步驟,如果您已經熟悉 Python 環境和相關模塊的使用,您可以選擇跳過這一部分。

1. 首先,您需要一台安裝了 Win7 或者 Win10 系統的電腦,可以是台式機或者是筆記本電腦。

當然,不一定非要用 Windows 系統來開發區塊鏈應用,Linux 或者 Mac 系統也是很好的選擇,這裡我們為了照顧大部分讀者,只介紹 Windows 系統下的操作。

下載Python

3. 安裝完畢 Python 之後,從 Windows 的開始菜單輸入 「cmd」:

在命令行窗口輸入以下指令,安裝 Flask 和 requests 庫。Flask 庫將用於在本地構建一個 Web 伺服器,把 Python 的功能映射到一定的埠,便於我們稍後通過針對不同的地址終端(endpoint)發送 HTTP 請求,執行各項交易,從而構成我們自己的 「虛擬交易所」 ;requests 庫則用於自動發送 HTTP 請求到伺服器。

4. 訪問 https://www.getpostman.com/apps, 下載並安裝 Postman,它可以把我們定製的交易內容,發送到我們的 「虛擬交易所」。

Postman的開始界面

5. 現在,打開電腦在帶的寫字板編輯器,保存這樣一個文件到 D:hello.py:

fromflaskimportFlaskapp = Flask(__name__)@app.route("/")defhello_world():return"您好,歡迎來到我的虛擬貨幣交易所!"

這裡實際上用的 Flask 模塊的路由功能,具體語法信息請參閱 Flask 介紹頁面(http://flask.pocoo.org/docs/0.12/quickstart/#a-minimal-application)。

6. 回到命令行控制界面,輸入下列指令:

c:>set FLASK_APP=D:hello.pyc:>python -m flask run

你可以看到屏幕顯示 「Running on https://127.0.0.1:5000/」。 這時,打開你的瀏覽器,訪問 https://127.0.0.1:5000/, 你可以看到這樣的顯示結果:

交易所開始運行

這就意味著,我們的運行環境已經搭建成功,您的 「虛擬交易所」 已經準備好接受交易了!


3.1 概念介紹

「區塊鏈」(Blockchina)可以理解為把一個個符合特定格式的區塊(Block),按照一定的方法 「鏈」(chain)到一起。

這裡先預習幾個需要涉及的概念:

「類」 (class):類是面向對象程序設計中的概念,是面向對象編程的基礎。

類是對現實生活中一類具有共同特徵的事物的抽象,譬如區塊鏈這個概念,就是一類具有共同特徵的事物,我們可以用一個類來代表它。

類可以描述一個對象(在本文中即某個區塊鏈)能夠做什麼,以及做的方法(method)。

哈希值(Hash):所謂 「哈希值」 就是計算機可以對任意內容,計算出一個長度相同的特徵值。

區塊鏈的哈希值長度是 256 位,這也就是說,不管原始內容是什麼,最後都會計算出一個 256 位的二進位數字。

而且可以保證,只要原始內容不同,對應的哈希一定是不同的。舉例來說,字元串 123 的哈希值是 a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0(十六進位),轉成二進位就是 256 位,而且只有 123 能得到這個哈希。

(理論上,其他字元串也有可能得到這個哈希,但是概率極低,可以近似認為不可能發生。) 由此可以得到兩個重要的結論:

結論 1:每個區塊的哈希都是不一樣的,可以通過哈希標識一個區塊。

結論 2:如果區塊的內容變了,它的哈希一定會改變。

3.2 代碼實現

首先,我們要用一個構造函數來創建一個區塊鏈類 ,其中包括兩個表:一個用於存儲區塊,一個用於記錄交易。另外,我們還要定義一個方法,用於生成區塊的哈希值。

此外,我們還為這個類定義了一個屬性 last_block, 這樣可以通過調用該類獲得區塊鏈中最後一個區塊的信息。下面是這個類的初步結構:

這個類負責管理整個區塊鏈,包括存儲交易信息,把新的區塊添加到整個區塊鏈之中。

下面,我們再來看看一個典型的區塊是什麼樣的,以及它們是怎麼構成一條區塊鏈的。按照中本聰的原始定義,下面是一個典型的區塊:

3.3 深入講解

由上面的定義可以看出,一個區塊包括下面幾項內容:

區塊索引 / 編號

區塊產生時間

上一個區塊的哈希值

工作量證明(PoW)

交易信息

這揭示了區塊鏈的核心理念:每個區塊中包含了上一個區塊的哈希值或者說信息。這一點對區塊鏈有重大意義:如果有人修改了一個區塊,該區塊的哈希值就變了。

為了讓後面的區塊還能連到它,就必須依次修改後面所有的區塊,否則被改掉的區塊就脫離區塊鏈了。

由於哈希值的計算非常耗時(後面將解釋原因),短時間內修改多個區塊幾乎不可能發生,除非有人真的掌握了全球網路中 51% 以上的計算能力。

正是通過這種聯動機制,區塊鏈保證了自身的可靠性,數據一旦寫入,就無法被篡改。這就像歷史一樣,發生了就是發生了,從此再無法改變。每個區塊都連著上一個區塊,這也是 「區塊鏈」 這個名字的由來。


4.1 概念介紹

在建立起區塊鏈之後,接下來我們看看怎麼為其添加交易信息。所謂 「交易」(Transaction)的過程,實際上就是給區塊鏈加一筆數據更新的記錄,其中包含了付款人的錢包地址、收款人的錢包地址、交易金額。如果把區塊鏈作為一個狀態機,則每次交易就是試圖改變一次狀態,而每次生成的區塊,就是參與者對於區塊中交易導致狀態改變的結果進行確認。

4.2 代碼實現

具體的添加過程,是通過 new_transaction 這個方法來實現的。下面是對這個方法的定義實例。

......


6. 在網路中傳播區塊鏈:共識演算法


後記

本 Chat 中所有的代碼都放置在我的 GitHub 項目 「Frank—Blockchain」 上,請自由索取或者提交修改。

或者您也可以分叉(fork)一個自己的分支,創建您自己的區塊鏈項目。開句玩笑話,這就像是在麻將的基本原則基礎上,開闢出各種分支:四川麻將、上海麻將等等。

希望本 Chat 能幫助您了解並實踐區塊鏈的基本概念和實現方法。請注意,這裡提到的只是區塊鏈最核心的部分,還有很多很多其他的技術細節和演算法,譬如非對稱加密、點對點網路等,我將會在以後的其他 Chat 中詳細說明。

如果有任何其他的問題,歡迎到我的讀者圈中繼續提問。


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

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


請您繼續閱讀更多來自 Python 的精彩文章:

Python數據類型知識點全解
Python每日一題:標準庫

TAG:Python |