以太幣交易所 以太幣交易所
Ctrl+D 以太幣交易所
ads
首頁 > Ethereum > Info

如何用 Python 從 0 開始創建一個區塊鏈?_區塊鏈

Author:

Time:1900/1/1 0:00:00

點擊上方“CSDN”,選擇“置頂公眾號”

關鍵時刻,第一時間送達!

在數字貨幣盛行的檔口,比特幣,這幣那幣到底值不值得信賴呢?也許你像很多人一樣感到新奇,想接近它,但只因背后的區塊鏈技術,阻斷了向新領域嘗試的步伐。不過,對于程序員來說,想真正搞懂比特幣,搞懂區塊鏈,可不是難題,因為他們能邊玩邊學,通過一行行Pyhton代碼,就能真正理解數字貨幣的底層秘密。能用這么有逼格的方式來學習區塊鏈的,也只有程序員了。

作者|DanielvanFlymen紐約區塊鏈工程師

譯者|熊麗兵牛娃軟件CTO

本文經授權轉自「區塊鏈大本營」

準備工作

本文要求讀者對Python有基本的理解,能讀寫基本的Python,并且需要對HTTP請求有基本的了解。

我們知道區塊鏈是由區塊的記錄構成的不可變、有序的鏈結構,記錄可以是交易、文件或任何你想要的數據,重要的是它們是通過哈希值鏈接起來的。

如果你還不是很了解哈希,可以查看這篇文章https://learncryptography.com/hash-functions/what-are-hash-functions。

環境準備

環境準備,確保已經安裝Python3.6+、pip、Flask、requests。

安裝方法:

pipinstallFlask==0.12.2requests==2.18.4

同時還需要一個HTTP客戶端,比如Postman、cURL或其它客戶端。

參考源代碼。

開始創建Blockchain

新建一個文件blockchain.py,本文所有的代碼都寫在這一個文件中,可以隨時參考源代碼。

Blockchain類

首先創建一個Blockchain類,在構造函數中創建了兩個列表,一個用于儲存區塊鏈,一個用于儲存交易。

高盛:探索如何確定比特幣和其他加密資產的“基本面”:本周,高盛經濟研究團隊的Zach Pandl和Isabella Rosenberg發布報告,探索了如何確定加密資產的基本面問題。報告指出,將加密資產等同于黃金是確定其基本面的常見框架,但除此之外,加密貨幣價格也與其底層分布式網絡的價值有關。報告使用區塊鏈地址估算網絡用戶數量,并與貨幣市值進行比較,觀察到:“市值與網絡規模之間存在明顯的相關性”,且相關性超過1。他們基于歷史數據計算出的平均增長曲線接近價值=用戶數的1.4次冪,這給出了一個利用基本面作為市值參考的基準比率。基于該推斷,報告指出BTC的市值遠大于基本面,其基于用戶增量的價值(基本面)與市值相比存在嚴重偏差。過去幾年,比特幣市值較2018年平均水平上漲520%,但網絡僅增長60-100%。報告認為這一偏差意味著要么比特幣現在被高估,要么2018年被低估,要么兼而有之。但報告也指出,除基本面因素外,加密貨幣上漲還有眾多其他因素,包括情緒,以及它作為一種快速致富的新方式的吸引力。但投機交易帶來的網絡活動增加并不能完全反應基本面的改善,因為平臺并未獲得更高的經濟價值,要使加密貨幣網絡具備可持續價值,活動需要由非投機性用例驅動,而目前此類用例十分缺乏。(雅虎財經)[2021/7/21 1:06:15]

以下是Blockchain類的框架:

classBlockchain(object):def__init__(self):self.chain=self.current_transactions=defnew_block(self):Billions項目組Addsanewtransactiontothelistoftransactionspass@staticmethoddefhash(block):Billions項目組ReturnsthelastBlockinthechainpass

Blockchain類用來管理鏈條,它能存儲交易、加入新塊等,下面我們來進一步完善這些方法。

塊結構

每個區塊包含屬性:索引、Unix時間戳、交易列表、工作量證明以及前一個區塊的Hash值。

日本金融廳長官:日本要密切關注如何克服發行CBDC的挑戰:日本金融廳長官HIMINO表示,日本不僅需要對央行數字貨幣(CBDC)進行學術研究,要更密切地關注如何克服發行央行數字貨幣可能帶來的挑戰。如果只是解除對比特幣和其他加密貨幣的管制,這可能只會增加投機交易,并不一定會促進技術創新。不考慮推動加密貨幣交易的新舉措,希望更多地關注如何將區塊鏈技術與增強公共福利的政策結合起來。[2020/8/5]

