ホームページ  >  記事  >  バックエンド開発  >  Python 関数を使用してブロックチェーンを詳細に分析する

Python 関数を使用してブロックチェーンを詳細に分析する

不言
不言転載
2018-10-24 17:20:022861ブラウズ

この記事の内容は、Python 関数を使用してブロックチェーンを詳細に分析するものであり、一定の参考価値があります。必要な友人が参照することができます。お役に立てれば幸いです。

世の中の多くの人にとって、ブロックチェーンは頭がくらくらせずにはいられないほどの現象だと思います。私はビデオを見たり記事を読み始めましたが、個人的には、独自の単純なブロックチェーンを作成するまで、それが何であるか、そしてその潜在的なアプリケーションが何であるかを本当に理解していませんでした。

ブロックチェーンに対する私の見解は、ブロックチェーンは暗号化された公開データベースであるというものです。あなたが Amazon で、在庫レベルを追跡するためにテクノロジーを使用したい場合、ブロックチェーンを使用するのは理にかなっていますか?おそらくそうではありません。顧客は、Web サイトを見て 残り 1 つだけ! と言うだけなので、ブロックチェーンの検証にリソースを費やしたくないからです。

今後の応用のために検討させていただきます。それではさっそく、7 つの機能を見てみましょう。

def hash_function(k):
    """Hashes our transaction."""
    if type(k) is not str:
        k = json.dumps(k, sort_keys=True)

    return hashlib.sha256(k).hexdigest()

ブロックチェーンの中核はハッシュ関数です。暗号化がなければ、ブロックチェーンの運用は容易になり、トランザクションは不正に書き込まれる可能性があります。

def update_state(transaction, state):
    state = state.copy()

    for key in transaction:
        if key in state.keys():
            state[key] += transaction[key]
        else:
            state[key] = transaction[key]

    return state

state は、トークン トランザクションの所有者を記録します。たとえば、トークンが 10 個あり、1 を Medium に与えると、状態 state は以下の辞書の値になります。

{‘transaction’: {‘Tom’: 9, ‘Medium’: 1}}

当座貸越はできないことに注意してください。利用可能なトークンが 10 個しかない場合、誰かに 11 個のトークンを与えることはできません。次の関数は、行おうとしているトランザクションが実際に有効であることを検証します。さらに、トランザクションは全体的にバランスが取れている必要があります。 5 つのトークンを渡して受信者に 4 つのトークンを受け取ることはできません。トークンが破棄されて生成されてしまうためです。

def valid_transaction(transaction, state):
    """A valid transaction must sum to 0."""
    if sum(transaction.values()) is not 0:
        return False

    for key in transaction.keys():
        if key in state.keys():
            account_balance = state[key]
        else:
            account_balance = 0

        if account_balance + transaction[key] < 0:
            return False

    return True

これで、ブロックを作成できます。前のブロックからの情報が読み取られ、新しいブロックにリンクするために使用されます。これはブロックチェーンの概念の中核でもあります。一見有効なトランザクションをブロックチェーンに欺瞞的に挿入することは可能ですが、ブロックチェーンの整合性を維持するために、以前のブロックをすべて復号化することは計算上 (ほぼ) 不可能です。

def make_block(transactions, chain):
    """Make a block to go into the chain."""
    parent_hash = chain[-1]['hash']
    block_number = chain[-1]['contents']['block_number'] + 1

    block_contents = {
        'block_number': block_number,
        'parent_hash': parent_hash,
        'transaction_count': block_number + 1,
        'transaction': transactions
    }

    return {'hash': hash_function(block_contents), 'contents': block_contents}

ここに、前のブロックのハッシュをチェックするための小さなヘルパー関数があります:

def check_block_hash(block):
    expected_hash = hash_function(block['contents'])

    if block['hash'] is not expected_hash:
        raise

    return

すべてが揃ったら、ブロックを作成する時間があります。次にブロックチェーンを更新します。

def check_block_validity(block, parent, state):
    parent_number = parent['contents']['block_number']
    parent_hash = parent['hash']
    block_number = block['contents']['block_number']

    for transaction in block['contents']['transaction']:
        if valid_transaction(transaction, state):
            state = update_state(transaction, state)
        else:
            raise

    check_block_hash(block)  # Check hash integrity

    if block_number is not parent_number + 1:
        raise

    if block['contents']['parent_hash'] is not parent_hash:
        raise

    return state

終了する前に、ブロックチェーンを検証する必要があります:

def check_chain(chain):
    """Check the chain is valid."""
    if type(chain) is str:
        try:
            chain = json.loads(chain)
            assert (type(chain) == list)
        except ValueError:
            # String passed in was not valid JSON
            return False
    elif type(chain) is not list:
        return False

    state = {}

    for transaction in chain[0]['contents']['transaction']:
        state = update_state(transaction, state)

    check_block_hash(chain[0])
    parent = chain[0]

    for block in chain[1:]:
        state = check_block_validity(block, parent, state)
        parent = block

    return state

最後に、上記のすべてを一時停止するトランザクション関数が必要です:

def add_transaction_to_chain(transaction, state, chain):
    if valid_transaction(transaction, state):
        state = update_state(transaction, state)
    else:
        raise Exception('Invalid transaction.')

    my_block = make_block(state, chain)
    chain.append(my_block)

    for transaction in chain:
        check_chain(transaction)

    return state, chain

それでは、 7つの機能をご用意しております。私たちはそれとどのように対話するのでしょうか?まず、Genesis Block でブロックチェーンを開始する必要があります。これが新しいトークン (またはインベントリなど) の始まりです。この記事では、私はトムであり、10 トークンから始めることにします。

genesis_block = {
    'hash': hash_function({
        'block_number': 0,
        'parent_hash': None,
        'transaction_count': 1,
        'transaction': [{'Tom': 10}]
    }),
    'contents': {
        'block_number': 0,
        'parent_hash': None,
        'transaction_count': 1,
        'transaction': [{'Tom': 10}]
    },
}

block_chain = [genesis_block]
chain_state = {'Tom': 10}

さあ、いくつかのトークンを Medium に与えるとどうなるか見てみましょう:

chain_state, block_chain = add_transaction_to_chain(transaction={'Tom': -1, 'Medium': 1}, state=chain_state, chain=block_chain)

state 誰がいくつのトークンを所有しているかを示す更新:

{'Medium': 1, 'Tom': 9}

ブロックチェーンは次のようになります:

[{'contents': {'block_number': 0,
               'parent_hash': None,
               'transaction': [{'Tom': 10}],
               'transaction_count': 1},
  'hash': '064d0b480b3b92761f31831d30ae9f01954efaa62371b4b44f11465ec22abe93'},
 {'contents': {'block_number': 1,
               'parent_hash': '064d0b480b3b92761f31831d30ae9f01954efaa62371b4b44f11465ec22abe93',
               'transaction': {'Medium': 1, 'Tom': 9},
               'transaction_count': 2},
  'hash': 'b4ae25f0cc0ee0b0caa66b9a3473e9a108652d53b1dc22a40962fef5c8c0f08c'}]

最初の新しいトランザクションを作成し、それをスタックの先頭に挿入します。さて、コードをコピーして遊んでみたいというあなたの好奇心と興味をそそられたことを願っています。


以上がPython 関数を使用してブロックチェーンを詳細に分析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。