我想對(duì)于那里的很多人來(lái)說(shuō),區(qū)塊鏈就是這種現(xiàn)象,很難不讓你頭腦發(fā)熱。我開(kāi)始觀看視頻和閱讀文章,但對(duì)我個(gè)人而言,直到我編寫自己的簡(jiǎn)單區(qū)塊鏈,我才真正理解它是什么以及它的潛在應(yīng)用價(jià)值。
我對(duì)區(qū)塊鏈的看法是它是一個(gè)公開(kāi)的加密數(shù)據(jù)庫(kù)。如果你是亞馬遜并且你想使用該技術(shù)來(lái)跟蹤庫(kù)存水平,那么使用區(qū)塊鏈?zhǔn)欠裼幸饬x?可能沒(méi)有,因?yàn)槟愕目蛻舨幌牖ㄙM(fèi)資源來(lái)驗(yàn)證你的區(qū)塊鏈,因?yàn)樗麄冎活櫩粗W(wǎng)站說(shuō)Only 1 left!
。
我會(huì)讓你考慮未來(lái)的應(yīng)用。所以不用多說(shuō),讓我們看看我們的7個(gè)函數(shù)!
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ū)塊鏈的核心是hash函數(shù)。如果沒(méi)有加密,區(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
state
是來(lái)記錄誰(shuí)擁有代幣交易情況。例如,我有10個(gè)代幣,我給1到Medium,然后狀態(tài)state
將是下面字典的值。
{‘transaction’: {‘Tom’: 9, ‘Medium’: 1}}
值得注意的是,透支不可能存在。如果現(xiàn)有只有10個(gè)代幣,那么我就不能給某人11個(gè)代幣。以下函數(shù)驗(yàn)證我們嘗試進(jìn)行的交易確實(shí)有效。此外,交易總體上必須平衡。我不能給5個(gè)代幣并讓收件人收到4個(gè)代幣幣,因?yàn)檫@樣可以銷毀和生成代幣。
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)在,我們可以制作我們的區(qū)塊。讀取前一個(gè)區(qū)塊的信息,并將其用于將其鏈接到新區(qū)塊。這也是區(qū)塊鏈理念的核心。可以嘗試以欺騙性的方式將看似有效的交易插入到區(qū)塊鏈中,但是解密所有先前的塊在計(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ù)來(lái)檢查前一個(gè)塊的哈希值:
def check_block_hash(block): expected_hash = hash_function(block['contents']) if block['hash'] is not expected_hash: raise return
一旦我們將所有東西組合在一起,就有時(shí)間來(lái)創(chuàng)建我們的區(qū)塊。我們現(xiàn)在將更新區(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
在我們完成之前,必須驗(yàn)證區(qū)塊鏈:
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è)交易功能,它將以上所有內(nèi)容掛起:
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ù)。我們?nèi)绾闻c它互動(dòng)?好吧,首先我們需要用Genesis Block
啟動(dòng)我們的區(qū)塊鏈。這是我們的新代幣(或庫(kù)存等)的開(kāi)始。出于本文解釋說(shuō)明的目的,我會(huì)說(shuō)我是Tom,將從擁有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}
現(xiàn)在,看看當(dāng)我將一些代幣交給Medium時(shí)會(huì)發(fā)生什么:
chain_state, block_chain = add_transaction_to_chain(transaction={'Tom': -1, 'Medium': 1}, state=chain_state, chain=block_chain)
state
更新顯示誰(shuí)擁有多少代幣:
{'Medium': 1, 'Tom': 9}
區(qū)塊鏈看起來(lái)像這樣:
[{'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'}]
我們創(chuàng)建了第一個(gè)新交易并將其插入到堆棧頂部。現(xiàn)在,我希望我已經(jīng)激起了你的好奇心,并且有興趣將代碼復(fù)制下來(lái)并使用它。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com