以下是一個區塊的結構:

block={'index':1,'timestamp':1506057125.900785,'transactions':,'proof':324984774000,'previous_hash':"2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"}

到這里區塊鏈的概念就清楚了,每個新的區塊都包含上一個區塊的Hash,這是關鍵的一點,它保障了區塊鏈不可變性。如果攻擊者破壞了前面的某個區塊,那么后面所有區塊的Hash都會變得不正確。不理解的話,慢慢消化,可參考{%post_linkwhatbc區塊鏈技術原理%}。

加入交易

接下來我們需要添加一個交易,來完善下new_transaction方法:

classBlockchain(object):...defnew_transaction(self,sender,recipient,amount):"""生成新交易信息,信息將加入到下一個待挖的區塊中:paramsender:<str>AddressoftheSender:paramrecipient:<str>AddressoftheRecipient:paramamount:<int>Amount:return:<int>TheindexoftheBlockthatwillholdthistransaction"""self.current_transactions.append({'sender':sender,'recipient':recipient,'amount':amount,})returnself.last_block+1

梭哈學院:教你如何快速抓住合約開倉點:4月23日15:00,行情大V梭哈學院做客金色財經《幣情觀察室》直播間,將分享《教你如何快速抓住合約開倉點》,欲觀看直播掃描下圖二維碼即可![2020/4/23]

方法向列表中添加一個交易記錄,并返回該記錄將被添加到的區塊(下一個待挖掘的區塊)的索引,等下在用戶提交交易時會有用。

創建新塊

當Blockchain實例化后,我們需要構造一個創世塊,并且給它加上一個工作量證明。

每個區塊都需要經過工作量證明,俗稱挖礦,稍后會繼續講解。

為了構造創世塊,我們還需要完善new_block(),new_transaction()和hash()方法:

importhashlibimportjsonfromtimeimporttimeclassBlockchain(object):def__init__(self):self.current_transactions=self.chain=Billions項目組Resetthecurrentlistoftransactionsself.current_transactions=self.chain.append(block)returnblockdefnew_transaction(self,sender,recipient,amount):"""生成新交易信息,信息將加入到下一個待挖的區塊中:paramsender:<str>AddressoftheSender:paramrecipient:<str>AddressoftheRecipient:paramamount:<int>Amount:return:<int>TheindexoftheBlockthatwillholdthistransaction"""self.current_transactions.append({'sender':sender,'recipient':recipient,'amount':amount,})returnself.last_block+1@propertydeflast_block(self):returnself.chain@staticmethoddefhash(block):"""生成塊的SHA-256hash值:paramblock:<dict>Block:return:<str>"""Billions項目組y未知whilesha256(f'{x*y}'.encode()).hexdigest()!="0":y+=1print(f'Thesolutionisy={y}')

聲音 | 礦海學院創始人Andy:如何利用金融工具鎖定利潤是新時代礦工必須補的一門課:在今日TokenInsight對話首席第20期《比特幣挖礦,你真的懂嗎?》的直播中,針對“是否在未來會出現更加智能的豐枯水期預測工具以輔助礦工進行決策?的提問,礦海學院創始人Andy指出:枯水期來臨,電力資源減少,勢必會淘汰小算力的機器,受影響的將是這部分礦工群體。2019年四川灃水期延遲,這讓很多礦工機器停放在礦場無電可挖,如果有準確的灃枯水期預測工具,相信會為礦工提供更好的決策參考。現在大部分礦工考慮的是如何能夠找到低價合規穩定的電力資源,然后大部分礦工應該都希望比特幣的價格可以漲起來,早期礦工依靠囤幣就可以賺錢,這在幣價上漲行情下可行,可是2018年持續下行,如何利用金融工具鎖定利潤是新時代礦工必須補的一門課。[2019/9/6]

結果是y=21,因為:

hash(5*21)=1253e9373e...5e3600155e860

在比特幣中,使用稱為Hashcash的工作量證明算法,它和上面的問題很類似,礦工們為了爭奪創建區塊的權利而爭相計算結果。通常,計算難度與目標字符串需要滿足的特定字符的數量成正比,礦工算出結果后,會獲得比特幣獎勵。

當然,在網絡上非常容易驗證這個結果。

實現工作量證明

讓我們來實現一個相似PoW算法,規則是:尋找一個數p,使得它與前一個區塊的proof拼接成的字符串的Hash值以4個零開頭。

