BlockChain:Py实现区块链简单场景应用:程序猿记录在区块里的收入记录图-阿里云开发者社区

开发者社区> 一个处女座的程序猿> 正文

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()


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
区块链开发公司发展迅速 区块链如何创新跟上节奏
  创新式区块链技术的出现和成熟,让产业内开始将焦点放至区块链技术其本身。首先,部署方式区块链出现创新,在比T币这种公共链形式的基础上,目前延伸出了联盟链和私链。这些链在信息公开程度和中心控制力度方面有所限制。
1301 0
解码2017双11:全球狂欢新记录背后的阿里云存储
2017天猫双11再次刷新纪录,这背后是大数据的支撑和阿里云计算的能力的体现。手淘、天猫APP主站的所有图片和视频都存储在阿里云对象存储OSS之上,全球数以亿计的消费者,对这些商品的访问的流量和并发次数,比成交笔数高得高。
5186 0
以太坊·电影院场景区块链应用探索
本文节选自电子书《Netkiller Blockchain 手札》 Netkiller Blockchain 手札 本文作者最近在找工作,有意向致电 13113668890 Mr. Neo Chan, 陈景峯(BG7NYT) 中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 <netkiller@msn.com> 文档始创于2018-02-10 版权 © 2018 Netkiller(Neo Chan). All rights reserved. 版权声明 转载请与作者联系,转载时请务必标明文章原始出处和作者信息及本声明。
1126 0
HyperLedger Fabric区块链应用场景(3.1)
比特币是区块链应用最早的场景,随着比特币安全稳定运行多年以后,数字货币的场景应用遍地开花,各种山寨币泛滥,通过ICO(Initial Coin Offering 首次币发行)就能融到大量资金,上市后的数字货币就像股票一样可以进自由交易,这类应用主流称为区块链1.0。
2530 0
gdy
【出错记录】Tomcat非root用户启动无法拥有权限读写文件
简单记录下,如有必要,将深入补充: 一、非root用户运行Tomcat及原因 由于项目中,为了安全需要,Tomcat将禁止以root形式启动,原因很简单,举个例子,一旦有人恶意将jsp文件透过某个别的漏洞传到你的服务器中,那么你的程序运行过程中,将会远端被别人恶意执行代码,轻则服务器被黑,重则通过这台跳板进入你的后台,病毒式的入侵到内网的其他机器(例如大量的Redis以及MongoDB置于内网时是不设置密码的),所以以非root的方式启动Tomcat对于商用的环境下,是必须的。
1950 0
猫晚流量再创记录,阿里云直播方案护航优酷2500万用户体验
对“剁手党而言,天猫双11早已经超越了简单的“买买买”,更是一场边看边玩的狂欢盛宴。今年的天猫双11狂欢夜晚会(简称“猫晚”)在上海举办,这台兼具年轻潮流与国际风范的“超级晚会”,通过优酷、浙江卫视、东方卫视进行了全程网络直播和电视直播,吸引了超过全球超过2.4亿人收看。
2004 0
+关注
一个处女座的程序猿
国内互联网圈知名博主、人工智能领域优秀创作者,全球最大中文IT社区博客专家、CSDN开发者联盟生态成员、中国开源社区专家、华为云社区专家、51CTO社区专家、Python社区专家等,曾受邀采访和评审十多次。仅在国内的CSDN平台,博客文章浏览量超过2500万,拥有超过57万的粉丝。
1701
文章
0
问答
来源圈子
更多
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载