欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python區(qū)塊鏈基本原型簡(jiǎn)版實(shí)現(xiàn)示例

 更新時(shí)間:2022年05月24日 16:32:00   作者:曉彬_  
這篇文章主要為大家介紹了python區(qū)塊鏈基本原型簡(jiǎn)版實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

說(shuō)明

本文根據(jù)https://github.com/liuchengxu/blockchain-tutorial的內(nèi)容,用python實(shí)現(xiàn)的,但根據(jù)個(gè)人的理解進(jìn)行了一些修改,大量引用了原文的內(nèi)容。文章末尾有"本節(jié)完整源碼實(shí)現(xiàn)地址"。

引言

區(qū)塊鏈?zhǔn)?21 世紀(jì)最具革命性的技術(shù)之一,它仍然處于不斷成長(zhǎng)的階段,而且還有很多潛力尚未顯現(xiàn)。 本質(zhì)上,區(qū)塊鏈只是一個(gè)分布式數(shù)據(jù)庫(kù)而已。 不過(guò),使它獨(dú)一無(wú)二的是,區(qū)塊鏈?zhǔn)且粋€(gè)公開(kāi)的數(shù)據(jù)庫(kù),而不是一個(gè)私人數(shù)據(jù)庫(kù),也就是說(shuō),每個(gè)使用它的人都有一個(gè)完整或部分的副本。 只有經(jīng)過(guò)其他“數(shù)據(jù)庫(kù)管理員”的同意,才能向數(shù)據(jù)庫(kù)中添加新的記錄。 此外,也正是由于區(qū)塊鏈,才使得加密貨幣和智能合約成為現(xiàn)實(shí)。

在本系列文章中,我們將實(shí)現(xiàn)一個(gè)簡(jiǎn)化版的區(qū)塊鏈,并基于它來(lái)構(gòu)建一個(gè)簡(jiǎn)化版的加密貨幣。

區(qū)塊

首先從 “區(qū)塊” 談起。在區(qū)塊鏈中,真正存儲(chǔ)有效信息的是區(qū)塊(block)。而在比特幣中,真正有價(jià)值的信息就是交易(transaction)。實(shí)際上,交易信息是所有加密貨幣的價(jià)值所在。除此以外,區(qū)塊還包含了一些技術(shù)實(shí)現(xiàn)的相關(guān)信息,比如版本,當(dāng)前時(shí)間戳和前一個(gè)區(qū)塊的哈希。

不過(guò),我們要實(shí)現(xiàn)的是一個(gè)簡(jiǎn)化版的區(qū)塊鏈,而不是一個(gè)像比特幣技術(shù)規(guī)范所描述那樣成熟完備的區(qū)塊鏈。所以在我們目前的實(shí)現(xiàn)中,區(qū)塊僅包含了部分關(guān)鍵信息,它的數(shù)據(jù)結(jié)構(gòu)如下:

class Block(object):
    """A Block
    Attributes:
        _magic_no (int): Magic number
        _block_header (Block): Header of the previous Block.
        _transactions (Transaction): transactions of the current Block.
    """
    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)成部分,這里我們簡(jiǎn)化了一部分信息。在真正的比特幣中,區(qū)塊 的數(shù)據(jù)結(jié)構(gòu)如下:

FieldDescriptionSize
Magic novalue always 0xD9B4BEF94 bytes
Blocksizenumber of bytes following up to end of block4 bytes
Blockheaderconsists of 6 items80 bytes
Transaction counterpositive integer VI = VarInt1 - 9 bytes
transactionsthe (non empty) list of transactions-many transactions

區(qū)塊頭

class BlockHeader(object):
    """ A BlockHeader
    Attributes:
        timestamp (str): Creation timestamp of Block
        prev_block_hash (str): Hash of the previous Block.
        hash (str): Hash of the current Block.
        hash_merkle_root(str): Hash of the merkle_root.
        height (int): Height of Block
        nonce (int): A 32 bit arbitrary random number that is typically used once.
    """
    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當(dāng)前時(shí)間戳,也就是區(qū)塊創(chuàng)建的時(shí)間
prev_block_hash前一個(gè)塊的哈希,即父哈希
hash當(dāng)前塊頭的哈希
hash_merkle_root區(qū)塊存儲(chǔ)的交易的merkle樹(shù)的根哈希

我們這里的 timestamp,prev_block_hash, Hash,hash_merkle_root, 在比特幣技術(shù)規(guī)范中屬于區(qū)塊頭(block header),區(qū)塊頭是一個(gè)單獨(dú)的數(shù)據(jù)結(jié)構(gòu)。
完整的 比特幣的區(qū)塊頭(block header)結(jié)構(gòu) 如下:

