chaincode

package
v0.0.1 Latest Latest
Warning

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

Go to latest
Published: Jan 4, 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 peerName = "peer.example.org"
const peerEndpoint = peerName + ":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)

	// 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 = chaincode.Install(ctx, connection, id, 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 = chaincode.Approve(ctx, connection, id, chaincodeDefinition)
	panicOnError(err)

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

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

	connection, err := grpc.Dial(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 Approve

func Approve(ctx context.Context, connection grpc.ClientConnInterface, id identity.SigningIdentity, chaincodeDef *Definition) error

Approve a chaincode package for the user's own organization. The connection may be to any Gateway peer that is a member of the channel.

func CheckCommitReadiness

func CheckCommitReadiness(ctx context.Context, connection grpc.ClientConnInterface, id identity.SigningIdentity, chaincodeDef *Definition) (*lifecycle.CheckCommitReadinessResult, error)

CheckCommitReadiness for a chaincode and return all approval records. The connection may be to any Gateway peer that is a member of the channel.

func Commit

func Commit(ctx context.Context, connection grpc.ClientConnInterface, id identity.SigningIdentity, chaincodeDef *Definition) error

Commit a chaincode definition to the channel. This requires that sufficient organizations have approved the chaincode definition. The connection may be to any Gateway peer that is a member of the channel.

func GetInstalled

func GetInstalled(ctx context.Context, connection grpc.ClientConnInterface, id identity.SigningIdentity, packageID string) ([]byte, error)

GetInstalled chaincode package from a specific peer. The connection must be to the specific peer where the chaincode is installed.

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 Install

Install a chaincode package to specific peer. The connection must be to the specific peer where the chaincode is to be installed.

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 QueryApproved

func QueryApproved(ctx context.Context, connection grpc.ClientConnInterface, id identity.SigningIdentity, channelID string, chaincodeName string, sequence int64) (*lifecycle.QueryApprovedChaincodeDefinitionResult, error)

QueryApproved chaincode definition for the user's own organization. The connection may be to any Gateway peer that is a member of the channel.

func QueryCommitted

QueryCommitted returns the definitions of all committed chaincode for a given channel. The connection may be to any Gateway peer that is a member of the channel.

func QueryCommittedWithName

func QueryCommittedWithName(ctx context.Context, connection grpc.ClientConnInterface, id identity.SigningIdentity, channelID, chaincodeName string) (*lifecycle.QueryChaincodeDefinitionResult, error)

QueryCommittedWithName returns the definition of the named chaincode for a given channel. The connection may be to any Gateway peer that is a member of the channel.

func QueryInstalled

QueryInstalled chaincode on a specific peer. The connection must be to the specific peer where the chaincode is installed.

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 Metadata

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

Metadata as metadata.json

Jump to

Keyboard shortcuts

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