如何解决将gRPC服务器合并到Chaincode中
因此,我正在使用gRPC将Hyperledger Fabric网络(服务器)连接到我的Android应用程序(客户端)。服务器端是用Go编写的,当服务器启动且未连接到Chaincode时,它可以与Android一起使用(不执行任何操作)。
如何将server.go代码转移到我的链码中? 我能否将其复制到我的链码代码中,并在Docker中启动时作为服务器和链码一起工作? 还是我将它们全部建立起来后以某种方式从server.go文件中调用chaincode? (docker,server.go和android中的整个网络)
server.go
package main
import (
"context"
"log"
"net"
"fmt"
grpc "google.golang.org/grpc"
pb "../proto"
)
func main() {
listener,err := net.Listen("tcp",":8080")
if err != nil {
log.Fatalf("Unable to listen on port 8080: %v",err)
}
grpcServer := grpc.NewServer()
pb.RegisterBlockchainAndroidServer(grpcServer,&Server{})
grpcServer.Serve(listener)
}
// Server struct
type Server struct{}
// LogInUser implementation
func (s *Server) LogInUser(ctx context.Context,in *pb.User) (*pb.Success,error) {
fmt.Println("bloyal logInUser\n")
fmt.Println("User email: " + in.GetEmail() + ",user pass: " + in.GetPassword())
return &pb.Success{Success: true},nil
}
chaincode.go -仅main()
func main() {
err := shim.Start(new(SimpleChaincode))
fmt.Printf("Main entered!! ")
if err != nil {
fmt.Printf("Error starting Simple chaincode: %s",err)
}
listener,err)
}
grpcServer := grpc.NewServer()
proto.RegisterBlockchainAndroidServer(grpcServer,&Server{})
grpcServer.Serve(listener)
}
解决方法
您要达到什么目标?
chaincode.go
照原样启动了链码(shim.Start
),并启动了gRPC服务器,但是两者之间没有连接,因此它们存在但完全不同。
IIRC Fabric对接口定义的链码使用init
和invoke
方法。 main
用于测试。因此,这种方法可能不正确。
Fabric为自己的目的提供了gRPC API,您应该能够使用Android客户端来利用它(现有的API和服务)。如果那还不够,您可以自己构建。
从内部链代码中调用gRPC方法可能更具挑战性。智能联系人(链码)的一个常见要求(总是?)是确定性联系人。相同的函数必须在任何时候都可以(重新)运行,并且必须为相同的输入产生相同的输出,例如2 + 2 = 4是确定性的,但“现在几点了?”不是,由于无法控制可用性等原因,多次(并非总是)外部API调用也不是。
我不知道链码是否允许外部呼叫,但由于上述原因,可能不允许。
,将Web应用程序集成到智能合约中的正确方法是摆脱所有REST关联,而仅从交易建议中获取payloads and parameters,并将其直接输入纯应用程序级功能中。意思是,客户端将通过官方的Fabric SDK(Go,Java,Node.js)发送参数。
对等方为您验证了来自客户端的提案,因此您无需检查“登录”,但可以假定提案的创建者(签名者)确实已经对包含参数的提案进行了签名。
由于Fabric对客户端/节点使用x509证书,因此代表用户的正确方法是通过其相应的证书(或证书的一部分)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。