Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah mungkin untuk menggunakan gRPC dengan hyperledger-chaincode, dan jika ya, bagaimana untuk mengelakkan ralat semasa panggilan pada rangkaian ujian?

Adakah mungkin untuk menggunakan gRPC dengan hyperledger-chaincode, dan jika ya, bagaimana untuk mengelakkan ralat semasa panggilan pada rangkaian ujian?

PHPz
PHPzke hadapan
2024-02-13 09:12:09646semak imbas

是否可以在 hyperledger-chaincode 中使用 gRPC,如果可以,如何避免在测试网络上调用期间出现错误?

editor php Xigua di sini untuk menjawab soalan anda. Ya, anda boleh menggunakan gRPC dengan Hyperledger Chaincode. gRPC ialah rangka kerja panggilan prosedur jauh (RPC) sumber terbuka berprestasi tinggi yang membolehkan Chaincode anda berkomunikasi dengan perkhidmatan lain. Untuk mengelakkan ralat semasa panggilan pada rangkaian ujian, terdapat beberapa langkah yang boleh anda ambil. Mula-mula, pastikan rangkaian ujian anda dikonfigurasikan dan berjalan dengan betul. Kedua, semak kod dan fail konfigurasi anda untuk memastikan anda menggunakan gRPC dengan betul. Akhir sekali, lakukan pengendalian ralat dan pengelogan yang sesuai supaya sebarang isu ditemui dan diselesaikan dengan segera. Dengan langkah ini, anda seharusnya dapat mengelakkan ralat semasa panggilan pada rangkaian ujian anda dan berkomunikasi menggunakan gRPC dengan lancar.

Kandungan soalan

Saya ingin menggunakan grpc dalam kod rantai fabrik untuk mencapai komunikasi silang rantai dan bukannya menggunakan sdk kain. Tetapi apabila saya memanggil fungsi chaincode pada fabric-sample/test-network, saya sentiasa mendapat ralat.

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"

Boleh sesiapa beritahu saya apa yang menyebabkan ralat ini? Adakah terdapat pepijat dalam kod rantai saya atau grpc tidak boleh digunakan dalam fungsi kod rantai?

Kod rantai saya untuk 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()
}

Penyelesaian

Siapa boleh beritahu saya apa yang menyebabkan ralat ini?

Lihat hyperledger fabric v2.x/ Log Control untuk butiran, apa yang boleh memberitahu anda apa yang menyebabkan Ralat 500 (Ralat Pelayan Dalaman) ialah log pelayan

Bergantung pada cara anda menjalankannya:

docker logs <chaincode_container_id>
kubectl logs -n <namespace> <pod_name>
oc logs -n <namespace> <pod_name>

Ini mungkin disebabkan oleh isu dalam kod rantai anda (seperti pepijat dalam kod grpc anda), atau ia mungkin disebabkan oleh persekitaran di mana kod rantai dijalankan.

Daripada kod anda, anda mungkin menganggap tidak memulakan pelayan grpc dalam kod rantai (server.main()). Chaincode berjalan dalam rangkaian fabrik hyperledger dan tidak mengendalikan komunikasi rangkaian seperti aplikasi kendiri.
Sebaliknya, anda harus menjadikan pelayan grpc sebagai perkhidmatan berasingan yang berjalan secara bebas, dan kod rantai kemudiannya boleh berkomunikasi dengan perkhidmatan tersebut mengikut keperluan.

Fungsi

plus client.clientfunc() nampaknya mewujudkan sambungan grpc, menghantar permintaan, dan menunggu respons. Ini adalah operasi segerak dan boleh menyebabkan masalah jika respons mengambil masa yang lama untuk tiba. Sebaik-baiknya menggunakan operasi tak segerak (iaitu menghantar permintaan dan mengendalikan respons dalam fungsi panggil balik) untuk mengelak daripada menyekat pelaksanaan kod rantai.
Dan... anda tidak sepatutnya mengabaikan kesilapan daripada client.send() ;)

Pastikan pelayan grpc anda tidak memerlukan sambungan selamat, jika tidak grpc.withtransportcredentials(insecure.newcredentials()) (sambungan tidak selamat tanpa ssl/tls) akan gagal.

Secara amnya, adalah disyorkan untuk mengendalikan komunikasi dengan sistem luaran (cth. melalui grpc) dalam aplikasi klien fabrik, bukannya dalam kod rantai itu sendiri.

Jika saya hanya mahu menggunakan kod rantai dan bukannya aplikasi fabrik, adakah terdapat cara untuk berkomunikasi antara organisasi pada saluran yang berbeza?

Komunikasi antara organisasi pada saluran yang berbeza boleh menjadi rumit, kerana ia merupakan aspek asas reka bentuk fabrik hyperledger yang saluran diasingkan antara satu sama lain untuk mengekalkan privasi data.

Anda mungkin mempertimbangkan:

  • Fungsi kod rantai: Organisasi boleh memanggil fungsi kod rantai pada salurannya sendiri, yang seterusnya memanggil fungsi kod rantai pada saluran lain. Ini mungkin kerana kod rantai boleh dikaitkan dengan berbilang saluran.
    Ambil perhatian bahawa pendekatan ini mempunyai had bahawa panggilan fungsi kedua tidak tergolong dalam transaksi yang sama seperti panggilan fungsi pertama, jadi jika transaksi pertama gagal, ia tidak boleh ditarik balik.

  • Dual Keahlian: Organisasi boleh tergolong dalam berbilang saluran. Oleh itu, ia boleh membaca data dari satu saluran dan menulis data ke saluran lain. Walau bagaimanapun, ini dilakukan dalam dua transaksi berasingan, jadi atomicity tidak dijamin.

  • Pengumpulan Data Peribadi (pdc): Jika matlamatnya adalah untuk berkongsi data peribadi antara organisasi tertentu (atau merentasi saluran yang berbeza), pdc mungkin menjadi pilihan. pdc membenarkan subset organisasi yang ditentukan pada saluran untuk menyokong, menyerahkan atau menanyakan data peribadi tanpa perlu mengedarkan data kepada semua organisasi pada saluran tersebut.

  • Penyelesaian kebolehoperasian: Terdapat juga penyelesaian yang lebih maju untuk kebolehkendalian rantaian blok sedang dibangunkan, seperti interledger protocol (ilp), yang boleh digunakan untuk menyambungkan rangkaian fabrik yang berbeza (atau malah memindahkan data atau aset sepenuhnya antara jenis yang berbeza rangkaian blockchain).
    Walau bagaimanapun, teknologi ini sebahagian besarnya masih dalam peringkat penyelidikan dan pembangunan dan mungkin belum bersedia untuk kegunaan pengeluaran.

Atas ialah kandungan terperinci Adakah mungkin untuk menggunakan gRPC dengan hyperledger-chaincode, dan jika ya, bagaimana untuk mengelakkan ralat semasa panggilan pada rangkaian ujian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam