




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第python區(qū)塊鏈基本原型簡版實現(xiàn)示例目錄說明引言區(qū)塊區(qū)塊頭區(qū)塊鏈總結(jié)
說明
本文根據(jù)/liuchengxu/blockchain-tutorial的內(nèi)容,用python實現(xiàn)的,但根據(jù)個人的理解進行了一些修改,大量引用了原文的內(nèi)容。文章末尾有本節(jié)完整源碼實現(xiàn)地址。
引言
區(qū)塊鏈是21世紀最具革命性的技術(shù)之一,它仍然處于不斷成長的階段,而且還有很多潛力尚未顯現(xiàn)。本質(zhì)上,區(qū)塊鏈只是一個分布式數(shù)據(jù)庫而已。不過,使它獨一無二的是,區(qū)塊鏈是一個公開的數(shù)據(jù)庫,而不是一個私人數(shù)據(jù)庫,也就是說,每個使用它的人都有一個完整或部分的副本。只有經(jīng)過其他數(shù)據(jù)庫管理員的同意,才能向數(shù)據(jù)庫中添加新的記錄。此外,也正是由于區(qū)塊鏈,才使得加密貨幣和智能合約成為現(xiàn)實。
在本系列文章中,我們將實現(xiàn)一個簡化版的區(qū)塊鏈,并基于它來構(gòu)建一個簡化版的加密貨幣。
區(qū)塊
首先從區(qū)塊談起。在區(qū)塊鏈中,真正存儲有效信息的是區(qū)塊(block)。而在比特幣中,真正有價值的信息就是交易(transaction)。實際上,交易信息是所有加密貨幣的價值所在。除此以外,區(qū)塊還包含了一些技術(shù)實現(xiàn)的相關(guān)信息,比如版本,當前時間戳和前一個區(qū)塊的哈希。
不過,我們要實現(xiàn)的是一個簡化版的區(qū)塊鏈,而不是一個像比特幣技術(shù)規(guī)范所描述那樣成熟完備的區(qū)塊鏈。所以在我們目前的實現(xiàn)中,區(qū)塊僅包含了部分關(guān)鍵信息,它的數(shù)據(jù)結(jié)構(gòu)如下:
classBlock(object):
"""ABlock
Attributes:
_magic_no(int):Magicnumber
_block_header(Block):HeaderofthepreviousBlock.
_transactions(Transaction):transactionsofthecurrentBlock.
MAGIC_NO=0xBCBCBCBC
def__init__(self,block_header,transactions):
self._magic_no=self.MAGIC_NO
self._block_header=block_header
self._transactions=transactions
字段解釋_magic_no魔數(shù)_block_header區(qū)塊頭_transactions交易
這里的_magic_no,_block_header,_transactions,也是比特幣區(qū)塊的構(gòu)成部分,這里我們簡化了一部分信息。在真正的比特幣中,區(qū)塊的數(shù)據(jù)結(jié)構(gòu)如下:
FieldDescriptionSizeMagicnovaluealways0xD9B4BEF94bytesBlocksizenumberofbytesfollowinguptoendofblock4bytesBlockheaderconsistsof6items80bytesTransactioncounterpositiveintegerVI=VarInt1-9bytestransactionsthe(nonempty)listoftransactions-manytransactions
區(qū)塊頭
classBlockHeader(object):
"""ABlockHeader
Attributes:
timestamp(str):CreationtimestampofBlock
prev_block_hash(str):HashofthepreviousBlock.
hash(str):HashofthecurrentBlock.
hash_merkle_root(str):Hashofthemerkle_root.
height(int):HeightofBlock
nonce(int):A32bitarbitraryrandomnumberthatistypicallyusedonce.
def__init__(self,hash_merkle_root,height,pre_block_hash=''):
self.timestamp=str(time.time())
self.prev_block_hash=pre_block_hash
self.hash=None
self.hash_merkle_root=hash_merkle_root
self.height=height
self.nonce=None
字段解釋timestamp當前時間戳,也就是區(qū)塊創(chuàng)建的時間prev_block_hash前一個塊的哈希,即父哈希hash當前塊頭的哈希hash_merkle_root區(qū)塊存儲的交易的merkle樹的根哈希
我們這里的timestamp,prev_block_hash,Hash,hash_merkle_root,在比特幣技術(shù)規(guī)范中屬于區(qū)塊頭(blockheader),區(qū)塊頭是一個單獨的數(shù)據(jù)結(jié)構(gòu)。
完整的比特幣的區(qū)塊頭(blockheader)結(jié)構(gòu)如下:
FieldPurposeUpdatedwhenSize(Bytes)VersionBlockversionnumberYouupgradethesoftwareanditspecifiesanewversion4hashPrevBlock256-bithashofthepreviousblockheaderAnewblockcomesin32hashMerkleRoot256-bithashbasedonallofthetransactionsintheblockAtransactionisaccepted32TimeCurrenttimestampassecondssince1970-01-01T00:00UTCEveryfewseconds4BitsCurrenttargetincompactformatThedifficultyisadjusted4Nonce32-bitnumber(startsat0)Ahashistried(increments)4
我們的簡化版的區(qū)塊頭里,hash和hash_merkle_root是需要計算的。hash_merkle_root暫且不管留空,它是由區(qū)塊中的交易信息生成的merkle樹的根哈希。
而hash的計算如下:
defset_hash(self):
Sethashoftheheader
data_list=[str(self.timestamp),
str(self.prev_block_hash),
str(self.hash_merkle_root),
str(self.height),
str(self.nonce)]
data=''.join(data_list)
self.hash=sum256_hex(data)
區(qū)塊鏈
有了區(qū)塊,下面讓我們來實現(xiàn)區(qū)塊鏈。本質(zhì)上,區(qū)塊鏈就是一個有著特定結(jié)構(gòu)的數(shù)據(jù)庫,是一個有序,每一個塊都連接到前一個塊的鏈表。也就是說,區(qū)塊按照插入的順序進行存儲,每個塊都與前一個塊相連。這樣的結(jié)構(gòu),能夠讓我們快速地獲取鏈上的最新塊,并且高效地通過哈希來檢索一個塊。
classBlockChain(object):
def__init__(self):
self.blocks=[]
這就是我們的第一個區(qū)塊鏈!就是一個list。
我們還需要一個添加區(qū)塊的函數(shù):
defadd_block(self,transactions):
addablocktoblock_chain
last_block=self.blocks[-1]
prev_hash=last_block.get_header_hash()
height=len(self.blocks)
block_header=BlockHeader('',height,prev_hash)
block=Block(block_header,transactions)
block.set_header_hash()
self.blocks.append(block)
為了加入一個新的塊,我們必須要有一個已有的塊,但是,初始狀態(tài)下,我們的鏈是空的,一個塊都沒有!所以,在任何一個區(qū)塊鏈中,都必須至少有一個塊。這個塊,也就是鏈中的第一個塊,通常叫做創(chuàng)世塊(genesisblock).讓我們實現(xiàn)一個方法來創(chuàng)建創(chuàng)世塊:
#classBlockChain
defnew_genesis_block(self):
ifnotself.blocks:
genesis_block=Block.new_genesis_block('genesis_block')
genesis_block.set_header_hash()
self.blocks.append(genesis_block)
#classBlock
@classmethod
defnew_genesis_block(cls,coin_base_tx):
block_header=BlockHeader.new_genesis_block_header()
returncls(block_header,coin_base_tx)
#classBlockHeader
@classmethod
defnew_genesis_block_header(cls):
NewGenesisBlockcreatesandreturnsgenesisBlock
returncls('',0,'')
上面分別對應三個函數(shù)分別對應鏈中創(chuàng)世塊生成,創(chuàng)世塊生成,和創(chuàng)世塊頭的生成。
創(chuàng)世塊高度為0。這里我們暫時還沒有交易類,交易暫時用字符串代替。prev_block_hash和hash_merkle_root都暫時留空。
讓BlockChain支持迭代
#classBlockChain
def__getitem__(self,index):
ifindexlen(self.blocks):
returnself.blocks[index]
else:
raiseIndexError('Indexisoutofrange')
最后再進行簡單的測試:
defmain():
bc=BlockChain()
bc.new_genesis_block()
bc.add_block('Send1BTCtoB')
bc.add_block('Send2BTCtoB')
forblockinbc:
print(block)
if__name__=="__main__":
main()
輸出:
Block(_block_header=BlockHeader(timestamp='1548150457.22',hash_merkle_root='',prev_block_hash='',hash='f91f638a9a2b4caf241112d3bc92c9168cc9d52207a5580b3a549ed5343e2ed3',nonce=None,height=0))
Block(_block_header=BlockHeader(timestamp='1548150457.22',hash_merkle_root='',prev_block_hash='f91f638a9a2b4caf241112d3bc92c9168cc9d52207a5580b3a549ed5343e2ed3',hash='d21570e36f0c6f75c112d98416ca4ffae14e5cf02492bea5a7f8c398c1d458ca',nonce=None,height=1))
Block(_block_header=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 生物技術(shù)發(fā)展規(guī)劃策略研究報告總結(jié)
- 麻醉學鎮(zhèn)痛泵使用人員培訓方案
- 預防心肌梗塞的運動方案
- 采購員個人20xx年工作計劃
- 微項目 研究車用燃料及安全氣囊 -利用化學反應解決實際問題教學設(shè)計高中化學魯科版2019必修第二冊-魯科版2019
- 高中信息技術(shù) Flash作品的合成說課稿
- 2025年崗前培訓考試試題及答案
- 2025年保安員從業(yè)資格證及保安崗位職責考試題庫及答案
- 2025年中醫(yī)護理知識重點題庫及答案
- 2025年護理規(guī)培問答題題庫及答案大全
- 興東線泰州段航道整治工程環(huán)評資料環(huán)境影響
- 踝關(guān)節(jié)超聲檢查
- 【成都】2025年四川成都高新區(qū)“蓉漂人才薈”招聘事業(yè)單位工作人員10人筆試歷年典型考題及考點剖析附帶答案詳解
- 冠脈介入培訓心得體會
- 材料進場檢測方案(3篇)
- 腫瘤內(nèi)科護士進修總結(jié)
- DB5301-T 19-2025 公園綠地設(shè)計規(guī)范
- 中醫(yī)高血壓糖尿病課件
- 無人機集群技術(shù)-智能組網(wǎng)與協(xié)同 課件 第7章 無人機集群協(xié)同搜索
- 美容科規(guī)章制度
- 室內(nèi)設(shè)計項目的安全保證措施
評論
0/150
提交評論