您當前的位置:首頁 > 文化

【譯】用7個Python函式解析區塊鏈

作者:由 梁勇 發表于 文化時間:2018-05-25

作者:Tom Cusack

參與:Cynthia

翻譯:本文為天善智慧編譯,未經容許,禁止轉載

1。雜湊函式 Hash Function

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()

區塊鏈的核心是雜湊函式。在沒有加密的情況下,區塊鏈將很容易操作,並且交易將能夠被欺騙地插入。

2。狀態更新

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

“狀態”是誰擁有需求的記錄。例如,Tom有10個硬幣,並給了Medium1個,那麼這個狀態就是下面字典的值:

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

3。有效事務

值得注意的是,透支不能存在。如果只有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

4.建立區塊

現在,我們可以建立區塊了。讀取前一個區塊中的資訊,並將其連結到新區塊上。這也是區塊鏈思想的核心。看起來有效的交易可以嘗試欺騙地插入到區塊鏈中,但是對所有前面的塊進行解密在計算上(幾乎)是不可能的,這如此便保留了區塊鏈的完整性。

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

5。升級區塊鏈

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

6。驗證區塊鏈

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

7。事務處理函式

最後,我們需要用事務處理函式將以上全部內容串起:

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

舉例

以上是我們的七個函式,那麼該如何與之互動呢?首先我們需要用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}

接下來,Tom給了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/b

lockchain-explained-7-python-functions。html

標簽: Transaction  Block  STATE  chain  hash