Last active
September 25, 2019 17:57
-
-
Save ghoshbishakh/3e7518a9ed6b2b768153a41dda1f544b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Copyright IBM Corp. All Rights Reserved. | |
# | |
# SPDX-License-Identifier: Apache-2.0 | |
# | |
--- | |
################################################################################ | |
# | |
# Section: Organizations | |
# | |
# - This section defines the different organizational identities which will | |
# be referenced later in the configuration. | |
# | |
################################################################################ | |
Organizations: | |
# SampleOrg defines an MSP using the sampleconfig. It should never be used | |
# in production but may be used as a template for other definitions | |
- &OrdererOrg | |
# DefaultOrg defines the organization which is used in the sampleconfig | |
# of the fabric.git development environment | |
Name: OrdererOrg | |
# ID to load the MSP definition as | |
ID: OrdererMSP | |
# MSPDir is the filesystem path which contains the MSP configuration | |
MSPDir: crypto-config/ordererOrganizations/example.com/msp | |
# Policies defines the set of policies at this level of the config tree | |
# For organization policies, their canonical path is usually | |
# /Channel/<Application|Orderer>/<OrgName>/<PolicyName> | |
Policies: | |
Readers: | |
Type: Signature | |
Rule: "OR('OrdererMSP.member')" | |
Writers: | |
Type: Signature | |
Rule: "OR('OrdererMSP.member')" | |
Admins: | |
Type: Signature | |
Rule: "OR('OrdererMSP.admin')" | |
- &Org1 | |
# DefaultOrg defines the organization which is used in the sampleconfig | |
# of the fabric.git development environment | |
Name: Org1MSP | |
# ID to load the MSP definition as | |
ID: Org1MSP | |
MSPDir: crypto-config/peerOrganizations/org1.example.com/msp | |
# Policies defines the set of policies at this level of the config tree | |
# For organization policies, their canonical path is usually | |
# /Channel/<Application|Orderer>/<OrgName>/<PolicyName> | |
Policies: | |
Readers: | |
Type: Signature | |
Rule: "OR('Org1MSP.admin', 'Org1MSP.peer', 'Org1MSP.client')" | |
Writers: | |
Type: Signature | |
Rule: "OR('Org1MSP.admin', 'Org1MSP.client')" | |
Admins: | |
Type: Signature | |
Rule: "OR('Org1MSP.admin')" | |
# leave this flag set to true. | |
AnchorPeers: | |
# AnchorPeers defines the location of peers which can be used | |
# for cross org gossip communication. Note, this value is only | |
# encoded in the genesis block in the Application section context | |
- Host: peer0.org1.example.com | |
Port: 7051 | |
- &Org2 | |
# DefaultOrg defines the organization which is used in the sampleconfig | |
# of the fabric.git development environment | |
Name: Org2MSP | |
# ID to load the MSP definition as | |
ID: Org2MSP | |
MSPDir: crypto-config/peerOrganizations/org2.example.com/msp | |
# Policies defines the set of policies at this level of the config tree | |
# For organization policies, their canonical path is usually | |
# /Channel/<Application|Orderer>/<OrgName>/<PolicyName> | |
Policies: | |
Readers: | |
Type: Signature | |
Rule: "OR('Org2MSP.admin', 'Org2MSP.peer', 'Org2MSP.client')" | |
Writers: | |
Type: Signature | |
Rule: "OR('Org2MSP.admin', 'Org2MSP.client')" | |
Admins: | |
Type: Signature | |
Rule: "OR('Org2MSP.admin')" | |
AnchorPeers: | |
# AnchorPeers defines the location of peers which can be used | |
# for cross org gossip communication. Note, this value is only | |
# encoded in the genesis block in the Application section context | |
- Host: peer0.org2.example.com | |
Port: 7051 | |
- &Org3 | |
# DefaultOrg defines the organization which is used in the sampleconfig | |
# of the fabric.git development environment | |
Name: Org3MSP | |
# ID to load the MSP definition as | |
ID: Org3MSP | |
MSPDir: crypto-config/peerOrganizations/org3.example.com/msp | |
# Policies defines the set of policies at this level of the config tree | |
# For organization policies, their canonical path is usually | |
# /Channel/<Application|Orderer>/<OrgName>/<PolicyName> | |
Policies: | |
Readers: | |
Type: Signature | |
Rule: "OR('Org3MSP.admin', 'Org3MSP.peer', 'Org3MSP.client')" | |
Writers: | |
Type: Signature | |
Rule: "OR('Org3MSP.admin', 'Org3MSP.client')" | |
Admins: | |
Type: Signature | |
Rule: "OR('Org3MSP.admin')" | |
AnchorPeers: | |
# AnchorPeers defines the location of peers which can be used | |
# for cross org gossip communication. Note, this value is only | |
# encoded in the genesis block in the Application section context | |
- Host: peer0.org3.example.com | |
Port: 7051 | |
################################################################################ | |
# | |
# SECTION: Capabilities | |
# | |
# - This section defines the capabilities of fabric network. This is a new | |
# concept as of v1.1.0 and should not be utilized in mixed networks with | |
# v1.0.x peers and orderers. Capabilities define features which must be | |
# present in a fabric binary for that binary to safely participate in the | |
# fabric network. For instance, if a new MSP type is added, newer binaries | |
# might recognize and validate the signatures from this type, while older | |
# binaries without this support would be unable to validate those | |
# transactions. This could lead to different versions of the fabric binaries | |
# having different world states. Instead, defining a capability for a channel | |
# informs those binaries without this capability that they must cease | |
# processing transactions until they have been upgraded. For v1.0.x if any | |
# capabilities are defined (including a map with all capabilities turned off) | |
# then the v1.0.x peer will deliberately crash. | |
# | |
################################################################################ | |
Capabilities: | |
# Channel capabilities apply to both the orderers and the peers and must be | |
# supported by both. | |
# Set the value of the capability to true to require it. | |
Channel: &ChannelCapabilities | |
# V1.3 for Channel is a catchall flag for behavior which has been | |
# determined to be desired for all orderers and peers running at the v1.3.x | |
# level, but which would be incompatible with orderers and peers from | |
# prior releases. | |
# Prior to enabling V1.3 channel capabilities, ensure that all | |
# orderers and peers on a channel are at v1.3.0 or later. | |
V1_3: true | |
# Orderer capabilities apply only to the orderers, and may be safely | |
# used with prior release peers. | |
# Set the value of the capability to true to require it. | |
Orderer: &OrdererCapabilities | |
# V1.1 for Orderer is a catchall flag for behavior which has been | |
# determined to be desired for all orderers running at the v1.1.x | |
# level, but which would be incompatible with orderers from prior releases. | |
# Prior to enabling V1.1 orderer capabilities, ensure that all | |
# orderers on a channel are at v1.1.0 or later. | |
V1_1: true | |
# Application capabilities apply only to the peer network, and may be safely | |
# used with prior release orderers. | |
# Set the value of the capability to true to require it. | |
Application: &ApplicationCapabilities | |
# V1.3 for Application enables the new non-backwards compatible | |
# features and fixes of fabric v1.3. | |
V1_3: true | |
# V1.2 for Application enables the new non-backwards compatible | |
# features and fixes of fabric v1.2 (note, this need not be set if | |
# later version capabilities are set) | |
V1_2: false | |
# V1.1 for Application enables the new non-backwards compatible | |
# features and fixes of fabric v1.1 (note, this need not be set if | |
# later version capabilities are set). | |
V1_1: false | |
################################################################################ | |
# | |
# SECTION: Application | |
# | |
# - This section defines the values to encode into a config transaction or | |
# genesis block for application related parameters | |
# | |
################################################################################ | |
Application: &ApplicationDefaults | |
# Organizations is the list of orgs which are defined as participants on | |
# the application side of the network | |
Organizations: | |
# Policies defines the set of policies at this level of the config tree | |
# For Application policies, their canonical path is | |
# /Channel/Application/<PolicyName> | |
Policies: | |
Readers: | |
Type: ImplicitMeta | |
Rule: "ANY Readers" | |
Writers: | |
Type: ImplicitMeta | |
Rule: "ANY Writers" | |
Admins: | |
Type: ImplicitMeta | |
Rule: "MAJORITY Admins" | |
################################################################################ | |
# | |
# SECTION: Orderer | |
# | |
# - This section defines the values to encode into a config transaction or | |
# genesis block for orderer related parameters | |
# | |
################################################################################ | |
Orderer: &OrdererDefaults | |
# Orderer Type: The orderer implementation to start | |
# Available types are "solo" and "kafka" | |
OrdererType: solo | |
Addresses: | |
- orderer.example.com:7050 | |
# Batch Timeout: The amount of time to wait before creating a batch | |
BatchTimeout: 1s | |
# Batch Size: Controls the number of messages batched into a block | |
BatchSize: | |
# Max Message Count: The maximum number of messages to permit in a batch | |
MaxMessageCount: 1 | |
# Absolute Max Bytes: The absolute maximum number of bytes allowed for | |
# the serialized messages in a batch. | |
AbsoluteMaxBytes: 99 MB | |
# Preferred Max Bytes: The preferred maximum number of bytes allowed for | |
# the serialized messages in a batch. A message larger than the preferred | |
# max bytes will result in a batch larger than preferred max bytes. | |
PreferredMaxBytes: 512 KB | |
Kafka: | |
# Brokers: A list of Kafka brokers to which the orderer connects | |
# NOTE: Use IP:port notation | |
Brokers: | |
- 127.0.0.1:9092 | |
# Organizations is the list of orgs which are defined as participants on | |
# the orderer side of the network | |
Organizations: | |
# Policies defines the set of policies at this level of the config tree | |
# For Orderer policies, their canonical path is | |
# /Channel/Orderer/<PolicyName> | |
Policies: | |
Readers: | |
Type: ImplicitMeta | |
Rule: "ANY Readers" | |
Writers: | |
Type: ImplicitMeta | |
Rule: "ANY Writers" | |
Admins: | |
Type: ImplicitMeta | |
Rule: "MAJORITY Admins" | |
# BlockValidation specifies what signatures must be included in the block | |
# from the orderer for the peer to validate it. | |
BlockValidation: | |
Type: ImplicitMeta | |
Rule: "ANY Writers" | |
################################################################################ | |
# | |
# CHANNEL | |
# | |
# This section defines the values to encode into a config transaction or | |
# genesis block for channel related parameters. | |
# | |
################################################################################ | |
Channel: &ChannelDefaults | |
# Policies defines the set of policies at this level of the config tree | |
# For Channel policies, their canonical path is | |
# /Channel/<PolicyName> | |
Policies: | |
# Who may invoke the 'Deliver' API | |
Readers: | |
Type: ImplicitMeta | |
Rule: "ANY Readers" | |
# Who may invoke the 'Broadcast' API | |
Writers: | |
Type: ImplicitMeta | |
Rule: "ANY Writers" | |
# By default, who may modify elements at this config level | |
Admins: | |
Type: ImplicitMeta | |
Rule: "MAJORITY Admins" | |
# Capabilities describes the channel level capabilities, see the | |
# dedicated Capabilities section elsewhere in this file for a full | |
# description | |
Capabilities: | |
<<: *ChannelCapabilities | |
################################################################################ | |
# | |
# Profile | |
# | |
# - Different configuration profiles may be encoded here to be specified | |
# as parameters to the configtxgen tool | |
# | |
################################################################################ | |
Profiles: | |
TwoOrgsOrdererGenesis: | |
<<: *ChannelDefaults | |
Orderer: | |
<<: *OrdererDefaults | |
Organizations: | |
- *OrdererOrg | |
Capabilities: | |
<<: *OrdererCapabilities | |
Consortiums: | |
SampleConsortium: | |
Organizations: | |
- *Org1 | |
- *Org2 | |
TwoOrgsChannel: | |
Consortium: SampleConsortium | |
Application: | |
<<: *ApplicationDefaults | |
Organizations: | |
- *Org1 | |
- *Org2 | |
Capabilities: | |
<<: *ApplicationCapabilities | |
ThreeOrgsOrdererGenesis: | |
<<: *ChannelDefaults | |
Orderer: | |
<<: *OrdererDefaults | |
Organizations: | |
- *OrdererOrg | |
Capabilities: | |
<<: *OrdererCapabilities | |
Consortiums: | |
SampleConsortium: | |
Organizations: | |
- *Org1 | |
- *Org2 | |
- *Org3 | |
ThreeOrgsChannel: | |
Consortium: SampleConsortium | |
Application: | |
<<: *ApplicationDefaults | |
Organizations: | |
- *Org1 | |
- *Org2 | |
- *Org3 | |
Capabilities: | |
<<: *ApplicationCapabilities |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Copyright IBM Corp. All Rights Reserved. | |
# | |
# SPDX-License-Identifier: Apache-2.0 | |
# | |
# --------------------------------------------------------------------------- | |
# "OrdererOrgs" - Definition of organizations managing orderer nodes | |
# --------------------------------------------------------------------------- | |
OrdererOrgs: | |
# --------------------------------------------------------------------------- | |
# Orderer | |
# --------------------------------------------------------------------------- | |
- Name: Orderer | |
Domain: example.com | |
# --------------------------------------------------------------------------- | |
# "Specs" - See PeerOrgs below for complete description | |
# --------------------------------------------------------------------------- | |
Specs: | |
- Hostname: orderer | |
# --------------------------------------------------------------------------- | |
# "PeerOrgs" - Definition of organizations managing peer nodes | |
# --------------------------------------------------------------------------- | |
PeerOrgs: | |
# --------------------------------------------------------------------------- | |
# Org1 | |
# --------------------------------------------------------------------------- | |
- Name: Org1 | |
Domain: org1.example.com | |
EnableNodeOUs: true | |
# --------------------------------------------------------------------------- | |
# "Specs" | |
# --------------------------------------------------------------------------- | |
# Uncomment this section to enable the explicit definition of hosts in your | |
# configuration. Most users will want to use Template, below | |
# | |
# Specs is an array of Spec entries. Each Spec entry consists of two fields: | |
# - Hostname: (Required) The desired hostname, sans the domain. | |
# - CommonName: (Optional) Specifies the template or explicit override for | |
# the CN. By default, this is the template: | |
# | |
# "{{.Hostname}}.{{.Domain}}" | |
# | |
# which obtains its values from the Spec.Hostname and | |
# Org.Domain, respectively. | |
# --------------------------------------------------------------------------- | |
# Specs: | |
# - Hostname: foo # implicitly "foo.org1.example.com" | |
# CommonName: foo27.org5.example.com # overrides Hostname-based FQDN set above | |
# - Hostname: bar | |
# - Hostname: baz | |
# --------------------------------------------------------------------------- | |
# "Template" | |
# --------------------------------------------------------------------------- | |
# Allows for the definition of 1 or more hosts that are created sequentially | |
# from a template. By default, this looks like "peer%d" from 0 to Count-1. | |
# You may override the number of nodes (Count), the starting index (Start) | |
# or the template used to construct the name (Hostname). | |
# | |
# Note: Template and Specs are not mutually exclusive. You may define both | |
# sections and the aggregate nodes will be created for you. Take care with | |
# name collisions | |
# --------------------------------------------------------------------------- | |
Template: | |
Count: 2 | |
# Start: 5 | |
# Hostname: {{.Prefix}}{{.Index}} # default | |
# --------------------------------------------------------------------------- | |
# "Users" | |
# --------------------------------------------------------------------------- | |
# Count: The number of user accounts _in addition_ to Admin | |
# --------------------------------------------------------------------------- | |
Users: | |
Count: 1 | |
# --------------------------------------------------------------------------- | |
# Org2: See "Org1" for full specification | |
# --------------------------------------------------------------------------- | |
- Name: Org2 | |
Domain: org2.example.com | |
EnableNodeOUs: true | |
Template: | |
Count: 2 | |
Users: | |
Count: 1 | |
# --------------------------------------------------------------------------- | |
# Org3: See "Org1" for full specification | |
# --------------------------------------------------------------------------- | |
- Name: Org3 | |
Domain: org3.example.com | |
EnableNodeOUs: true | |
Template: | |
Count: 2 | |
Users: | |
Count: 1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
In case of Docker Compose Error in Ubuntu 18.04: | |
Install with: | |
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose | |
sudo chmod +x /usr/local/bin/docker-compose | |
docker-compose --version |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"fmt" | |
"github.com/hyperledger/fabric/core/chaincode/shim" | |
"github.com/hyperledger/fabric/protos/peer" | |
) | |
// SimpleAsset implements a simple chaincode to manage an asset | |
type SimpleAsset struct { | |
} | |
// Init is called during chaincode instantiation to initialize any | |
// data. Note that chaincode upgrade also calls this function to reset | |
// or to migrate data. | |
func (t *SimpleAsset) Init(stub shim.ChaincodeStubInterface) peer.Response { | |
// Get the args from the transaction proposal | |
args := stub.GetStringArgs() | |
if len(args) != 2 { | |
return shim.Error("Incorrect arguments. Expecting a key and a value") | |
} | |
// Set up any variables or assets here by calling stub.PutState() | |
// We store the key and the value on the ledger | |
err := stub.PutState(args[0], []byte(args[1])) | |
if err != nil { | |
return shim.Error(fmt.Sprintf("Failed to create asset: %s", args[0])) | |
} | |
return shim.Success(nil) | |
} | |
// Invoke is called per transaction on the chaincode. Each transaction is | |
// either a 'get' or a 'set' on the asset created by Init function. The Set | |
// method may create a new asset by specifying a new key-value pair. | |
func (t *SimpleAsset) Invoke(stub shim.ChaincodeStubInterface) peer.Response { | |
// Extract the function and args from the transaction proposal | |
fn, args := stub.GetFunctionAndParameters() | |
var result string | |
var err error | |
if fn == "set" { | |
result, err = set(stub, args) | |
} else { // assume 'get' even if fn is nil | |
result, err = get(stub, args) | |
} | |
if err != nil { | |
return shim.Error(err.Error()) | |
} | |
// Return the result as success payload | |
return shim.Success([]byte(result)) | |
} | |
// Set stores the asset (both key and value) on the ledger. If the key exists, | |
// it will override the value with the new one | |
func set(stub shim.ChaincodeStubInterface, args []string) (string, error) { | |
if len(args) != 2 { | |
return "", fmt.Errorf("Incorrect arguments. Expecting a key and a value") | |
} | |
err := stub.PutState(args[0], []byte(args[1])) | |
if err != nil { | |
return "", fmt.Errorf("Failed to set asset: %s", args[0]) | |
} | |
return args[1], nil | |
} | |
// Get returns the value of the specified asset key | |
func get(stub shim.ChaincodeStubInterface, args []string) (string, error) { | |
if len(args) != 1 { | |
return "", fmt.Errorf("Incorrect arguments. Expecting a key") | |
} | |
value, err := stub.GetState(args[0]) | |
if err != nil { | |
return "", fmt.Errorf("Failed to get asset: %s with error: %s", args[0], err) | |
} | |
if value == nil { | |
return "", fmt.Errorf("Asset not found: %s", args[0]) | |
} | |
return string(value), nil | |
} | |
// main function starts up the chaincode in the container during instantiate | |
func main() { | |
if err := shim.Start(new(SimpleAsset)); err != nil { | |
fmt.Printf("Error starting SimpleAsset chaincode: %s", err) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment