chaincode

package
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 19, 2024 License: Apache-2.0 Imports: 24 Imported by: 0

Documentation

Overview

Package chaincode provides functions for driving chaincode lifecycle.

Example
package main

import (
	"context"
	"crypto"
	"crypto/x509"
	"encoding/pem"
	"os"
	"time"

	"github.com/hyperledger/fabric-admin-sdk/pkg/chaincode"
	"github.com/hyperledger/fabric-admin-sdk/pkg/identity"

	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
)

const peerEndpoint = "peer.example.org:7051"
const mspID = "Org1"
const chaincodePackageFile = "basic.tar.gz"

func main() {
	// gRPC connection a target peer.
	connection := newGrpcConnection()
	defer connection.Close()

	// Client identity used to carry out deployment tasks.
	id, err := identity.NewPrivateKeySigningIdentity(mspID, readCertificate(), readPrivateKey())
	panicOnError(err)

	peer := chaincode.NewPeer(connection, id)
	gateway := chaincode.NewGateway(connection, id)

	// Context used to manage Fabric invocations.
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
	defer cancel()

	// Read existing chaincode package file.
	chaincodePackage, err := os.Open(chaincodePackageFile)
	panicOnError(err)

	// Install chaincode package. This must be performed for each peer on which the chaincode is to be installed.
	_, err = peer.Install(ctx, chaincodePackage)
	panicOnError(err)

	// Definition of the chaincode as it should appear on the channel.
	chaincodeDefinition := &chaincode.Definition{
		ChannelName: "mychannel",
		Name:        "basic",
		Version:     "1.0",
		Sequence:    1,
	}

	// Approve chaincode definition. This must be performed using client identities from sufficient organizations to
	// satisfy the approval policy.
	err = gateway.Approve(ctx, chaincodeDefinition)
	panicOnError(err)

	// Commit approved chaincode definition. This can be carried out by any organization once enough approvals have
	// been recorded.
	err = gateway.Commit(ctx, chaincodeDefinition)
	panicOnError(err)
}

func newGrpcConnection() *grpc.ClientConn {
	caCertificate := readCertificate()
	certPool := x509.NewCertPool()
	certPool.AddCert(caCertificate)
	transportCredentials := credentials.NewClientTLSFromCert(certPool, "")

	connection, err := grpc.NewClient(peerEndpoint, grpc.WithTransportCredentials(transportCredentials))
	panicOnError(err)

	return connection
}

func readCertificate() *x509.Certificate {
	certificatePEM, err := os.ReadFile("certificate.pem")
	panicOnError(err)

	block, _ := pem.Decode([]byte(certificatePEM))
	if block == nil {
		panic("failed to parse certificate PEM")
	}
	certificate, err := x509.ParseCertificate(block.Bytes)
	if err != nil {
		panic("failed to parse certificate: " + err.Error())
	}

	return certificate
}

func readPrivateKey() crypto.PrivateKey {
	privateKeyPEM, err := os.ReadFile("privateKey.pem")
	panicOnError(err)

	block, _ := pem.Decode(privateKeyPEM)
	if block == nil {
		panic("failed to parse private key PEM")
	}

	privateKey, err := x509.ParsePKCS8PrivateKey(block.Bytes)
	if err != nil {
		panic("failed to parse PKCS8 encoded private key: " + err.Error())
	}

	return privateKey
}

func panicOnError(err error) {
	if err != nil {
		panic(err)
	}
}
Output:

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func GetPackageID

func GetPackageID(label string, ccInstallPkg []byte) string

GetPackageID returns the package ID with the label and hash of the chaincode install package

func NewApplicationPolicy

func NewApplicationPolicy(signaturePolicy, channelConfigPolicy string) (*peer.ApplicationPolicy, error)

func PackageCCAAS

func PackageCCAAS(connection Connection, metadata Metadata, tmpPath, filename string) error

PackageCCAAS requires that you start a container by yourself. as sample as ${CONTAINER_CLI} run --rm -d --name peer0org1_${CC_NAME}_ccaas \ --network fabric_test \ -e CHAINCODE_SERVER_ADDRESS=0.0.0.0:${CCAAS_SERVER_PORT} \ -e CHAINCODE_ID=$PACKAGE_ID -e CORE_CHAINCODE_ID_NAME=$PACKAGE_ID \ ${CC_NAME}_ccaas_image:latest

func PackageID

func PackageID(packageReader io.Reader) (string, error)

func SignaturePolicyEnvelopeToString

func SignaturePolicyEnvelopeToString(policy *cb.SignaturePolicyEnvelope) (string, error)

SignaturePolicyEnvelopeToString parse a SignaturePolicyEnvelope to human readable expression the returned expression is GATE(P[, P])

where:

  • GATE is either "and" or "or" or "outof"
  • P is either a principal or another nested call to GATE

A principal is defined as:

ORG.ROLE

where:

  • ORG is a string (representing the MSP identifier)
  • ROLE takes the value of any of the RoleXXX constants representing the required role

func ValidateLabel

func ValidateLabel(label string) error

ValidateLabel return an error if the provided label contains any invalid characters, as determined by LabelRegexp.

Types

type ChaincodePackageMetadata

