日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

【译】A Practical Introduction to Blockchain with Python

發(fā)布時間:2025/3/15 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【译】A Practical Introduction to Blockchain with Python 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

區(qū)塊鏈可以說是互聯(lián)網(wǎng)自成立以來最重要和最具顛覆性的技術(shù)之一。?這是比特幣和其他加密貨幣背后的核心技術(shù),在過去幾年引起了很多關(guān)注。

作為其核心,區(qū)塊鏈?zhǔn)且粋€分布式數(shù)據(jù)庫,允許雙方直接交易,而無需中央機(jī)構(gòu)。?這個簡單而強(qiáng)大的概念對銀行,政府和市場等各種機(jī)構(gòu)具有重大意義,僅舉幾例。?任何依賴中央數(shù)據(jù)庫作為核心競爭優(yōu)勢的企業(yè)或組織都可能受到區(qū)塊鏈技術(shù)的干擾。

拋開所有關(guān)于比特幣和其他加密貨幣價格的炒作,本博文的目標(biāo)是給你一個區(qū)塊鏈技術(shù)的實(shí)用介紹。?第1節(jié)和第2節(jié)介紹了區(qū)塊鏈背后的一些核心概念,第3節(jié)介紹了如何使用Python實(shí)現(xiàn)區(qū)塊鏈。?我們還將實(shí)施2個Web應(yīng)用程序,以方便最終用戶與我們的區(qū)塊鏈互動。

請注意,我在此使用比特幣作為解釋“區(qū)塊鏈”更一般技術(shù)的媒介,本文中描述的大多數(shù)概念都適用于其他區(qū)塊鏈?zhǔn)褂冒咐图用茇泿拧?/span>

以下是我們將在第3節(jié)中構(gòu)建的兩個Web應(yīng)用程序的動畫gif。

1.區(qū)塊鏈中的崩潰課程

這一切都始于2008年由一個不知名的人或?qū)嶓w使用Satoshi Nakamoto這個名字發(fā)布的白皮書。?該白皮書的標(biāo)題是“比特幣:對等電子現(xiàn)金系統(tǒng)”?,它奠定了后來被稱為區(qū)塊鏈的基礎(chǔ)。?在最初的比特幣白皮書中,Satoshi描述了如何建立點(diǎn)對點(diǎn)電子現(xiàn)金系統(tǒng),使得在線支付可以直接從一方發(fā)送到另一方,而無需通過中央機(jī)構(gòu)。?該系統(tǒng)解決了數(shù)字貨幣中稱為雙重支出的重要問題。

1.1。?什么是雙重支出?

假設(shè)Alice想支付Bob 1 $。?如果Alice和Bob使用實(shí)物現(xiàn)金,那么在交易執(zhí)行后Alice將不再擁有1美元。?如果Alice和Bob使用數(shù)字貨幣,那么問題變得更加復(fù)雜。?數(shù)字貨幣是數(shù)字形式,可以很容易地復(fù)制。?如果Alice通過電子郵件向Bob發(fā)送一個價值1美元的數(shù)字文件,Bob無法確定Alice是否刪除了她的文件副本。?如果Alice仍然有1 $數(shù)字文件,那么她可以選擇將同一個文件發(fā)送給Carol。?這個問題叫做雙重支出。

解決雙重支出問題的一種方法是在Alice,Bob和網(wǎng)絡(luò)中的所有其他參與者之間建立一個可信的第三方(例如銀行)。?該第三方負(fù)責(zé)管理集中分類帳,用于跟蹤和驗(yàn)證網(wǎng)絡(luò)中的所有交易。?這個解決方案的缺點(diǎn)是要使系統(tǒng)正常工作,它需要信任一個集中的第三方。

1.2。?比特幣:雙重支出問題的分散解決方案

