1. 程式人生 > >太簡單!只學十分鐘,Python菜鳥也能開發一個區塊鏈客戶端

太簡單!只學十分鐘,Python菜鳥也能開發一個區塊鏈客戶端

640?wx_fmt=jpeg

區塊鏈技術以其去中心化特性成為又一具有顛覆性特徵的技術。Python作為一種面向物件的解釋型計算機程式設計語言,因其具有豐富和強大的庫,常被稱為“膠水語言”,簡單、易上手,是區塊鏈技術愛好者快速學習區塊鏈的首選之一。

本文作者Adil Moujahid 是世界IT服務企業排名前十、日本IT服務企業排名榜首的NTT DATA集團的資料科學家,對Python在區塊鏈方向的應用有著十分深入的研究。

在這篇文章中,Adil Moujahid 由雙重支付問題引出去中心化支付方案,介紹公鑰密碼學、Hash函式、挖礦等區塊鏈核心概念,並詳細闡述如何產生一個新區快、如何將新區快新增到區塊鏈等問題,最後,利用Python實現基本的區塊鏈和區塊鏈客戶端。

在瞭解區塊鏈的核心概念之後,讓Adil Moujahid 手把手,教你用Python實現區塊鏈和區塊鏈客戶端的實操吧!乾貨滿滿!

作者 | Adil Moujahid

編譯 | kou、Eli

可以說,區塊鏈是自網際網路誕生以來最重要和最具顛覆性的技術之一。作為比特幣和其他加密貨幣背後的核心技術,區塊鏈在過去幾年獲得了廣泛關注。

區塊鏈是一個分散式資料庫,允許雙方之間直接進行交易,而無需第三方許可權,對銀行、政府和市場等機構具有很大影響。

任何依賴中心化資料庫作為核心競爭優勢的企業或組織都可能被區塊鏈技術所顛覆。

本文分三部分,前兩部分介紹區塊鏈的核心概念;第三部分介紹如何利用Python實現區塊鏈以及2個

區塊鏈Web應用程式,以便終端使用者輕鬆與區塊鏈進行鏈上互動,效果圖如下。

640?wx_fmt=gif

極簡的區塊鏈速成教程

2008年中本聰釋出標題為“比特幣:點對點電子現金系統” 的比特幣白皮書,奠定了區塊鏈的基礎。

在最初的比特幣白皮書中,中本聰描述瞭如何建立一個點對點電子現金系統,允許不通過中心化機構實現線上支付,直接從一方傳送到另一方。該系統解決了數字貨幣中一個稱為雙重支付的重要問題。

什麼是雙重支付?

假設Alice想要支付Bob 1美元。如果Alice和Bob使用實物現金,那麼Alice在執行交易後將不再擁有1美元;如果Alice和Bob使用數字貨幣,那麼問題會變得更加複雜。

數字貨幣以數字形式存在,可以輕鬆進行復制。例如,如果Alice通過電子郵件向Bob傳送價值1美元的數字檔案,則

Bob無法確定Alice是否刪除了她的檔案副本,如果Alice仍然擁有1美元數字檔案,那麼她可以選擇將相同的檔案傳送給Carol。這個問題就叫做雙重支付。

640?wx_fmt=png

解決雙重支付問題的一種方法是在Alice、Bob和網路中其他參與者之間建立可信任的第三方(例如銀行),該第三方負責管理中心化分類賬,而分類賬跟蹤並驗證網路中的所有交易。該解決方案的缺點是,為了使系統執行,它需要信任中心化的第三方。

比特幣:雙重支付問題的去中心化方案

