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


Wijd
Wijd 2022-09-20 11:05:08 51761
分类专栏: 资讯

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

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

目录

输出结果

代码设计


输出结果
 

 

 

代码设计

  1. Created on 2018311
  2. -meta">@author: Jason niu
  3. '''
  4. import hashlib 该模块实现了诸多安全哈希和消息摘要算法的通用接口,包括 FIPS 安全哈希算法: SHA1、SHA224、 SHA256、SHA384、RSA的 MD5 等等算法
  5. import uuid 通用唯一标识符 ( Universally Unique Identifier ), 对于所有的UUID它可以保证在空间和时间上的唯一性. 它是通过MAC地址, 时间戳, 命名空间, 随机数, 伪随机数来保证生成ID的唯一性, 有着固定的大小( 128 bit ). 它的唯一性和一致性特点使得可以无需注册过程就能够产生一个新的UUID. UUID可以被用作多种用途, 既可以用来短时间内标记一个对象, 也可以可靠的辨别网络中的持久性对象.
  6. 该类实现简化版的区块包:一个唯一标识符、父节点的哈希值、nonce值、该区块的内容字段。
  7. class Block(object):
  8. def __init__(self, data=None, previous_hash=None):
  9. self.identifier = uuid.uuid4().hex uuid产生唯一标示
  10. self.nonce = None
  11. self.data = data
  12. self.previous_hash = previous_hash
  13. def hash(self, nonce=None): 利用sha256算法计算区块的哈希值
  14. message = hashlib.sha256()
  15. message.update(self.identifier.encode('utf-8')) 以utf-8格式对identifier进行编码,二进制从低位往高位取出二进制数字
  16. message.update(str(nonce).encode('utf-8'))
  17. message.update(str(self.data).encode('utf-8'))
  18. message.update(str(self.previous_hash).encode('utf-8'))
  19. return message.hexdigest() hexdigest函数计算整个文件的hash code,返回摘要作为十六进制数据字符串值
  20. def hash_is_valid(self, the_hash):
  21. return the_hash.startswith('0000')
  22. def __repr__(self):
  23. return 'Block<Hash: {}, Nonce: {}>'.format(self.hash(self.nonce), self.nonce)
  24. def mine(self):
  25. cur_nonce = self.nonce or 0
  26. while True:
  27. the_hash = self.hash(nonce=cur_nonce)
  28. if self.hash_is_valid(the_hash):
  29. self.nonce = cur_nonce
  30. break
  31. else:
  32. cur_nonce += 1
  33. 创建创世区块
  34. block = Block('Hello World')
  35. block.mine()
  36. print(block)
  37. class BlockChain(object):
  38. def __init__(self):
  39. self.head = None
  40. self.blocks = {}
  41. def add_block(self, new_block):
  42. previous_hash = self.head.hash(self.head.nonce) if self.head else None
  43. new_block.previous_hash = previous_hash
  44. self.blocks[new_block.identifier] = {
  45. 'block': new_block,'previous_hash': previous_hash,'previous': self.head,
  46. }
  47. self.head = new_block
  48. def __repr__(self):
  49. num_existing_blocks = len(self.blocks)
  50. return 'Blockchain<{} Blocks, Head: {}>'.format(
  51. num_existing_blocks,
  52. self.head.identifier if self.head else None
  53. )
  54. 定义好区块链结构后,下面就开始初始化一条区块链。
  55. chain = BlockChain()
  56. print(chain)
  57. chain.add_block(block)
  58. print(chain)
  59. for循环,添加更多的区块
  60. for i in range(6):
  61. new_block = Block(i)
  62. new_block.mine()
  63. chain.add_block(new_block)
  64. print(chain)
  65. from datetime import datetime 导入时间日期模块
  66. 该类实现基于Block实现一个支持收支记录格式
  67. class AccountBill(Block):
  68. def __init__(self, content, amount):
  69. t = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  70. data = "{}|{}|{}".format(t, content, amount)
  71. return super(AccountBill, self).__init__(data)
  72. def get_amount(self):
  73. amount = 0
  74. if self.data:
  75. amount = int(self.data.split('|')[2])
  76. return amount
  77. def get_content(self):
  78. content = ''
  79. if self.data:
  80. content = self.data.split('|')[1]
  81. return content
  82. def __repr__(self):
  83. return 'Bill: {}>'.format(
  84. self.data
  85. )
  86. AccountBill('测试', 100)
  87. from collections import OrderedDict
  88. class AccountBook(BlockChain):
  89. def __init__(self):
  90. self.head = None
  91. self.blocks = OrderedDict()
  92. def add_block(self, new_bill):
  93. new_bill.mine()
  94. super(AccountBook, self).add_block(new_bill)
  95. def balance(self):
  96. balance = 0
  97. if self.blocks:
  98. for k, v in self.blocks.items():
  99. balance += v['block'].get_amount()
  100. return balance
  101. def __repr__(self):
  102. num_existing_blocks = len(self.blocks)
  103. return 'AccountBook<{} Bills, Head: {}>'.format(
  104. num_existing_blocks,
  105. self.head.identifier if self.head else None
  106. )
  107. book = AccountBook()
  108. b1 = AccountBill('月薪', 23000)
  109. book.add_block(b1)
  110. b2 = AccountBill('房租消费', -3000)
  111. book.add_block(b2)
  112. b3 = AccountBill('饮食消费', -1200)
  113. book.add_block(b3)
  114. b4 = AccountBill('娱乐消费', -1200)
  115. book.add_block(b4)
  116. b5 = AccountBill('token收入', 1000)
  117. book.add_block(b5)
  118. b6 = AccountBill('搬砖收入', 400)
  119. book.add_block(b6)
  120. b7 = AccountBill('扛水泥收入', 500)
  121. book.add_block(b7)
  122. b8 = AccountBill('学习AI', -1000)
  123. book.add_block(b8)
  124. b9 = AccountBill('学习BlockChain', -800)
  125. book.add_block(b9)
  126. b10 = AccountBill('学习ICO', -10)
  127. book.add_block(b10)
  128. print(book.balance())
  129. for k,v in book.blocks.items():
  130. print(v['block'].data)
  131. import matplotlib
  132. import numpy as np
  133. import matplotlib.pyplot as plt
  134. plt.rcParams['font.sans-serif']=['SimHei']
  135. x_data = []
  136. y_data = []
  137. colors = []
  138. for k,v in book.blocks.items():
  139. bill = v['block']
  140. y_data.append(bill.get_content())
  141. amount = bill.get_amount()
  142. if amount > 0:
  143. x_data.append(amount)
  144. colors.append('blue')
  145. else:
  146. x_data.append(-amount)
  147. colors.append('red')
  148. y_pos = np.arange(len(y_data))
  149. plt.bar(y_pos, x_data, align='center', alpha=0.5, color=colors)
  150. plt.xticks(y_pos, y_data)
  151. plt.ylabel('金额')
  152. plt.title('BlockChain:程序猿记录在区块里的收支记录图——Jason niu')
  153. plt.show()

 

 



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

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=4194
赞同 0
评论 0 条
WijdL0
粉丝 0 发表 6 + 关注 私信
上周热门
如何使用 StarRocks 管理和优化数据湖中的数据?  2959
【软件正版化】软件正版化工作要点  2878
统信UOS试玩黑神话:悟空  2843
信刻光盘安全隔离与信息交换系统  2737
镜舟科技与中启乘数科技达成战略合作,共筑数据服务新生态  1270
grub引导程序无法找到指定设备和分区  1235
华为全联接大会2024丨软通动力分论坛精彩议程抢先看!  165
点击报名 | 京东2025校招进校行程预告  164
2024海洋能源产业融合发展论坛暨博览会同期活动-海洋能源与数字化智能化论坛成功举办  163
华为纯血鸿蒙正式版9月底见!但Mate 70的内情还得接着挖...  159
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

加入交流群

请使用微信扫一扫!