Hyperledger fabric の byfn(Building Your First Network) を調べる

Hyperledger Fabric

Hyperledger fabric でネットワークを作ろうとするときに byfn(Building Your First Network).sh を使って構築して色々内容について把握しようとしている都合、byfn.shでどのようなことをやっているか調べてみました。

以下は byfn について記載がされているページです。

Building Your First Network

また、以下githubのソースのコードを参考にしています。

https://github.com/hyperledger/fabric-samples/blob/release-1.4/first-network/byfn.sh

Sponsored Link


基本的なコマンド

ブロックチェーン作成

genesisブロックとかできる。

./byfn.sh generate

ネットワーク立ち上げ

-l node で node のchaincodeが実行できるネットワークがたちあがる。

./byfn.sh up -l node

ネットワーク閉じる

./byfn.sh down

./byfn.sh generate

generate を実行すると以下メソッドが呼ばれる

elif [ "${MODE}" == "generate" ]; then ## Generate Artifacts
  generateCerts
  replacePrivateKey
  generateChannelArtifacts

generateCerts

function generateCerts() {
  which cryptogen
  if [ "$?" -ne 0 ]; then
    echo "cryptogen tool not found. exiting"
    exit 1
  fi
  echo
  echo "##########################################################"
  echo "##### Generate certificates using cryptogen tool #########"
  echo "##########################################################"

  if [ -d "crypto-config" ]; then
    rm -Rf crypto-config
  fi
  set -x
  cryptogen generate --config=./crypto-config.yaml
  res=$?
  set +x
  if [ $res -ne 0 ]; then
    echo "Failed to generate certificates..."
    exit 1
  fi
  echo
}

cryptogenというツールで crypto-config.yaml を使って、x509 certsや署名、鍵などを作成している。
crypto-config というフォルダに、これらのファイルが作成される。
crypto-config.yamlには、ordererやpeerの定義が記載されている。

replacePrivateKey

ca, orderer, peer の3種類のコンテナを作る docker-composeを作成している。
その中でprivatekeyのファイル場所を変換しているから replacePrivateKey というファイル名らしい。

# Using docker-compose-e2e-template.yaml, replace constants with private key file names
# generated by the cryptogen tool and output a docker-compose.yaml specific to this
# configuration
function replacePrivateKey() {
  # sed on MacOSX does not support -i flag with a null extension. We will use
  # 't' for our back-up's extension and delete it at the end of the function
  ARCH=$(uname -s | grep Darwin)
  if [ "$ARCH" == "Darwin" ]; then
    OPTS="-it"
  else
    OPTS="-i"
  fi

  # Copy the template to the file that will be modified to add the private key
  cp docker-compose-e2e-template.yaml docker-compose-e2e.yaml

  # The next steps will replace the template's contents with the
  # actual values of the private key file names for the two CAs.
  CURRENT_DIR=$PWD
  cd crypto-config/peerOrganizations/org1.example.com/ca/
  PRIV_KEY=$(ls *_sk)
  cd "$CURRENT_DIR"
  sed $OPTS "s/CA1_PRIVATE_KEY/${PRIV_KEY}/g" docker-compose-e2e.yaml
  cd crypto-config/peerOrganizations/org2.example.com/ca/
  PRIV_KEY=$(ls *_sk)
  cd "$CURRENT_DIR"
  sed $OPTS "s/CA2_PRIVATE_KEY/${PRIV_KEY}/g" docker-compose-e2e.yaml
  # If MacOSX, remove the temporary backup of the docker-compose file
  if [ "$ARCH" == "Darwin" ]; then
    rm docker-compose-e2e.yamlt
  fi
}

generateChannelArtifacts

configtxgen というツールを使って configtx.yaml という設定ファイルを元に genesisブロックを作成している。
メンバーは3つで、Orderer Org (OrdererOrg) と 2つの Peer Orgs (Org1 & Org2)
該当箇所は以下。defaultは CONSENSUS_TYPE = solo になる。

  echo "CONSENSUS_TYPE="$CONSENSUS_TYPE
  set -x
  if [ "$CONSENSUS_TYPE" == "solo" ]; then
    configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
  elif [ "$CONSENSUS_TYPE" == "kafka" ]; then
    configtxgen -profile SampleDevModeKafka -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
  elif [ "$CONSENSUS_TYPE" == "etcdraft" ]; then
    configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
  else
    set +x
    echo "unrecognized CONSESUS_TYPE='$CONSENSUS_TYPE'. exiting"
    exit 1
  fi

次は、チャンネルトランザクションを作成するtxを発行している。

  echo "#################################################################"
  echo "### Generating channel configuration transaction 'channel.tx' ###"
  echo "#################################################################"
  set -x
  configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
  res=$?
  set +x
  if [ $res -ne 0 ]; then
    echo "Failed to generate channel configuration transaction..."
    exit 1
  fi

