Skip to content

Commit

Permalink
[WIP] Update to use fabric-gateway
Browse files Browse the repository at this point in the history
Signed-off-by: James Taylor <jamest@uk.ibm.com>
  • Loading branch information
jt-nti committed Oct 20, 2023
1 parent 16c4aaf commit 64afdbe
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 29 deletions.
148 changes: 120 additions & 28 deletions cmd/ccmetadata/main.go
Original file line number Diff line number Diff line change
@@ -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() {
Expand All @@ -28,6 +31,7 @@ func usage() {
}

func main() {
// TODO need tlsCertPath
var certPath string
var keyPath string
var mspid string
Expand Down Expand Up @@ -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
}
5 changes: 4 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand Down

0 comments on commit 64afdbe

Please sign in to comment.