1 Star 1 Fork 0

Hyperledger Fabric 国密 / fabric

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
container_runtime.go 6.21 KB
一键复制 编辑 原始数据 按行查看 历史
Jtyoui 提交于 2021-07-22 15:59 . 国密
/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package chaincode
import (
"bytes"
"fmt"
"sort"
"strings"
"gitee.com/hyperledger-fabric-gm/fabric/core/chaincode/accesscontrol"
"gitee.com/hyperledger-fabric-gm/fabric/core/chaincode/platforms"
"gitee.com/hyperledger-fabric-gm/fabric/core/common/ccprovider"
"gitee.com/hyperledger-fabric-gm/fabric/core/container"
"gitee.com/hyperledger-fabric-gm/fabric/core/container/ccintf"
pb "gitee.com/hyperledger-fabric-gm/fabric/protos/peer"
"github.com/pkg/errors"
)
// Processor processes vm and container requests.
type Processor interface {
Process(vmtype string, req container.VMCReq) error
}
// CertGenerator generates client certificates for chaincode.
type CertGenerator interface {
// Generate returns a certificate and private key and associates
// the hash of the certificates with the given chaincode name
Generate(ccName string) (*accesscontrol.CertAndPrivKeyPair, error)
}
// ContainerRuntime is responsible for managing containerized chaincode.
type ContainerRuntime struct {
CertGenerator CertGenerator
Processor Processor
CACert []byte
CommonEnv []string
PeerAddress string
PlatformRegistry *platforms.Registry
}
// Start launches chaincode in a runtime environment.
func (c *ContainerRuntime) Start(ccci *ccprovider.ChaincodeContainerInfo, codePackage []byte) error {
cname := ccci.Name + ":" + ccci.Version
lc, err := c.LaunchConfig(cname, ccci.Type)
if err != nil {
return err
}
chaincodeLogger.Debugf("start container: %s", cname)
chaincodeLogger.Debugf("start container with args: %s", strings.Join(lc.Args, " "))
chaincodeLogger.Debugf("start container with env:\n\t%s", strings.Join(lc.Envs, "\n\t"))
scr := container.StartContainerReq{
Builder: &container.PlatformBuilder{
Type: ccci.Type,
Name: ccci.Name,
Version: ccci.Version,
Path: ccci.Path,
CodePackage: codePackage,
PlatformRegistry: c.PlatformRegistry,
},
Args: lc.Args,
Env: lc.Envs,
FilesToUpload: lc.Files,
CCID: ccintf.CCID{
Name: ccci.Name,
Version: ccci.Version,
},
}
if err := c.Processor.Process(ccci.ContainerType, scr); err != nil {
return errors.WithMessage(err, "error starting container")
}
return nil
}
// Stop terminates chaincode and its container runtime environment.
func (c *ContainerRuntime) Stop(ccci *ccprovider.ChaincodeContainerInfo) error {
scr := container.StopContainerReq{
CCID: ccintf.CCID{
Name: ccci.Name,
Version: ccci.Version,
},
Timeout: 0,
Dontremove: false,
}
if err := c.Processor.Process(ccci.ContainerType, scr); err != nil {
return errors.WithMessage(err, "error stopping container")
}
return nil
}
// Wait waits for the container runtime to terminate.
func (c *ContainerRuntime) Wait(ccci *ccprovider.ChaincodeContainerInfo) (int, error) {
type result struct {
exitCode int
err error
}
resultCh := make(chan result, 1)
wcr := container.WaitContainerReq{
CCID: ccintf.CCID{
Name: ccci.Name,
Version: ccci.Version,
},
Exited: func(exitCode int, err error) {
resultCh <- result{exitCode: exitCode, err: err}
close(resultCh)
},
}
if err := c.Processor.Process(ccci.ContainerType, wcr); err != nil {
return -1, err
}
r := <-resultCh
return r.exitCode, r.err
}
const (
// Mutual TLS auth client key and cert paths in the chaincode container
TLSClientKeyPath string = "/etc/hyperledger/fabric/client.key"
TLSClientCertPath string = "/etc/hyperledger/fabric/client.crt"
TLSClientRootCertPath string = "/etc/hyperledger/fabric/peer.crt"
)
func (c *ContainerRuntime) getTLSFiles(keyPair *accesscontrol.CertAndPrivKeyPair) map[string][]byte {
if keyPair == nil {
return nil
}
return map[string][]byte{
TLSClientKeyPath: []byte(keyPair.Key),
TLSClientCertPath: []byte(keyPair.Cert),
TLSClientRootCertPath: c.CACert,
}
}
// LaunchConfig holds chaincode launch arguments, environment variables, and files.
type LaunchConfig struct {
Args []string
Envs []string
Files map[string][]byte
}
// LaunchConfig creates the LaunchConfig for chaincode running in a container.
func (c *ContainerRuntime) LaunchConfig(cname string, ccType string) (*LaunchConfig, error) {
var lc LaunchConfig
// common environment variables
lc.Envs = append(c.CommonEnv, "CORE_CHAINCODE_ID_NAME="+cname)
// language specific arguments
switch ccType {
case pb.ChaincodeSpec_GOLANG.String(), pb.ChaincodeSpec_CAR.String():
lc.Args = []string{"chaincode", fmt.Sprintf("-peer.address=%s", c.PeerAddress)}
case pb.ChaincodeSpec_JAVA.String():
lc.Args = []string{"/root/chaincode-java/start", "--peerAddress", c.PeerAddress}
case pb.ChaincodeSpec_NODE.String():
lc.Args = []string{"/bin/sh", "-c", fmt.Sprintf("cd /usr/local/src; npm start -- --peer.address %s", c.PeerAddress)}
default:
return nil, errors.Errorf("unknown chaincodeType: %s", ccType)
}
// Pass TLS options to chaincode
if c.CertGenerator != nil {
certKeyPair, err := c.CertGenerator.Generate(cname)
if err != nil {
return nil, errors.WithMessage(err, fmt.Sprintf("failed to generate TLS certificates for %s", cname))
}
lc.Files = c.getTLSFiles(certKeyPair)
if lc.Files == nil {
return nil, errors.Errorf("failed to acquire TLS certificates for %s", cname)
}
lc.Envs = append(lc.Envs, "CORE_PEER_TLS_ENABLED=true")
lc.Envs = append(lc.Envs, fmt.Sprintf("CORE_TLS_CLIENT_KEY_PATH=%s", TLSClientKeyPath))
lc.Envs = append(lc.Envs, fmt.Sprintf("CORE_TLS_CLIENT_CERT_PATH=%s", TLSClientCertPath))
lc.Envs = append(lc.Envs, fmt.Sprintf("CORE_PEER_TLS_ROOTCERT_FILE=%s", TLSClientRootCertPath))
} else {
lc.Envs = append(lc.Envs, "CORE_PEER_TLS_ENABLED=false")
}
chaincodeLogger.Debugf("launchConfig: %s", lc.String())
return &lc, nil
}
func (lc *LaunchConfig) String() string {
buf := &bytes.Buffer{}
if len(lc.Args) > 0 {
fmt.Fprintf(buf, "executable:%q,", lc.Args[0])
}
fileNames := []string{}
for k := range lc.Files {
fileNames = append(fileNames, k)
}
sort.Strings(fileNames)
fmt.Fprintf(buf, "Args:[%s],", strings.Join(lc.Args, ","))
fmt.Fprintf(buf, "Envs:[%s],", strings.Join(lc.Envs, ","))
fmt.Fprintf(buf, "Files:%v", fileNames)
return buf.String()
}
Go
1
https://gitee.com/hyperledger-fabric-gm/fabric.git
git@gitee.com:hyperledger-fabric-gm/fabric.git
hyperledger-fabric-gm
fabric
fabric
v1.4.9

搜索帮助