Skip to content
This repository has been archived by the owner on Jan 23, 2024. It is now read-only.

Add anchor peer configuration script #107

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions add-anchor-peer/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Script to add Anchor Peer to a channel in Amazon Managed Blockchian for Hyperledger Fabric

This script helps to add an [Anchor Peer](https://hyperledger-fabric.readthedocs.io/en/release-1.4/glossary.html#anchor-peer)
to a channel in Amazon Managed Blockchain for Hyperledger Fabric network. To set up an EC2 instance with Hyperledger Fabric client and
create a new channel, please follow the steps in [Getting Started Tutorial](https://docs.aws.amazon.com/managed-blockchain/latest/managementguide/managed-blockchain-get-started-tutorial.html).

## Pre-requisites
- [An EC2 instance with Hyperledger Fabric client CLI docker container.](https://docs.aws.amazon.com/managed-blockchain/latest/managementguide/get-started-create-client.html)
- `jq` tool, installed on an EC2 instance with Hyperledger Fabric client CLI.
To install `jq` tool, run the following command on your EC2 instance: `sudo yum install jq`

## Usage

```
./configureAnchorPeer.sh \
--channelName "<CHANNEL_NAME>" \
--memberId "<AMB_MEMBER_ID>" \
--peerAddress "<PEER_ENDPOINT>" \
--ordererAddress "<ORDERING_SERVICE_ENDPOINT>"
```

If you are using ngo workshop setup please set an optional parameter `--mspPath MSP_PATH`

### Usage example:

- Using EC instance with Hyperledger Fabric client CLI docker container from documentation:

`./configureAnchorPeer.sh --channelName "mychannel" --memberId "m-JNF6WTCRZJEPTBF6FXLD44KVEM" --peerAddress "nd-veqmnn7wfffbhazm4mg4i3fbz4.m-jnf6wtcrzjeptbf6fxld44kvem.n-roc33c2uibfnnbmowgpyi74lfe.managedblockchain.us-east-1.amazonaws.com:30003" --ordererAddress "orderer.n-roc33c2uibfnnbmowgpyi74lfe.managedblockchain.us-east-1.amazonaws.com:30001"`

- Using setup form NGO workshop:

`./configureAnchorPeer.sh --channelName "mychannel" --memberId "m-JNF6WTCRZJEPTBF6FXLD44KVEM" --peerAddress "nd-veqmnn7wfffbhazm4mg4i3fbz4.m-jnf6wtcrzjeptbf6fxld44kvem.n-roc33c2uibfnnbmowgpyi74lfe.managedblockchain.us-east-1.amazonaws.com:30003" --ordererAddress "orderer.n-roc33c2uibfnnbmowgpyi74lfe.managedblockchain.us-east-1.amazonaws.com:30001" --mspPath "/opt/home/admin-msp"`
139 changes: 139 additions & 0 deletions add-anchor-peer/configureAnchorPeer.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
#!/bin/bash

print_usage() {
echo "Usage:"
echo " ./configureAnchorPeer.sh [--channelName CHANNEL_NAME] [--memberId AMB_MEMBER_ID] [--peerAddress PEER_ENDPOINT] [--ordererAddress ORDERER_ENDPOINT]"
echo " "
echo " Optional:"
echo " If you are using ngo workshop setup please set [--mspPath MSP_PATH]"
echo " "
echo "Usage example:"
echo " ./configureAnchorPeer.sh --channelName \"mychannel\" --memberId \"m-JNF6WTCRZJEPTBF6FXLD44KVEM\" --peerAddress \"nd-veqmnn7wfffbhazm4mg4i3fbz4.m-jnf6wtcrzjeptbf6fxld44kvem.n-roc33c2uibfnnbmowgpyi74lfe.managedblockchain.us-east-1.amazonaws.com:30003\" --ordererAddress \"orderer.n-roc33c2uibfnnbmowgpyi74lfe.managedblockchain.us-east-1.amazonaws.com:30001\" --mspPath \"/opt/home/admin-msp\""
echo " "
}


while test $# -gt 0; do
case "$1" in
--channelName)
shift
export CHANNEL_NAME=$1
shift
;;
--memberId)
shift
export AMB_MEMBER_ID=$1
export MSP=$AMB_MEMBER_ID
shift
;;
--peerAddress)
shift
export PEER=$1
shift
;;
--ordererAddress)
shift
export ORDERER=$1
shift
;;
--mspPath)
shift
export MSP_PATH=$1
shift
;;
*)
break
;;
esac
done

if [ -z "$CHANNEL_NAME" ]
then
echo "CHANNEL_NAME is not set. Please set it as environment variable CHANNEL_NAME or use \"channelName=\" flag."
print_usage
exit 1
fi

if [ -z "$AMB_MEMBER_ID" ]
then
echo "AMB_MEMBER_ID is not set. Please set it as environment variable AMB_MEMBER_ID or use \"memberId=\" flag."
print_usage
exit 1
fi