FieldPurposeUpdated when…Size (Bytes)
VersionBlock version numberYou upgrade the software and it specifies a new version4
hashPrevBlock256-bit hash of the previous block headerA new block comes in32
hashMerkleRoot256-bit hash based on all of the transactions in the blockA transaction is accepted32
TimeCurrent timestamp as seconds since 1970-01-01T00:00 UTCEvery few seconds4
BitsCurrent target in compact formatThe difficulty is adjusted4
Nonce32-bit number (starts at 0)A hash is tried (increments)4

我們的簡(jiǎn)化版的區(qū)塊頭里,hash和hash_merkle_root是需要計(jì)算的。hash_merkle_root暫且不管留空,它是由區(qū)塊中的交易信息生成的merkle樹(shù)的根哈希。
而hash的計(jì)算如下:

    def set_hash(self):
        """
        Set hash of the header
        """
        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ū)塊,下面讓我們來(lái)實(shí)現(xiàn)區(qū)塊鏈。本質(zhì)上,區(qū)塊鏈就是一個(gè)有著特定結(jié)構(gòu)的數(shù)據(jù)庫(kù),是一個(gè)有序,每一個(gè)塊都連接到前一個(gè)塊的鏈表。也就是說(shuō),區(qū)塊按照插入的順序進(jìn)行存儲(chǔ),每個(gè)塊都與前一個(gè)塊相連。這樣的結(jié)構(gòu),能夠讓我們快速地獲取鏈上的最新塊,并且高效地通過(guò)哈希來(lái)檢索一個(gè)塊。

class BlockChain(object):
    def __init__(self):
        self.blocks = []