為了解決雙重支出問題,Satoshi提出了一個公共分類賬,即比特幣的區(qū)塊鏈來跟蹤網(wǎng)絡(luò)中的所有交易。?比特幣的區(qū)塊鏈具有以下特點(diǎn):

  • 分布式:分類賬在多臺計(jì)算機(jī)上復(fù)制,而不是存儲在中央服務(wù)器上。?任何具有互聯(lián)網(wǎng)連接的計(jì)算機(jī)都可以下載區(qū)塊鏈的完整副本。
  • 密碼:密碼術(shù)用于確保發(fā)件人擁有她試圖發(fā)送的比特幣,并決定如何將交易添加到區(qū)塊鏈中。
  • 不可變:區(qū)塊鏈可以以追加方式更改。?換句話說,交易只能添加到區(qū)塊鏈中,但不能刪除或修改。
  • 使用工作證明(PoW):網(wǎng)絡(luò)中一種特殊類型的參與者稱為礦工競爭尋找加密難題的解決方案,這將使他們能夠在比特幣區(qū)塊鏈中添加大量交易。?這個過程稱為工作證明(Proof of Work),它允許系統(tǒng)安全(稍后會介紹這一點(diǎn))。

發(fā)送比特幣錢如下:

  • 步驟1(一次性努力):創(chuàng)建一個比特幣錢包。?對于一個人發(fā)送或接收比特幣,她需要創(chuàng)建一個比特幣錢包。?比特幣錢包存儲2條信息:私鑰和公鑰。?私鑰是一個秘密號碼,允許所有者向其他用戶發(fā)送比特幣,或者將比特幣用于接受他們的服務(wù)作為付款方式。?公鑰是接收比特幣所需的數(shù)字。?公鑰也被稱為比特幣地址(不完全正確,但為了簡單起見,我們將假定公鑰和比特幣地址相同)。?請注意,錢包本身不存儲比特幣。?關(guān)于比特幣余額的信息存儲在比特幣區(qū)塊鏈中。
  • 第2步:創(chuàng)建一個比特幣交易。?如果Alice想要給Bob發(fā)送1 BTC,Alice需要使用她的私鑰連接到她的比特幣錢包,并創(chuàng)建一個包含她想要發(fā)送的比特幣數(shù)量和她要發(fā)送的地址的交易(在這種情況下鮑勃的公共地址)。
  • 第3步:將交易廣播至比特幣網(wǎng)絡(luò)。?一旦Alice創(chuàng)建比特幣交易,她需要將此交易廣播到整個比特幣網(wǎng)絡(luò)。
  • 第4步:確認(rèn)交易。?一位收聽比特幣網(wǎng)絡(luò)的礦工使用Alice的公鑰驗(yàn)證交易,證實(shí)Alice的錢包中有足夠的比特幣(在這種情況下至少為1 BTC),并在比特幣的區(qū)塊鏈中增加了一個新記錄,其中包含交易詳情。
  • 第5步:將區(qū)塊鏈更改廣播給所有礦工。?交易確認(rèn)后,礦工應(yīng)該向所有礦工廣播區(qū)塊鏈更改,以確保區(qū)塊鏈的副本全部同步。

2.區(qū)塊鏈技術(shù)深入研究

本部分的目標(biāo)是深入介紹區(qū)塊鏈技術(shù)構(gòu)建模塊。?我們將介紹公鑰密碼學(xué),散列函數(shù),區(qū)塊鏈的挖掘和安全性。

2.1。?公鑰加密

公鑰密碼學(xué)或不對稱密碼學(xué)是使用密鑰對的任何密碼系統(tǒng):可以廣泛傳播的公鑰和只有所有者知道的私鑰。?這實(shí)現(xiàn)了兩個功能:認(rèn)證,其中公鑰驗(yàn)證發(fā)送消息的配對私鑰的持有者和加密,其中只有配對私鑰持有者可以解密用公鑰加密的消息。?[1]

RSA和橢圓曲線數(shù)字簽名(ECDSA)是最流行的公鑰密碼算法。

就比特幣而言,ECDSA算法用于生成比特幣錢包。?比特幣使用各種密鑰和地址,但為了簡單起見,我們將在本博文中假設(shè)每個比特幣錢包都有一對私鑰/公鑰,比特幣地址就是錢包的公鑰。?如果您對比特幣錢包的完整技術(shù)細(xì)節(jié)感興趣,我推薦這篇文章?。

