BlockChain:Py实现区块链简单场景应用:程序猿记录在区块里的收入记录图
生活随笔
收集整理的這篇文章主要介紹了
BlockChain:Py实现区块链简单场景应用:程序猿记录在区块里的收入记录图
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
BlockChain:Py實現(xiàn)區(qū)塊鏈簡單場景應(yīng)用:程序猿記錄在區(qū)塊里的收入記錄圖
導讀
想更好的了解區(qū)塊鏈技術(shù)?還是用程序猿的方式來加深了解和探索區(qū)塊鏈吧!實際案例應(yīng)用會讓我們更加熟悉它的底層技術(shù)!
?
目錄
輸出結(jié)果
代碼設(shè)計
?
?
?
輸出結(jié)果
?
?
?
?
代碼設(shè)計
Created on 2018年3月11日@author: Jason niu ''' import hashlib #該模塊實現(xiàn)了諸多安全哈希和消息摘要算法的通用接口,包括 FIPS 安全哈希算法: SHA1、SHA224、 SHA256、SHA384、RSA的 MD5 等等算法 import uuid #通用唯一標識符 ( Universally Unique Identifier ), 對于所有的UUID它可以保證在空間和時間上的唯一性. 它是通過MAC地址, 時間戳, 命名空間, 隨機數(shù), 偽隨機數(shù)來保證生成ID的唯一性, 有著固定的大小( 128 bit ). 它的唯一性和一致性特點使得可以無需注冊過程就能夠產(chǎn)生一個新的UUID. UUID可以被用作多種用途, 既可以用來短時間內(nèi)標記一個對象, 也可以可靠的辨別網(wǎng)絡(luò)中的持久性對象. #該類實現(xiàn)簡化版的區(qū)塊包:一個唯一標識符、父節(jié)點的哈希值、nonce值、該區(qū)塊的內(nèi)容字段。 class Block(object):def __init__(self, data=None, previous_hash=None):self.identifier = uuid.uuid4().hex # uuid產(chǎn)生唯一標示self.nonce = None self.data = data self.previous_hash = previous_hash def hash(self, nonce=None): #利用sha256算法計算區(qū)塊的哈希值message = hashlib.sha256()message.update(self.identifier.encode('utf-8')) #以utf-8格式對identifier進行編碼,二進制從低位往高位取出二進制數(shù)字message.update(str(nonce).encode('utf-8'))message.update(str(self.data).encode('utf-8'))message.update(str(self.previous_hash).encode('utf-8'))return message.hexdigest() #hexdigest函數(shù)計算整個文件的hash code,返回摘要作為十六進制數(shù)據(jù)字符串值def hash_is_valid(self, the_hash):return the_hash.startswith('0000') def __repr__(self):return 'Block<Hash: {}, Nonce: {}>'.format(self.hash(self.nonce), self.nonce)def mine(self): cur_nonce = self.nonce or 0 while True: the_hash = self.hash(nonce=cur_nonce)if self.hash_is_valid(the_hash): self.nonce = cur_nonce break else:cur_nonce += 1 # 創(chuàng)建創(chuàng)世區(qū)塊 block = Block('Hello World') block.mine() print(block) class BlockChain(object):def __init__(self):self.head = None self.blocks = {} def add_block(self, new_block):previous_hash = self.head.hash(self.head.nonce) if self.head else Nonenew_block.previous_hash = previous_hashself.blocks[new_block.identifier] = {'block': new_block,'previous_hash': previous_hash,'previous': self.head,}self.head = new_blockdef __repr__(self):num_existing_blocks = len(self.blocks)return 'Blockchain<{} Blocks, Head: {}>'.format(num_existing_blocks,self.head.identifier if self.head else None)#定義好區(qū)塊鏈結(jié)構(gòu)后,下面就開始初始化一條區(qū)塊鏈。 chain = BlockChain() print(chain) chain.add_block(block) print(chain) #for循環(huán),添加更多的區(qū)塊 for i in range(6):new_block = Block(i)new_block.mine()chain.add_block(new_block) print(chain) from datetime import datetime #導入時間日期模塊#該類實現(xiàn)基于Block實現(xiàn)一個支持收支記錄格式 class AccountBill(Block): def __init__(self, content, amount):t = datetime.now().strftime('%Y-%m-%d %H:%M:%S')data = "{}|{}|{}".format(t, content, amount)return super(AccountBill, self).__init__(data)def get_amount(self): amount = 0if self.data:amount = int(self.data.split('|')[2])return amountdef get_content(self):content = ''if self.data:content = self.data.split('|')[1]return contentdef __repr__(self):return 'Bill: {}>'.format(self.data)AccountBill('測試', 100) from collections import OrderedDictclass AccountBook(BlockChain):def __init__(self):self.head = None self.blocks = OrderedDict() def add_block(self, new_bill): new_bill.mine()super(AccountBook, self).add_block(new_bill)def balance(self): balance = 0if self.blocks:for k, v in self.blocks.items():balance += v['block'].get_amount()return balancedef __repr__(self):num_existing_blocks = len(self.blocks)return 'AccountBook<{} Bills, Head: {}>'.format(num_existing_blocks,self.head.identifier if self.head else None)book = AccountBook()b1 = AccountBill('月薪', 23000) book.add_block(b1)b2 = AccountBill('房租消費', -3000) book.add_block(b2)b3 = AccountBill('飲食消費', -1200) book.add_block(b3)b4 = AccountBill('娛樂消費', -1200) book.add_block(b4)b5 = AccountBill('token收入', 1000) book.add_block(b5)b6 = AccountBill('搬磚收入', 400) book.add_block(b6)b7 = AccountBill('扛水泥收入', 500) book.add_block(b7)b8 = AccountBill('學習AI', -1000) book.add_block(b8)b9 = AccountBill('學習BlockChain', -800) book.add_block(b9)b10 = AccountBill('學習ICO', -10) book.add_block(b10)print(book.balance()) for k,v in book.blocks.items():print(v['block'].data)import matplotlib import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei']x_data = [] y_data = [] colors = [] for k,v in book.blocks.items():bill = v['block']y_data.append(bill.get_content())amount = bill.get_amount()if amount > 0:x_data.append(amount)colors.append('blue')else:x_data.append(-amount)colors.append('red')y_pos = np.arange(len(y_data))plt.bar(y_pos, x_data, align='center', alpha=0.5, color=colors) plt.xticks(y_pos, y_data) plt.ylabel('金額') plt.title('BlockChain:程序猿記錄在區(qū)塊里的收支記錄圖——Jason niu') plt.show()?
?
?
?
?
相關(guān)文章
BlockChain:Py實現(xiàn)區(qū)塊鏈簡單場景應(yīng)用:程序猿記錄在區(qū)塊里的收入記錄圖
?
總結(jié)
以上是生活随笔為你收集整理的BlockChain:Py实现区块链简单场景应用:程序猿记录在区块里的收入记录图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Py:python利用easygui实现
- 下一篇: Py之chatterbot:python