通過7個函式解密區塊鏈(附程式碼)
翻譯:張媛
校對:丁楠雅
本文約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】至聯絡郵箱,申請白名單授權並按要求編輯。
釋出後請將連結反饋至聯絡郵箱(見下方)。未經許可的轉載以及改編者,我們將依法追究其法律責任。
點選“閱讀原文”擁抱組織
相關文章
- 通過 7 個 python 函式來了解區塊鏈Python函式區塊鏈
- 通過7個Python函式來解釋區塊鏈Python函式區塊鏈
- 透過 7 個 python 函式來了解區塊鏈Python函式區塊鏈
- 區塊鏈交易所基礎開發(7)通過介面查詢區塊鏈各個幣種的提幣情況-eth區塊鏈
- 華為雲首批通過可信區塊鏈評測區塊鏈
- 俄亥俄州議會通過支援區塊鏈法案區塊鏈
- 50行ruby程式碼開發一個區塊鏈區塊鏈
- 一個簡單的區塊鏈程式碼實現區塊鏈
- 新加坡計劃通過區塊鏈推動金融普惠區塊鏈
- synchronized函式和synchronized程式碼塊有什麼區別?synchronized函式
- 圖說區塊鏈————附錄區塊鏈
- 支援區塊鏈的議案通過了美國國會投票區塊鏈
- 區塊鏈教程、區塊鏈指南、區塊鏈中文手冊、區塊鏈原理區塊鏈
- 區塊鏈篇:區塊鏈的創新與顛覆(附下載)區塊鏈
- 區塊鏈交易所基礎開發(2)通過介面查詢區塊鏈各個幣種的提幣情況-bch區塊鏈
- 區塊鏈交易所基礎開發(3)通過介面查詢區塊鏈各個幣種的提幣情況-btc區塊鏈
- 區塊鏈交易所基礎開發(4)通過介面查詢區塊鏈各個幣種的提幣情況-dash區塊鏈
- 區塊鏈交易所基礎開發(5)通過介面查詢區塊鏈各個幣種的提幣情況-eos區塊鏈
- 區塊鏈交易所基礎開發(6)通過介面查詢區塊鏈各個幣種的提幣情況-etc區塊鏈
- 區塊鏈交易所基礎開發(8)通過介面查詢區塊鏈各個幣種的提幣情況-neo區塊鏈
- 區塊鏈交易所基礎開發(9)通過介面查詢區塊鏈各個幣種的提幣情況-qtum區塊鏈QT
- 區塊鏈交易所基礎開發(10)通過介面查詢區塊鏈各個幣種的提幣情況-tether區塊鏈
- 區塊鏈交易所基礎開發(11)通過介面查詢區塊鏈各個幣種的提幣情況-tron區塊鏈
- 區塊鏈交易所基礎開發(12)通過介面查詢區塊鏈各個幣種的提幣情況-xmr區塊鏈
- 區塊鏈通識問題(二)區塊鏈
- 區塊鏈通識問題(四)區塊鏈
- Java中靜態程式碼塊、構造程式碼塊、建構函式、普通程式碼塊Java函式
- [譯] 用 Java 程式碼實現區塊鏈Java區塊鏈
- 區塊鏈的幾個小故事.小白學區塊鏈01區塊鏈
- [區塊鏈]區塊鏈和通證的應用與技術路徑區塊鏈
- 區塊鏈交易所基礎開發(1)通過介面查詢區塊鏈各個幣種的提幣情況-ada區塊鏈
- 區塊鏈交易所基礎開發(13)通過介面查詢區塊鏈各個幣種的提幣情況-xrp區塊鏈
- 用 Go 構建一個區塊鏈 -- Part 7: 網路Go區塊鏈
- 區塊鏈搭建開發公司談分散式記賬與區塊鏈區塊鏈分散式
- 區塊鏈運作的7個核心技術,你知道幾個?區塊鏈
- 程式碼重構:函式重構的 7 個小技巧函式
- 通過一道面試題來學習原型/原型鏈-函式宣告/函式表示式面試題原型函式
- 全球普惠區塊鏈峰會——通區塊鏈技術帶動社群發展區塊鏈