BlockChain:Py实现区块链简单场景应用:程序猿记录在区块里的收入记录图——Jason niu
# -*- coding: utf-8 -*-
'''
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()





BlockChain:Py实现区块链简单场景应用:程序猿记录在区块里的收入记录图——Jason niu的更多相关文章
- 【区块链Go语言实现】Part 1:区块链基本原型
0x00 介绍 区块链(Blockchain)是21世纪最具革命性的技术之一,目前它仍处于逐渐成熟阶段,且其发展潜力尚未被完全意识到.从本质上讲,区块链只是一种记录的分布式数据库.但它之所以独特,是因 ...
- 老K漫谈区块链的共识(3)——分布式系统和区块链共识
1. 啥是分布式系统 当我们评价一个新的事物或者介绍一个新的技术的时候,我们不能架空历史和环境,新的事物不可能脱离历史和环境凭空诞生.任何新的事物和新的技术总是或多或少的,与旧的事件以及过去的技术有所 ...
- 区块链教程(二):比特币、区块链、以太坊、Hyperledger的关系
不知道大家喜不喜欢音乐! 朋克音乐:诞生于七十年代中期,一种源于六十年代车库摇滚和前朋克摇滚的简单摇滚乐.它由一个简单悦耳的主旋律和三个和弦组成,经过演变,朋克已经逐渐脱离摇滚,成为一种独立的音乐,朋 ...
- 区块链入门到实战(12)之区块链 – 默克尔树(Merkle Tree)
目的:解决由于区块链过长,导致节点硬盘存不下的问题. 方法:只需保留交易的哈希值. 区块链作为分布式账本,原则上网络中的每个节点都应包含整个区块链中全部区块,随着区块链越来越长,节点的硬盘有可能放不下 ...
- 沪苏浙皖共同打造区块链数字经济发展高地,Panda Global表示区块链真的来了!
近日,在长三角一体化发展重大合作事项签约仪式上,沪苏浙皖经信部门共同签约,推进长三角区块链数字经济一体化发展,共同打造数字经济发展高地.从此次签约活动也能看出来,区块链数字现金的发展已经得到了认可,早 ...
- HyperLedger Fabric 1.4 区块链应用场景(3.1)
比特币是区块链应用最早的场景,随着比特币安全稳定运行多年以后,数字货币的场景应用遍地开花,各种山寨币泛滥,通过ICO(Initial Coin Offering 首次币发行)就能融到大量资金,上市后的 ...
- AbelSu区块链应用场景收集
1.基于智能合约的众筹 众筹项目的资金通常由一个中心化不可变更且开放的数据库来控制,这个数据库可以追踪所有出资人. 虽然如此,我们可以用一种去中心化的方式来实现,而且只要创建一个代币就可以追踪资金.一 ...
- 区块链入门到实战(6)之区块链 – 哈希(Hash)
密码学中,最重要的函数之一是哈希函数.哈希函数将任意大小的数据(内容)映射到固定大小的数据(哈希值). 哈希函数是单向的,从内容生成哈希值很容易,但从哈希值映射到内容很难. 比特币使用SHA-256哈 ...
- Python 模拟简单区块链
首先这是说明一下这是Tiny熊老师的教程https://www.cnblogs.com/tinyxiong 另外还要说明一下,暑假指导老师让我们做一些关于区块链的应用.这里只是涉及极其简单的模拟,主要 ...
随机推荐
- 20165232 week1 kali安装
20165232 Week1 kali安装 一.安装虚拟机 首先到kali官网下载64bit版本的kali(3.5G),这里我是从同学盘上拷过来的. 下载VMWARE 进入官网,找到如下图示 点击进行 ...
- com.alibaba.druid数据源工具类
Druid是阿里巴巴推出的国产数据库连接池,据网上测试对比,比目前的DBCP或C3P0数据库连接池性能更好.它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库, ...
- Kettle中并行执行测试
整个作业截图: 设置并行方法:右键 START 组件,勾选最后一个选项: Run Next Entries In Parallel 设置aa, bb, cc, dd, ee 都是shell脚本,内容都 ...
- metasploit与Cobaltstrike互相派生shell
msf 派生 shell 给 Cobalt strike(前提有一个meterpreter) msf exploit(handler) > use exploit/windows/local/p ...
- 操作系统层面聊聊BIO,NIO和AIO (epoll)
BIO 有了Block的定义,就可以讨论BIO和NIO了.BIO是Blocking IO的意思.在类似于网络中进行read, write, connect一类的系统调用时会被卡住. 举个例子,当用re ...
- [Luogu P2296][NOIP 2014]寻找道路
emmm交了第8次才过. 这道题目测一道单源最短路问题,因此dijkstra或者spfa板子先准备好.因为题中对最短路有限定: 路径上的所有点的出边所指向的点都直接或间接与终点连通. 在满足条件1的情 ...
- [Reinforcement Learning] 动态规划(Planning)
动态规划 动态规划(Dynamic Programming,简称DP)是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于具有如下性质的问题: 具有最优子结构(Opt ...
- 多个div实现随意拖拽功能
鼠标事件 mousedownmousemovemouseup注意事项:被拖动的div的position属性值一定是absolute.切记不可使用margin-top:10px;而应该使用top:10p ...
- Faster R-CNN
1.R-CNN R-CNN网络架构图 R-CNN网络框架流程 1)原图像经过 selective search算法提取约2000个候选框 2)候选框缩放到同一大小,原因是上图的ConvNet需要输入图 ...
- IAR 关于C++几个内存的使用及释放的问题
由于之前工作中常常遇到,但是遇到的时候工作总是要求比较紧急,没有那么多时间细细寻找有效的解决办法.现在了解到了一些,记录一些. 1. string vector 都是增量在堆里,所以只要有增量都是在堆 ...