點擊上方“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類,在構造函數中創建了兩個列表,一個用于儲存區塊鏈,一個用于儲存交易。
聲音 | Ripple CEO:正與監管機構會面解釋如何使用加密技術:Ripple CEO Brad Garlinghouse在接受采訪時表示其正在告訴銀行,“加密不是一個壞詞”。他稱,“我正在做很多事情是與監管機構、銀行高層會面,向他們解釋如何使用加密技術,特別是XRP來解決實際問題,而不是規避監管。一旦人們理解了這一點,他們很快就會解除武裝,加密這個詞就不再是一個貶義詞”。(CoinTeleraph)[2020/2/20]
以下是Blockchain類的框架:
classBlockchain(object):def__init__(self):self.chain=self.current_transactions=defnew_block(self):Billions項目組Addsanewtransactiontothelistoftransactionspass@staticmethoddefhash(block):Billions項目組ReturnsthelastBlockinthechainpass
Blockchain類用來管理鏈條,它能存儲交易、加入新塊等,下面我們來進一步完善這些方法。
塊結構
每個區塊包含屬性:索引、Unix時間戳、交易列表、工作量證明以及前一個區塊的Hash值。
以下是一個區塊的結構:
block={'index':1,'timestamp':1506057125.900785,'transactions':,'proof':324984774000,'previous_hash':"2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"}
到這里區塊鏈的概念就清楚了,每個新的區塊都包含上一個區塊的Hash,這是關鍵的一點,它保障了區塊鏈不可變性。如果攻擊者破壞了前面的某個區塊,那么后面所有區塊的Hash都會變得不正確。不理解的話,慢慢消化,可參考{%post_linkwhatbc區塊鏈技術原理%}。
聲音 | 韋氏評級:無論比特幣盈利能力如何 投資者都更傾向于存幣而非賣幣:韋氏評級今日稱,超過60%的比特幣一年多都存儲于錢包中而非在市場流通。在此期間,比特幣兌美元的價格從去年12月的3100美元上漲到僅6個月后2019年的13800美元高點。無論盈利能力如何,投資者都希望存幣而不是賣幣。[2019/12/3]
加入交易
接下來我們需要添加一個交易,來完善下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
方法向列表中添加一個交易記錄,并返回該記錄將被添加到的區塊(下一個待挖掘的區塊)的索引,等下在用戶提交交易時會有用。
創建新塊
當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}')
聲音 | 趙長鵬:無論市場如何變化,幣安仍將在100年內存在:據CCN報道,幣安首席執行官趙長鵬今日表示,無論行業發生什么變化,幣安仍將在100年內存在。幣安團隊并沒有對每日比特幣的價格波動有所顧忌,基本上并沒有真正關注市場,而是長期關注并專注于團隊工作。趙長鵬表示,幣安只是低著頭,建立功能。[2019/2/8]
結果是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"
動態 | 社科院法學所刊文《對“去中心化”的區塊鏈如何監管》:中國社科院法學所趙磊在《經濟參考報》發表題為《對“去中心化”的區塊鏈如何監管》的文章。文章指出,對區塊鏈技術的監管,應該分為兩個層面:一是結合區塊鏈技術的具體應用場景,分行業進行監管;另一是針對區塊鏈,制定專門的技術標準,以實現區塊鏈技術的規范、統一。而判斷某種商業活動或者社會管理活動是否可以應用區塊鏈,至少應該從以下兩方面進行衡量:一方面是區塊鏈技術只能在虛擬空間中應用;另一方面是區塊鏈技術無論在何種場景中應用,必須符合其去中心化、共識機制與分布式記賬等技術特征。[2019/1/10]
衡量算法復雜度的辦法是修改零開頭的個數。使用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
金色財經獨家分析 比特幣期貨市場空倉降低 對現貨價格的影響如何?:報道稱大型投機客在芝加哥期權交易所的比特幣期貨凈空倉降至1370張合約,為該產品12月上線以來最低的凈空水平,顯示市場情緒好轉。 金色財經獨家解讀,與其他期貨一樣,比特幣期貨同樣具有價值發現和套期保值(礦工的最愛)的作用,期貨價格與現貨價格走勢相似,臨近合約日期貨與現貨價格趨同,期貨價格帶動現貨價格的走勢,讓套利空間逐漸收窄。
期貨等金融衍生品爭相上線,一方面使得數字貨幣的定價權爭奪趨于激烈,另一方面也吸引更多的專業傳統金融投資者加入,兩者共同促進幣價趨于理性。隨著更多保值需求者和更多投機套利者的加入,流動性將增強,對現貨市場的引領能力會更強,也反映出人們更愿意在監管下開展交易。需要說明的是,由于比特幣本身價格的波動劇烈,期貨交易又加杠桿,所以一定警惕爆倉風險。[2018/3/26]
第一個方法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
在最近這一周,幣圈最熱的新聞無疑是庫幣交易所被黑客攻擊。26日凌晨,庫幣交易所遭受黑客攻擊,大量資產被盜.
1900/1/1 0:00:00Billions項目組 我想談一談對于Crypto項目“空投模式”的看法。后文總結的有空投百倍幣!對于大多數投資者,無論是什么標的,只要是賺錢的事情、造富的事情都會引起人們的極大關注.
1900/1/1 0:00:00比特幣(BTC) 比特幣是最受歡迎的加密貨幣,最近因其價格飛速上漲而成為新聞。隨著美國公布新的CPI數據的消息,數字貨幣突破了20,000美元大關,突破了之前18,000美元的關口.
1900/1/1 0:00:00這種山寨幣價格即將上漲 自2022年5月以來,Chainlink(LINK)的價格一直在5.5美元至9.5美元的范圍內交易.
1900/1/1 0:00:00Libra是一種由獨立非營利組織運營的新型加密貨幣,于2020年推出。Facebook還宣布了一個新的子公司Calibra,它將為Libra構建產品.
1900/1/1 0:00:00在經歷了一段艱難的低迷和急劇下跌之后,基于全球宏觀經濟和近期通脹數據,加密貨幣領域終于見證了巨大的看漲軌跡,全球加密貨幣市場已達到1.26萬億美元的新里程碑.
1900/1/1 0:00:00