Heim >Backend-Entwicklung >Golang >Ist es möglich, gRPC mit Hyperledger-Chaincode zu verwenden, und wenn ja, wie können Fehler bei Aufrufen im Testnetzwerk vermieden werden?
php-Editor Xigua ist hier, um Ihre Fragen zu beantworten. Ja, Sie können gRPC mit Hyperledger Chaincode verwenden. gRPC ist ein leistungsstarkes Open-Source-RPC-Framework (Remote Procedure Call), das es Ihrem Chaincode ermöglicht, mit anderen Diensten zu kommunizieren. Um Fehler bei Anrufen im Testnetz zu vermeiden, können Sie mehrere Schritte unternehmen. Stellen Sie zunächst sicher, dass Ihr Testnetzwerk konfiguriert ist und ordnungsgemäß funktioniert. Überprüfen Sie zweitens Ihren Code und Ihre Konfigurationsdateien, um sicherzustellen, dass Sie gRPC korrekt verwenden. Schließlich sollten Sie über eine angemessene Fehlerbehandlung und -protokollierung verfügen, damit etwaige Probleme umgehend erkannt und behoben werden. Mit diesen Schritten sollten Sie in der Lage sein, Fehler bei Anrufen in Ihrem Testnetzwerk zu vermeiden und reibungslos über gRPC zu kommunizieren.
Ich möchte grpc im Fabric Chaincode verwenden, um eine kettenübergreifende Kommunikation zu erreichen, anstatt Fabric SDK zu verwenden. Aber wenn ich die Chaincode-Funktion auf Fabric-Sample/Test-Network aufrufe, erhalte ich immer eine Fehlermeldung.
error: endorsement failure during invoke. response: status:500 message:"error in simulation: failed to execute transaction eb5e480bd4075a767f56ae263741ca0f5f19620ef88952e26b7f1952bdbe83cd: could not launch chaincode chaincode_1.2:d3f97f15a635e73d3de230c8e5899e5fb95a68cf897c03e19f9e4eeca7ca3fd5: chaincode registration failed: container exited with 2"
Kann mir jemand sagen, was diesen Fehler verursacht? Gibt es einen Fehler in meinem Chaincode oder kann Grpc nicht in Chaincode-Funktionen verwendet werden?
Mein Kettencode für grpc:
func (s *smartcontract) begin(ctx contractapi.transactioncontextinterface) error { server.main() return nil } func (s *smartcontract) client(ctx contractapi.transactioncontextinterface) error { // client.clientfunc is the client main function client.clientfunc(xt, r, sign, m) }
server.go
func main() { listen, err := net.listen("tcp", ":9090") if err != nil { fmt.printf("failed to listen: %v", err) return } grpcserver := grpc.newserver() pb.registersendserviceserver(grpcserver, &server{}) err2 := grpcserver.serve(listen) if err2 != nil { fmt.printf("failed to serve: %v", err2) return } }
client.go
func Clientfunc(Xt *btcec.PublicKey, R *btcec.PublicKey, s *big.Int, m []byte) []byte { conn, err := grpc.Dial("127.0.0.1:9090", grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close() client := pb.NewSendServiceClient(conn) output := &pb.SignInput{ XtX: Xt.X().Int64(), XtY: Xt.Y().Int64(), M: m, RX: R.X().Int64(), RY: R.Y().Int64(), S: s.Int64(), } resp, _ := client.Send(context.Background(), output) return resp.GetM() }
Wer kann mir sagen, was diesen Fehler verursacht?
Weitere Informationen finden Sie unter Hyperledger Fabric v2.x/Log Control . Dort erfahren Sie, was die Ursache ist. Fehler 500 (Interner Serverfehler) ist das Serverprotokoll
Je nachdem, wie Sie es ausführen:
docker logs <chaincode_container_id> kubectl logs -n <namespace> <pod_name> oc logs -n <namespace> <pod_name>
Dies kann an einem Problem in Ihrem Chaincode liegen (z. B. einem Fehler in Ihrem GRPC-Code) oder an der Umgebung, in der der Chaincode ausgeführt wird.
Aufgrund Ihres Codes könnten Sie erwägen, den Grpc-Server nicht in Chaincode zu starten (server.main()
). Chaincode läuft innerhalb eines Hyperledger-Fabric-Netzwerks und wickelt die Netzwerkkommunikation nicht wie eine eigenständige Anwendung ab.
Stattdessen sollten Sie den grpc-Server zu einem separaten Dienst machen, der unabhängig ausgeführt wird, und der Chaincode kann dann bei Bedarf mit diesem Dienst kommunizieren.
plus client.clientfunc()
scheint die grpc-Verbindung herzustellen, die Anfrage zu senden und auf die Antwort zu warten. Dies ist ein synchroner Vorgang und kann Probleme verursachen, wenn das Eintreffen der Antwort lange dauert. Es ist besser, asynchrone Vorgänge zu verwenden (d. h. eine Anfrage senden und die Antwort in einer Rückruffunktion verarbeiten), um eine Blockierung der Chaincode-Ausführung zu vermeiden.
Und... man sollte Fehler von client.send()
;)
Stellen Sie sicher, dass Ihr GRPC-Server keine sicheren Verbindungen erfordert, da sonst grpc.withtransportcredentials(insecure.newcredentials())
(unsichere Verbindungen ohne SSL/TLS) fehlschlagen.
Im Allgemeinen wird empfohlen, die Kommunikation mit externen Systemen (z. B. über grpc) innerhalb der Fabric-Client-Anwendung und nicht innerhalb des Chaincodes selbst abzuwickeln.
Wenn ich nur Chaincode anstelle einer Fabric-Anwendung verwenden möchte, gibt es dann eine Möglichkeit, zwischen Organisationen auf verschiedenen Kanälen zu kommunizieren?
Die Kommunikation zwischen Organisationen auf verschiedenen Kanälen kann komplex sein, da es ein grundlegender Aspekt des Hyperledger-Fabric-Designs ist, dass Kanäle voneinander isoliert sind, um den Datenschutz zu gewährleisten.
Sie könnten darüber nachdenken:
Chaincode-Funktionen: Eine Organisation kann eine Chaincode-Funktion auf ihrem eigenen Kanal aufrufen, die wiederum eine Chaincode-Funktion auf einem anderen Kanal aufruft. Dies ist möglich, da Chaincodes mehreren Kanälen zugeordnet werden können.
Beachten Sie, dass bei diesem Ansatz die Einschränkung besteht, dass der zweite Funktionsaufruf nicht zur gleichen Transaktion wie der erste Funktionsaufruf gehört. Wenn also die erste Transaktion fehlschlägt, kann sie nicht zurückgesetzt werden.
Doppelte Mitgliedschaft: Eine Organisation kann mehreren Kanälen angehören. Daher kann es Daten von einem Kanal lesen und Daten auf einen anderen Kanal schreiben. Dies erfolgt jedoch in zwei separaten Transaktionen, sodass die Atomizität nicht garantiert ist.
Private Data Collection (PDC): Wenn das Ziel darin besteht, private Daten zwischen bestimmten Organisationen (oder sogar über verschiedene Kanäle hinweg) zu teilen, kann PDC eine Option sein. pdc ermöglicht einer definierten Untergruppe von Organisationen auf einem Kanal, private Daten zu unterstützen, zu übermitteln oder abzufragen, ohne die Daten an alle Organisationen auf dem Kanal verteilen zu müssen.
Interoperabilitätslösungen: Es werden auch fortschrittlichere Lösungen für die Blockchain-Interoperabilität entwickelt, wie zum Beispiel das Interledger-Protokoll (ilp), das zwischen verschiedenen Fabric-Netzwerken verwendet werden kann (oder sogar Daten oder Vermögenswerte vollständig zwischen verschiedenen Arten von Netzwerken verschieben kann). Blockchain-Netzwerke).
Allerdings befinden sich diese Technologien noch weitgehend im Forschungs- und Entwicklungsstadium und sind möglicherweise noch nicht reif für den Serieneinsatz.
Das obige ist der detaillierte Inhalt vonIst es möglich, gRPC mit Hyperledger-Chaincode zu verwenden, und wenn ja, wie können Fehler bei Aufrufen im Testnetzwerk vermieden werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!