要發(fā)送或接收BTC,用戶首先生成一個包含一對私鑰和公鑰的錢包。?如果Alice想要給Bob發(fā)送一些BTC,她創(chuàng)建一個交易,在該交易中她輸入她和Bob的公鑰,以及她想要發(fā)送的BTC數(shù)量。?她然后使用她的私鑰簽署交易。?區(qū)塊鏈中的計(jì)算機(jī)使用Alice的公鑰來驗(yàn)證交易是否真實(shí),并將交易添加到稍后將添加到區(qū)塊鏈的區(qū)塊。

2.2。?散列函數(shù)和挖掘

所有比特幣交易都分組在稱為塊的文件中。?比特幣每10分鐘添加一個新的交易塊。?一旦新塊被添加到區(qū)塊鏈中,它就變得不可變,并且不能被刪除或修改。?網(wǎng)絡(luò)中一個特殊的參與者稱為礦工(連接到區(qū)塊鏈的計(jì)算機(jī))負(fù)責(zé)創(chuàng)建新的交易塊。?礦工必須使用發(fā)件人的公鑰驗(yàn)證每筆交易,確認(rèn)發(fā)件人有足夠的余額用于所請求的交易,并將交易添加到該塊。?礦工們可以完全自由地選擇塊中包含哪些交易,因此發(fā)件人需要包含交易費(fèi)以激勵礦工將其交易添加到塊中。

對于被區(qū)塊鏈接受的區(qū)塊,它需要被“挖掘”。?為了挖掘一個塊,礦工需要找到一個極其罕見的解決密碼難題的方法。?如果區(qū)塊鏈接受了開采區(qū)塊,礦工將獲得比特幣獎勵,這是對交易費(fèi)用的額外激勵。?挖掘過程也被稱為工作量證明(PoW),它是使區(qū)塊鏈變得可靠和安全的主要機(jī)制(更多關(guān)于區(qū)塊鏈安全性)。

哈希和區(qū)塊鏈的密碼拼圖

要理解區(qū)塊鏈的加密難題,我們需要從哈希函數(shù)開始。?哈希函數(shù)是可用于將任意大小的數(shù)據(jù)映射到固定大小的數(shù)據(jù)的任何函數(shù)。?散列函數(shù)返回的值稱為散列。?散列函數(shù)通常用于通過檢測重復(fù)記錄來加速數(shù)據(jù)庫查找,并且它們也廣泛用于密碼學(xué)。?密碼散列函數(shù)允許人們?nèi)菀椎仳?yàn)證某些輸入數(shù)據(jù)映射到給定的散列值,但是如果輸入數(shù)據(jù)是未知的,則通過知道存儲的散列值來重建它是故意困難的。?[2]

比特幣使用稱為SHA-256的加密散列函數(shù)。?SHA-256應(yīng)用于塊數(shù)據(jù)(比特幣交易)和一個稱為nonce的數(shù)字的組合。?通過更改塊數(shù)據(jù)或隨機(jī)數(shù),我們可以得到完全不同的哈希值。?對于被認(rèn)為有效或“挖掘”的塊,塊的散列值和隨機(jī)數(shù)需要滿足一定的條件。?例如,散列的四位前導(dǎo)數(shù)字需要等于“0000”。?我們可以通過使條件更復(fù)雜來增加挖掘的復(fù)雜性,例如我們可以增加散列值開始所需的0的數(shù)量。

礦工需要解決的cryptograhic難題是找到一個隨機(jī)數(shù)值,使得哈希值滿足挖掘條件。?您可以使用下面的應(yīng)用程序來模擬塊挖掘。?當(dāng)您輸入“數(shù)據(jù)”文本框或更改隨機(jī)數(shù)值時,您可以注意到哈希值的變化。?當(dāng)你點(diǎn)擊“我的”按鈕時,應(yīng)用程序以nonce等于零開始,計(jì)算散列值并檢查散列值的前四位數(shù)是否等于“0000”。?如果前四位數(shù)字不等于“0000”,它將隨機(jī)數(shù)加1,并重復(fù)整個過程直到找到一個滿足條件的隨機(jī)數(shù)值。?如果該塊被視為開采,背景顏色將變成綠色。

隨機(jī)數(shù):數(shù)據(jù):哈希:

2.3。?從塊到區(qū)塊鏈

