這篇文章帶給大家的內容是關於透過Python函數來詳細解析區塊鏈,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
我想對那裡的許多人來說,區塊鏈就是這種現象,很難不讓你頭腦發熱。我開始觀看影片和閱讀文章,但對我個人而言,直到我編寫自己的簡單區塊鏈,我才真正理解它是什麼以及它的潛在應用價值。
我對區塊鏈的看法是它是一個公開的加密資料庫。如果你是亞馬遜並且你想使用該技術來追蹤庫存水平,那麼使用區塊鏈是否有意義?可能沒有,因為你的客戶不想花費資源來驗證你的區塊鏈,因為他們只顧看著網站說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'}]
我們創建了第一個新交易並將其插入到堆疊頂部。現在,我希望我已經激起了你的好奇心,並且有興趣將程式碼複製下來並使用它。
以上是透過Python函數來詳細解析區塊鏈的詳細內容。更多資訊請關注PHP中文網其他相關文章!