五月天婷亚洲天久久综合网,婷婷丁香五月激情亚洲综合,久久男人精品女人,麻豆91在线播放

  • <center id="8gusu"></center><rt id="8gusu"></rt>
    <menu id="8gusu"><small id="8gusu"></small></menu>
  • <dd id="8gusu"><s id="8gusu"></s></dd>
    樓主: Studio-R
    1712 2

    [區(qū)塊鏈] 邊構建區(qū)塊鏈邊學習(Jupyter notebook) [推廣有獎]

    • 5關注
    • 12粉絲

    教授

    20%

    還不是VIP/貴賓

    -

    威望
    0
    論壇幣
    37933 個
    通用積分
    1108.6812
    學術水平
    31 點
    熱心指數(shù)
    30 點
    信用等級
    18 點
    經(jīng)驗
    26009 點
    帖子
    752
    精華
    1
    在線時間
    1270 小時
    注冊時間
    2016-11-3
    最后登錄
    2024-12-4

    樓主
    Studio-R 在職認證  發(fā)表于 2018-1-30 08:41:56 |只看作者 |壇友微信交流群|倒序 |AI寫論文

    +2 論壇幣
    k人 參與回答

    經(jīng)管之家送您一份

    應屆畢業(yè)生專屬福利!

    求職就業(yè)群
    趙安豆老師微信:zhaoandou666

    經(jīng)管之家聯(lián)合CDA

    送您一個全額獎學金名額~ !

    感謝您參與論壇問題回答

    經(jīng)管之家送您兩個論壇幣!

    +2 論壇幣
    邊構建區(qū)塊鏈邊學習(Jupyter notebook)
    • 構建區(qū)塊鏈的同時進行學習|編程|使用在POSTD中發(fā)布的解釋和代碼逐步進行測試。

    • 直接由Jupyter實施,因為覺得在Flask中的實現(xiàn)很多余。

    • 閱讀文本是假定您對于塊鏈本身的機制已經(jīng)有所理解。






    代碼的實現(xiàn)1.創(chuàng)建一個區(qū)塊鏈類


    In [1]:
    1. from time import time
    2. import hashlib
    3. import json

    4. class Blockchain(object):
    5.     def __init__(self):
    6.         self.current_transactions = []
    7.         self.chain = []

    8.         # Create the genesis block
    9.         self.new_block(previous_hash=1, proof=100)

    10.     def new_block(self, proof, previous_hash=None):
    11.         """
    12.         Create a new Block in the Blockchain
    13.         :param proof: <int> The proof given by the Proof of Work algorithm
    14.         :param previous_hash: (Optional) <str> Hash of previous Block
    15.         :return: <dict> New Block
    16.         """
    17.         block = {
    18.             'index': len(self.chain) + 1,
    19.             'timestamp': time(),
    20.             'transactions': self.current_transactions,
    21.             'proof': proof,
    22.             'previous_hash': previous_hash or self.hash(self.chain[-1]),
    23.         }

    24.         # Reset the current list of transactions
    25.         self.current_transactions = []

    26.         self.chain.append(block)
    27.         return block

    28.     def new_transaction(self, sender, recipient, amount):
    29.         """
    30.         Creates a new transaction to go into the next mined Block
    31.         :param sender: <str> Address of the Sender
    32.         :param recipient: <str> Address of the Recipient
    33.         :param amount: <int> Amount
    34.         :return: <int> The index of the Block that will hold this transaction
    35.         """
    36.         self.current_transactions.append({
    37.             'sender': sender,
    38.             'recipient': recipient,
    39.             'amount': amount,
    40.         })
    41.         return self.last_block['index'] + 1

    42.     @staticmethod
    43.     def hash(block):
    44.         """
    45.         Creates a SHA-256 hash of a Block
    46.         :param block: <dict> Block
    47.         :return: <str>
    48.         """
    49.         # We must make sure that the Dictionary is Ordered, or we'll have inconsistent hashes
    50.         block_string = json.dumps(block, sort_keys=True).encode()
    51.         return hashlib.sha256(block_string).hexdigest()

    52.     @property
    53.     def last_block(self):
    54.         return self.chain[-1]

    55.     def proof_of_work(self, last_proof):
    56.         """
    57.         Simple Proof of Work Algorithm:
    58.          - Find a number p' such that hash(pp') contains leading 4 zeroes, where p is the previous p'
    59.          - p is the previous proof, and p' is the new proof
    60.         :param last_proof: <int>
    61.         :return: <int>
    62.         """
    63.         proof = 0
    64.         while self.valid_proof(last_proof, proof) is False:
    65.             proof += 1
    66.         return proof

    67.     @staticmethod
    68.     def valid_proof(last_proof, proof):
    69.         """
    70.         Validates the Proof: Does hash(last_proof, proof) contain 4 leading zeroes?
    71.         :param last_proof: <int> Previous Proof
    72.         :param proof: <int> Current Proof
    73.         :return: <bool> True if correct, False if not.
    74.         """
    75.         guess = ('%d%d' % (last_proof, proof)).encode()
    76.         guess_hash = hashlib.sha256(guess).hexdigest()
    77.         return guess_hash[:4] == "0000"
    復制代碼

    2.挖礦代碼


    In [2]:
    1. from uuid import uuid4

    2. node_identifier = str(uuid4()).replace('-', '')

    3. def mine(blockchain):
    4.     global node_identifier
    5.    
    6.     # We run the proof of work algorithm to get the next proof...
    7.     last_block = blockchain.last_block
    8.     last_proof = last_block['proof']
    9.     proof = blockchain.proof_of_work(last_proof)

    10.     # We must receive a reward for finding the proof.
    11.     # The sender is "0" to signify that this node has mined a new coin.
    12.     blockchain.new_transaction(
    13.         sender="0",
    14.         recipient=node_identifier,
    15.         amount=1,
    16.     )

    17.     # Forge the new Block by adding it to the chain
    18.     previous_hash = blockchain.hash(last_block)
    19.     block = blockchain.new_block(proof, previous_hash)

    20.     response = {
    21.         'message': "New Block Forged",
    22.         'index': block['index'],
    23.         'transactions': block['transactions'],
    24.         'proof': block['proof'],
    25.         'previous_hash': block['previous_hash'],
    26.     }
    27.     return response
    復制代碼





    3.添加示例并返回整個鏈


    In [3]:
    1. def full_chain(blockchain):
    2.     response = {
    3.         'chain': blockchain.chain,
    4.         'length': len(blockchain.chain),
    5.     }
    6.     return response
    復制代碼




    嘗試移動塊鏈

    使用pprint使顯示更容易看到。




    In [4]:
    1. import pprint
    2. pp = pprint.PrettyPrinter(indent=2)
    復制代碼

    自身節(jié)點的標識符如下。




    In [5]:
    1. import pprint
    2. pp = pprint.PrettyPrinter(indent=2)
    復制代碼
    Out[5]:
    '7d10057a10364156aa9ac7b92ce3c34e'





    一旦實例化,將創(chuàng)建第一個區(qū)塊

    • index:索引為1
    • previous_hash:初始的hash值1
    • length:鏈條的長度顯然是1



    In [6]:
    1. b = Blockchain()
    2. pp.pprint(full_chain(b))
    復制代碼

    開始創(chuàng)建第一個街區(qū)

    1. { 'chain': [ { 'index': 1,
    2.                'previous_hash': 1,
    3.                'proof': 100,
    4.                'timestamp': 1516245610.8226993,
    5.                'transactions': []}],
    6.   'length': 1}
    復制代碼

    In [7]:
    1. newblock = mine(b)
    2. pp.pprint(newblock)
    復制代碼
    1. { 'index': 2,
    2.   'message': 'New Block Forged',
    3.   'previous_hash': 'b0879b53a4230c49e23d3c4715034e732bc07ab54f3ba16dbd0fa73860d8faee',
    4.   'proof': 35293,
    5.   'transactions': [ { 'amount': 1,
    6.                       'recipient': '7d10057a10364156aa9ac7b92ce3c34e',
    7.                       'sender': '0'}]}
    復制代碼

    在交易環(huán)節(jié)中,只描述了采礦挖掘交易

    • sender:發(fā)件人為0
    • recipient:收件人標識符
    • amount:金額是1

    記錄為交易。 現(xiàn)在我們來看看整個區(qū)塊鏈的內容




    In [8]:
    1. pp.pprint(full_chain(b))
    復制代碼
    1. { 'chain': [ { 'index': 1,
    2.                'previous_hash': 1,
    3.                'proof': 100,
    4.                'timestamp': 1516245610.8226993,
    5.                'transactions': []},
    6.              { 'index': 2,
    7.                'previous_hash': 'b0879b53a4230c49e23d3c4715034e732bc07ab54f3ba16dbd0fa73860d8faee',
    8.                'proof': 35293,
    9.                'timestamp': 1516245625.9124067,
    10.                'transactions': [ { 'amount': 1,
    11.                                    'recipient': '7d10057a10364156aa9ac7b92ce3c34e',
    12.                                    'sender': '0'}]}],
    13.   'length': 2}
    復制代碼





    作為一個新的交易(交易),有的區(qū)塊只包含挖掘結果。

    我們在這里添加一個新的事務。

    • 添加發(fā)件人到'foo'
    • 將收件人設置為'bar'
    • amount 設置為10

    并達成交易。




    In [9]:
    1. index = b.new_transaction('foo', 'bar', 10)
    復制代碼


    此時index(塊的索引)是3。 上述交易存儲在這個塊中。




    In [10]:
    1. print(index)
    復制代碼
    3

    此時,從整個鏈條來看,上面添加的交易還沒有在鏈上注冊。




    In [11]:
    1. pp.pprint(full_chain(b))
    復制代碼
    1. { 'chain': [ { 'index': 1,
    2.                'previous_hash': 1,
    3.                'proof': 100,
    4.                'timestamp': 1516245610.8226993,
    5.                'transactions': []},
    6.              { 'index': 2,
    7.                'previous_hash': 'b0879b53a4230c49e23d3c4715034e732bc07ab54f3ba16dbd0fa73860d8faee',
    8.                'proof': 35293,
    9.                'timestamp': 1516245625.9124067,
    10.                'transactions': [ { 'amount': 1,
    11.                                    'recipient': '7d10057a10364156aa9ac7b92ce3c34e',
    12.                                    'sender': '0'}]}],
    13.   'length': 2}
    復制代碼





    挖礦并添加一個新的塊。


    In [12]:
    1. newblock = mine(b)
    復制代碼

    創(chuàng)建第3個區(qū)塊,保存之前創(chuàng)建的事務信息和挖掘信息。




    In [13]:

    pp.pprint(newblock)
    { 'index': 3,  'message': 'New Block Forged',  'previous_hash': '635b05a6a3d32c78f3d23fa9ab44222616ba073cac93f064fedeafb6684ad645',  'proof': 35089,  'transactions': [ {'amount': 10, 'recipient': 'bar', 'sender': 'foo'},                    { 'amount': 1,                      'recipient': '7d10057a10364156aa9ac7b92ce3c34e',                      'sender': '0'}]}


    此時整個鏈條的狀態(tài)如下。




    In [14]:
    pp.pprint(full_chain(b)){ 'chain': [ { 'index': 1,               'previous_hash': 1,               'proof': 100,               'timestamp': 1516245610.8226993,               'transactions': []},             { 'index': 2,               'previous_hash': 'b0879b53a4230c49e23d3c4715034e732bc07ab54f3ba16dbd0fa73860d8faee',               'proof': 35293,               'timestamp': 1516245625.9124067,               'transactions': [ { 'amount': 1,                                   'recipient': '7d10057a10364156aa9ac7b92ce3c34e',                                   'sender': '0'}]},             { 'index': 3,               'previous_hash': '635b05a6a3d32c78f3d23fa9ab44222616ba073cac93f064fedeafb6684ad645',               'proof': 35089,               'timestamp': 1516245688.0261838,               'transactions': [ { 'amount': 10,                                   'recipient': 'bar',                                   'sender': 'foo'},                                 { 'amount': 1,                                   'recipient': '7d10057a10364156aa9ac7b92ce3c34e',                                   'sender': '0'}]}],  'length': 3}



    智能合約(分布式)class Blockchain2()類的實現(xiàn)

    實現(xiàn)Blcokchain 2類包含共識算法。

    另外,節(jié)點標識符被保存為一個類成員,并且在挖掘它時被修改為使用它。 (為了能夠處理多個節(jié)點的塊鏈)

    (實際上,定義Node類并將Blockchain 2類作為has-a作為成員似乎更好,但是因為在Blockchain類的原始版本中引入了register_node()或resolve_conflicts()




    In [15]:import copyBlockchainNeighbours = {}class Blockchain2(Blockchain):    def __init__(self, node_identifier):        super().__init__()        self.nodes = set()        self.node_identifier = node_identifier            def register_node(self, node_identifier):        """        Add a new node to the list of nodes        :node_identifier: <str> Node identifier of the neighbour node.        :return: None        """        self.nodes.add(node_identifier)    def valid_chain(self, chain):        """        Determine if a given blockchain is valid        :param chain: <list> A blockchain        :return: <bool> True if valid, False if not        """        last_block = chain[0]        current_index = 1        while current_index < len(chain):            block = chain[current_index]#            print(f'{last_block}')#            print(f'{block}')#            print("\n-----------\n")            # Check that the hash of the block is correct            if block['previous_hash'] != self.hash(last_block):                return False            # Check that the Proof of Work is correct            if not self.valid_proof(last_block['proof'], block['proof']):                return False            last_block = block            current_index += 1        return True    def resolve_conflicts(self):        """        This is our Consensus Algorithm, it resolves conflicts        by replacing our chain with the longest one in the network.        :return: <bool> True if our chain was replaced, False if not        """        neighbours = self.nodes        new_chain = None        # We're only looking for chains longer than ours        max_length = len(self.chain)        # Grab and verify the chains from all the nodes in our network        for node in neighbours:            blockchain = BlockchainNeighbours[node]            print('node id: %s, len: %d' % (blockchain.node_identifier, len(blockchain.chain)))            # Check if the length is longer and the chain is valid            if len(blockchain.chain) > max_length and self.valid_chain(blockchain.chain):                max_length = len(blockchain.chain)                new_chain = blockchain        # Replace our chain if we discovered a new, valid chain longer than ours        if new_chain:            print("Replacing `%s' <- `%s'" % (self.node_identifier, new_chain.node_identifier))            self.chain = copy.copy(new_chain.chain)            return True        return False


    In [16]:def mine2(blockchain):    # We run the proof of work algorithm to get the next proof...    last_block = blockchain.last_block    last_proof = last_block['proof']    proof = blockchain.proof_of_work(last_proof)    # We must receive a reward for finding the proof.    # The sender is "0" to signify that this node has mined a new coin.    blockchain.new_transaction(        sender="0",        recipient=blockchain.node_identifier,        amount=1,    )    # Forge the new Block by adding it to the chain    previous_hash = blockchain.hash(last_block)    block = blockchain.new_block(proof, previous_hash)    response = {        'message': "New Block Forged",        'index': block['index'],        'transactions': block['transactions'],        'proof': block['proof'],        'previous_hash': block['previous_hash'],    }    return response


    創(chuàng)建多個節(jié)點的塊鏈



    為三個節(jié)點創(chuàng)建一個塊鏈,并注冊為一個相鄰節(jié)點。




    In [35]:# 為節(jié)點標識符為“foo”,“bar”,“buz”的三個節(jié)點創(chuàng)建一個塊鏈。foo = Blockchain2('foo')bar = Blockchain2('bar')buz = Blockchain2('buz')# 注冊在相鄰節(jié)點的列表中BlockchainNeighbours['foo'] = fooBlockchainNeighbours['bar'] = barBlockchainNeighbours['buz'] = buz# 'bar','buz'注冊為'foo'節(jié)點鄰居foo.register_node('bar')foo.register_node('buz')# 為“bar”,“buz”節(jié)點注冊鄰居bar.register_node('foo')bar.register_node('buz')buz.register_node('foo')buz.register_node('bar')



    在初始狀態(tài)下,所有節(jié)點的鏈路長度為1。




    In [18]:
    print('foo: %d, bar: %d, buz: %d' %(len(foo.chain), len(bar.chain), len(buz.chain)))

    foo: 1, bar: 1, buz: 1





    即使你試圖在初始狀態(tài)下解決沖突,也沒有鏈節(jié)點長于foo節(jié)點,所以foo節(jié)點鏈不會改變。




    In [19]:
    foo.resolve_conflicts()



    node id: buz, len: 1node id: bar, len: 1

    Out[19]:
    False





    在一些節(jié)點上伸展塊

    接下來,在bar節(jié)點上挖掘并添加一個塊。




    In [20]:
    pp.pprint(mine2(bar))
    { 'index': 2,  'message': 'New Block Forged',  'previous_hash': 'c97740db684709fd7455f413f0ad84f435236e1534caaea7cf744921b59fab3b',  'proof': 35293,  'transactions': [{'amount': 1, 'recipient': 'bar', 'sender': '0'}]}




    節(jié)點的長度只有2




    In [21]:
    print('foo: %d, bar: %d, buz: %d' %(len(foo.chain), len(bar.chain), len(buz.chain)))



    foo: 1, bar: 2, buz: 1




    In [22]:
    pp.pprint(foo.chain)



    [ { 'index': 1,    'previous_hash': 1,    'proof': 100,    'timestamp': 1516245713.7215648,    'transactions': []}]



    In [23]:
    pp.pprint(bar.chain)[ { 'index': 1,    'previous_hash': 1,    'proof': 100,    'timestamp': 1516245713.7215648,    'transactions': []},  { 'index': 2,    'previous_hash': 'c97740db684709fd7455f413f0ad84f435236e1534caaea7cf744921b59fab3b',    'proof': 35293,    'timestamp': 1516245772.022711,    'transactions': [{'amount': 1, 'recipient': 'bar', 'sender': '0'}]}]



    In [24]:
    pp.pprint(buz.chain)
    [ { 'index': 1,    'previous_hash': 1,    'proof': 100,    'timestamp': 1516245713.7215648,    'transactions': []}]



    消除節(jié)點之間的沖突

    在這種狀態(tài)下,當試圖解決foo節(jié)點處的沖突時,foo節(jié)點鏈被(更長的)節(jié)點鏈覆蓋。




    In [25]:
    foo.resolve_conflicts()node id: buz, len: 1node id: bar, len: 2Replacing `foo' <- `bar'
    Out[25]:
    True





    當沖突的解決完成時,foo節(jié)點的鏈長變?yōu)?。




    In [26]:

    print('foo: %d, bar: %d, buz: %d' %(len(foo.chain), len(bar.chain), len(buz.chain)))foo: 2, bar: 2, buz: 1





    如果每個節(jié)點鏈的內容不同



    接下來,考慮每個節(jié)點鏈的內容不同的情況。

    這里我們看到foo節(jié)點和buz節(jié)點的內容不同的情況。




    In [27]:
    # buzノードの內容を揃えるbuz.resolve_conflicts()print('foo: %d, bar: %d, buz: %d' %(len(foo.chain), len(bar.chain), len(buz.chain)))
    node id: foo, len: 2node id: bar, len: 2Replacing `buz' <- `foo'foo: 2, bar: 2, buz: 2



    在這里,在foo節(jié)點添加兩個塊,一個塊在buz節(jié)點,并且添加具有不同事務的塊。




    In [28]:
    foo.new_transaction('AAA', 'BBB', 123)mine2(foo)foo.new_transaction('CCC', 'DDD', 456)mine2(foo)buz.new_transaction('EEE', 'FFF', 789)mine2(buz)print('foo: %d, bar: %d, buz: %d' %(len(foo.chain), len(bar.chain), len(buz.chain)))foo: 4, bar: 2, buz: 3




    此時foo節(jié)點和buz節(jié)點鏈的內容如下。 你可以看到內容與中間不同。




    In [29]:
    pp.pprint(foo.chain)
    [ { 'index': 1,    'previous_hash': 1,    'proof': 100,    'timestamp': 1516245713.7215648,    'transactions': []},  { 'index': 2,    'previous_hash': 'c97740db684709fd7455f413f0ad84f435236e1534caaea7cf744921b59fab3b',    'proof': 35293,    'timestamp': 1516245772.022711,    'transactions': [{'amount': 1, 'recipient': 'bar', 'sender': '0'}]},  { 'index': 3,    'previous_hash': '8791fb38c957761c7af4331d65e834691cd7aa46019faaab3d655deae86d3dbb',    'proof': 35089,    'timestamp': 1516245803.1813366,    'transactions': [ {'amount': 123, 'recipient': 'BBB', 'sender': 'AAA'},                      {'amount': 1, 'recipient': 'foo', 'sender': '0'}]},  { 'index': 4,    'previous_hash': '99e21d9dd699d831803a0ea41d08cf9b2cfa642b94d4ee5ba4a38d1773c1c5c3',    'proof': 119678,    'timestamp': 1516245803.3608067,    'transactions': [ {'amount': 456, 'recipient': 'DDD', 'sender': 'CCC'},                      {'amount': 1, 'recipient': 'foo', 'sender': '0'}]}]
    二維碼

    掃碼加我 拉你入群

    請注明:姓名-公司-職位

    以便審核進群資格,未注明則拒絕

    關鍵詞:Notebook EBook note eboo Book

    [url=https://edu.cda.cn/page/110][/url]
    沙發(fā)
    pudino 發(fā)表于 2018-1-31 14:33:23 |只看作者 |壇友微信交流群
    不太能理解。
    藤椅
    Studio-R 在職認證  發(fā)表于 2018-2-2 18:45:26 |只看作者 |壇友微信交流群
    pudino 發(fā)表于 2018-1-31 14:33
    不太能理解。
    有什么問題嗎?
    您需要登錄后才可以回帖 登錄 | 我要注冊

    本版微信群
    加好友,備注jr
    拉您進交流群

    京ICP備16021002-2號 京B2-20170662號 京公網(wǎng)安備 11010802022788號 論壇法律顧問:王進律師 知識產(chǎn)權保護聲明   免責及隱私聲明

    GMT+8, 2024-12-23 03:32