This is a very simple Fabric network that consists of an orderer, peer, cli and chaincode container.
To start the nodes and join the peer to the channel myc
, run:
./start.sh
or, to run without the chaincode container (for local development):
./start-no-cc.sh
In this setup there is no need to run the chaincode container.
Instead, the chaincode process will be run on our host machine.
The only change needed is to make port 7052 of the peer accessible from outside the docker-compose network created for the Fabric deployment.
To do this, the mapping: - 7052:7052
is added under the ports section of the peer
container in the docker-compose.yaml
.
The current version of the fabric_shim
package requires an older version of node to be compiled successfully.
To do that we will be using the n version manager.
With the Fabric network running do the following:
# npm install n
sudo n 8.9.0
cd chaincode/chaincode_example02/node
npm install
node chaincode_example02.js --peer.address localhost:7052 --chaincode-id-name "mycc:v0"
cd chaincode/chaincode_example02/go
go build -o example02
CORE_CHAINCODE_LOGGING_LEVEL=debug CORE_PEER_ADDRESS=localhost:7052 CORE_CHAINCODE_ID_NAME=mycc:v0 ./example02
This requires building and running the Haskell chaincode process from the haskell-cc repository. Instructions for doing so can be found in the repository's readme.
In a separate terminal window, run:
Instantiation:
docker exec -it cli bash
peer chaincode install -n mycc -v v0 -l node -p /opt/gopath/src/chaincodedev/chaincode/chaincode_example02/node
peer chaincode list --installed
peer chaincode instantiate -n mycc -v v0 -l node -c '{"Args":["init","a","100","b","200"]}' -C myc -o orderer:7050
Invocation:
peer chaincode invoke -n mycc -c '{"Args":["invoke","a","b","30"]}' -C myc
Query:
peer chaincode query -n mycc -c '{"Args":["query","a"}' -C myc
Instantiation:
For the Go chaincode we need to provide a relative path to /opt/gopath/src
docker exec -it cli bash
peer chaincode install -n mycc -v v0 -l golang -p chaincodedev/chaincode/chaincode_example02/go
peer chaincode list --installed
peer chaincode instantiate -n mycc -v v0 -l golang -c '{"Args":["init","a","100","b","200"]}' -C myc -o orderer:7050
Invocation:
peer chaincode invoke -n mycc -c '{"Args":["invoke","a","b","30"]}' -C myc
Query:
peer chaincode query -n mycc -c '{"Args":["query","a"}' -C myc
From the perspective of the peer, interacting with Haskell chaincode looks the same as with Go chaincode.
Instantiation:
docker exec -it cli bash
peer chaincode install -n mycc -v v0 -l golang -p chaincodedev/chaincode/chaincode_example02/go
peer chaincode list --installed
peer chaincode instantiate -n mycc -v v0 -l golang -c '{"Args":["init","a","100"]}' -C myc -o orderer:7050
Invocation:
peer chaincode invoke -n mycc -c '{"Args":["get","a"]}' -C myc
peer chaincode invoke -n mycc -c '{"Args":["set","b","60"]}' -C myc
peer chaincode invoke -n mycc -c '{"Args":["del","a"]}' -C myc
As an alternative to running the chaincode process locally, it can also be run in a chaincode container that is manually started by the user. To do so, use the following:
docker exec -it chaincode bash
cd chaincode_example02/node
npm install
node chaincode_example02.js --peer.address peer:7052 --chaincode-id-name "mycc:v0"
docker exec -t chaincode bash
cd chaincode_example02/go
go build -o example02
CORE_CHAINCODE_LOGGING_LEVEL=debug CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mycc:v0 ./example02
Note there is currently no image for running Haskell chaincode in a container.