這就是我們的第一個(gè)區(qū)塊鏈!就是一個(gè)list。
我們還需要一個(gè)添加區(qū)塊的函數(shù):

    def add_block(self, transactions):
        """
        add a block to block_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)

為了加入一個(gè)新的塊,我們必須要有一個(gè)已有的塊,但是,初始狀態(tài)下,我們的鏈?zhǔn)强盏?,一個(gè)塊都沒(méi)有!所以,在任何一個(gè)區(qū)塊鏈中,都必須至少有一個(gè)塊。這個(gè)塊,也就是鏈中的第一個(gè)塊,通常叫做創(chuàng)世塊(genesis block). 讓我們實(shí)現(xiàn)一個(gè)方法來(lái)創(chuàng)建創(chuàng)世塊:

    # class BlockChain
    def new_genesis_block(self):
        if not self.blocks:
            genesis_block = Block.new_genesis_block('genesis_block')
            genesis_block.set_header_hash()
            self.blocks.append(genesis_block)
    # class Block
    @classmethod
    def new_genesis_block(cls, coin_base_tx):
        block_header = BlockHeader.new_genesis_block_header()
        return cls(block_header, coin_base_tx)
    # class BlockHeader
    @classmethod
    def new_genesis_block_header(cls):
        """
        NewGenesisBlock creates and returns genesis Block
        """
        return cls('', 0, '')

上面分別對(duì)應(yīng)三個(gè)函數(shù)分別對(duì)應(yīng)鏈中創(chuàng)世塊生成,創(chuàng)世塊生成,和創(chuàng)世塊頭的生成。

創(chuàng)世塊高度為0。這里我們暫時(shí)還沒(méi)有交易類,交易暫時(shí)用字符串代替。prev_block_hash和hash_merkle_root都暫時(shí)留空。

讓BlockChain支持迭代

    # class BlockChain
    def __getitem__(self, index):
        if index < len(self.blocks):
            return self.blocks[index]
        else:
            raise IndexError('Index is out of range')

最后再進(jìn)行簡(jiǎn)單的測(cè)試:

def main():
    bc = BlockChain()
    bc.new_genesis_block()
    bc.add_block('Send 1 BTC to B')
    bc.add_block('Send 2 BTC to B')
    for block in bc:
        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=BlockHeader(timestamp='1548150457.22', hash_merkle_root='', prev_block_hash='d21570e36f0c6f75c112d98416ca4ffae14e5cf02492bea5a7f8c398c1d458ca', hash='9c78f38ec78a0d492a27e69ab04a3e0ba07d70d31a1ef96d581e8198d9781bc0', nonce=None, height=2))

總結(jié)

我們創(chuàng)建了一個(gè)非常簡(jiǎn)單的區(qū)塊鏈原型:它僅僅是一個(gè)數(shù)組構(gòu)成的一系列區(qū)塊,每個(gè)塊都與前一個(gè)塊相關(guān)聯(lián)。真實(shí)的區(qū)塊鏈要比這復(fù)雜得多。在我們的區(qū)塊鏈中,加入新的塊非常簡(jiǎn)單,也很快,但是在真實(shí)的區(qū)塊鏈中,加入新的塊需要很多工作:你必須要經(jīng)過(guò)十分繁重的計(jì)算(這個(gè)機(jī)制叫做工作量證明),來(lái)獲得添加一個(gè)新塊的權(quán)力。并且,區(qū)塊鏈?zhǔn)且粋€(gè)分布式數(shù)據(jù)庫(kù),并且沒(méi)有單一決策者。因此,要加入一個(gè)新塊,必須要被網(wǎng)絡(luò)的其他參與者確認(rèn)和同意(這個(gè)機(jī)制叫做共識(shí)(consensus))。還有一點(diǎn),我們的區(qū)塊鏈還沒(méi)有任何的交易!

參考:
[1] basic-prototype

[2] 完整實(shí)現(xiàn)源碼

以上就是python區(qū)塊鏈基本原型簡(jiǎn)版實(shí)現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于python區(qū)塊鏈基本原型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python自動(dòng)化測(cè)試中裝飾器@ddt與@data源碼深入解析

    python自動(dòng)化測(cè)試中裝飾器@ddt與@data源碼深入解析

    最近工作中接觸了python自動(dòng)化測(cè)試,所以下面這篇文章主要給大家介紹了關(guān)于python自動(dòng)化測(cè)試中裝飾器@ddt與@data源碼解析的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • python中的單向鏈表實(shí)現(xiàn)

    python中的單向鏈表實(shí)現(xiàn)

    大家好,本篇文章主要講的是python中的單向鏈表實(shí)現(xiàn),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • typing.Dict和Dict的區(qū)別及它們?cè)赑ython中的用途小結(jié)

    typing.Dict和Dict的區(qū)別及它們?cè)赑ython中的用途小結(jié)

    當(dāng)在 Python 函數(shù)中聲明一個(gè) dictionary 作為參數(shù)時(shí),我們一般會(huì)把 key 和 value 的數(shù)據(jù)類型聲明為全局變量,而不是局部變量。,這篇文章主要介紹了typing.Dict和Dict的區(qū)別及它們?cè)赑ython中的用途小結(jié),需要的朋友可以參考下
    2023-06-06
  • Python用requests-html爬取網(wǎng)頁(yè)的實(shí)現(xiàn)

    Python用requests-html爬取網(wǎng)頁(yè)的實(shí)現(xiàn)

    本文主要介紹了Python用requests-html爬取網(wǎng)頁(yè)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • python如何爬取動(dòng)態(tài)網(wǎng)站

    python如何爬取動(dòng)態(tài)網(wǎng)站

    在本篇內(nèi)容里小編給各位分享了關(guān)于python如何爬取動(dòng)態(tài)網(wǎng)站的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以參考下。
    2020-09-09
  • Python?OpenCV超詳細(xì)講解調(diào)整大小與圖像操作的實(shí)現(xiàn)

    Python?OpenCV超詳細(xì)講解調(diào)整大小與圖像操作的實(shí)現(xiàn)

    OpenCV用C++語(yǔ)言編寫,它具有C?++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac?OS,OpenCV主要傾向于實(shí)時(shí)視覺(jué)應(yīng)用,并在可用時(shí)利用MMX和SSE指令,本篇文章帶你通過(guò)OpenCV實(shí)現(xiàn)重調(diào)大小與圖像裁剪
    2022-04-04
  • python屬于哪種語(yǔ)言

    python屬于哪種語(yǔ)言

    在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于python屬于哪種語(yǔ)言的一篇基礎(chǔ)內(nèi)容文章,有興趣的朋友們可以參考下。
    2020-08-08
  • python版本的讀寫鎖操作方法

    python版本的讀寫鎖操作方法

    這篇文章主要介紹了python版本的讀寫鎖操作方法,結(jié)合實(shí)例形式分析了Python讀寫鎖機(jī)制的原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-04-04
  • 用python生成(動(dòng)態(tài)彩色)二維碼的方法(使用myqr庫(kù)實(shí)現(xiàn))

    用python生成(動(dòng)態(tài)彩色)二維碼的方法(使用myqr庫(kù)實(shí)現(xiàn))

    今天小編就為大家分享一篇用python生成(動(dòng)態(tài)彩色)二維碼的方法(使用myqr庫(kù)實(shí)現(xiàn)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • pycharm 添加解釋器的方法步驟

    pycharm 添加解釋器的方法步驟

    這篇文章主要介紹了pycharm 添加解釋器的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評(píng)論