為了解決雙重支付問題,中本聰提出了一個公共分類賬,即通過比特幣的區塊鏈來跟蹤網路中的所有交易。比特幣的區塊鏈具有以下特徵:

  • 分散式:分類帳在多臺計算機上覆制,而不是儲存在中央伺服器上。任何具有網際網路連線的計算機都可以下載區塊鏈的完整副本。

  • 加密:用於確認傳送人持有她想要傳送的比特幣,並決定如何將交易新增到區塊鏈中。

  • 不可變:交易只能新增到區塊鏈中,但不能刪除或修改。

  • 工作量證明(PoW):網路中一種特殊型別的參與者稱為礦工,他們競爭搜尋加密難題的解決方案,該解決方案允許他們向比特幣的區塊鏈新增一個交易區塊,此過程稱為工作量證明,它能確保系統安全。

640?wx_fmt=png

傳送比特幣資金流程如下:

  1. 建立一個比特幣錢包。用於傳送或接收比特幣,比特幣錢包儲存2條資訊:私鑰和公鑰。私鑰是一個祕密號碼,允許所有者將比特幣傳送給另一個使用者,或者消費比特幣。公鑰是接收比特幣所需的數字。錢包本身不儲存比特幣,有關比特幣餘額的資訊儲存在比特幣的區塊鏈中。

  2. 建立比特幣交易。如果Alice想要向Bob傳送1個比特幣,Alice需要使用她的私鑰連線到她的比特幣錢包,並建立一個包含她想要傳送的比特幣數量和地址的交易。

  3. 將交易廣播到比特幣網路。一旦Alice建立比特幣交易,她需要將此交易廣播到整個比特幣網路。

  4. 確認交易。收聽到比特幣網路的礦工使用Alice的公鑰驗證交易,確認Alice的錢包中有足夠的比特幣,並向比特幣區塊鏈新增一條包含交易詳細資訊的新紀錄。

  5. 將區塊鏈的變更廣播給所有礦工。 一旦交易得到確認,該礦工應向所有礦工廣播區塊鏈變更,以確保他們的區塊鏈副本全部同步。

區塊鏈技術深度研究

為深入研究區塊鏈技術構建模組,作者系統介紹了公鑰密碼學,Hash函式和區塊鏈挖掘及安全性等。

公鑰密碼學

公鑰密碼學或非對稱加密學是任何使用金鑰對的加密系統:包括可以廣泛傳播的公鑰,以及只有所有者知道的私鑰。 這實現了兩個基本功能:

  • 身份驗證:公鑰驗證傳送訊息的配對私鑰的持有者

  • 加密:只有配對的私鑰持有者可以解密用公鑰加密的訊息。

RSA和ECDSA(橢圓曲線數字簽名演算法)是最流行的公鑰加密演算法,ECDSA演算法用於生成比特幣錢包。

為了傳送或接收BTC,使用者首先生成包含一對私鑰和公鑰的錢包。

如果Alice想要向Bob傳送一定數量的BTC,她會建立一個交易,在該交易中輸入她和Bob的公鑰以及她想要傳送的BTC數量,然後使用她的私鑰簽署交易。

區塊鏈上的計算機使用Alice的公鑰來驗證交易是否可信,並將交易寫入即將新增到區塊鏈的區塊中。

640?wx_fmt=jpeg

Hash函式和挖掘

所有比特幣交易都儲存在稱為區塊的檔案中。比特幣每10分鐘增加一個新的交易區塊,將新區塊新增到區塊鏈後,它將不可變、無法刪除和修改。

網路中一組特殊的參與者稱為礦工(連線到區塊鏈的計算機),負責建立新的交易區塊。礦工必須使用發件人的公鑰對每筆交易進行身份驗證,確認發件人有足夠的餘額用於所請求的交易,並將交易新增到塊中

礦工可以完全自由選擇區塊中的交易,因此發件人需要包含交易費以激勵礦工將他們的交易新增到區塊中。

對於區塊連結受的區塊,需要進行“挖掘”。為了挖掘區塊,礦工需要找到一種非常罕見的加密難題解決方案。如果區塊連結受了採礦區塊,則礦工將獲得比特幣獎勵,這是對交易費用的額外獎勵。挖掘過程也稱為工作量證明(PoW),它是使區塊鏈無信任和安全的主要機制。

