Hyperledger fabric 将gRPC服务器合并到链码中

Hyperledger fabric 将gRPC服务器合并到链码中,hyperledger-fabric,grpc,hyperledger-chaincode,Hyperledger Fabric,Grpc,Hyperledger Chaincode,因此,我使用gRPC将我的Hyperledger结构网络(服务器)连接到我的Android应用程序(客户端)。服务器端是用Go编写的,当服务器启动且未连接到链码(不做任何操作)时,它可以与Android一起工作 如何将server.go代码转换为链码? 我能把它复制到我的链码代码中吗?当我在Docker中长大的时候,它可以作为一个服务器和一个链码一起工作吗? 或者,当我把它们都准备好的时候,我会从server.go文件调用chaincode吗?(docker、server.go和android中

因此,我使用gRPC将我的Hyperledger结构网络(服务器)连接到我的Android应用程序(客户端)。服务器端是用Go编写的,当服务器启动且未连接到链码(不做任何操作)时,它可以与Android一起工作

如何将server.go代码转换为链码? 我能把它复制到我的链码代码中吗?当我在Docker中长大的时候,它可以作为一个服务器和一个链码一起工作吗? 或者,当我把它们都准备好的时候,我会从server.go文件调用chaincode吗?(docker、server.go和android中的整个网络)

服务器。转到

chaincode.go-just main()


你想达到什么目标

chaincode.go
按原样启动一个chaincode(
shim.Start
)并启动一个gRPC服务器,但这两个服务器之间没有连接,因此它们存在,但完全不同

IIRC结构对接口定义的链码使用
init
invoke
方法
main
用于测试。因此,这种方法可能是不正确的

Fabric为其自身目的提供了一个gRPC API,您应该能够使用Android客户端利用该API(现有API和服务)。如果这还不够,你可以建立自己的

从链码中调用gRPC方法可能更具挑战性。智能触点(链码)的一个常见(始终?)要求是这些触点具有确定性;同一函数必须在任何时候(重新)运行,并且必须为相同的输入生成相同的输出,例如2+2=4是确定的,但“现在是什么时候?”不是确定的,并且,由于无法控制|确保可用性等,很多时候(并非总是)外部API调用也不是确定的


我不知道chaincode是否允许外部调用,但出于上述原因,它可能不允许。

将您的web应用程序合并到智能合约中的正确方法是去掉所有其余的连接,只需从事务提案中获取数据,并将其直接输入纯应用程序级函数。这意味着,客户端将通过官方Fabric SDK(Go、Java、Node.js)发送参数

对等方为您验证来自客户端的提案,因此您不需要检查“登录”,但您可以假设提案的创建者(签名者)确实签署了包含参数的提案


由于Fabric为客户端/节点使用x509证书,因此表示用户的正确方法是通过相应的证书(或部分证书)。

谢谢您的回答!我的Android客户端应该调用我的链码来实现简单的checkLogin、getPoints等功能。我想用gRPC实现这一点,但我不知道在哪里实现服务器端,所以可以接收android gRPC调用并调用链码?。。。在gRPC中包装RESTAPI没有什么好处API@DazWilkin这是一个到Fabric 0.6(2016)文档的链接,该文档现已灭绝。Fabric v1.0及以后版本没有可以调用链码的REST API。对等机有一个有限的RESTAPI来执行简单的管理任务,如日志控制、度量等。
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
}
func main() {
    err := shim.Start(new(SimpleChaincode))
    fmt.Printf("Main entered!! ")
    if err != nil {
        fmt.Printf("Error starting Simple chaincode: %s", err)
    }

    listener, err := net.Listen("tcp", ":8080")
    if err != nil {
        log.Fatalf("Unable to listen on port 8080:  %v", err)
    }

    grpcServer := grpc.NewServer()
    proto.RegisterBlockchainAndroidServer(grpcServer, &Server{})
    grpcServer.Serve(listener)
}