4. Создайте и присоединитесь к связанному каналу (анализ функции сценария network.sh createChannel) [fabric2.2]

В примере тестовой сети фабрики есть организация-заказчик, две одноранговые организации, и каждая организация имеет узел.Есть только системные каналы (системный канал) и никаких других каналов приложений. Мы можем использовать команду ./network.sh createChannel для создания канала приложения с именем mychannel.

1. Основные понятия

ряд

Каналы используются для изоляции компаний в сети блокчейна.Альянс может иметь несколько каналов, и каждый канал может представлять бизнес.Участники каждого канала могут совместно использовать реестры, а реестры разных каналов изолированы друг от друга. Организация может присоединиться к нескольким каналам, и участники канала являются участниками бизнеса, которые могут отправлять транзакции в канал, которые будут получены одноранговыми узлами в канале и обновлены в локальном реестре после достижения консенсуса.

якорный узел

Основная цель узла привязки — помочь в обнаружении узлов между несколькими организациями в канале и синхронизировать информацию узла своей организации с другими организациями. Узел привязки должен отправить транзакцию конфигурации канала обновления, чтобы изменить узел привязки.

Транзакции конфигурации канала

Файлы транзакций конфигурации канала указывают информацию о конфигурации при создании каналов и объединении каналов для обновления узлов привязки.

Почему он называется файлом транзакции конфигурации канала? Насколько я понимаю, создание канала и присоединение к каналу отправляются узлу заказчика как транзакция, поэтому. . .

2. Создавайте и присоединяйтесь к каналам

cd /root/fabric/scripts/fabric-samples/test-network # 进入测试案例目录
./network.sh createChannel # 调用network.sh脚本创建通道

3. createChannelАнализ работы скрипта network.sh

Когда сценарий network.sh использует параметр createChannel, он вызывает createChannelфункцию