雜湊和區塊鏈加密難題

雜湊函式是任何可以用來將任意大小的資料對映到固定大小的資料的函式。雜湊函式返回的值稱為Hash值。雜湊函式通常用於通過檢測重複的記錄來加速資料庫查詢,它們在密碼學中也被廣泛使用。

雜湊函式允許我們輕鬆地驗證某些輸入資料對映到給定的雜湊值,但是如果輸入資料是未知的,那麼通過儲存的雜湊值來重構它是很困難的。

比特幣使用稱為SHA-256的加密雜湊函式。SHA-256應用於區塊資料(比特幣交易)和名為Nonce的數字組合。通過更改區塊資料或Nonce,我們得到完全不同的Hash值。 

對於被認為有效或“已挖掘”的區塊,區塊和Nonce的Hash值需要滿足特定條件。例如,Hash值的四個前導數字需要等於“0000”。 我們可以通過使條件更復雜來增加挖礦的複雜性,例如我們可以增加Hash值開頭0的數量。

礦工需要解決的密碼難題是找到一個Nonce值,使Hash值滿足挖掘條件。

使用下面的應用程式來模擬區塊挖掘

當你在“Data”文字框中輸入或更改Nonce值時,你會注意到Hash值的變化。 當你單擊“Mine”按鈕時,應用程式從Nonce等於零開始,計算Hash值並檢查Hash值的前四位是否等於“0000”。 

如果前四位數不等於“0000”,則將Nonce增加1並重復整個過程,直到找到滿足條件的Nonce值。如果區塊已開採,背景顏色變為綠色。

640?wx_fmt=png

從區塊到區塊鏈

交易按區塊分組,區塊被附加到區塊鏈。

為了建立一條由區塊組成的鏈,每個新塊使用前一個塊的Hash值作為其資料的一部分。為了建立新塊,礦工選擇一組交易,新增前一個塊的Hash值開始區塊挖掘工作。

對任何區塊資料進行的任何更改都將影響其後所有區塊的Hash值,並且它們將變為無效,這就是區塊鏈的不變性。

640?wx_fmt=png

使用下面的應用程式模擬包含3個區塊的區塊鏈。

當你在“Data”文字框中輸入或更改Nonce值時,你可以注意到當前區塊Hash值以及下一區塊的“Prev”值(上一個Hash值)的變化。

你可以通過單擊每個塊的“Mine”按鈕來模擬挖礦過程。挖掘出3個區塊之後,嘗試更改塊1或2中的資料,你將注意到之後的所有區塊都變為無效。

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

將區塊新增到區塊鏈

比特幣網路中的所有礦工互相競爭,以找到一個有效的區塊,該區塊將被新增到區塊鏈並從網路獲得獎勵。

雖然找到驗證區塊Nonce機率很低,但由於礦工的數量很多,網路中礦工驗證區塊的概率非常高。第一個提交有效區塊的礦工將他的區塊新增到區塊鏈中並獲得比特幣的獎勵。

如果兩個礦工或更多的礦工同時提交,會發生什麼呢?

解決衝突

如果2名礦工幾乎同時解決一個區塊,那麼我們將在網路中有2個不同的區塊鏈,我們需要等待下一個區塊來解決衝突。 一些礦工選擇在區塊鏈1頂部挖掘,其他礦工選擇在區塊鏈2頂部挖掘。

當有礦工找到一個新的區塊之後,衝突就被解決了。

如果新區塊在區塊鏈1的頂部被挖掘出來,則區塊鏈2變為無效,前一區塊的獎勵通過區塊鏈1獎勵給礦工,區塊鏈2部分和未新增到區塊鏈中的交易將被退回到交易池並新增到下一個塊。 

簡而言之,如果區塊鏈存在衝突,那麼最長的鏈就會獲勝。



640?wx_fmt=png

