BlockChain:Py实现区块链简单场景应用:程序猿记录在区块里的收入记录图

简介: BlockChain:Py实现区块链简单场景应用:程序猿记录在区块里的收入记录图

输出结果

image.png

image.png

image.png 



代码设计


Created on 2018年3月11日

@author: Jason niu

'''

import hashlib  #该模块实现了诸多安全哈希和消息摘要算法的通用接口,包括 FIPS 安全哈希算法: SHA1、SHA224、 SHA256、SHA384、RSA的 MD5 等等算法

import uuid  #通用唯一标识符 ( Universally Unique Identifier ), 对于所有的UUID它可以保证在空间和时间上的唯一性. 它是通过MAC地址, 时间戳, 命名空间, 随机数, 伪随机数来保证生成ID的唯一性, 有着固定的大小( 128 bit ).  它的唯一性和一致性特点使得可以无需注册过程就能够产生一个新的UUID. UUID可以被用作多种用途, 既可以用来短时间内标记一个对象, 也可以可靠的辨别网络中的持久性对象.

#该类实现简化版的区块包:一个唯一标识符、父节点的哈希值、nonce值、该区块的内容字段。

class Block(object):

   def __init__(self, data=None, previous_hash=None):

       self.identifier = uuid.uuid4().hex   # uuid产生唯一标示

       self.nonce = None                  

       self.data = data                    

       self.previous_hash = previous_hash  

   def hash(self, nonce=None):  #利用sha256算法计算区块的哈希值

       message = hashlib.sha256()

       message.update(self.identifier.encode('utf-8')) #以utf-8格式对identifier进行编码,二进制从低位往高位取出二进制数字

       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函数计算整个文件的hash code,返回摘要作为十六进制数据字符串值

   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  

# 创建创世区块

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 None

       new_block.previous_hash = previous_hash

       self.blocks[new_block.identifier] = {

           'block': new_block,'previous_hash': previous_hash,'previous': self.head,

       }

       self.head = new_block

   def __repr__(self):

       num_existing_blocks = len(self.blocks)

       return 'Blockchain<{} Blocks, Head: {}>'.format(

           num_existing_blocks,

           self.head.identifier if self.head else None

       )

     

#定义好区块链结构后,下面就开始初始化一条区块链。

chain = BlockChain()

print(chain)

chain.add_block(block)

print(chain)

#for循环,添加更多的区块

for i in range(6):

   new_block = Block(i)

   new_block.mine()

   chain.add_block(new_block)

print(chain)

from datetime import datetime  #导入时间日期模块

#该类实现基于Block实现一个支持收支记录格式

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 = 0

       if self.data:

           amount = int(self.data.split('|')[2])

       return amount

   def get_content(self):

       content = ''

       if self.data:

           content = self.data.split('|')[1]

       return content

   def __repr__(self):

       return 'Bill: {}>'.format(

           self.data

       )

AccountBill('测试', 100)

from collections import OrderedDict

class 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 = 0

       if self.blocks:

           for k, v in self.blocks.items():

               balance += v['block'].get_amount()

       return balance

   def __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:程序猿记录在区块里的收支记录图——Jason niu')

plt.show()


目录
打赏
0
0
1
0
1042
分享
相关文章
区块链在房地产交易中的应用:革新房产市场的未来
区块链在房地产交易中的应用:革新房产市场的未来
193 80
区块链技术在跨境支付中的应用:打破传统,畅行全球支付新时代
区块链技术在跨境支付中的应用:打破传统,畅行全球支付新时代
22 12
区块链技术在跨境支付中的应用:打破传统,畅行全球支付新时代
区块链在物流管理中的应用:让货物管理变得更智能
区块链在物流管理中的应用:让货物管理变得更智能
46 14
区块链在能源交易中的应用:打造去中心化能源市场
区块链在能源交易中的应用:打造去中心化能源市场
117 22
区块链技术在选举中的应用:透明与安全的新时代
区块链技术在选举中的应用:透明与安全的新时代
73 16
区块链在医疗数据管理中的应用:安全与隐私的新纪元
区块链在医疗数据管理中的应用:安全与隐私的新纪元
150 16
探索区块链技术在供应链管理中的应用
【10月更文挑战第21天】 本文深入探讨了区块链技术如何在供应链管理中发挥关键作用,通过具体案例分析,揭示了区块链提高透明度、降低成本和增强安全性的潜力。文章首先概述了区块链技术的基本原理及其对传统供应链模式的挑战,接着详细讨论了区块链如何在不同供应链环节中实施,并分析了其带来的变革。最后,文章提出了企业在采纳区块链技术时可能面临的挑战和应对策略,为供应链管理者提供了宝贵的参考。
167 26
深入理解区块链技术:原理、应用与挑战
本文旨在探讨区块链技术的基本原理、主要应用及其面临的挑战。通过分析区块链的分布式账本技术、加密算法和共识机制,我们揭示了其如何在无需中心化权威的情况下确保数据的不可篡改性和透明性。此外,文章还讨论了区块链在金融、供应链管理、智能合约等领域的应用案例,并指出了当前区块链技术面临的可扩展性、隐私保护和法律监管等挑战。通过对这些内容的深入分析,我们希望为读者提供一个全面而深入的区块链技术概览。
352 16
未来已来:区块链技术在物联网与虚拟现实中的应用
随着科技的不断进步,新兴技术如区块链、物联网(IoT)和虚拟现实(VR)正在逐渐改变我们的生活和工作方式。本文将探讨这些技术的发展趋势和应用场景,以及它们如何相互融合,为我们带来更便捷、安全和沉浸式的体验。
深入探索区块链技术:原理、应用与未来展望
本文将带你深入了解区块链技术的基本原理,探讨其在金融、供应链、医疗等多个领域的应用案例,并展望其未来的发展趋势。通过本文,你将对区块链技术有一个全面的认识,理解其背后的技术逻辑和应用场景。

热门文章

最新文章