![(https://img-blog.csdnimg.cn/426279b880cd4e28a4c1464c207cadfc.png)

Посмотрите еще раз на createChannel()функцию

function createChannel() {
    
    
  # Bring up the network if it is not already up.

  if [ ! -d "organizations/peerOrganizations" ]; then
    infoln "Bringing up network"
    networkUp  # 启动网络
  fi

  # 运行scripts/createChannel.sh脚本来创建通道
  # 创建通道,创建交易和锚节点更新.
  # 使用configtx.yaml配置文件创建通道
  scripts/createChannel.sh $CHANNEL_NAME $CLI_DELAY $MAX_RETRY $VERBOSE
}

Проверьте файл сценария scripts/createChannel.sh, и в конце вы обнаружите, что весь сценарий выполнил четыре шага и вызвал четыре функции:

  • Создайте файл транзакции конфигурации канала channeltx
  • создать канал
  • Присоединить все узлы (узлы org1 и org2) к каналу
  • Установите якоря для каждой организации в канале
## 创建通道交易文件 channeltx
infoln "Generating channel create transaction '${CHANNEL_NAME}.tx'"
createChannelTx # 调用createChannelTx 函数

FABRIC_CFG_PATH=$PWD/../config/
BLOCKFILE="./channel-artifacts/${CHANNEL_NAME}.block"

## 创建通道
infoln "Creating channel ${CHANNEL_NAME}"
createChannel  # 调用createChannel 函数
successln "Channel '$CHANNEL_NAME' created"

## 将所有节点(org1 peer 和org2 peer)加入通道
infoln "Joining org1 peer to the channel..."
joinChannel 1 # 调用joinChannel函数,将org1 peer加入通道
infoln "Joining org2 peer to the channel..."
joinChannel 2 ## 调用joinChannel函数,将org2 peer加入通道

##为通道中的每个组织设置锚点
infoln "Setting anchor peer for org1..."
setAnchorPeer 1 # 调用setAnchorPeer函数,设置org1的锚节点
infoln "Setting anchor peer for org2..."
setAnchorPeer 2 # 调用createChannel 函数

createChannelTxфункциональный анализ

Функция функции заключается в создании файла транзакции конфигурации канала channeltx, а ядром функции является вызов инструмента configtxgen.

createChannelTx() {
    
    
	set -x
	#configtxgen工具依赖configtx.yaml文件
	#使用TwoOrgsChanne模板,定义了应用通道配置,可以用来新建应用通道。
	#TwoOrgsChanne模板在test-network/configtx/configtx.yaml文件定义
	#-profile 指定使用的是configtx.yaml中某个用于生成的Profiles配置项。
	#-outputCreateChannelTx 通道配置交易文件的保存路径
	#-channelID 在configtx中使用的通道ID,就是通道名称
	#下面详细介绍 configtxgen工具的参数
	configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/${CHANNEL_NAME}.tx -channelID $CHANNEL_NAME
	res=$?
	{
    
     set +x; } 2>/dev/null
  verifyResult $res "Failed to generate channel configuration transaction..."
}

configtxgenинструмент

Основные функции инструмента configtxgen включают в себя:

  • Генерация начального блока системного канала, необходимого для запуска сети, и поддержка проверки содержимого блока;
  • Создание конфигурационных транзакций, необходимых для создания каналов приложений, и поддержка проверки содержимого транзакций;
  • Создайте транзакцию обновления конфигурации для узла привязки (узла привязки).

Дополнительные параметры для инструмента configtxgen:

# configtxgen --help # 使用帮助命令查看

Usage of configtxgen:
  -asOrg string
        作为特定组织(按名称)执行配置生成,仅包括组织(可能)有权设置的写入集中的值
  -channelCreateTxBaseProfile string
       指定一个配置文件以将其视为orderer系统通道的当前状态,以允许在通道创建tx文件生成期间修改非应用程序参数。仅与“outputCreateChannelTx”结合使用有效。
  -channelID string
       在configtx中使用的通道 ID
  -configPath string
        包含要使用的配置的路径(如果设置)
  -inspectBlock string
        打印指定路径的块中包含的配置
  -inspectChannelCreateTx string
        打印指定路径下事务中包含的配置
  -outputAnchorPeersUpdate string
       [已弃用] 创建一个配置更新来更新锚点(仅适用于默认通道创建,并且仅适用于第一次更新)
  -outputBlock string
        写入创世块的路径(如果设置)
  -outputCreateChannelTx string
        设置通道创建的configtx的保存路径路径(如果已设置)
  -printOrg string
        将组织的定义打印为JSON。(对于手动将组织添加到频道很有用)
  -profile string
        指定configtx.yaml中用于生成的配置项。
  -version
        显示版本信息

createChannelфункциональный анализ

Функция функции заключается в создании канала.Клиенту необходимо отправить запрос Заказчику на создание канала приложения, а затем ждать, пока Заказчик создаст канал. Здесь mychannelсоздается канал с именем channel. (определено в network.sh CHANNEL_NAME="mychannel").

createChannel() {
    
    
	# setGlobals函数在scripts/envVar.sh文件中定义
	# 作用是为peer组织设置环境变量
	# 指定了组织的管理员用户的证书文件的位置
	# 需要配置交易文件channel.tx,并且只有组织的管理身份才能执行创建通道的命令
	setGlobals 1
	# 在 raft leader还没有设置前一直循环
	local rc=1
	local COUNTER=1
	while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ] ; do
		sleep $DELAY
		set -x
		#调用peer channel命令的子命令create,需要由拥有创建通道权限组织管理员身份来调用,在指定的排序服务上创建新的应用通道
		#-o order服务地址
		#-c 创建通道的名称
		#--ordererTLSHostnameOverride 验证Orderer TLS时覆盖所校验的主机名
		#-f 指定创建通道所用的交易文件
		#--outputBlock 创建通道成功后,将初始区块写到本地指定文件,默认为./.block。
		#--tls 连接到Orderer服务时是否启用TLS
		#--cafile 信任的排序服务的TLS CA证书,PEM编码格式
		peer channel create -o localhost:7050 -c $CHANNEL_NAME --ordererTLSHostnameOverride orderer.example.com -f ./channel-artifacts/${CHANNEL_NAME}.tx --outputBlock $BLOCKFILE --tls --cafile $ORDERER_CA >&log.txt
		# 通道创建成功后会生成,初始区块文件mychannel.block
		res=$?
		{
    
     set +x; } 2>/dev/null
		let rc=$res
		COUNTER=$(expr $COUNTER + 1)
	done
	cat log.txt
	verifyResult $res "Channel creation failed"
}

Точно так же вы можете использовать одноранговый канал --help для просмотра всех доступных параметров.

joinChannelФункциональный анализ

Роль функции состоит в том, чтобы объединить все узлы (узлы org1 и org2) в канал.

joinChannel вызывается дважды для узла org1 и узла org1 peer2.

# 将组织加入通道
joinChannel() {
    
    
  FABRIC_CFG_PATH=$PWD/../config/
  ORG=$1
  	# setGlobals函数在scripts/envVar.sh文件中定义
	# 作用是为peer组织设置环境变量
	# 指定了组织的管理员用户的证书文件的位置
	# 需要拥有所加入通道的初始区块文件,并且只有组织的管理身份才能执行创建通道的命令
	setGlobals 1
  setGlobals $ORG
	local rc=1
	local COUNTER=1
	## 有时加入需要时间,因此重试
	while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ] ; do
    sleep $DELAY
    set -x
	# peer的join子命令会将指定的Peer节点加入指定的应用通道中
	# -b 指定通道初始区块文件路径
    peer channel join -b $BLOCKFILE >&log.txt
    res=$?
    {
    
     set +x; } 2>/dev/null
		let rc=$res
		COUNTER=$(expr $COUNTER + 1)
	done
	cat log.txt
	verifyResult $res "After $MAX_RETRY attempts, peer0.org${ORG} has failed to join channel '$CHANNEL_NAME' "
}

