通過7個Python函式來解釋區塊鏈

malakashi發表於2019-02-16

我想對於那裡的很多人來說,區塊鏈就是這種現象,很難不讓你頭腦發熱。我開始觀看視訊和閱讀文章,但對我個人而言,直到我編寫自己的簡單區塊鏈,我才真正理解它是什麼以及它的潛在應用價值。

我對區塊鏈的看法是它是一個公開的加密資料庫。如果你是亞馬遜並且你想使用該技術來跟蹤庫存水平,那麼使用區塊鏈是否有意義?可能沒有,因為你的客戶不想花費資源來驗證你的區塊鏈,因為他們只顧看著網站說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更新顯示誰擁有多少代幣:

{`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`}]

我們建立了第一個新交易並將其插入到堆疊頂部。現在,我希望我已經激起了你的好奇心,並且有興趣將程式碼複製下來並使用它。在我看來,這是學習新技術的最佳方式 ——進入它。

玩程式碼並製作自己的代幣。如果你試圖提供比目前存在的更多代幣會怎麼樣? 如果你繼續創造新的收款人,會發生什麼?

你能想到區塊鏈的未來應用嗎?

======================================================================

分享一些以太坊、EOS、比特幣等區塊鏈相關的互動式線上程式設計實戰教程:

python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。

  • java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
  • php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和交易等內容。
  • 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
  • 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
  • C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和交易等。
  • EOS教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
  • java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Java程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
  • php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。

這裡是原文

相關文章