def To(self, request, context): # => Block # <= 如果高度增加 回傳 SYNCHRONIZATION ,否則 NOT_SYNCHRONIZATION global __BranchTarget,flag b = block.block.Block() b.pb2 = request print("=> [To] Block:%s" % b.pb2.blockhash) status = block.block.Chain.addBlock(b.pb2.blockhash,b) print("<= [To] Response:%sSYNCHRONIZATION" % ("" if "HEIGHT_ADD" == status else "NOT_") ) if "HEIGHT_ADD" == status: flag = False __BranchTarget = "" return grpc_pb2.Message(value = "SYNCHRONIZATION") return grpc_pb2.Message(value = "NOT_SYNCHRONIZATION")
def Hello(self, request, context): global PORT, selfipport selfIP = request.value[0:request.value.index('|')] Node.add((selfIP, PORT)) selfipport = "%s:%s" % (selfIP, PORT) nodePort = request.value[request.value.index('|') + 1:len(request.value)] print("=> Node Port:%s" % nodePort) port = talkYouIP(nodePort) return grpc_pb2.Message(value=str(port))
def BlockBroadcast(self, request, context): # => 區塊 # <= Status block = Block() block.pb2 = request print("=> [Transaction]Block:%s" % block.pb2.blockhash) status = Chain.addBlock(block.pb2.blockhash, block) print("<= [Transaction]Status:%s" % status) return grpc_pb2.Message(value=status)
def From(node, info): # <= 給予區塊資訊 # => 返回高度 block = Block() info = grpc_pb2.Message(value=str(info)) print("<= [From]info:%s" % str(info)) response = p2p.p2p.Node.send(node, SERVICE * SYNCHRONIZATION + FROM, info) print("=> [From]Block:%s" % str(response.blockhash)) block.pb2 = response v = block.vertify() if v == SUCCESS_VERTIFY: Chain.addBlock(block.pb2.blockhash, block) return int(block.pb2.height) elif v == WARNING_PREVIOUS_HASH_NOT_EQUAL: return -1 raise Exception("Error Block.py From()")
def grpcJoinNode(target): global PORT, GET_SELFNODE_FALG, selfipport target = str(target) compi = re.compile('^(\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}):(\d{1,5})$') result = compi.match(target) # 判斷是否存在且曾加入過 if result == None or (target in Node.getNodesList()): return False Node.add(target) # 判斷是否已取得自己IP if GET_SELFNODE_FALG: return True # Discovery.Hello() ip = result.group(1) print("<= grpc link to %s" % target) channel = grpc.insecure_channel(target) stub = grpc_pb2_grpc.DiscoveryStub(channel) HelloResponse = None try: HelloResponse = stub.Hello(grpc_pb2.Message( value="%s|%s" % (ip, PORT))) #target ip & self port except: return False helloPort = HelloResponse.value time.sleep(1) # 因不知道自己IP 故需要請對方告知自己 # socket get my ip print("=> hello port:%s" % helloPort) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print("<= connect to socket will get myIP") sock.connect((ip, int(helloPort))) myIP = sock.recv(1024) print("=> get myIP:%s" % myIP) Node.add((myIP, PORT)) selfipport = "%s:%s" % (myIP, PORT) GET_SELFNODE_FALG = True return True