【譯】用7個Python函式解析區塊鏈
作者: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