通過7個函式解密區塊鏈(附程式碼)

資料派THU發表於2018-05-18

翻譯:張媛

校對:丁楠雅

本文約2022字,建議閱讀5分鐘。

本文將通過例項展示如何應用機器學習來更好地匹配學生和導師,最終在Flask圖表介面中展示結果。


我想對很多人來說,區塊鏈是一種很難理解的技術,雖然我也看了很多視訊和文章,但從我個人角度來講,直到我開始寫一些簡單的區塊鏈應用,我才真正理解了它是什麼以及它的潛在應用。


我對區塊鏈的看法是,它是一個公開的加密資料庫。舉個例子,亞馬遜也許想利用這種技術來跟蹤庫存水平,那麼使用區塊鏈是否有意義呢?大概率沒有,因為消費者不會願意花費資源來驗證亞馬遜的區塊鏈是否可行,更別說亞馬遜總是在網站上宣稱商品“只剩最後一個!”。


關於區塊鏈未來可能的應用場景留給您自己思考,廢話不多說,讓我們一起通過這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


所謂的狀態是交易完成後的資產分配記錄。比如,我有10個幣,我把其中1個幣給了Medium那麼當前的狀態就是如下字典中的值。


{‘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個函式,那麼怎樣使用它們呢?首先,我們需要一個創世塊來開始我們的區塊鏈,這也是新幣產生的開始。在這篇文章裡,我將會從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)


狀態的值將會被更新為當前各人擁有多少個幣:


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

 

至此,我們的第一個交易已經建立並被插入到堆疊的頂部。現在,我希望這些已經激起你的好奇心,並且有興趣將程式碼複製下來跑一跑。在我看來,這是學習新技術的最佳途徑。

請嘗試執行程式碼去創造自己的幣。思考一下,如果您想提供比現存更多的幣,會發生什麼情況?如果您不斷建立新的收款人,會發生什麼?

還有,您能想到區塊鏈在未來會被應用到哪些場景呢?歡迎在評論中留言。

原文連結:

https://www.kdnuggets.com/2018/04/blockchain-explained-7-python-functions.html

 Blockchain Explained in 7 Python Functions


譯者簡介


張媛,某雲端計算公司不務正業服務工程師一枚。喜歡下雨天,讀閒書,缺乏技術細胞,欣賞並喜歡有態度有立場的人,愛浪漫,注重儀式感,喜歡記錄。最近的願望是擁有自己的小窩,給想念的人寫一封信。

翻譯組招募資訊

工作內容:將選取好的外文前沿文章準確地翻譯成流暢的中文。如果你是資料科學/統計學/計算機專業的留學生,或在海外從事相關工作,或對自己外語水平有信心的朋友,資料派翻譯組歡迎你們加入!

你能得到:提高對於資料科學前沿的認知,提高對外文新聞來源渠道的認知,海外的朋友可以和國內技術應用發展保持聯絡,資料派團隊產學研的背景為志願者帶來好的發展機遇。

其他福利:和來自於名企的資料科學工作者,北大清華以及海外等名校學生共同合作、交流。

點選文末“閱讀原文”加入資料派團隊~


轉載須知

如需轉載,請在開篇顯著位置註明作者和出處(轉自:資料派THU ID:DatapiTHU),並在文章結尾放置資料派醒目二維碼。有原創標識文章,請傳送【文章名稱-待授權公眾號名稱及ID】至聯絡郵箱,申請白名單授權並按要求編輯。

釋出後請將連結反饋至聯絡郵箱(見下方)。未經許可的轉載以及改編者,我們將依法追究其法律責任。



點選“閱讀原文”擁抱組織

相關文章