我想對(duì)很多人來(lái)說(shuō),區(qū)塊鏈是一種很難理解的技術(shù),雖然我也看了很多視頻和文章,但從我個(gè)人角度來(lái)講,直到我開(kāi)始寫(xiě)一些簡(jiǎn)單的區(qū)塊鏈應(yīng)用,我才真正理解了它是什么以及它的潛在應(yīng)用。
我對(duì)區(qū)塊鏈的看法是,它是一個(gè)公開(kāi)的加密數(shù)據(jù)庫(kù)。舉個(gè)例子,亞馬遜也許想利用這種技術(shù)來(lái)跟蹤庫(kù)存水平,那么使用區(qū)塊鏈?zhǔn)欠裼幸饬x呢?大概率沒(méi)有,因?yàn)橄M(fèi)者不會(huì)愿意花費(fèi)資源來(lái)驗(yàn)證亞馬遜的區(qū)塊鏈?zhǔn)欠窨尚?,更別說(shuō)亞馬遜總是在網(wǎng)站上宣稱(chēng)商品“只剩最后一個(gè)!”。
關(guān)于區(qū)塊鏈未來(lái)可能的應(yīng)用場(chǎng)景留給您自己思考,廢話(huà)不多說(shuō),讓我們一起通過(guò)這7個(gè)函數(shù)來(lái)探索區(qū)塊鏈吧。
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()
區(qū)塊鏈的核心是哈希函數(shù),如果不加密,區(qū)塊鏈將很容易被操縱,交易將能夠被欺騙性地插入到區(qū)塊鏈中。
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
所謂的“狀態(tài)”是交易完成后的資產(chǎn)分配記錄。比如,我有10個(gè)幣,我把其中1個(gè)幣給了Medium,那么當(dāng)前的“狀態(tài)”就是如下字典中的值。
{‘transaction’: {‘Tom’: 9, ‘Medium’: 1}}
值得注意的是,在這個(gè)體系中,透支是不可能存在的。如果我只有10個(gè)幣,那么我不可能將11個(gè)幣給別人。下面的函數(shù)將驗(yàn)證我們嘗試進(jìn)行的交易確實(shí)是有效的。而且,交易必須平衡,我不可能給了對(duì)方5個(gè)幣,但他只收到4個(gè)幣,否則會(huì)引起幣的銷(xiāo)毀和創(chuàng)建。
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
現(xiàn)在我們可以構(gòu)建自己的區(qū)塊了。讀取上一個(gè)區(qū)塊的信息,并將其鏈接到下一個(gè)區(qū)塊,這也是區(qū)塊鏈的核心技術(shù)之一,看起來(lái)有效交易可以被欺詐性地插入到區(qū)塊鏈中,但是對(duì)前面所有的區(qū)塊進(jìn)行解密在計(jì)算上幾乎是不可能的,這就保留了區(qū)塊鏈的完整性。
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}
下面是一個(gè)小小的幫助函數(shù),用于檢查前一個(gè)區(qū)塊的哈希值。
def check_block_hash(block):
expected_hash = hash_function(block['contents'])
if block['hash'] is not expected_hash:
raise
return
一旦我們把所有的東西整合起來(lái),就是時(shí)候創(chuàng)建自己的區(qū)塊了。接下來(lái)我們將更新區(qū)塊鏈。
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
在完成之前,區(qū)塊鏈必須經(jīng)過(guò)驗(yàn)證:
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
最后,需要一個(gè)交易函數(shù),將所有上述功能整合在一起:
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
現(xiàn)在我們有了7個(gè)函數(shù),那么怎樣使用它們呢?首先,我們需要一個(gè)創(chuàng)世塊來(lái)開(kāi)始我們的區(qū)塊鏈,這也是新幣產(chǎn)生的開(kāi)始。在這篇文章里,我將會(huì)從10個(gè)幣開(kāi)始。
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}
那么,當(dāng)我將一些幣給Medium之后發(fā)生了什么呢?
chain_state, block_chain = add_transaction_to_chain(transaction={'Tom': -1, 'Medium': 1}, state=chain_state, chain=block_chain)
“狀態(tài)”的值將會(huì)被更新為當(dāng)前各人擁有多少個(gè)幣:
{'Medium': 1, 'Tom': 9}
然后生成的區(qū)塊鏈會(huì)如下所示:
[{'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'}]
至此,我們的第一個(gè)交易已經(jīng)創(chuàng)建并被插入到堆棧的頂部。現(xiàn)在,我希望這些已經(jīng)激起你的好奇心,并且有興趣將代碼復(fù)制下來(lái)跑一跑。在我看來(lái),這是學(xué)習(xí)新技術(shù)的最佳途徑。
請(qǐng)嘗試運(yùn)行代碼去創(chuàng)造自己的幣。思考一下,如果您想提供比現(xiàn)存更多的幣,會(huì)發(fā)生什么情況?如果您不斷創(chuàng)建新的收款人,會(huì)發(fā)生什么?
還有,您能想到區(qū)塊鏈在未來(lái)會(huì)被應(yīng)用到哪些場(chǎng)景呢?歡迎在評(píng)論中留言。
-
區(qū)塊鏈
+關(guān)注
關(guān)注
112文章
15568瀏覽量
108401
原文標(biāo)題:通過(guò)7個(gè)函數(shù)解密區(qū)塊鏈
文章出處:【微信號(hào):C_Expert,微信公眾號(hào):C語(yǔ)言專(zhuān)家集中營(yíng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
區(qū)塊鏈如何改變AI
什么是區(qū)塊鏈 區(qū)塊鏈有什么用
區(qū)塊鏈不是泡沫 馬云或?qū)?chuàng)造新的神話(huà)
區(qū)塊鏈在商業(yè)方面的應(yīng)用如何
區(qū)塊鏈將改革供應(yīng)鏈
區(qū)塊鏈熱度不止,參考架構(gòu)9個(gè)部分解密
區(qū)塊鏈技術(shù)開(kāi)發(fā)公司談區(qū)塊鏈賺錢(qián)滿(mǎn)足人哪些需求
淺談區(qū)塊鏈對(duì)銀行業(yè)的發(fā)展
區(qū)塊鏈將如何優(yōu)化產(chǎn)業(yè)鏈?
區(qū)塊鏈對(duì)我們的生活有什么影響
《區(qū)塊鏈+從全球50個(gè)案例看區(qū)塊鏈的應(yīng)用與未來(lái)》高清pdf
區(qū)塊鏈錢(qián)包軟件開(kāi)發(fā),區(qū)塊鏈錢(qián)包源碼搭建
區(qū)塊鏈分成兩部分, 一個(gè)是區(qū)塊,一個(gè)是鏈
用不到50行的 Python 2.x代碼實(shí)現(xiàn)一個(gè)簡(jiǎn)單的區(qū)塊鏈

評(píng)論