python 블록 및 블록 체인 개발 상세 설명

이 어 전편거래 기록 통합 거래 클래스여기 서 블록 개발 을 묘사 합 니 다.
먼저 우 리 는 거래 기록 집합,시간 스탬프,해시,이전 블록 의 하 시 를 포함 한 블록 을 알 아야 한다.이것 을 알 게 되면 다음은 코드 개발 이 쉬 워 집 니 다.

import datetime
import hashlib
from Message import DaDaMessage, InvalidMessage
from Transaction import Transaction
class Block:
  #    ,*args,    
  def __init__(self, *args):
    self.messagelist = [] #         
    self.timestamp = None #             
    self.hash = None
    self.preHash = None
    if args:
      for arg in args:
        self.add_message(arg)

  def add_message(self, message): #        
    #           ,      
    if len(self.messagelist) > 0:
      message.link(self.messagelist[-1]) #       
    message.seal() #   
    message.validate() #   
    self.messagelist.append(message)
  def link(self, block): #     
    self.preHash = block.hash
  def seal(self): #     hash
    self.timestamp = datetime.datetime.now()
    self.hash = self.hash_block()
  def hash_block(self): #        ,   ,         

    return hashlib.sha512(
      (str(self.timestamp) + str(self.preHash) + str(self.messagelist[-1].hash)).encode("utf-8")).hexdigest()
  def validate(self): #   
    for i, message in enumerate(self.messagelist): #           
      message.validate() #         
      if i > 0 and message.prev_hash != self.messagelist[i - 1].hash:
        raise InvalidBlock("   block,          {}   ".format(i)+str(self))
    return str(self) + "Ok"
  def __repr__(self):
    return "money block= hash:{},prehash:{},len:{},time:{}".format(self.hash, self.preHash, len(self.messagelist),
                                    self.timestamp)
사용자 정의 이상:

class InvalidBlock(Exception):
  def __init__(self,*args,**kwargs):
    super(Exception,self).__init__(*args,**kwargs)
테스트 모듈 작성:

if __name__=="__main__":
  t1 = Transaction("yicheng", "ddd1", 100)
  t2 = Transaction("yicheng", "ddd2", 200)
  t3 = Transaction("yicheng", "ddd3", 300)
  t4 = Transaction("yicheng", "ddd4", 400)
  m1 = DaDaMessage(t1)
  m2 = DaDaMessage(t2)
  m3 = DaDaMessage(t3)
  m4 = DaDaMessage(t4)
  try:
    block1 = Block(m1, m2, m3)
    block1.seal()
    #      
    #m3.data = "     "
    #block1.messagelist[0] = m3
    print(block1.validate())
  except InvalidMessage as e: #       
    print(e)
  except InvalidBlock as e: #     
    print(e)
테스트 결 과 는 다음 과 같 습 니 다.인쇄 를 위해 md5 형식의 결과 로 바 꾸 었 습 니 다.

블록 정 보 를 변경 한 결 과 는 결과 가 다 를 수 있 습 니 다.수정 한 내용 이 다 르 기 때문에 보고 한 오류 도 다 릅 니 다.

이로써 거래 기록,블록 개발 을 완 성 했 고 지금 은 블록 체인 개발 을 하 는 것 이 비교적 쉽다.구현 코드 는 다음 과 같 습 니 다:

from Block import InvalidBlock, Block
from Message import InvalidMessage, DaDaMessage
from Transaction import Transaction
#    
class Dada_BlockCoin:
  def __init__(self):
    self.blocklist = [] #       
  def validate(self):#      
    for i, block in enumerate(self.blocklist):
      try:
        block.validate()
      except InvalidBlockCoin as e:
        raise InvalidBlockCoin("      ,    {}".format(i))
  def add_block(self, block): #     
    if len(self.blocklist) > 0:
      block.link(self.blocklist[-1]) #    
    block.seal()#  
    block.validate()#  
    self.blocklist.append(block)#       
  def __repr__(self):
    return "Dada_BlockCoin:{}".format(len(self.blocklist))
사용자 정의 이상:

class InvalidBlockCoin(Exception):
  def __init__(self, *args, **kwargs):
    super(Exception, self).__init__(*args, **kwargs)
테스트 모듈 작성:

if __name__ == "__main__":
  t1 = Transaction("yicheng", "ddd1", 100)
  t2 = Transaction("yicheng", "ddd2", 200)
  t3 = Transaction("yicheng", "ddd3", 300)
  t4 = Transaction("yicheng", "ddd4", 400)
  t5 = Transaction("yicheng", "ddd5", 500)
  t6 = Transaction("yicheng", "ddd6", 600)
  m1 = DaDaMessage(t1)
  m2 = DaDaMessage(t2)
  m3 = DaDaMessage(t3)
  m4 = DaDaMessage(t4)
  m5 = DaDaMessage(t5)
  m6 = DaDaMessage(t6)
  try:
    yin1 = Block(m1, m2)
    yin1.seal()
    yin2 = Block(m3, m4)
    yin2.seal()
    yin3 = Block(m5, m6)
    yin3.seal()
    #     
    #yin3.messagelist.append(m1)
    coin = Dada_BlockCoin() #    
    coin.add_block(yin1)
    coin.add_block(yin2)
    coin.add_block(yin3)
    coin.validate()
    print(coin)
  except InvalidMessage as e:
    print(e)
  except InvalidBlock as e:
    print(e)
  except InvalidBlockCoin as e:
    print(e)
테스트 결 과 는 다음 과 같다.

블록 체인 변경,테스트 모듈 블록 체인 의 내용 은 임의로 변경 할 수 있 습 니 다.테스트 결 과 는 다음 과 같 습 니 다.

이곳 은 이미 데이터 층 의 일부 개발 을 마 쳤 고 나머지 부분 은 추 후 완 선 될 것 이다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기