正如前面部分所討論的,交易以塊形式分組,并且塊被附加到區(qū)塊鏈。?為了創(chuàng)建塊鏈,每個新塊都使用前一個塊的散列作為其數(shù)據(jù)的一部分。?為了創(chuàng)建一個新塊,礦工選擇一組事務(wù),添加上一個塊的散列并以上述類似的方式挖掘塊。

對任何塊中的數(shù)據(jù)所做的任何更改都會影響到它后面的塊的所有散列值,并且它們將變?yōu)闊o效。?這給區(qū)塊鏈帶來了不變性。

您可以使用下面的應(yīng)用程序來模擬3塊的區(qū)塊鏈。?當(dāng)您輸入“Data”文本框或更改nonce值時,可以注意到下一個塊的散列值和“Prev”值(前一個散列)的更改。?您可以通過單擊每個塊的“Mine”按鈕來模擬采礦過程。?在挖掘3個塊之后,嘗試更改塊1或塊2中的數(shù)據(jù),并且您會注意到后面的所有塊都變?yōu)闊o效。

塊:隨機(jī)數(shù):數(shù)據(jù):上一篇:哈希:

塊:隨機(jī)數(shù):數(shù)據(jù):上一篇:哈希:

塊:隨機(jī)數(shù):數(shù)據(jù):上一篇:哈希:

上述兩款采礦模擬器都是根據(jù)Anders Brownworth出色的Blockchain Demo改編的。

2.4。?將區(qū)塊添加到區(qū)塊鏈

比特幣網(wǎng)絡(luò)中的所有礦工相互競爭,找到一個有效的區(qū)塊,并將其添加到區(qū)塊鏈中,并從網(wǎng)絡(luò)中獲得獎勵。?發(fā)現(xiàn)一個驗(yàn)證塊的隨機(jī)數(shù)很少見,但由于礦工人數(shù)眾多,網(wǎng)絡(luò)中的礦工驗(yàn)證塊的可能性非常高。?第一位提交有效街區(qū)的礦工將他的街區(qū)加入?yún)^(qū)塊鏈,并獲得比特幣獎勵。?但是,如果兩名礦工或更多的同時遞交他們的塊,會發(fā)生什么?

解決沖突

如果兩個礦工幾乎同時解決一個塊,那么我們將在網(wǎng)絡(luò)中有兩個不同的塊鏈,我們需要等待下一個塊來解決沖突。?一些礦工將決定在區(qū)塊鏈1和區(qū)塊鏈2頂部的其他礦區(qū)之上開采礦石。第一個找到新區(qū)塊的礦工將解決沖突。?如果新區(qū)塊在區(qū)塊鏈1的頂部被開采,則區(qū)塊鏈2變?yōu)闊o效,前區(qū)塊的獎勵從區(qū)塊鏈1進(jìn)入礦工,并且區(qū)塊鏈2的一部分并且未被添加到區(qū)塊鏈的交易返回到事務(wù)池并添加到下一個塊。?簡而言之,如果區(qū)塊鏈上存在沖突,那么最長的連鎖贏家。

2.5。?區(qū)塊鏈和雙重支出

在本節(jié)中,我們將介紹對區(qū)塊鏈執(zhí)行雙重支出攻擊的最常見方式,以及用戶應(yīng)采取哪些措施來防止他們遭受損失。

種族攻擊

攻擊者快速連續(xù)發(fā)送同一枚硬幣到兩個不同的地址。?為了防止這種攻擊,建議在接受付款之前等待至少一個數(shù)據(jù)塊確認(rèn)。?[3]

芬尼攻擊

攻擊者預(yù)先在事務(wù)中挖掘一個塊,并在釋放塊之前在第二個事務(wù)中花費(fèi)相同的硬幣。?在這種情況下,第二個事務(wù)將不會被驗(yàn)證。?為了防止這種攻擊,建議在接受付款之前至少等待6個數(shù)據(jù)塊確認(rèn)。?[3]

多數(shù)人攻擊(也被稱為51%攻擊)

