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

导读
想更好的了解区块链技术?还是用程序猿的方式来加深了解和探索区块链吧!实际案例应用会让我们更加熟悉它的底层技术!

目录

输出结果

代码设计


输出结果

代码设计

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 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)#定义好区块链结构后,下面就开始初始化一条区块链。
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 = 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:程序猿记录在区块里的收支记录图——Jason niu')
plt.show()

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

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

  1. 1分钟链圈 | 马化腾:大湾区可挖掘更多的区块链应用场景,比如区块链电子发票...

    Hi,艾瑞巴蒂! 这里是 9 月 6 日的每日1句话新闻晚报,只需1分钟,看看全球最热.最新的区块链新闻. 实时币价:BTC $6426.80    ETH $228.73    EOS $5.04( ...

  2. Python之区块链简单记账本实现

    在上一篇<Python之区块链入门>中讲述了区块链的基础知识,并用Python实现了区块和区块链的结构.在本篇中,将基于上面的内容实现一个简单的记账本功能. 记账本的功能如下: 实现基本的 ...

  3. 区块链简单实现之p2p网络多节点同步

    区块链简单实现之p2p网络多节点同步 将区块保存为json文件 节点 不确定性 区块里保存节点信息 并未向所有节点广播 简单模拟 广播的代码: 实现效果: 完整的代码: 承接上文:区块链的简单实现,我 ...

  4. 众说区块链:区块链应用场景之Token

    上期<众说区块链>讨论的主题是"区块链在食品安全溯源领域中的应用",围绕这个主题,范璟玮老师从基础的概念到以步步鸡为例的溯源事例就食品溯源这块和大家一起进行了详细的探讨 ...

  5. 区块链简单介绍(二)

    什么是PoW共识机制 所谓PoW机制全称是proof of work,也就是工作量证明.最开始这个技术是被用来解决垃圾邮件的问题.不过后来中本聪发现这个技术能有效解决拜占庭将军问题,于是便把它引进了比 ...

  6. 超级账本与区块链应用场景

    文章目录 区块链3.0 去中心化应用的新需求 区块链技术在行业应用中的条件 区块链3.0架构与超级账本 区块链3.0架构 超级账本(Hyperledger Fabric) 超级账本的项目 Fabric ...

  7. 推动区块链技术应用创新河南开展区块链应用场景需求和典型应用案例征集工作

    大河网讯(记者 杨露露)为推动区块链技术应用创新,深度赋能数字化转型升级.近日,河南省工信厅先后下发通知,开展河南省区块链典型应用案例征集工作和区块链应用场景需求征集工作. 区块链应用场景需求征集 据 ...

  8. 区块链应用场景:物联网和物流供应链

    曾经有人认为,物联网为大数据时代的基础. 笔者认为,区块链技术是物联网时代的基础. 应用场景分析 一种可能的应用场景为:通过 Transaction 产生对应的行为,为每一个设备分配地址 Addres ...

  9. 关于区块链应用场景的思考

    原文:2016-09-09 |关于区块链应用场景的思考 | G2EX,作者 Yaming Gong 读完本文大约需要 6 分钟 1. 区块链应用场景的思考 根据最近对比特币和区块链技术的学习,首先提出 ...

最新文章

  1. 用Red5搭建支持WEB播放的实时监控视频
  2. String类为什么是final
  3. MFC——基于MFC对话框程序中添加菜单栏 (CMenu)解决方案
  4. 用小程序·云开发打造运动圈小程序丨实战
  5. Java代理模式学习
  6. phpcms9.6 ueditor_Phpcms v9深度整合百度编辑器Ueditor
  7. 小鹏汽车CEO疑似隔空回应偷窃技术传闻;​苹果明年新款iPhone将使用增强版5nm芯片;Windows诞生35周年|极客头条...
  8. python 极速后台开发框架_基于FastAdmin快速搭建后台管理系统
  9. 动态规划法求最大字段和时间复杂度_面试必备——手撕代码(1)“最大子序列和”...
  10. AD14插入原理图模板
  11. aliddns ipv6_利用阿里云ddns动态解析ipv6地址
  12. itest手机考试有监控吗_itest考试有声音监控吗?
  13. DELL笔记本UEFI+GPT安装window10与Ubuntu双系统
  14. 我们都希望有一部属于自己的电脑。
  15. 在Mac上修复问题硬盘是如何操作的
  16. 微信公众号推送模板消息
  17. OPEN(SAP) UI5 学习入门系列之二: 最佳实践练习(上)
  18. window系统使用 bash 新建 vue3+ts 项目以及 preset 模板使用
  19. 电脑蓝牙耳机连接不稳定_一个困扰我半年的 macOS 蓝牙有时断连的问题终于解决了!...
  20. 用投影机控制软件2017 V3(可在多媒体教室代替遥控器中控机)

热门文章

  1. vue自定义指令截取图片中心显示
  2. Apache OpenWebBeans 发布适用于 Java EE 微服务的 Meecrowave 服务器 1.0
  3. 东京见闻:快速走红日本市场 阿里云的三大秘密
  4. 隐藏SSID无线网络ID 你的无线网络真的安全吗?
  5. Tomcat中的字体请求跨域问题解决
  6. ArcGIS中QueryTask,FindTask,IndentifyTask 之间的区别
  7. Excel为整列设置函数
  8. linux 下重名名文件
  9. 功能自动化测试工具列表大全
  10. 抛出这8个问题,检验你是否真的会ThreadLocal