经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 区块链 » 查看文章
python区块及区块链的开发详解
来源:jb51  时间:2019/7/4 8:33:57  对本文有异议

接着上一篇交易记录整合交易类,这里描述区块的开发。

首先我们要明白一个区块,需要的内容,包括交易记录集合,时间戳,哈希,上一个区块的哈希。明白了这个,下面就容易代码开发了。

  1. import datetime
  2. import hashlib
  3. from Message import DaDaMessage, InvalidMessage
  4. from Transaction import Transaction
  5. class Block:
  6. #不定参数,*args,区块集合
  7. def __init__(self, *args):
  8. self.messagelist = [] # 存储多个交易记录
  9. self.timestamp = None # 存储多个记录最终锁定时间
  10. self.hash = None
  11. self.preHash = None
  12. if args:
  13. for arg in args:
  14. self.add_message(arg)
  15.  
  16. def add_message(self, message): # 添加 交易信息
  17. # 区分第一条与后面多条,是否需要链接
  18. if len(self.messagelist) > 0:
  19. message.link(self.messagelist[-1]) # 链接最后一个
  20. message.seal() # 密封
  21. message.validate() # 校验
  22. self.messagelist.append(message)
  23. def link(self, block): # 区块链接
  24. self.preHash = block.hash
  25. def seal(self): # 密封当前hash
  26. self.timestamp = datetime.datetime.now()
  27. self.hash = self.hash_block()
  28. def hash_block(self): # 密封上一块哈希,时间戳,交易记录的最后一个
  29.  
  30. return hashlib.sha512(
  31. (str(self.timestamp) + str(self.preHash) + str(self.messagelist[-1].hash)).encode("utf-8")).hexdigest()
  32. def validate(self): # 校验
  33. for i, message in enumerate(self.messagelist): # 每个交易记录校验一下
  34. message.validate() #每一条交易记录校验
  35. if i > 0 and message.prev_hash != self.messagelist[i - 1].hash:
  36. raise InvalidBlock("无效的block,交易记录被修改为在第{}条记录".format(i)+str(self))
  37. return str(self) + "Ok"
  38. def __repr__(self):
  39. return "money block= hash:{},prehash:{},len:{},time:{}".format(self.hash, self.preHash, len(self.messagelist),
  40. self.timestamp)

自定义异常:

  1. class InvalidBlock(Exception):
  2. def __init__(self,*args,**kwargs):
  3. super(Exception,self).__init__(*args,**kwargs)

编写测试模块:

  1. if __name__=="__main__":
  2. t1 = Transaction("yicheng", "ddd1", 100)
  3. t2 = Transaction("yicheng", "ddd2", 200)
  4. t3 = Transaction("yicheng", "ddd3", 300)
  5. t4 = Transaction("yicheng", "ddd4", 400)
  6. m1 = DaDaMessage(t1)
  7. m2 = DaDaMessage(t2)
  8. m3 = DaDaMessage(t3)
  9. m4 = DaDaMessage(t4)
  10. try:
  11. block1 = Block(m1, m2, m3)
  12. block1.seal()
  13. #测试篡改数据
  14. #m3.data = "你妹的直播"
  15. #block1.messagelist[0] = m3
  16. print(block1.validate())
  17. except InvalidMessage as e: #交易记录被修改
  18. print(e)
  19. except InvalidBlock as e: #区块被修改
  20. print(e)

测试结果如下,为了打印需要,我改成了md5格式下的结果:

篡改区块信息的结果,可能结果不一样,因为修改的内容不一样,报的错误也不一样:

至此,已经完成了:交易记录,区块的开发,现在进行区块链的开发就比较容易了。实现代码如下:

  1. from Block import InvalidBlock, Block
  2. from Message import InvalidMessage, DaDaMessage
  3. from Transaction import Transaction
  4. # 区块链
  5. class Dada_BlockCoin:
  6. def __init__(self):
  7. self.blocklist = [] # 装载所有区块
  8. def validate(self):#校验所有区块
  9. for i, block in enumerate(self.blocklist):
  10. try:
  11. block.validate()
  12. except InvalidBlockCoin as e:
  13. raise InvalidBlockCoin("区块校验错误,区块索引{}".format(i))
  14. def add_block(self, block): # 增加区块
  15. if len(self.blocklist) > 0:
  16. block.link(self.blocklist[-1]) #连接区块
  17. block.seal()#密封
  18. block.validate()#校验
  19. self.blocklist.append(block)#添加到区块链中
  20. def __repr__(self):
  21. return "Dada_BlockCoin:{}".format(len(self.blocklist))

自定义异常:

  1. class InvalidBlockCoin(Exception):
  2. def __init__(self, *args, **kwargs):
  3. super(Exception, self).__init__(*args, **kwargs)

编写测试模块:

  1. if __name__ == "__main__":
  2. t1 = Transaction("yicheng", "ddd1", 100)
  3. t2 = Transaction("yicheng", "ddd2", 200)
  4. t3 = Transaction("yicheng", "ddd3", 300)
  5. t4 = Transaction("yicheng", "ddd4", 400)
  6. t5 = Transaction("yicheng", "ddd5", 500)
  7. t6 = Transaction("yicheng", "ddd6", 600)
  8. m1 = DaDaMessage(t1)
  9. m2 = DaDaMessage(t2)
  10. m3 = DaDaMessage(t3)
  11. m4 = DaDaMessage(t4)
  12. m5 = DaDaMessage(t5)
  13. m6 = DaDaMessage(t6)
  14. try:
  15. yin1 = Block(m1, m2)
  16. yin1.seal()
  17. yin2 = Block(m3, m4)
  18. yin2.seal()
  19. yin3 = Block(m5, m6)
  20. yin3.seal()
  21. # 篡改区块
  22. #yin3.messagelist.append(m1)
  23. coin = Dada_BlockCoin() # 区块链
  24. coin.add_block(yin1)
  25. coin.add_block(yin2)
  26. coin.add_block(yin3)
  27. coin.validate()
  28. print(coin)
  29. except InvalidMessage as e:
  30. print(e)
  31. except InvalidBlock as e:
  32. print(e)
  33. except InvalidBlockCoin as e:
  34. print(e)

测试结果如下:

篡改区块链,测试模块区块链的内容,可以任意篡改,测试结果如下:

这里已经完成了数据层的部分开发,其余部分后续会完善。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号