importhashlibimportjsonfromtimeimporttimefromuuidimportuuid4classBlockchain(object):...defproof_of_work(self,last_proof):"""簡單的工作量證明:-查找一個p'使得hash(pp')以4個0開頭-p是上一個塊的證明,p'是當前的證明:paramlast_proof:<int>:return:<int>"""proof=0whileself.valid_proof(last_proof,proof)isFalse:proof+=1returnproof@staticmethoddefvalid_proof(last_proof,proof):"""驗證證明:是否hash(last_proof,proof)以4個0開頭?:paramlast_proof:<int>PreviousProof:paramproof:<int>CurrentProof:return:<bool>Trueifcorrect,Falseifnot."""guess=f'{last_proof}{proof}'.encode()guess_hash=hashlib.sha256(guess).hexdigest()returnguess_hash=="0000"

動態 | Block.one 總裁發文闡述區塊鏈如何解決銀行的 KYC 和 AML 問題:據 IMEOS 報道,Block.one 總裁 Rob Jesudason 十分鐘前發文《How Blockchain Offers an Answer to Banks’ KYC and AML Issues 》闡述區塊鏈如何解決銀行的 KYC 和 AML 問題。他認為區塊鏈不是官僚或新聞中想象的監管雷區; 相反,它可以成為監管機構的資產。

文中提及在過去十年中,許多世界領先的銀行都因反洗錢問題而被罰款,罰款總數達260億美元之多。而在過去12個月中,監管機構如何考慮如何鼓勵使用區塊鏈技術方面取得了進展。區塊鏈技術可以減輕數據模糊性并減少欺詐的可能性。如果所有銀行都在區塊鏈上,那么KYC和AML數據可以以安全,透明和無縫的方式在金融機構之間共享。[2018/10/16]

衡量算法復雜度的辦法是修改零開頭的個數。使用4個來用于演示,你會發現多一個零都會大大增加計算出結果所需的時間。

現在Blockchain類基本已經完成了,接下來使用HTTPrequests來進行交互。

Blockchain作為API接口

我們將使用PythonFlask框架,這是一個輕量Web應用框架,它方便將網絡請求映射到Python函數,現在我們來讓Blockchain運行在基于Flaskweb上。

我們將創建三個接口:

/transactions/new創建一個交易并添加到區塊;/mine告訴服務器去挖掘新的區塊;/chain返回整個區塊鏈。創建節點

我們的“Flask服務器”將扮演區塊鏈網絡中的一個節點,我們先添加一些框架代碼:

importhashlibimportjsonfromtextwrapimportdedentfromtimeimporttimefromuuidimportuuid4fromflaskimportFlaskclassBlockchain(object):...Billions項目組Generateagloballyuniqueaddressforthisnodenode_identifier=str(uuid4()).replace('-','')Billions項目組CheckthattherequiredfieldsareinthePOST'eddatarequired=ifnotall(kinvaluesforkinrequired):return'Missingvalues',400Billions項目組Weruntheproofofworkalgorithmtogetthenextproof...last_block=blockchain.last_blocklast_proof=last_blockproof=blockchain.proof_of_work(last_proof)Billions項目組發送者為"0"表明是新挖出的幣blockchain.new_transaction(sender="0",recipient=node_identifier,amount=1,)Billions項目組Checkthatthehashoftheblockiscorrectifblock!=self.hash(last_block):returnFalseBillions項目組We'reonlylookingforchainslongerthanoursmax_length=len(self.chain)Billions項目組Checkifthelengthislongerandthechainisvalidiflength>max_lengthandself.valid_chain(chain):max_length=lengthnew_chain=chain#Replaceourchainifwediscoveredanew,validchainlongerthanoursifnew_chain:self.chain=new_chainreturnTruereturnFalse

第一個方法valid_chain()用來檢查是否是有效鏈,遍歷每個塊驗證hash和proof。

第二個方法resolve_conflicts()用來解決沖突,遍歷所有的鄰居節點,并用上一個方法檢查鏈的有效性,如果發現有效更長鏈,就替換掉自己的鏈。

讓我們添加兩個路由,一個用來注冊節點,一個用來解決沖突。

@app.route('/nodes/register',methods=)defregister_nodes():values=request.get_json()nodes=values.get('nodes')ifnodesisNone:return"Error:Pleasesupplyavalidlistofnodes",400fornodeinnodes:blockchain.register_node(node)response={'message':'Newnodeshavebeenadded','total_nodes':list(blockchain.nodes),}returnjsonify(response),201@app.route('/nodes/resolve',methods=)defconsensus():replaced=blockchain.resolve_conflicts()ifreplaced:response={'message':'Ourchainwasreplaced','new_chain':blockchain.chain}else:response={'message':'Ourchainisauthoritative','chain':blockchain.chain}returnjsonify(response),200