在這次攻擊中,攻擊者擁有51%的網(wǎng)絡(luò)計(jì)算能力。?攻擊者首先在整個網(wǎng)絡(luò)上創(chuàng)建一個交易,然后挖掘一個私人區(qū)塊鏈,在那里他將前一個交易的硬幣加倍。?由于攻擊者擁有大部分計(jì)算能力,因此他可以保證他在某個時間點(diǎn)的鏈接比“誠實(shí)”的網(wǎng)絡(luò)要長。?然后,他可以發(fā)布他的較長的區(qū)塊鏈,取代“誠實(shí)”區(qū)塊鏈并取消原始交易。?這種攻擊極不可能,因?yàn)樗谙癖忍貛胚@樣的區(qū)塊鏈網(wǎng)絡(luò)中非常昂貴。?[4]

3. Python中的區(qū)塊鏈實(shí)現(xiàn)

在本節(jié)中,我們將使用Python實(shí)現(xiàn)基本區(qū)塊鏈和區(qū)塊鏈客戶端。?我們的區(qū)塊鏈將具有以下功能:

  • 將多個節(jié)點(diǎn)添加到區(qū)塊鏈的可能性
  • 工作證明(PoW)
  • 節(jié)點(diǎn)之間的簡單沖突解決
  • 使用RSA加密的交易

我們的區(qū)塊鏈客戶端將具有以下功能:

  • 使用公鑰/私鑰加密(基于RSA算法)生成錢包
  • 使用RSA加密生成事務(wù)

我們還將實(shí)施2個儀表板:

  • 面向礦工的“Blockchain Frontend”
  • “區(qū)塊鏈客戶端”讓用戶生成錢包并發(fā)送硬幣

區(qū)塊鏈實(shí)施主要基于這個github項(xiàng)目?。?我對原始代碼進(jìn)行了一些修改,以便為事務(wù)添加RSA加密。?錢包生成和交易加密基于Jupyter筆記本?。?2個儀表板從頭開始使用HTML / CSS / JS實(shí)現(xiàn)。

您可以從https://github.com/adilmoujahid/blockchain-python-tutorial下載完整的源代碼。

請注意,此實(shí)現(xiàn)僅用于教育目的,不應(yīng)用于生產(chǎn),因?yàn)樗鼪]有很好的安全性,不能很好地?cái)U(kuò)展并缺少許多重要功能。

3.1。?區(qū)塊鏈客戶端實(shí)施

您可以通過訪問blockchain_client文件夾并鍵入python blockchain_client.py來從終端啟動區(qū)塊鏈客戶端。?在瀏覽器中,轉(zhuǎn)至http://localhost:8080?,您將看到下面的儀表板。


儀表板在導(dǎo)航欄中有3個選項(xiàng)卡:

  • 錢包生成器:使用RSA加密算法生成錢包(公鑰/私鑰對)
  • 進(jìn)行交易:生成交易并將其發(fā)送到區(qū)塊鏈節(jié)點(diǎn)
  • 查看轉(zhuǎn)換:查看區(qū)塊鏈上的交易

為了制作或查看交易,您至少需要運(yùn)行一個區(qū)塊鏈節(jié)點(diǎn)(將在下一節(jié)中介紹)。

以下是blockchain_client.py代碼中最重要部分的一些說明。

我們定義了一個名為Transaction的python類,它具有4個屬性sender_address?,?sender_private_key?,?recipient_address?,?value?。?這些是發(fā)件人創(chuàng)建交易所需的4條信息。

to_dict()方法以Python字典格式(沒有發(fā)件人的私鑰)返回交易信息。?sign_transaction()方法獲取交易信息(不包括發(fā)件人的私鑰),并使用發(fā)件人的私鑰對其進(jìn)行簽名。

交易 def __init__ self sender_address sender_private_key recipient_address value ): 自我 sender_address = sender_address 自我 sender_private_key = sender_private_key 自我 recipient_address = recipient_address 自我 = def __getattr__ self attr ): 回歸 自我 數(shù)據(jù) [ attr ] def to_dict self ): 返回 OrderedDict ({ 'sender_address' self。sender_address 'recipient_address' 自我 recipient_address '價值' 自我 }) def sign_transaction self ): “”” 用私鑰簽名交易 “”” private_key = RSA importKey binascii。unhexlify self。sender_private_key )) 簽署者 = PKCS1_v1_5 private_key h = SHA new str self.to_dict ()) encode 'utf8' )) 返回 binascii hexlify 簽字人 簽字 h )) 解碼 'ascii'