區塊鏈和雙重支付

接下來,詳細介紹對區塊鏈進行雙重支付攻擊的常見形式,以及使用者為防止受到損害應採取的措施。

  • 種族攻擊:攻擊者將相同的硬幣快速傳送到兩個不同的地址。為防止此類攻擊,建議在接受付款前等待至少一次區塊確認

  • 芬尼攻擊:攻擊者使用交易預先挖掘區塊,並在釋放區塊之前在第二個交易中花費相同的幣。 在這種情況下,將不驗證第二個交易。為防止此類攻擊,建議在接受付款前等待至少6次區塊確認

  • 51%攻擊:在這類攻擊中,攻擊者擁有網路51%的算力。攻擊者首先向整個網路廣播進行交易,然後挖掘一個私有區塊鏈,在那裡將上一筆交易的幣加倍。

    由於攻擊者擁有大部分算力,因此保證他在某些時候會擁有比正常網路更長的鏈。然後,他可以釋出更長的區塊鏈,取代正常區塊鏈並取消原始交易。

    這種攻擊極不可能,因為它在像比特幣這樣的區塊鏈網路中非常昂貴。

Python中的區塊鏈實現

在本節中,我們將使用Python實現基本的區塊鏈和區塊鏈客戶端。

區塊鏈將具有以下功能:

  • 在區塊鏈中新增多個節點

  • 工作量證明(PoW)

  • 節點之間的簡單衝突解決方案

區塊鏈客戶端將具有以下功能:

  • 使用公鑰/私鑰加密生成錢包(基於RSA演算法)

  • 使用RSA加密生成交易

還將實現2個顯示頁:

  • 供礦工使用的“區塊鏈前端”

  • 供使用者生成錢包和傳送數字貨幣的“區塊鏈客戶端”

本文區塊鏈實現主要參考下面的GitHub專案,作者對原始程式碼進行了一些修改,以便為交易新增RSA加密。

使用Jupyter notebook生成電子錢包,進行加密交易,使用HTML / CSS / JS2完成2個顯示頁。

區塊鏈客戶端

切換到blockchain_client資料夾下,在終端輸入python blockchain_client.py,啟動區塊鏈客戶端。在瀏覽器中,轉到http:// localhost:8080你將看到下面的顯示頁面。

640?wx_fmt=png



顯示頁面在導航欄中有3個選項卡:

  • Wallet Generator:使用RSA加密演算法生成錢包(公鑰/私鑰對)

  • Make Transaction:生成交易並將其傳送到區塊鏈節點

  • View Transasctions:檢視區塊鏈上的交易

要建立或檢視交易,你至少需要執行一個區塊鏈節點。

下面,對blockchain_client.py程式碼重要的部分進行解釋。

定義一個名為Transaction的python類,它有 sender_address,sender_private_key,recipient_address 和 value 4個屬性。這些是發件人建立交易所需的4條資訊。

使用to_dict()方法以Python字典格式(沒有發件人的私鑰)返回交易資訊。

通過使用 sign_transaction()方法獲取交易資訊(沒有發件人的私鑰),並使用發件人的私鑰對其進行簽名。

640?wx_fmt=png

啟動一個Python Flask應用程式,使用它來建立不同的API,與區塊鏈及其客戶端進行互動。

640?wx_fmt=png

下面定義3個Flask html頁面返回路徑,每個標籤連線一個html頁面。

640?wx_fmt=png

然後,定義一個生成錢包的API(私鑰/公鑰對)。

640?wx_fmt=png

640?wx_fmt=gif

下面定義一個API,將sender_address,sender_private_key,recipient_address,value 作為輸入項,並返回交易(沒有私鑰)和簽名。

640?wx_fmt=png

640?wx_fmt=gif

區塊鏈