setAnchorPeerфункциональный анализ

Роль функции — установить точку привязки для каждой организации в канале, а команда для настройки и обновления узла привязки находится в setAnchorPeer.sh (которую нужно запустить в контейнере).

setAnchorPeer() {
    
    
  ORG=$1
  # 在setAnchorPeer.sh脚本中配置和更新锚节点
  docker exec cli ./scripts/setAnchorPeer.sh $ORG $CHANNEL_NAME 
}

Давайте посмотрим на скрипт scripts/setAnchorPeer.sh: в основном три шага)
Давайте посмотрим на конкретную реализацию функции:
вставьте сюда описание изображения

# 注意:这必须在 CLI 容器中运行,因为它需要 jq 和 configtxlator
createAnchorPeerUpdate() {
    
    
  infoln "Fetching channel config for channel $CHANNEL_NAME"
  #  fetchChannelConfig在scripts/configUpdate.sh脚本中定义,将给定通道的当前道配置信息写入 JSON 文件
  fetchChannelConfig $ORG $CHANNEL_NAME ${CORE_PEER_LOCALMSPID}config.json

  infoln "Generating anchor peer update transaction for Org${ORG} on channel $CHANNEL_NAME"
# 选择是哪一个组织
  if [ $ORG -eq 1 ]; then
    HOST="peer0.org1.example.com"
    PORT=7051
  elif [ $ORG -eq 2 ]; then
    HOST="peer0.org2.example.com"
    PORT=9051
  elif [ $ORG -eq 3 ]; then
    HOST="peer0.org3.example.com"
    PORT=11051
  else
    errorln "Org${ORG} unknown"
  fi

  set -x
  # 修改配置增加锚节点
  jq '.channel_group.groups.Application.groups.'${CORE_PEER_LOCALMSPID}'.values += {"AnchorPeers":{"mod_policy": "Admins","value":{"anchor_peers": [{"host": "'$HOST'","port": '$PORT'}]},"version": "0"}}' ${CORE_PEER_LOCALMSPID}config.json > ${CORE_PEER_LOCALMSPID}modified_config.json
  {
    
     set +x; } 2>/dev/null

  # createConfigUpdate在scripts/configUpdate.sh脚本中定义,用于生成配置更新文件
  # 根据 {orgmsp}config.json 和 {orgmsp}modified_config.json两者之间的差异计算配置更新
  #,将其作为交易写入 {orgmsp}anchors.tx
  createConfigUpdate ${CHANNEL_NAME} ${CORE_PEER_LOCALMSPID}config.json ${CORE_PEER_LOCALMSPID}modified_config.json ${CORE_PEER_LOCALMSPID}anchors.tx
}
  #更新锚节点
  #peer channel update命令用于更新通道的配置信息,如组织、锚节点配置等
updateAnchorPeer() {
    
    
  peer channel update -o orderer.example.com:7050 --ordererTLSHostnameOverride orderer.example.com -c $CHANNEL_NAME -f ${CORE_PEER_LOCALMSPID}anchors.tx --tls --cafile $ORDERER_CA >&log.txt
  res=$?
  cat log.txt
  verifyResult $res "Anchor peer update failed"
  successln "Anchor peer set for org '$CORE_PEER_LOCALMSPID' on channel '$CHANNEL_NAME'"
}

На этом создание канала и присоединение к каналу завершены.

Guess you like

Origin blog.csdn.net/weixin_45213317/article/details/129343025