下面的代碼啟動一個Python Flask應(yīng)用程序,我們將使用它來創(chuàng)建不同的API來與區(qū)塊鏈及其客戶端進(jìn)行交互。

app = Flask __name__

下面我們定義返回html頁面的3個Flask路由。?每個標(biāo)簽頁都有一個html頁面。

@ app.route '/' def index (): 返回 render_template './index.html' @ app.route '/ make / transaction' def make_transaction (): 返回 render_template './make_transaction.html' @ app.route '/ view / transactions' def view_transaction (): 返回 render_template './view_transactions.html'

下面我們定義一個生成錢包的API(私鑰/公鑰對)。

@ app.route '/ wallet / new' methods = [ 'GET' ]) def new_wallet (): random_gen = 加密 隨機(jī) new () private_key = RSA 生成 1024 random_gen public_key = private_key publickey () response = { 'private_key' binascii hexlify private_key。exportKey format = 'DER' )) 解碼 'ascii' ), 'public_key' binascii hexlify public_key。exportKey format = 'DER' )) 解碼 'ascii' } 返回 jsonify 響應(yīng) ), 200



下面我們定義一個API,它將輸入sender_address?,?sender_private_key?,?recipient_address?,?value作為輸入,并返回事務(wù)(無私鑰)和簽名。

@ app.route '/ generate / transaction' methods = [ 'POST' ]) def generate_transaction (): sender_address = 請求 表單 [ 'sender_address' ] sender_private_key = 請求 表單 [ 'sender_private_key' ] recipient_address = 請求 表單 [ 'recipient_address' ] = 請求 形式 [ 'amount' ] transaction = Transaction sender_address sender_private_key recipient_address value response = { 'transaction' 交易 to_dict (), '簽名' 事務(wù) sign_transaction ()} 返回 jsonify 響應(yīng) ), 200



3.2。?區(qū)塊鏈實(shí)施

您可以通過轉(zhuǎn)到blockchain文件夾啟動區(qū)塊鏈節(jié)點(diǎn),然后輸入python blockchain_client.py或python blockchain_client.py -p <PORT NUMBER>?。?如果您未指定端口號,則默認(rèn)為端口5000.在瀏覽器中,轉(zhuǎn)到http://localhost:<PORT NUMBER>以查看區(qū)塊鏈前端儀表板。


儀表板在導(dǎo)航欄中有2個選項(xiàng)卡:

  • Mine:用于查看交易和區(qū)塊鏈數(shù)據(jù),以及用于挖掘新的交易區(qū)塊。
  • 配置:用于配置不同區(qū)塊鏈節(jié)點(diǎn)之間的連接。

以下是blockchain.py代碼中最重要部分的一些說明。

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

  • transactions?:將被添加到下一個塊的交易列表。
  • chain?:實(shí)際的區(qū)塊鏈,這是一個塊數(shù)組。
  • nodes?:包含節(jié)點(diǎn)URL的集合。?區(qū)塊鏈?zhǔn)褂眠@些節(jié)點(diǎn)從其他節(jié)點(diǎn)檢索區(qū)塊鏈數(shù)據(jù),并在區(qū)塊鏈不同步時更新區(qū)塊鏈。
  • node_id?:識別node_id鏈節(jié)點(diǎn)的隨機(jī)字符串。

Blockchain類還實(shí)現(xiàn)了以下方法:

  • register_node(node_url)?:將新的register_node(node_url)鏈節(jié)點(diǎn)添加到節(jié)點(diǎn)列表中。
  • verify_transaction_signature(sender_address, signature, transaction)?:檢查提供的簽名是否與由公鑰簽名的事務(wù)(sender_address)相對應(yīng)。
  • submit_transaction(sender_address, recipient_address, value, signature)?:如果驗(yàn)證簽名,則將事務(wù)添加到事務(wù)列表。
  • create_block(nonce, previous_hash)?:向區(qū)塊鏈添加一個交易塊。
  • hash(block)?:創(chuàng)建hash(block)的SHA-256散列。
  • proof_of_work()?:工作證明算法。?尋找滿足采礦條件的隨機(jī)數(shù)。
  • valid_proof(transactions, last_hash, nonce, difficulty=MINING_DIFFICULTY)?:檢查哈希值是否滿足挖掘條件。該函數(shù)在proof_of_work函數(shù)中使用。
  • valid_chain(chain)?:檢查鏈接是否有效。
  • resolve_conflicts()?:通過替換網(wǎng)絡(luò)中最長的鏈來解決區(qū)塊鏈節(jié)點(diǎn)之間的沖突。
