func chatWithPeer(chaincodeSupportClient pb.ChaincodeSupportClient, cc Chaincode) error { var errFromChat error // Establish stream with validating peer stream, err := chaincodeSupportClient.Register(context.Background()) if err != nil { return fmt.Errorf("Error chatting with leader at address=%s: %s", getPeerAddress(), err) } // Create the chaincode stub which will be passed to the chaincode //stub := &ChaincodeStub{} // Create the shim handler responsible for all control logic handler = newChaincodeHandler(getPeerAddress(), stream, cc) defer stream.CloseSend() // Send the ChaincodeID during register. chaincodeID := &pb.ChaincodeID{Name: viper.GetString("chaincode.id.name")} payload, err := proto.Marshal(chaincodeID) if err != nil { return fmt.Errorf("Error marshalling chaincodeID during chaincode registration: %s", err) } // Register on the stream chaincodeLogger.Debug("Registering.. sending %s", pb.ChaincodeMessage_REGISTER) stream.Send(&pb.ChaincodeMessage{Type: pb.ChaincodeMessage_REGISTER, Payload: payload}) waitc := make(chan struct{}) go func() { for { in, err := stream.Recv() if err == io.EOF { // read done. errFromChat = fmt.Errorf("Error sending transactions to peer address=%s, received EOF when expecting %s", getPeerAddress(), pb.OpenchainMessage_DISC_HELLO) close(waitc) return } if err != nil { grpclog.Fatalf("Failed to receive a Registered message from server : %v", err) } // Call FSM.handleMessage() err = handler.handleMessage(in) if err != nil { chaincodeLogger.Error(fmt.Sprintf("Error handling message: %s", err)) return } } }() <-waitc return nil }
func chatWithPeer(chaincodeSupportClient pb.ChaincodeSupportClient, cc Chaincode) error { // Establish stream with validating peer stream, err := chaincodeSupportClient.Register(context.Background()) if err != nil { return fmt.Errorf("Error chatting with leader at address=%s: %s", getPeerAddress(), err) } // Create the chaincode stub which will be passed to the chaincode //stub := &ChaincodeStub{} // Create the shim handler responsible for all control logic handler = newChaincodeHandler(getPeerAddress(), stream, cc) defer stream.CloseSend() // Send the ChaincodeID during register. chaincodeID := &pb.ChaincodeID{Name: viper.GetString("chaincode.id.name")} payload, err := proto.Marshal(chaincodeID) if err != nil { return fmt.Errorf("Error marshalling chaincodeID during chaincode registration: %s", err) } // Register on the stream chaincodeLogger.Debug("Registering.. sending %s", pb.ChaincodeMessage_REGISTER) handler.serialSend(&pb.ChaincodeMessage{Type: pb.ChaincodeMessage_REGISTER, Payload: payload}) waitc := make(chan struct{}) go func() { defer close(waitc) msgAvail := make(chan *pb.ChaincodeMessage) var nsInfo *nextStateInfo var in *pb.ChaincodeMessage recv := true for { in = nil err = nil nsInfo = nil if recv { recv = false go func() { var in2 *pb.ChaincodeMessage in2, err = stream.Recv() msgAvail <- in2 }() } select { case in = <-msgAvail: if err == io.EOF { chaincodeLogger.Debug("Received EOF, ending chaincode stream, %s", err) return } else if err != nil { chaincodeLogger.Error(fmt.Sprintf("Received error from server: %s, ending chaincode stream", err)) return } else if in == nil { err = fmt.Errorf("Received nil message, ending chaincode stream") chaincodeLogger.Debug("Received nil message, ending chaincode stream") return } chaincodeLogger.Debug("[%s]Received message %s from shim", shortuuid(in.Uuid), in.Type.String()) recv = true case nsInfo = <-handler.nextState: in = nsInfo.msg if in == nil { panic("nil msg") } chaincodeLogger.Debug("[%s]Move state message %s", shortuuid(in.Uuid), in.Type.String()) } // Call FSM.handleMessage() err = handler.handleMessage(in) if err != nil { err = fmt.Errorf("Error handling message: %s", err) return } if nsInfo != nil && nsInfo.sendToCC { chaincodeLogger.Debug("[%s]send state message %s", shortuuid(in.Uuid), in.Type.String()) if err = handler.serialSend(in); err != nil { err = fmt.Errorf("Error sending %s: %s", in.Type.String(), err) return } } } }() <-waitc return err }