organization Org1MSP の Org1MSPanchors.tx を configtx.yamlベースにアンカーpeerのtxを発行。

Anchor Peerとは

Anchor Peer はブロックチェーンネットワーク上の他の組織の Peer との通信の窓口となる Peer のことを言います。 各組織の Anchor Peer のアドレスはブロックチェーンネットワークの起動時に受け取ることができるので、Anchor Peer を通じて各組織の持つ Peer の情報を知ることができます。

  echo "#################################################################"
  echo "#######    Generating anchor peer update for Org1MSP   ##########"
  echo "#################################################################"
  set -x
  configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
  res=$?
  set +x
  if [ $res -ne 0 ]; then
    echo "Failed to generate anchor peer update for Org1MSP..."
    exit 1
  fi

Org2MSPのケース。同様にconfigtx.yamlベースにアンカーpeerのtxを発行している。

  echo "#################################################################"
  echo "#######    Generating anchor peer update for Org2MSP   ##########"
  echo "#################################################################"
  set -x
  configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate \
    ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
  res=$?
  set +x
  if [ $res -ne 0 ]; then
    echo "Failed to generate anchor peer update for Org2MSP..."
    exit 1
  fi

./byfn.sh up -l node

以下のように呼び出される

#Create the network using docker compose
if [ "${MODE}" == "up" ]; then
  networkUp

networkUp

docker-compose-cli.yaml をもとに docker-compose -d up している。
以下のコンテナが立ち上がる。
orderer.example.com:
peer0.org1.example.com:
peer1.org1.example.com:
peer0.org2.example.com:
peer1.org2.example.com:
cli:

ちなみに、-a オプションをつけると docker-compose-ca.yaml で caサーバー(ca0, ca1)も立ち上がる。

また、upした内容が問題ないかテストしている。

# Generate the needed certificates, the genesis block and start the network.
function networkUp() {
  checkPrereqs
  # generate artifacts if they don't exist
  if [ ! -d "crypto-config" ]; then
    generateCerts
    replacePrivateKey
    generateChannelArtifacts
  fi
  COMPOSE_FILES="-f ${COMPOSE_FILE}"
  if [ "${CERTIFICATE_AUTHORITIES}" == "true" ]; then
    COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_CA}"
    export BYFN_CA1_PRIVATE_KEY=$(cd crypto-config/peerOrganizations/org1.example.com/ca && ls *_sk)
    export BYFN_CA2_PRIVATE_KEY=$(cd crypto-config/peerOrganizations/org2.example.com/ca && ls *_sk)
  fi
  if [ "${CONSENSUS_TYPE}" == "kafka" ]; then
    COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_KAFKA}"
  elif [ "${CONSENSUS_TYPE}" == "etcdraft" ]; then
    COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_RAFT2}"
  fi
  if [ "${IF_COUCHDB}" == "couchdb" ]; then
    COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_COUCH}"
  fi
  IMAGE_TAG=$IMAGETAG docker-compose ${COMPOSE_FILES} up -d 2>&1
  docker ps -a
  if [ $? -ne 0 ]; then
    echo "ERROR !!!! Unable to start network"
    exit 1
  fi

  if [ "$CONSENSUS_TYPE" == "kafka" ]; then
    sleep 1
    echo "Sleeping 10s to allow $CONSENSUS_TYPE cluster to complete booting"
    sleep 9
  fi

  if [ "$CONSENSUS_TYPE" == "etcdraft" ]; then
    sleep 1
    echo "Sleeping 15s to allow $CONSENSUS_TYPE cluster to complete booting"
    sleep 14
  fi

  # now run the end to end script
  docker exec cli scripts/script.sh $CHANNEL_NAME $CLI_DELAY $LANGUAGE $CLI_TIMEOUT $VERBOSE $NO_CHAINCODE
  if [ $? -ne 0 ]; then
    echo "ERROR !!!! Test failed"
    exit 1
  fi
}

まとめ

ソース一通り読んで、byfn.shでどのようにネットワークが立ち上げられているかのメモなので、またブラッシュアップするかもしれません。
自分はだいたい理解できました。

Sponsored Link
コメントはまだありません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


Hyperledger Fabric
Hyperledger fabric – Fauxton を使用する

Hyperledger fabric で開発をしているとCouchDBの中身を簡単に参照したくなりま …

Hyperledger Fabric
Hyperledger fabric コマンドまとめ

よく使うHyperledger fabricコマンドのメモ[随時追記] Contents1 chai …

Hyperledger Fabric
Hyperledger fabci の Smart Contract(スマートコントラクト)を調査

前回Commercial Paperを動かしていて、スマコンの詳しい説明がなかったが以下に詳しく記載 …