class blockchain def __init__ self ): 自我 交易 = [] 自我 chain = [] 自我 nodes = set () #生成用作node_id的隨機(jī)數(shù) 自我 node_id = str uuid4 ()) 替換 ' - ' '' #創(chuàng)建基因塊 自我 create_block 0 '00' def register_node self node_url ): “”” 向節(jié)點(diǎn)列表中添加一個新節(jié)點(diǎn) “”” ... def verify_transaction_signature self sender_address signature transaction ): “”” 檢查提供的簽名是否與交易相符 由公鑰(sender_address)簽名 “”” ... def submit_transaction self sender_address recipient_address value signature ): “”” 如果驗(yàn)證簽名,則將事務(wù)添加到事務(wù)數(shù)組中 “”” ... def create_block self nonce previous_hash ): “”” 添加交易塊到區(qū)塊鏈 “”” ... def hash self block ): “”” 創(chuàng)建一個塊的SHA-256散列 “”” ... def proof_of_work self ): “”” 工作證明算法 “”” ... def valid_proof self transactions last_hash nonce difficulty = MINING_DIFFICULTY ): “”” 檢查哈希值是否滿足挖掘條件。 該函數(shù)在proof_of_work函數(shù)中使用。 “”” ... def valid_chain self chain ): “”” 檢查一個鏈接是否有效 “”” ... def resolve_conflicts self ): “”” 解決區(qū)塊鏈節(jié)點(diǎn)之間的沖突 通過取代我們的網(wǎng)絡(luò)中最長的鏈。 “”” ...

下面的代碼啟動一個Python Flask應(yīng)用程序,我們將使用它來創(chuàng)建不同的API來與區(qū)塊鏈進(jìn)行交互。

app = Flask __name__ CORS 應(yīng)用程序

接下來,我們啟動一個Blockchain實(shí)例。

blockchain = 區(qū)塊鏈 ()

下面我們定義返回我們區(qū)塊鏈前端儀表盤html頁面的2個Flask路由。

@ app.route '/' def index (): 返回 render_template './index.html' @ app.route '/ configure' def configure (): 返回 render_template './configure.html'

下面我們定義Flask?API來管理交易和挖掘區(qū)塊鏈。

  • '/transactions/new'?:這個API作為'sender_address'?,?'recipient_address'?,?'amount'和'signature'?,并將交易添加到交易列表中,如果簽名有效,交易列表將被添加到下一個區(qū)塊。
  • '/transactions/get'?:該API返回將被添加到下一個塊的所有事務(wù)。
  • '/chain'?:該API返回所有區(qū)塊鏈數(shù)據(jù)。
  • '/mine'?:該API運(yùn)行工作證明算法,并將新的交易塊添加到區(qū)塊鏈。
