mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-21 17:15:10 +00:00
154 lines
4 KiB
Go
154 lines
4 KiB
Go
package grpc
|
|
|
|
import (
|
|
"crypto/x509"
|
|
"fmt"
|
|
"os"
|
|
"path"
|
|
"time"
|
|
|
|
"github.com/hyperledger/fabric-gateway/pkg/client"
|
|
"github.com/hyperledger/fabric-gateway/pkg/hash"
|
|
"github.com/hyperledger/fabric-gateway/pkg/identity"
|
|
"google.golang.org/grpc"
|
|
"google.golang.org/grpc/credentials"
|
|
)
|
|
|
|
const (
|
|
rootPath = "/root/go/src/github.com/BennielAllan/fabric-samples"
|
|
mspID = "Org1MSP"
|
|
cryptoPath = rootPath + "/test-network/organizations/peerOrganizations/org1.example.com"
|
|
certPath = cryptoPath + "/users/User1@org1.example.com/msp/signcerts"
|
|
keyPath = cryptoPath + "/users/User1@org1.example.com/msp/keystore"
|
|
tlsCertPath = cryptoPath + "/peers/peer0.org1.example.com/tls/ca.crt"
|
|
peerEndpoint = "dns:///localhost:7051"
|
|
gatewayPeer = "peer0.org1.example.com"
|
|
)
|
|
|
|
var (
|
|
ClientConnection *grpc.ClientConn
|
|
GateWay *client.Gateway
|
|
Contract *client.Contract
|
|
)
|
|
|
|
func InitGWConnect() {
|
|
// The gRPC client connection should be shared by all Gateway connections to this endpoint
|
|
ClientConnection = newGrpcConnection()
|
|
|
|
id := newIdentity()
|
|
sign := newSign()
|
|
|
|
// Create a Gateway connection for a specific client identity
|
|
var err error
|
|
GateWay, err = client.Connect(
|
|
id,
|
|
client.WithSign(sign),
|
|
client.WithHash(hash.SHA256),
|
|
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 {
|
|
panic(err)
|
|
}
|
|
// ./network.sh deployCC -ccn ledger -ccp /root/go/src/github.com/BennielAllan/fabric-samples/asset-transfer-ledger-queries/chaincode-go/ -ccl go
|
|
// Override default values for chaincode and channel name as they may differ in testing contexts.
|
|
chaincodeName := "ledger"
|
|
if ccname := os.Getenv("CHAINCODE_NAME"); ccname != "" {
|
|
chaincodeName = ccname
|
|
}
|
|
|
|
channelName := "mychannel"
|
|
if cname := os.Getenv("CHANNEL_NAME"); cname != "" {
|
|
channelName = cname
|
|
}
|
|
|
|
network := GateWay.GetNetwork(channelName)
|
|
Contract = network.GetContract(chaincodeName)
|
|
}
|
|
|
|
func CloseGWConnect() {
|
|
GateWay.Close()
|
|
ClientConnection.Close()
|
|
}
|
|
|
|
// newGrpcConnection creates a gRPC connection to the Gateway server.
|
|
func newGrpcConnection() *grpc.ClientConn {
|
|
certificatePEM, err := os.ReadFile(tlsCertPath)
|
|
if err != nil {
|
|
panic(fmt.Errorf("failed to read TLS certifcate file: %w", err))
|
|
}
|
|
|
|
certificate, err := identity.CertificateFromPEM(certificatePEM)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
certPool := x509.NewCertPool()
|
|
certPool.AddCert(certificate)
|
|
transportCredentials := credentials.NewClientTLSFromCert(certPool, gatewayPeer)
|
|
|
|
connection, err := grpc.NewClient(peerEndpoint, grpc.WithTransportCredentials(transportCredentials))
|
|
if err != nil {
|
|
panic(fmt.Errorf("failed to create gRPC connection: %w", err))
|
|
}
|
|
|
|
return connection
|
|
}
|
|
|
|
// newIdentity creates a client identity for this Gateway connection using an X.509 certificate.
|
|
func newIdentity() *identity.X509Identity {
|
|
certificatePEM, err := readFirstFile(certPath)
|
|
if err != nil {
|
|
panic(fmt.Errorf("failed to read certificate file: %w", err))
|
|
}
|
|
|
|
certificate, err := identity.CertificateFromPEM(certificatePEM)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
id, err := identity.NewX509Identity(mspID, certificate)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return id
|
|
}
|
|
|
|
// newSign creates a function that generates a digital signature from a message digest using a private key.
|
|
func newSign() identity.Sign {
|
|
privateKeyPEM, err := readFirstFile(keyPath)
|
|
if err != nil {
|
|
panic(fmt.Errorf("failed to read private key file: %w", err))
|
|
}
|
|
|
|
privateKey, err := identity.PrivateKeyFromPEM(privateKeyPEM)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
sign, err := identity.NewPrivateKeySign(privateKey)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return sign
|
|
}
|
|
|
|
func readFirstFile(dirPath string) ([]byte, error) {
|
|
dir, err := os.Open(dirPath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
fileNames, err := dir.Readdirnames(1)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return os.ReadFile(path.Join(dirPath, fileNames[0]))
|
|
}
|