fabric里peer啟動(dòng)chaincode容器如何回訪peer

fabric里peer啟動(dòng)chaincode容器如何回訪peer

  1. peer如何啟動(dòng)chaincode

chaincode是在一個(gè)獨(dú)立的container里面啟動(dòng)的;整個(gè)過程由peer來完成;分如下幾步:

# core/container/dockercontroller/dockercontroller.go
# func (vm *DockerVM) Start(...)
  vm.stopInternal(client, containerName, 0, false, false)
  err = vm.createContainer(client, imageName, containerName, args, env, attachStdout)
  if err == docker.ErrNoSuchImage {
      reader, err := builder.Build()
      err = vm.deployImage(client, ccid, reader)
      err = vm.createContainer(client, imageName, containerName, args, env, attachStdout)
  }

  err = client.StartContainer(containerName, nil)
  1. 先發(fā)一個(gè)stop命令,不管原先是否存在,停止原來的container。
  2. 試圖創(chuàng)建container,如果失敗原因是image不存在(說明是第一個(gè)創(chuàng)建)
    2.1 編譯chaincode代碼
    2.2 生成chaincode的image
    2.3 重新創(chuàng)建container
  3. 啟動(dòng)container
  1. chaincode container的網(wǎng)絡(luò)

peer創(chuàng)建一個(gè)chaincode container之后這個(gè)container所屬的網(wǎng)絡(luò)是配置項(xiàng)(NetworkMode)決定的。
例如在docker-compose.yaml里面如下定義:

- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${COMPOSE_PROJECT_NAME}_byfn

如果沒有定義,那么缺省是"host"。 參見代碼:

# core/container/dockercontroller/dockercontroller.go
# func getDockerHostConfig()
    networkMode := viper.GetString(dockerKey("NetworkMode"))
    if networkMode == "" {
        networkMode = "host"
    }

所以這里我們可以定義是否讓chaincode和peer的container在同一個(gè)網(wǎng)絡(luò)里面。假設(shè)已知peer的網(wǎng)絡(luò)是net_byfn,那么只要把peer的環(huán)境變量CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE設(shè)成net_byfn,peer創(chuàng)建出來的chaincode的container的網(wǎng)絡(luò)也是net_byfn了,設(shè)置成其他值(或者不設(shè)置),則表示不在同一個(gè)網(wǎng)絡(luò)里面。

  1. chaincode如何回訪訪問peer

以golang的chaincode為例,container起來之后執(zhí)行的命令行是:

chaincode -peer.address=saturn:7052

這個(gè)命令是由peer設(shè)置提供的,參數(shù)peer.address就是告訴chaincode啟動(dòng)之后連接的peer的地址;這個(gè)地址是由peer產(chǎn)生出來的,規(guī)則是按如下順序:

  1. CORE_PEER_CHAINCODEADDRESS
  2. CORE_PEER_CHAINCODELISTENADDRESS
  3. peerAddr

參見:

# peer/node/start.go
# func computeChaincodeEndpoint(peerHostname string) (ccEndpoint string, err error)
  1. 添加主機(jī)域名

如果peer的地址(域名)在chaincode的container里面不可訪問,那么需要通過環(huán)境變量傳給chaincode container:

# CORE_VM_DOCKER_HOSTCONFIG_EXTRAHOSTS=<hostdomainname>:<ipaddress>
# For example
CORE_VM_DOCKER_HOSTCONFIG_EXTRAHOSTS=saturn:10.172.7.10
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容