134 lines
3.8 KiB
Go
134 lines
3.8 KiB
Go
/*
|
|
Copyright IBM Corp. All Rights Reserved.
|
|
SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package gateway
|
|
|
|
import (
|
|
"context"
|
|
|
|
peerproto "github.com/hyperledger/fabric-protos-go/peer"
|
|
"github.com/hyperledger/fabric/common/channelconfig"
|
|
"github.com/hyperledger/fabric/common/flogging"
|
|
"github.com/hyperledger/fabric/core/peer"
|
|
"github.com/hyperledger/fabric/core/scc"
|
|
gdiscovery "github.com/hyperledger/fabric/gossip/discovery"
|
|
"github.com/hyperledger/fabric/internal/pkg/comm"
|
|
"github.com/hyperledger/fabric/internal/pkg/gateway/commit"
|
|
"github.com/hyperledger/fabric/internal/pkg/gateway/config"
|
|
"github.com/hyperledger/fabric/internal/pkg/gateway/ledger"
|
|
"github.com/hyperledger/fabric/internal/pkg/peer/orderers"
|
|
"google.golang.org/grpc"
|
|
)
|
|
|
|
var logger = flogging.MustGetLogger("gateway")
|
|
|
|
// Server represents the GRPC server for the Gateway.
|
|
type Server struct {
|
|
registry *registry
|
|
commitFinder CommitFinder
|
|
policy ACLChecker
|
|
options config.Options
|
|
logger *flogging.FabricLogger
|
|
ledgerProvider ledger.Provider
|
|
getChannelConfig channelConfigGetter
|
|
}
|
|
|
|
type EndorserServerAdapter struct {
|
|
Server peerproto.EndorserServer
|
|
}
|
|
|
|
func (e *EndorserServerAdapter) ProcessProposal(ctx context.Context, req *peerproto.SignedProposal, _ ...grpc.CallOption) (*peerproto.ProposalResponse, error) {
|
|
return e.Server.ProcessProposal(ctx, req)
|
|
}
|
|
|
|
type CommitFinder interface {
|
|
TransactionStatus(ctx context.Context, channelName string, transactionID string) (*commit.Status, error)
|
|
}
|
|
|
|
type ACLChecker interface {
|
|
CheckACL(policyName string, channelName string, data interface{}) error
|
|
}
|
|
|
|
type channelConfigGetter func(cid string) channelconfig.Resources
|
|
|
|
// CreateServer creates an embedded instance of the Gateway.
|
|
func CreateServer(
|
|
localEndorser peerproto.EndorserServer,
|
|
discovery Discovery,
|
|
peerInstance *peer.Peer,
|
|
secureOptions *comm.SecureOptions,
|
|
policy ACLChecker,
|
|
localMSPID string,
|
|
options config.Options,
|
|
systemChaincodes scc.BuiltinSCCs,
|
|
) *Server {
|
|
adapter := &ledger.PeerAdapter{
|
|
Peer: peerInstance,
|
|
}
|
|
notifier := commit.NewNotifier(adapter)
|
|
|
|
server := newServer(
|
|
&EndorserServerAdapter{
|
|
Server: localEndorser,
|
|
},
|
|
discovery,
|
|
commit.NewFinder(adapter, notifier),
|
|
policy,
|
|
adapter,
|
|
peerInstance.GossipService.SelfMembershipInfo(),
|
|
localMSPID,
|
|
secureOptions,
|
|
options,
|
|
systemChaincodes,
|
|
peerInstance.OrdererEndpointOverrides,
|
|
peerInstance.GetChannelConfig,
|
|
)
|
|
|
|
peerInstance.AddConfigCallbacks(server.registry.configUpdate)
|
|
|
|
return server
|
|
}
|
|
|
|
func newServer(localEndorser peerproto.EndorserClient,
|
|
discovery Discovery,
|
|
finder CommitFinder,
|
|
policy ACLChecker,
|
|
ledgerProvider ledger.Provider,
|
|
localInfo gdiscovery.NetworkMember,
|
|
localMSPID string,
|
|
secureOptions *comm.SecureOptions,
|
|
options config.Options,
|
|
systemChaincodes scc.BuiltinSCCs,
|
|
ordererEndpointOverrides map[string]*orderers.Endpoint,
|
|
getChannelConfig channelConfigGetter,
|
|
) *Server {
|
|
return &Server{
|
|
registry: ®istry{
|
|
localEndorser: &endorser{
|
|
client: localEndorser,
|
|
endpointConfig: &endpointConfig{pkiid: localInfo.PKIid, address: localInfo.Endpoint, logAddress: localInfo.Endpoint, mspid: localMSPID},
|
|
},
|
|
discovery: discovery,
|
|
logger: logger,
|
|
endpointFactory: &endpointFactory{
|
|
timeout: options.DialTimeout,
|
|
clientCert: secureOptions.Certificate,
|
|
clientKey: secureOptions.Key,
|
|
ordererEndpointOverrides: ordererEndpointOverrides,
|
|
},
|
|
remoteEndorsers: map[string]*endorser{},
|
|
channelInitialized: map[string]bool{},
|
|
systemChaincodes: systemChaincodes,
|
|
localProvider: ledgerProvider,
|
|
},
|
|
commitFinder: finder,
|
|
policy: policy,
|
|
options: options,
|
|
logger: logger,
|
|
ledgerProvider: ledgerProvider,
|
|
getChannelConfig: getChannelConfig,
|
|
}
|
|
}
|