@ app.route '/ transactions / new' methods = [ 'POST' ]) def new_transaction (): = 請求 形成 #檢查所需字段是否在POST中 required = [ 'sender_address' 'recipient_address' 'amount' '簽名' ] 如果 不是 全部 k 需要的 k ): 返回 '缺失值' 400 #創(chuàng)建一個新的交易 transaction_result = 區(qū)塊鏈 submit_transaction values [ 'sender_address' ], values [ 'recipient_address' ], values [ 'amount' ], values [ 'signature' ]) 如果 transaction_result == False response = { 'message' '無效的交易!' } 返回 jsonify 響應(yīng) ), 406 其他 response = { 'message' '交易將被添加到Block' + str transaction_result )} 返回 jsonify 響應(yīng) ), 201 @ app.route '/ transactions / get' methods = [ 'GET' ]) def get_transactions (): #從事務(wù)池獲取事務(wù) 交易 = 區(qū)塊鏈 交易 response = { 'transactions' transactions } 返回 jsonify 響應(yīng) ), 200 @ app.route '/ chain' methods = [ 'GET' ]) def full_chain (): response = { '鏈' 區(qū)塊鏈 'length' len 區(qū)塊鏈 ), } 返回 jsonify 響應(yīng) ), 200 @ app.route '/ mine' methods = [ 'GET' ]) def mine (): #我們運(yùn)行工作證明算法以獲得下一個證明... last_block = 區(qū)塊 [ - 1 ] nonce = 區(qū)塊鏈 proof_of_work () #我們必須獲得找到證據(jù)的獎勵。 區(qū)塊鏈 submit_transaction sender_address = MINING_SENDER recipient_address = blockchain。node_id value = MINING_REWARD signature = “” #通過將新塊添加到鏈中來鍛造新塊 previous_hash = 區(qū)塊鏈 散列 last_block block = blockchain create_block nonce previous_hash response = { '消息' “偽造的新塊” 'block_number' block [ 'block_number' ], 'transactions' block [ 'transactions' ], 'nonce' block [ 'nonce' ], 'previous_hash' block [ 'previous_hash' ], } 返回 jsonify 響應(yīng) ), 200



下面我們定義Flask API來管理區(qū)塊鏈節(jié)點(diǎn)。

  • '/nodes/register'?:該API將節(jié)點(diǎn)URL列表作為輸入,并將它們添加到節(jié)點(diǎn)列表中。
  • '/nodes/resolve'?:該API通過用網(wǎng)絡(luò)中可用的最長鏈替換本地鏈來解決區(qū)塊鏈節(jié)點(diǎn)之間的沖突。
  • '/nodes/get'?:該API返回節(jié)點(diǎn)列表。
@ app.route '/ nodes / register' methods = [ 'POST' ]) def register_nodes (): = 請求 形成 節(jié)點(diǎn) = get '節(jié)點(diǎn)' 替換 “” “” split ',' 如果 節(jié)點(diǎn) None 返回 “錯誤:請?zhí)峁┮粋€有效的節(jié)點(diǎn)列表” 400 節(jié)點(diǎn) 中的 節(jié)點(diǎn) 區(qū)塊鏈 寄存器 節(jié)點(diǎn) 節(jié)點(diǎn) response = { 'message' '已添加新節(jié)點(diǎn)' 'total_nodes' [ 節(jié)點(diǎn) 塊鏈中的 節(jié)點(diǎn) 節(jié)點(diǎn) ], } 返回 jsonify 響應(yīng) ), 201 @ app.route '/ nodes / resolve' methods = [ 'GET' ]) def consensus (): 取代 = 區(qū)塊鏈 resolve_conflicts () 如果 更換 response = { '消息' '我們的連鎖已被替換' 'new_chain' 區(qū)塊 } 其他 response = { '消息' '我們的連鎖店是權(quán)威的' '鏈' 區(qū)塊鏈 } 返回 jsonify 響應(yīng) ), 200 @ app.route '/ nodes / get' methods = [ 'GET' ]) def get_nodes (): nodes = list blockchain。nodes response = { 'nodes' nodes } 返回 jsonify 響應(yīng) ), 200



結(jié)論

在本篇博文中,我們介紹了區(qū)塊鏈背后的一些核心概念,并學(xué)習(xí)了如何使用Python實(shí)現(xiàn)一個核心概念。?為了簡單起見,我沒有介紹一些技術(shù)細(xì)節(jié),例如:錢包地址和默克爾樹。?如果您想了解更多關(guān)于此主題的信息,我建議您閱讀比特幣原始白皮書,并跟進(jìn)比特幣維基和Andreas Antonopoulos出色的書籍:?掌握比特幣:編程開放區(qū)塊鏈?。

參考

  • 1 -?維基百科 - 公鑰密碼學(xué)
  • 2 -?維基百科 - 哈希函數(shù)
  • 3 -?Bitcoin Stackexchange - 交易一旦產(chǎn)生會發(fā)生什么?
  • 4 -?比特幣維基 - 多數(shù)人攻擊

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

總結(jié)

以上是生活随笔為你收集整理的【译】A Practical Introduction to Blockchain with Python的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。