你可以在不同的機器運行節點,或在一臺機機開啟不同的網絡端口來模擬多節點的網絡,這里在同一臺機器開啟不同的端口演示,在不同的終端運行以下命令,就啟動了兩個節點:http://localhost:5000和http://localhost:5001。

pipenvrunpythonblockchain.pypipenvrunpythonblockchain.py-p5001

然后在節點2上挖兩個塊,確保是更長的鏈,然后在節點1上訪問接口/nodes/resolve,這時節點1的鏈會通過共識算法被節點2的鏈取代。

好啦,你可以邀請朋友們一起來測試你的區塊鏈。

作者簡介:DanielvanFlymen,紐約區塊鏈工程師。譯者簡介:熊麗兵,牛娃軟件CTO,深入淺出區塊鏈learnblockchain.cn博主,區塊鏈大本營特邀專欄作者。擅長Java/Python/JavaScript語言,曾就職于創新工場,獵豹移動,參與開發移動應用,如安卓優化大師、清理大師等。昵稱Tiny熊,區塊鏈大本營特邀專欄作者,對底層公鏈,區塊鏈技術落地有深入研究。

本文原始鏈接https://learnblockchain.cn/2017/10/27/build_blockchain_by_python/,轉載請注明出處。

招聘新的一年已經到來,「CSDN」公眾號的目標更加明確,有更多的想法需要落地,不過目前對于小姐姐來說是“現實跟不上靈魂的腳步”,因為缺人~~所以,「CSDN」公眾號要壯大隊伍啦,現招聘業界與技術資深編輯記者、資深新媒體運營,有意者請將簡歷投至:,期待你的加入!如果你暫時不能加入我們的隊伍一起并肩戰斗,也歡迎加入「CSDN」作者大家庭,與所有「CSDN」的朋友們分享你的精彩文章,投稿郵箱:除了以上兩項,如果你熱愛技術分享,想要獲得更廣的視角和更前沿的技術探索,你還可以加入「CSDN」的譯者群,利用業余時間,在尊重版權的前提下,翻譯對中國開發者極有價值的文章,有意者請將簡歷投至:

Tags:區塊鏈BlockchainSDN區塊鏈工程專業學什么區塊鏈存證怎么弄區塊鏈技術發展現狀和趨勢blockchaintechnologyblockchain錢包是哪個國家的blockchain

Ethereum
自由也許只是幻覺!一文看懂美國財政部對Tornado Cash的制裁風波_以太坊

這是專欄《Degg的宏觀金融世界》的第15篇文章。 最近有個事件火遍了全網——美國財政部宣布對以太坊上的TornadoCash進行制裁,這次制裁在加密資產領域和法律領域,乃至傳統金融領域都引發了.

1900/1/1 0:00:00
新一輪大機會的到來!可以預見哪些利好幣?_BTC

比特幣以太坊自上周沖高遇阻后再次回歸于區間內震蕩,而這種震蕩已經持續一個月之久,通過長時間的拉鋸戰來瓦解多頭的信心,通過時間的消磨也在同時低位吸籌,直到足夠量變引起質變.

1900/1/1 0:00:00
市值TOP 100幣系列|Zcash有何魔力,竟引得中本聰接班人站臺!_比特幣

原創:幣圈大貓吳解區塊鏈昨天 導讀:所謂幣圈一日,人間一年,是形容幣圈的變化很快,時間流速是遠遠高于其它行業,在此背景之下,項目可謂是層出不窮,不少投資者盲目投資,或聽“大神”指導或追逐熱度.

1900/1/1 0:00:00
寄予厚望!這 7 種山寨幣受到投資者的關注_比特幣

在加密貨幣市場領先的加密貨幣比特幣的領導下,新的上升趨勢正在形成。在這種環境下,投資者和交易員正在探索具有支持多頭的潛力和技術指標的山寨幣項目。分析師解釋了他們對他們選擇的7種山寨幣的看法.

1900/1/1 0:00:00
急升做空、急跌做多!比特幣重磅信號:26500是最后上升趨勢支撐_比特幣

比特幣周二(4月25日)回跌至27500美元下方,黃金反彈一度觸及2000美元,也無法拯救比特幣的疲軟姿態.

1900/1/1 0:00:00
「區塊鏈百科」Elastos亦來云ELA、Augur幣REP、ARK鏈市值與簡介_區塊鏈

區塊鏈從發展的時間維度來講,還屬于發展的初期,方興未艾。目前區塊鏈項目如此之多,如欲甄別真正有價值的鳳毛麟角.

1900/1/1 0:00:00
ads