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

原文地址:https://www.cnblogs.com/yunyaniu/p/8546708.html

时间: 2024-08-01 00:17:14

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

区块链技术开发 聊区块链+物联网场景应用

几乎在同一时期,区块链技术开发的诞生与物联网概念出现,但"遗憾"的是,二者直到最近一两年才"擦出火花",一方面,物联网几何级扩张后问题暴露得更加明显,亟待寻找解决方案,另一方面,区块链带来的全新思维方式也逐渐被主流商业群体所接受,空白的市场吸引了各行各业切入其中,抢时间成为了大家做区块链技术开发的共同目标. 从区块链技术开发的结构机制来看,去中心化的架构直接颠覆了物联网旧有的中心架构,不但大大减轻中心计算的压力,而且释放了物联网组织结构的更多可能,为创新提供了更多空

【区块链Go语言实现】第一部分:区块链基本原型

0x00 介绍 区块链(Blockchain)是21世纪最具革命性的技术之一,目前它仍处于逐渐成熟阶段,且其发展潜力尚未被完全意识到.从本质上讲,区块链只是一种记录的分布式数据库.但它之所以独特,是因为它并不是一个私有的数据库,而是一个公共数据库,也就是说,每个使用它的人都有一份完整或部分的数据副本.并且,只有在数据库的其他持有者同意的情况下,才可以向区块链中添加新的记录.此外,正是区块链使得加密货币和智能合约成为可能. 在本系列文章中,我们将基于区块链构建一种简单的加密货币. 0x01 区块

评蔡文胜区块链10问,数字货币不等于区块链,套路韭菜不要太明显

昨天上午,一则蔡文胜.薛蛮子.帅初等人对区块链进行讨论的微信聊天记录开始在网络传播.在聊天对话中,蔡文胜.帅初.慕岩.陈伟星.沈波.易理华.点付大头.FBG周硕基等人就区块链领域的多个问题发表了自己的观点. 其中,蔡文胜的10个区块链观点被人整理后被人传播.就网络传播蔡文胜的10个观点,何玺并不认同,下面何玺就蔡文胜的10个观点也说说自己的看法. 蔡文胜10个关于区块链的观点,如下: 1.我为什么看好区块链? "我算比较早了解比特币,大概2011就知道,在2014投资okcoin,也买了第一块比

区块链的相关名词有哪些?星光区块链

区块链的相关名词有哪些?随着区块链这个名词越来越火,现在有很多人都去了解区块链技术是怎样的?但有一些人因为不知道它相关名词的意思,陷入一个似懂非懂的状态.为了使大家更加深入的了解区块链技术,下面就让星光区块链来告诉大家一些常用的区块链的相关名词有哪些?它们是什么意思?-:半衰期来源于比特币的激励机制,即为矿工每验证一个区块即可得到的奖励.从最开始的50BTC,每四年减半,目前是12.5BTC,已经历过2次半衰(50BTC-->25BTC-->12.5BTC). 二:.分叉指向同一个父块的2个区

终于把区块链与物流的关联搞清楚了 区块链的分类 物流业中区块链技术应用的案例

原文 区块链的分类 区块链可以分为三类:公有链.私有链.联盟链. 1.公有链无官方组织及管理机构,无中心服务器,参与的节点按照系统规则自由接入网络.不受控制,节点间基于共识机制开展工作. 2.私有链建立在某个企业内部,系统的运作规则根据企业要求进行设定,修改甚至是读取权限仅限于少数节点,同时仍保留着区块链的真实性和部分去中心化的特性. 3.联盟链由若干机构联合发起,介于公有链和私有链之间,兼具部分去中心化的特性. 去中心化是区块链的最重要特征 区块链技术提供了一种无需信任单个节点.还能创建共识网

3.1 区块链应用场景

比特币是区块链应用最早的场景,随着比特币安全稳定运行多年以后,数字货币的场景应用遍地开花,各种山寨币泛滥,通过ICO(Initial Coin Offering 首次币发行)就能融到大量资金,上市后的数字货币就像股票一样可以进自由交易,这类应用主流称为区块链1.0.       技术人员通过对比特币等数字货币的技术研究,梳理出数字货币中涉及的各类技术,如加密算法.端对端传输.共识算法,提炼并形成区块链架构理论:在区块链1.0架构的基础上,加上智能合约,应用扩展到金融领域,解决跨境支付与结算.证券

《区块链100问》第50集:区块链资产全球流通

区块链资产有几大特点,其中之一就是全球流通.区块链资产首先是基于互联网的.只要有互联网的地方,区块链资产就可以进行流通.这里的互联网可以是万维网,也可以是各种局域网,所以,区块链资产是全球流通的. 甚至你在月球.火星上,你只要有互联网,我就可以把我的区块链资产转账给你. 相较于中心化的方式,区块链资产在全球流通的转账手续费非常低.比如比特币早期转账手续费为0.0001BTC,现在就稍微有点贵了,其他如Bitcoin Cash网络转账手续费为0.0001BCC,达世转账手续费为0.002Dash,

《区块链100问》第52集:区块链资产能去中心化记账

区块链资产的第三大特点是记账去中心化. 你给别人的转账,不会因为记账机构要放假,所以延迟几天到账:不会因为记账机构要盈利,所以要付很高手续费:更不会因为记账机构作弊,而受到损失. 因为它的记账是全网共同进行的.你给别人转账记录的账本,不会因为你这里或者对方那里的账本数据丢失,而无法统一,因为这个账本是全网共同维护,每个全节点都有备份.如果你转账0.5个币给火币牛牛,你们俩一起看全网的记录数据就好:有没有到账.几个确认了等等,十分透明公正. 原文地址:https://www.cnblogs.com

区块链行业最不容错过资讯,全新区块链游戏龙纪链DGEra Chain热浪来袭

龙纪链DGEra Chain怎么玩?一天轻松薅上万!享受0成本撸钱的快感-- 注册下载链接:https://front.dgera.net/register/index.html?invite=11ISB2QD邀请码:11ISB2QD新手指南:https://dgera.zendesk.com/hc/zh-cn/articles/360031804912进微信群加:DGEra6 .www799584123.qvklxxx.yeez222诚招团队长 / 代理 / 个人站长 / 社群主共同致富,请加