if [ -z "$PEER" ]
then
echo "PEER is not set. Please set it as environment variable PEER or use \"peerAddress=\" flag."
print_usage
exit 1
fi

if [ -z "$ORDERER" ]
then
echo "ORDERER is not set. Please set it as environment variable ORDERER or use \"ordererAddress=\" flag."
print_usage
exit 1
fi

IFS=: read -r PEER_DNS_NAME PEER_PORT_NUMBER <<< "$PEER"

echo " "
echo "Initialized with the following config:"
echo "CHANNEL_NAME : $CHANNEL_NAME";
echo "AMB_MEMBER_ID : $AMB_MEMBER_ID";
echo "PEER : $PEER";
echo "PEER_DNS_NAME : $PEER_DNS_NAME";
echo "PEER_PORT_NUMBER : $PEER_PORT_NUMBER";
echo "ORDERER : $ORDERER";

cd /home/ec2-user

rm -rf ./channel-artifacts && mkdir ./channel-artifacts

if [ -z "$MSP_PATH" ]
then
docker exec cli peer channel fetch config /opt/home/channel-artifacts/$CHANNEL_NAME.pb -c $CHANNEL_NAME -o $ORDERER --cafile /opt/home/managedblockchain-tls-chain.pem --tls
else
docker exec -e "CORE_PEER_TLS_ENABLED=true" -e "CORE_PEER_TLS_ROOTCERT_FILE=/opt/home/managedblockchain-tls-chain.pem" \
-e "CORE_PEER_ADDRESS=$PEER" -e "CORE_PEER_LOCALMSPID=$MSP" -e "CORE_PEER_MSPCONFIGPATH=$MSP_PATH" \
cli peer channel fetch config /opt/home/channel-artifacts/$CHANNEL_NAME.pb -c $CHANNEL_NAME -o $ORDERER --cafile /opt/home/managedblockchain-tls-chain.pem --tls
fi

docker exec cli configtxlator proto_decode --input /opt/home/channel-artifacts/$CHANNEL_NAME.pb --type common.Block --output /opt/home/channel-artifacts/config_block.json

cd channel-artifacts

sudo jq .data.data[0].payload.data.config config_block.json > config.json

cp config.json config_copy.json

jq '.channel_group.groups.Application.groups["'$AMB_MEMBER_ID'"].values += {"AnchorPeers":{"mod_policy": "Admins","value":{"anchor_peers": [{"host": "'$PEER_DNS_NAME'","port": '$PEER_PORT_NUMBER'}]},"version": "0"}}' config_copy.json > modified_config.json

docker exec cli configtxlator proto_encode --input /opt/home/channel-artifacts/config.json --type common.Config --output /opt/home/channel-artifacts/config.pb

docker exec cli configtxlator proto_encode --input /opt/home/channel-artifacts/modified_config.json --type common.Config --output /opt/home/channel-artifacts/modified_config.pb

docker exec cli configtxlator compute_update --channel_id $CHANNEL_NAME --original /opt/home/channel-artifacts/config.pb --updated /opt/home/channel-artifacts/modified_config.pb --output /opt/home/channel-artifacts/config_update.pb

docker exec cli configtxlator proto_decode --input /opt/home/channel-artifacts/config_update.pb --type common.ConfigUpdate --output /opt/home/channel-artifacts/config_update.json

sudo chmod 755 config_update.json

echo '{"payload":{"header":{"channel_header":{"channel_id":"'$CHANNEL_NAME'", "type":2}},"data":{"config_update":'$(cat config_update.json)'}}}' | jq . > config_update_in_envelope.json

docker exec cli configtxlator proto_encode --input /opt/home/channel-artifacts/config_update_in_envelope.json --type common.Envelope --output /opt/home/channel-artifacts/config_update_in_envelope.pb

if [ -z "$MSP_PATH" ]
then
docker exec cli peer channel update -f /opt/home/channel-artifacts/config_update_in_envelope.pb -c $CHANNEL_NAME -o $ORDERER --cafile /opt/home/managedblockchain-tls-chain.pem --tls
else
docker exec -e "CORE_PEER_TLS_ENABLED=true" -e "CORE_PEER_TLS_ROOTCERT_FILE=/opt/home/managedblockchain-tls-chain.pem" \
-e "CORE_PEER_ADDRESS=$PEER" -e "CORE_PEER_LOCALMSPID=$MSP" -e "CORE_PEER_MSPCONFIGPATH=$MSP_PATH" \
cli peer channel update -f /opt/home/channel-artifacts/config_update_in_envelope.pb -c $CHANNEL_NAME -o $ORDERER --cafile /opt/home/managedblockchain-tls-chain.pem --tls
fi

echo " "
echo "Done"

#2020-08-28 08:37:36.806 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
#2020-08-28 08:37:36.887 UTC [channelCmd] update -> INFO 002 Successfully submitted channel update