Esempio n. 1
0
 def GetBlock(self, request, context):
     try:
         with self.mutex:
             blk1 = self.blocks[request.idx]
         tmp = pickle.dumps(blk1)
         return P2PNode_pb2.GetBlockReply(blk = tmp)
     except Exception:
         return P2PNode_pb2.GetBlockReply(blk = 'None')
Esempio n. 2
0
 def SendBlock(self, request, context):
     try:
         blk = pickle.loads(request.blk)
     except Exception:
         return 
     self.handle_send_block(blk)
     return P2PNode_pb2.SendBlockReply()
Esempio n. 3
0
    def reponseFindNode(self, request, context):

        #add sendId
        self.add(request.sendAddr.ip, request.sendAddr.port, request.sendId)

        #query
        ansNode = [(self.distance(request.targetId, self.id), self.addr[0],
                    self.addr[1], self.id)]

        for bucket in self.buckets:
            for item in bucket:
                ansNode.append(
                    (self.distance(request.targetId,
                                   item[2]), item[0], item[1], item[2]))
        ansNode.sort(key=lambda x: x[0])
        response = P2PNode_pb2.FindNodeReply()
        tot = 0
        for node in ansNode:
            nodeinfo = response.nodes.add()
            nodeinfo.addr.ip = node[1]
            nodeinfo.addr.port = node[2]
            nodeinfo.id = node[3]
            tot = tot + 1
            if (tot > self.k):  #can be more?
                break
        return response
Esempio n. 4
0
    def send_block(self, node, blk):
        format_addr = "%s:%s" % (node[0], node[1])
        with grpc.insecure_channel(format_addr) as channel:
            stub = P2PNode_pb2_grpc.BlockChainStub(channel)
            response = stub.SendBlock(P2PNode_pb2.SendBlockRequest(blk=blk))

            return
Esempio n. 5
0
    def get_block(self, node, idx):
        format_addr = "%s:%s" % (node[0], node[1])
        with grpc.insecure_channel(format_addr) as channel:
            stub = P2PNode_pb2_grpc.BlockChainStub(channel)
            response = stub.GetBlock(P2PNode_pb2.GetBlockRequest(idx=idx))

            return response.blk
Esempio n. 6
0
    def ping(self, ip, port):
        #print("ping:",ip,port)
        format_addr = "%s:%s" % (ip, port)
        channel = grpc.insecure_channel(format_addr)
        stub = P2PNode_pb2_grpc.KademliaStub(channel)
        request = P2PNode_pb2.pingRequest()
        request.sendAddr.ip = self.addr[0]
        request.sendAddr.port = self.addr[1]
        request.message = "ping-pong"

        response = stub.pong(request)
Esempio n. 7
0
 def FindNode(self, addr, id):
     format_addr = "%s:%s" % (addr[0], addr[1])
     with grpc.insecure_channel(format_addr) as channel:
         stub = P2PNode_pb2_grpc.KademliaStub(channel)
         request = P2PNode_pb2.FindNodeRequest()
         request.sendAddr.ip = self.addr[0]
         request.sendAddr.port = self.addr[1]
         request.sendId = self.id
         request.targetId = id
         response = stub.reponseFindNode(request)
         return response
     return None
Esempio n. 8
0
 def GetBlockNum(self, request, context):
     block_num = len(self.blocks)
     return P2PNode_pb2.BlockNumReply(num = block_num)
Esempio n. 9
0
 def pong(self, request, context):
     #print("pong:",request.sendAddr,self.addr)
     return P2PNode_pb2.pongReply(message=request.message)
Esempio n. 10
0
    def setAddr(self, addr):
        self.addr = addr

    def join(self, static_addr):
        peers = [static_addr]
        used = set()
        used.add(self.id)
        while len(peers) > 0:  # can be limit times
            response = self.FindNode(peers[0], self.id)
            #print("-------------",peers[0]);
            del peers[0]
            #print(response)
            for node in response.nodes:
                if node.id not in used:
                    if (node.addr.ip, node.addr.port) != static_addr:
                        peers.append((node.addr.ip, node.addr.port))
                    used.add(node.id)
                    self.add(node.addr.ip, node.addr.port, node.id)


if __name__ == '__main__':
    #unit test
    a = KademliaTable()
    a.setAddr(("10.0.0.1", 50000))
    request = P2PNode_pb2.FindNodeRequest()
    request.sendAddr.ip = "10.0.0.2"
    request.sendAddr.port = 50000
    request.sendId = a.random_id()
    request.targetId = request.sendId
    a.reponseFindNode(request, 1)
Esempio n. 11
0
 def SayHello(self, request, context):
     print("recive:", request.name)
     return P2PNode_pb2.HelloReply(message='hello {msg}'.format(
         msg=request.name))
Esempio n. 12
0
 def get_block_num(self, node):
     format_addr = "%s:%s" % (node[0], node[1])
     with grpc.insecure_channel(format_addr) as channel:
         stub = P2PNode_pb2_grpc.BlockChainStub(channel)
         response = stub.GetBlockNum(P2PNode_pb2.BlockNumRequest())
         return response.num
Esempio n. 13
0
 async def sendData(self):
     format_addr = "%s:%s" % (self.static_addr[0], self.static_addr[1])
     with grpc.insecure_channel(format_addr) as channel:
         stub = P2PNode_pb2_grpc.BlockChainStub(channel)
         response = stub.SayHello(P2PNode_pb2.HelloRequest(name='czl'))
         print("response : " + response.message)