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)
테스트 결 과 는 다음 과 같다.블록 체인 변경,테스트 모듈 블록 체인 의 내용 은 임의로 변경 할 수 있 습 니 다.테스트 결 과 는 다음 과 같 습 니 다.
이곳 은 이미 데이터 층 의 일부 개발 을 마 쳤 고 나머지 부분 은 추 후 완 선 될 것 이다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.