From 64afdbe19256e22b10086133315ed0c2db2d0eb0 Mon Sep 17 00:00:00 2001 From: James Taylor Date: Fri, 20 Oct 2023 18:11:46 +0100 Subject: [PATCH] [WIP] Update to use fabric-gateway Signed-off-by: James Taylor --- cmd/ccmetadata/main.go | 148 +++++++++++++++++++++++++++++++++-------- go.mod | 5 +- go.sum | 2 + 3 files changed, 126 insertions(+), 29 deletions(-) diff --git a/cmd/ccmetadata/main.go b/cmd/ccmetadata/main.go index acee270..33254c4 100644 --- a/cmd/ccmetadata/main.go +++ b/cmd/ccmetadata/main.go @@ -1,16 +1,19 @@ package main import ( + "crypto/x509" "flag" "fmt" - "io/ioutil" "log" "os" - "path/filepath" + "path" + "time" + "github.com/hyperledger/fabric-gateway/pkg/client" + "github.com/hyperledger/fabric-gateway/pkg/identity" "github.com/hyperledger/fabric-sdk-go/pkg/common/logging" - "github.com/hyperledger/fabric-sdk-go/pkg/core/config" - "github.com/hyperledger/fabric-sdk-go/pkg/gateway" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" ) func usage() { @@ -28,6 +31,7 @@ func usage() { } func main() { + // TODO need tlsCertPath var certPath string var keyPath string var mspid string @@ -91,51 +95,139 @@ func main() { } } - wallet, err := createWallet(certPath, keyPath, mspid) + // wallet, err := createWallet(certPath, keyPath, mspid) + // if err != nil { + // log.Fatalf("Failed to get credentials: %v", err) + // } + + // connectionConfig := config.FromFile(filepath.Clean(ccpPath)) + + // gateway, err := gateway.Connect( + // gateway.WithConfig(connectionConfig), + // gateway.WithIdentity(wallet, "identity"), + // ) + // if err != nil { + // log.Fatalf("Failed to connect to gateway: %v", err) + // } + // defer gateway.Close() + + // network, err := gateway.GetNetwork(channelName) + // if err != nil { + // log.Fatalf("Failed to get network: %v", err) + // } + + // contract := network.GetContract(chaincodeName) + + // result, err := contract.EvaluateTransaction("org.hyperledger.fabric:GetMetadata") + // if err != nil { + // log.Fatalf("Failed to evaluate transaction: %v", err) + // } + // fmt.Println(string(result)) + + clientConnection := newGrpcConnection("tlsCertPath") + defer clientConnection.Close() + + id := newIdentity(certPath) + sign := newSign(keyPath) + + gw, err := client.Connect( + id, + client.WithSign(sign), + client.WithClientConnection(clientConnection), + // Default timeouts for different gRPC calls + client.WithEvaluateTimeout(5*time.Second), + client.WithEndorseTimeout(15*time.Second), + client.WithSubmitTimeout(5*time.Second), + client.WithCommitStatusTimeout(1*time.Minute), + ) if err != nil { - log.Fatalf("Failed to get credentials: %v", err) + panic(err) } + defer gw.Close() +} - connectionConfig := config.FromFile(filepath.Clean(ccpPath)) +// func createWallet(certPath, keyPath, mspid string) (*gateway.Wallet, error) { +// wallet := gateway.NewInMemoryWallet() - gateway, err := gateway.Connect( - gateway.WithConfig(connectionConfig), - gateway.WithIdentity(wallet, "identity"), - ) +// cert, err := ioutil.ReadFile(filepath.Clean(certPath)) +// if err != nil { +// return wallet, err +// } + +// key, err := ioutil.ReadFile(filepath.Clean(keyPath)) +// if err != nil { +// return wallet, err +// } + +// identity := gateway.NewX509Identity(mspid, string(cert), string(key)) +// wallet.Put("identity", identity) + +// return wallet, nil +// } + +// newGrpcConnection creates a gRPC connection to the Gateway server. +func newGrpcConnection(tlsCertPath string) *grpc.ClientConn { + certificate, err := loadCertificate(tlsCertPath) if err != nil { - log.Fatalf("Failed to connect to gateway: %v", err) + panic(err) } - defer gateway.Close() - network, err := gateway.GetNetwork(channelName) + certPool := x509.NewCertPool() + certPool.AddCert(certificate) + transportCredentials := credentials.NewClientTLSFromCert(certPool, gatewayPeer) + + connection, err := grpc.Dial(peerEndpoint, grpc.WithTransportCredentials(transportCredentials)) if err != nil { - log.Fatalf("Failed to get network: %v", err) + panic(fmt.Errorf("failed to create gRPC connection: %w", err)) } - contract := network.GetContract(chaincodeName) + return connection +} - result, err := contract.EvaluateTransaction("org.hyperledger.fabric:GetMetadata") +// newIdentity creates a client identity for this Gateway connection using an X.509 certificate. +func newIdentity(certPath string) *identity.X509Identity { + certificate, err := loadCertificate(certPath) if err != nil { - log.Fatalf("Failed to evaluate transaction: %v", err) + panic(err) } - fmt.Println(string(result)) + + id, err := identity.NewX509Identity(mspID, certificate) + if err != nil { + panic(err) + } + + return id +} + +func loadCertificate(filename string) (*x509.Certificate, error) { + certificatePEM, err := os.ReadFile(filename) + if err != nil { + return nil, fmt.Errorf("failed to read certificate file: %w", err) + } + return identity.CertificateFromPEM(certificatePEM) } -func createWallet(certPath, keyPath, mspid string) (*gateway.Wallet, error) { - wallet := gateway.NewInMemoryWallet() +// newSign creates a function that generates a digital signature from a message digest using a private key. +func newSign(keyPath string) identity.Sign { + files, err := os.ReadDir(keyPath) + if err != nil { + panic(fmt.Errorf("failed to read private key directory: %w", err)) + } + privateKeyPEM, err := os.ReadFile(path.Join(keyPath, files[0].Name())) - cert, err := ioutil.ReadFile(filepath.Clean(certPath)) if err != nil { - return wallet, err + panic(fmt.Errorf("failed to read private key file: %w", err)) } - key, err := ioutil.ReadFile(filepath.Clean(keyPath)) + privateKey, err := identity.PrivateKeyFromPEM(privateKeyPEM) if err != nil { - return wallet, err + panic(err) } - identity := gateway.NewX509Identity(mspid, string(cert), string(key)) - wallet.Put("identity", identity) + sign, err := identity.NewPrivateKeySign(privateKey) + if err != nil { + panic(err) + } - return wallet, nil + return sign } diff --git a/go.mod b/go.mod index fab95dc..f76bf7d 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,7 @@ module github.com/hyperledgendary/ccmetadata go 1.14 -require github.com/hyperledger/fabric-sdk-go v1.0.0 +require ( + github.com/hyperledger/fabric-gateway v1.3.2 // indirect + github.com/hyperledger/fabric-sdk-go v1.0.0 +) diff --git a/go.sum b/go.sum index 8d9e4ae..ed05e6d 100644 --- a/go.sum +++ b/go.sum @@ -59,6 +59,8 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hyperledger/fabric-config v0.0.5 h1:khRkm8U9Ghdg8VmZfptgzCFlCzrka8bPfUkM+/j6Zlg= github.com/hyperledger/fabric-config v0.0.5/go.mod h1:YpITBI/+ZayA3XWY5lF302K7PAsFYjEEPM/zr3hegA8= +github.com/hyperledger/fabric-gateway v1.3.2 h1:TKBoL69CLTxOEwg0s3GDqR9QjLaK9RxQ7CHUjksO0Cg= +github.com/hyperledger/fabric-gateway v1.3.2/go.mod h1:ut3TCui98PIS08fwWJa+bfYvJvQf/rNlc0QtZZuY9/o= github.com/hyperledger/fabric-lib-go v1.0.0 h1:UL1w7c9LvHZUSkIvHTDGklxFv2kTeva1QI2emOVc324= github.com/hyperledger/fabric-lib-go v1.0.0/go.mod h1:H362nMlunurmHwkYqR5uHL2UDWbQdbfz74n8kbCFsqc= github.com/hyperledger/fabric-protos-go v0.0.0-20200424173316-dd554ba3746e/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0=