type ChaincodePackageMetadata struct {
	Type  string `json:"type"`
	Path  string `json:"path"`
	Label string `json:"label"`
}

ChaincodePackageMetadata contains the information necessary to understand the embedded code package.

func ParseChaincodePackage

func ParseChaincodePackage(source []byte) (*ChaincodePackageMetadata, []byte, error)

ParseChaincodePackage parses a set of bytes as a chaincode package and returns the parsed package as a metadata struct and a code package

type Connection

type Connection struct {
	Address     string `json:"address"`
	DialTimeout string `json:"dial_timeout"`
	TLSRequired bool   `json:"tls_required"`
}

Connection setting used in connection.json

type Definition

type Definition struct {
	// ChannelName on which the chaincode is deployed.
	ChannelName string

	// PackageID is a unique identifier for a chaincode package, combining the package label with a hash of the package.
	PackageID string

	// Name used when invoking the chaincode.
	Name string

	// Version associated with a given chaincode package.
	Version string

	// EndorsementPlugin used by the chaincode. May be omitted unless a custom plugin is required.
	EndorsementPlugin string

	// ValidationPlugin used by the chaincode. May be omitted unless a custom plugin is required.
	ValidationPlugin string

	// Sequence number indicating the number of times the chaincode has been defined on a channel, and used to keep
	// track of chaincode upgrades.
	Sequence int64

	// ApplicationPolicy defines the endorsement policy for the chaincode. This can be an explicit endorsement policy
	// it follows fabric-protos-go-apiv2/peer format and it will convert to validationParameter during validation phase.
	ApplicationPolicy *peer.ApplicationPolicy

	// InitRequired is true only if the chaincode defines an Init function using the low-level shim API, which must be
	// invoked before other transaction functions may be invoked; otherwise false. It is not recommended to rely on
	// functionality.
	InitRequired bool

	// Collections configuration for private data collections accessed by the chaincode.
	Collections *peer.CollectionConfigPackage
}

Definition of a chaincode.

type Gateway added in v0.1.0

type Gateway struct {
	// contains filtered or unexported fields
}

Gateway peer belonging to a specific organization to which you want to target requests.

func NewGateway added in v0.1.0

func NewGateway(connection grpc.ClientConnInterface, id identity.SigningIdentity) *Gateway

NewGateway creates a new Gateway instance.

func (*Gateway) Approve added in v0.1.0

func (g *Gateway) Approve(ctx context.Context, chaincodeDef *Definition) error

Approve a chaincode package for the user's own organization.

func (*Gateway) CheckCommitReadiness added in v0.1.0

func (g *Gateway) CheckCommitReadiness(ctx context.Context, chaincodeDef *Definition) (*lifecycle.CheckCommitReadinessResult, error)

CheckCommitReadiness for a chaincode and return all approval records.

func (*Gateway) ClientIdentity added in v0.1.0

func (g *Gateway) ClientIdentity() identity.SigningIdentity

ClientIdentity used to interact with the gateway peer.

func (*Gateway) Commit added in v0.1.0

func (g *Gateway) Commit(ctx context.Context, chaincodeDef *Definition) error

Commit a chaincode definition to the channel.

func (*Gateway) QueryApproved added in v0.1.0

func (g *Gateway) QueryApproved(ctx context.Context, channelName string, chaincodeName string, sequence int64) (*lifecycle.QueryApprovedChaincodeDefinitionResult, error)

QueryApproved chaincode definition for the user's own organization.

func (*Gateway) QueryCommitted added in v0.1.0

func (g *Gateway) QueryCommitted(ctx context.Context, channelName string) (*lifecycle.QueryChaincodeDefinitionsResult, error)

QueryCommitted returns the definitions of all committed chaincode for a given channel.

func (*Gateway) QueryCommittedWithName added in v0.1.0

func (g *Gateway) QueryCommittedWithName(ctx context.Context, channelName string, chaincodeName string) (*lifecycle.QueryChaincodeDefinitionResult, error)

QueryCommittedWithName returns the definition of the named chaincode for a given channel.

type Metadata

type Metadata struct {
	Type  string `json:"type"`
	Label string `json:"label"`
}

Metadata as metadata.json

type Peer added in v0.1.0

type Peer struct {
	// contains filtered or unexported fields
}

Peer in a Fabric network.

func NewPeer added in v0.1.0

func NewPeer(connection grpc.ClientConnInterface, id identity.SigningIdentity) *Peer

NewPeer creates a new Peer instance.

func (*Peer) ClientIdentity added in v0.1.0

func (p *Peer) ClientIdentity() identity.SigningIdentity

ClientIdentity used to interact with the peer.

func (*Peer) GetInstalled added in v0.1.0

func (p *Peer) GetInstalled(ctx context.Context, packageID string) ([]byte, error)

GetInstalled chaincode package from a specific peer.

func (*Peer) Install added in v0.1.0

func (p *Peer) Install(ctx context.Context, packageReader io.Reader) (*lifecycle.InstallChaincodeResult, error)

Install a chaincode package to specific peer.

func (*Peer) QueryInstalled added in v0.1.0

QueryInstalled chaincode on a specific peer.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL