我想對於那裡的很多人來說,區塊鏈就是這種現象,很難不讓你頭腦發熱。我開始觀看視訊和閱讀文章,但對我個人而言,直到我編寫自己的簡單區塊鏈,我才真正理解它是什麼以及它的潛在應用價值。
我對區塊鏈的看法是它是一個公開的加密資料庫。如果你是亞馬遜並且你想使用該技術來跟蹤庫存水平,那麼使用區塊鏈是否有意義?可能沒有,因為你的客戶不想花費資源來驗證你的區塊鏈,因為他們只顧看著網站說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以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
這裡是原文
本作品採用《CC 協議》,轉載必須註明作者和本文連結