>백엔드 개발 >파이썬 튜토리얼 >Python 기능을 통해 블록체인을 자세히 분석해보세요.

Python 기능을 통해 블록체인을 자세히 분석해보세요.

不言
不言앞으로
2018-10-24 17:20:022906검색

이 글의 내용은 Python 함수를 통해 블록체인을 자세히 분석하는 내용입니다. 참고할 만한 가치가 있으니 도움이 필요한 분들에게 도움이 되었으면 좋겠습니다.

내 생각에 많은 사람들에게 블록체인은 머리가 어지러울 정도로 대단한 현상이라고 생각합니다. 저는 비디오를 보고 기사를 읽기 시작했지만 개인적으로는 간단한 블록체인을 작성하기 전까지는 그것이 무엇인지, 잠재적인 응용이 무엇인지 이해하지 못했습니다.

블록체인에 대한 나의 견해는 블록체인이 공개 암호화된 데이터베이스라는 것입니다. 당신이 Amazon이고 재고 수준을 추적하는 기술을 사용하고 싶다면 블록체인을 사용하는 것이 합리적일까요? 아마도 그렇지 않을 것입니다. 고객이 웹사이트만 보고 1개만 남았습니다!라고 말하기 때문에 블록체인을 확인하는 데 리소스를 소비하고 싶어하지 않기 때문입니다. Only 1 left!

我会让你考虑未来的应用。所以不用多说,让我们看看我们的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()

区块链的核心是hash函数。如果没有加密,区块链将易于操作,并且交易将能够以欺诈方式写入。

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启动我们的区块链。这是我们的新代币(或库存等)的开始。出于本文解释说明的目的,我会说我是Tom,将从拥有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

향후 적용 시 고려하도록 하겠습니다. 그럼 더 이상 고민하지 말고 7가지 기능을 살펴보겠습니다!

{'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'}]
상태는 토큰 거래의 소유자를 기록하는 데 사용됩니다. 예를 들어, 10개의 토큰이 있고 1을 Medium에 주면 상태는 아래 사전의 값이 됩니다.
rrreee

초과인월이 불가능하다는 점은 주목할 만합니다. 토큰이 10개밖에 없다면 다른 사람에게 11개의 토큰을 줄 수 없습니다. 다음 함수는 우리가 시도하려는 거래가 실제로 유효한지 확인합니다. 또한 거래는 전체적으로 균형을 이루어야 합니다. 5개의 토큰을 주고 받는 사람이 4개의 토큰을 받도록 할 수는 없습니다. 그렇게 하면 토큰이 파괴되고 생성되기 때문입니다.

rrreee#🎜🎜#이제 블록을 만들 수 있습니다. 이전 블록의 정보를 읽어서 새 블록에 연결하는 데 사용됩니다. 이는 블록체인 개념의 핵심이기도 합니다. 유효한 것처럼 보이는 거래를 블록체인에 기만적으로 삽입하는 것은 가능하지만, 이전 블록을 모두 해독하는 것은 계산적으로 (거의) 불가능하므로 블록체인의 무결성이 유지됩니다. #🎜🎜#rrreee#🎜🎜#다음은 이전 블록의 해시를 확인하는 작은 도우미 함수입니다. #🎜🎜#rrreee#🎜🎜#모든 것이 함께 모이면 블록을 만들 시간이 있습니다. 이제 블록체인을 업데이트하겠습니다. #🎜🎜#rrreee#🎜🎜#완료하기 전에 블록체인을 확인해야 합니다. #🎜🎜#rrreee#🎜🎜#마지막으로 위의 모든 항목을 일시 중지하는 거래 기능이 필요합니다. #🎜🎜#rrreee# 🎜🎜#그래서 이제 7가지 기능이 생겼습니다. 우리는 그것과 어떻게 상호작용합니까? 먼저 Genesis Block으로 블록체인을 시작해야 합니다. 이것이 새로운 토큰(또는 인벤토리 등)의 시작입니다. 이 기사의 목적에 따라 나는 Tom이라고 말하고 10개의 토큰으로 시작하겠습니다. #🎜🎜#rrreee#🎜🎜#이제 Medium에 토큰을 주면 어떻게 되는지 보세요: #🎜🎜#rrreee#🎜🎜#state 업데이트를 통해 누가 몇 세대 코인을 소유하는지 표시: # 🎜🎜#rrreee#🎜🎜#블록체인은 다음과 같습니다: #🎜🎜#rrreee#🎜🎜# 첫 번째 새 트랜잭션을 생성하여 스택 상단에 삽입합니다. 이제 코드를 복사하여 가지고 놀아보는 데 대한 여러분의 호기심과 관심을 불러일으켰기를 바랍니다. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#

위 내용은 Python 기능을 통해 블록체인을 자세히 분석해보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제