python區(qū)塊鏈基本原型簡版實現(xiàn)示例_第1頁
python區(qū)塊鏈基本原型簡版實現(xiàn)示例_第2頁
python區(qū)塊鏈基本原型簡版實現(xiàn)示例_第3頁
python區(qū)塊鏈基本原型簡版實現(xiàn)示例_第4頁
python區(qū)塊鏈基本原型簡版實現(xiàn)示例_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論