轉到blockchain資料夾從終端啟動區塊鏈節點,然後鍵入python blockchain_client.pypython blockchain_client.py -p <PORT NUMBER>。如果未指定埠號,則預設為埠5000。在瀏覽器中,轉到http:// localhost:<PORT NUMBER>檢視區塊鏈前端顯示頁。

640?wx_fmt=png

導航欄下顯示頁有2個選項卡:

  • Mine:用於檢視交易和區塊鏈資料,以及挖掘新的交易區塊。

  • Configure:用於配置不同區塊鏈節點之間的連線。

接下來,對blockchain.py程式碼中重要部分進行解釋。

首先定義一個具有以下屬性的Blockchain類:

  • transactions:將新增到下一區塊的交易列表。

  • chain:由一系列區塊組成的區塊鏈。

  • nodes:包含節點url的集合。區塊鏈使用這些節點從其他節點檢索區塊鏈資料,如果它們不同步則更新其區塊鏈。

  • node_id:用於標識區塊鏈節點的隨機字串。

Blockchain類還實現了以下方法:

  • register_node(node_url):將新的區塊鏈節點新增到節點列表中。

  • verify_transaction_signature(sender_address, signature, transaction)檢查提供的簽名是否與公鑰(sender_address)簽名的交易相對應。

  • socmit_transaction(sender_address,recipient_address,value,signature):如果簽名已驗證,則將交易新增到交易列表中。

  • create_block(Nonce,previous_hash):向區塊鏈新增一個包含交易資訊的區塊。

  • hash(block):建立一個區塊的SHA-256 Hash值。

  • proof_of_work():工作量證明。尋找滿足挖掘條件的Nonce。

  • valid_proof(transactions,last_hash,Nonce,difficulty = MINING_DIFFICULTY):檢查Hash值是否滿足挖掘條件,此函式在proof_of_work函式中使用。

  • valid_chain(chain):檢查區塊鏈是否有效。

  • resolution_conflicts():通過用網路中最長的鏈替換鏈來解決區塊鏈節點之間的衝突。

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

啟動一個Python Flask應用程式,使用它建立不同的API以與區塊鏈進行互動。

640?wx_fmt=png

接下來,啟動Blockchain例項。

640?wx_fmt=png

定義2條返回區塊鏈前端html頁面的Flask路徑。

640?wx_fmt=png

下面定義Flask API來管理交易和挖掘區塊鏈。

  • '/ transactions / new':此API用來輸入 'sender_address', 'recipient_address','amount'和'signature',並將交易新增到簽名有效的、可新增到下一區塊的交易列表中。

  • '/ transactions / get':此API返回可以被新增到下一區塊的所有交易。

  • '/ chain':此API返回所有區塊鏈資料。

  • '/ mine':此API執行工作量證明演算法,並將新的交易塊新增到區塊鏈中。

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=gif

下面定義Flask API來管理區塊鏈節點。

  • '/ nodes / register':此API將節點URL列表作為輸入,並將它們新增到節點列表中。

  • '/ nodes / resolve':此API通過用網路中可用的最長鏈替換本地鏈來解決區塊鏈節點之間的衝突。

  • '/ nodes / get':此API返回節點列表。

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=gif

原文連結:

http://adilmoujahid.com/posts/2018/03/intro-blockchain-bitcoin-python/

原始碼:

https://github.com/adilmoujahid/blockchain-python-tutorial

參考資源:

1 - Wikipedia - Public-key cryptography

2 - Wikipedia - Hash function

3 - Bitcoin Stackexchange - What happens to a transaction once generated?

4 - Bitcoin Wiki - Majority attack

5 - 比特幣白皮書、

6 - 比特幣維基

7 - Andreas Antonopoulos:Mastering Bitcoin: Programming the Open 

最新熱文:

640?wx_fmt=png

掃碼加入區塊鏈大本營讀者群,群滿加微信 qk15732632926 入群

640?wx_fmt=gif

瞭解更多區塊鏈技術及應用內容

敬請關注:

640?wx_fmt=gif