Chinaunix首页 | 论坛 | 博客
  • 博客访问: 67715
  • 博文数量: 13
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 115
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-21 15:04
个人简介

好好努力

文章存档

2018年(2)

2015年(11)

我的朋友

分类: 服务器与存储

2018-05-23 23:06:19

1 e2e_cli实例简介

1.1 流程简介

 1 客户端通过命令行方式发送请求道Peer节点(一个或多个)

      

 2 peer节点分别验证(背书)和执行模拟交易(通过chaincode,但是并不将执行结果提交到本地的账本中)

 

3 参与背书的peer将执行结果(包括自身对背书结果的签名)返回给客户端

 

4 客户端收到各个Peer的应答后,打包到一起组成一个交易并签名,发送给Orderer

 

内部后续操作:

 1 共识:Orderer对接收到的交易进行排序共识,然后按照区块生成策略,将一批交易打包到一起,生成新的区块,在orderer本地更新ledger

 

2 同步:orderer执行完共识后,通过初始注册的消息通道分发给给各个已注册的Peer节点,

3 交易校验:Peer节点收到区块后,会对区块中的每笔交易进行校验,检查交易依赖的输入输出是否符合当前区块链的状态,完成后将区块写入账本,并修改K-V状态(state)数据

1.2 e2e_cli实例构成

1.2.1 cli

数据发起端,cli通过命令行执行peer命令去完成操作,客户端只需过段时间查询操作结果即可(其中包括到PEER验证应答后提交数据到Orderer)

1.2.2 peer

Peer节点功能:

a.接收cli数据请求,b.验证数据(背书)c.模拟交易(peer的子服务chaincode),  d.返回给cli  

1.2.3 OrdererServer

Orderer服务又叫共识服务,目的是将各个peer节点的数据请求进行排序共识,保证数据的唯一性,然后在Orderer更新账本,并将更新内容(block)发送给各个连接的peer节点,使peer更新各自的本地账本

1.3 fabric实例部署

fabric源码的examples中有e2e_cli,所有的部署、初始化都通过脚本和配置文件配置完成,只需要通过network_setup.sh(后续详讲)执行up/down即可完成部署和卸载。在部署之前需要完成所需docker镜像的下载。具体步骤参考:

http://www.cnblogs.com/studyzy/p/7437157.html

1.4 fabric数据验证

数据验证是通过docker命令进入cli的服务中,执行peer相关的各项命令,包括通知orderer服务channel创建,各个模块间通信的建立,各个peerchaincode服务的创建、调用peerchaincode指令,执行各项数据操作等(后续在script.sh中详讲)。等实例中各项模块初始化完成后,即可通过初始化账户,查询账户,交易等方式来验证数据的流通性和准确性了。

2 fabric实例源码结构

3 fabric实例实现

3.1 视图

3.1.1实例搭建

这一步工作主要是通过工具生成各个模块所需的文件,然后执行Docker配置,进行docker和本地文件共享目录,生成容器,执行各个模块容器中服务。然后通过cli容器中调用peer指令模拟客户端请求执行测试

3.1.2执行图示

3.2 详解

请结合github上下载的frbric/examples/e2e_cli源码阅读

3.2.1 network_setup.sh up

network_setup.sh执行up后,先执行generateArtifacts.sh脚本,用于生成crypto-configchannel-artifacts目录及其相关文件。然后在通过docker-compose工具以及docker-compose-cli.yaml配置文件,创建各个模块的容器,并启动各项服务

3.2.1.1 调用generateArtifacts.sh 3.2.1.1.1 generateCerts

a. 通过make release 生成相关工具

目标文件

源码路径

作用

configtxgen

fabric/common/configtx/tool/configtxgen

用于生成配置文件

cryptogen

fabric/common/tools/cryptogen

用于生成安全密钥和证书

configtxlator

fabric/common/tools/configtxlator

 

orderer

fabric/orderer

共识服务的可执行程序

peer

fabric/peer

各个peer节点的服务,cli也使用此方法访问chaincode

 

,b.通过 cryptogen generate --config=./crypto-config.yaml 生成clipeerorderer所需使用的证书、密钥。生成的密钥存储于crypty-config目录中,分为ordererpeer所两类使用的两类(参考

3.2.1.1.2 replacePrivateKey

docker配置文件中需要使用到上一步生成私钥文件名进行替换,本实例没有用靠,可以不用考虑

 

3.2.1.1.3 generateChannelArtifacts

文件名称

作用

genesis.block

用于orderer创建创世区块

channel.tx

用于初始化orderer中实例交互的channel

Org1MSPanchors.tx

用于Org1中的各Peer加入channel

Org2MSPanchors.tx

用于Org1中的各Peer加入channel

 

a. configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.blockchannel-artifact中生成配置文件genesis.block,该配置文件是orderer容器服务启动后,通过共享目录访问genesis.block创建并初始化orderer中创世区块使用

 

b. configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAM,在channel-artifact中生成配置文件channel.block,该配置文件是当后续首次创建channel时的配置文件

 

c. configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP

-profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP,在channel-artifact中生成配置文件Org1MSPanchors.tx和Org2MSPanchors.tx,该配置文件是当后续将当前org中的各个peer加入到a中创建channel时的配置文件

 

3.2.1.2 调用docker-compose

执行 docker-compose  -f  docker-compose-cli.yaml命令,生成各类容器,并启动。

在该实例的docker-compose-cli.yaml配置中共创建并运行了5个容器:

3.2.1.2.1 order服务容器

container_name

orderer.example.com

image

hyperledger/fabric-orderer

environment

     - ORDERER_GENERAL_LOGLEVEL=debug

      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0

      - ORDERER_GENERAL_GENESISMETHOD=file

      - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block

      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP

      - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp

      - ORDERER_GENERAL_TLS_ENABLED=true

      - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key

      - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt

      - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]

working_dir

/opt/gopath/src/github.com/hyperledger/fabric

command

orderer

volumes

    - ../channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block

    - ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp

    - ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls

ports

    - 7050:7050

 

 

3.2.1.2.2 peer0.org1服务容器

container_name

peer0.org1.example.com

image

hyperledger/fabric-peer

environment

     - CORE_PEER_ID=peer0.org1.example.com

      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051

      - CORE_PEER_CHAINCODELISTENADDRESS=peer0.org1.example.com:7052

      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051

      - CORE_PEER_LOCALMSPID=Org1MSP

      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock

      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=e2ecli_default

      - CORE_LOGGING_LEVEL=DEBUG

      - CORE_PEER_TLS_ENABLED=true

      - CORE_PEER_GOSSIP_USELEADERELECTION=true

      - CORE_PEER_GOSSIP_ORGLEADER=false

      - CORE_PEER_PROFILE_ENABLED=true

      - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt

      - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key

      - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt

working_dir

/opt/gopath/src/github.com/hyperledger/fabric/peer

command

peer node start

volumes

        - /var/run/:/host/var/run/

        - ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp

        - ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls

ports

      - 7051:7051

      - 7052:7052

      - 7053:7053

 

3.2.1.2.3 peer1.org1服务容器

container_name

peer1.org1.example.com

image

hyperledger/fabric-peer

environment

     - CORE_PEER_ID=peer1.org1.example.com

      - CORE_PEER_ADDRESS=peer1.org1.example.com:7051

      - CORE_PEER_CHAINCODELISTENADDRESS=peer1.org1.example.com:7052

      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:7051

      - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.example.com:7051

      - CORE_PEER_LOCALMSPID=Org1MSP

      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=e2ecli_default

      - CORE_LOGGING_LEVEL=DEBUG

      - CORE_PEER_TLS_ENABLED=true

      - CORE_PEER_GOSSIP_USELEADERELECTION=true

      - CORE_PEER_GOSSIP_ORGLEADER=false

      - CORE_PEER_PROFILE_ENABLED=true

      - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt

      - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key

      - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt

working_dir

/opt/gopath/src/github.com/hyperledger/fabric/peer

command

peer node start

volumes

        - /var/run/:/host/var/run/

        - ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp:/etc/hyperledger/fabric/msp

        - ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls:/etc/hyperledger/fabric/tls

ports

      - 8051:7051

      - 8052:7052

      - 8053:7053

 

3.2.1.2.4 peer0.org2服务容器

container_name

peer0.org2.example.com

image

hyperledger/fabric-peer

environment

      - CORE_PEER_ID=peer0.org2.example.com

      - CORE_PEER_ADDRESS=peer0.org2.example.com:7051

      - CORE_PEER_CHAINCODELISTENADDRESS=peer0.org2.example.com:7052

      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:7051

      - CORE_PEER_LOCALMSPID=Org2MSP

      - CORE_PEER_LOCALMSPID=Org1MSP

      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=e2ecli_default

      - CORE_LOGGING_LEVEL=DEBUG

      - CORE_PEER_TLS_ENABLED=true

      - CORE_PEER_GOSSIP_USELEADERELECTION=true

      - CORE_PEER_GOSSIP_ORGLEADER=false

      - CORE_PEER_PROFILE_ENABLED=true

      - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt

      - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key

      - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt

working_dir

/opt/gopath/src/github.com/hyperledger/fabric/peer

command

peer node start

volumes

        - /var/run/:/host/var/run/

        - ../crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp:/etc/hyperledger/fabric/msp

        - ../crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls:/etc/hyperledger/fabric/tls

ports

      - 9051:7051

      - 9052:7052

      - 9053:7053

 

3.2.1.2.5  peer1.org2服务容器

container_name

peer1.org2.example.com

image

hyperledger/fabric-peer

environment

      - CORE_PEER_ID=peer1.org2.example.com

      - CORE_PEER_ADDRESS=peer1.org2.example.com:7051

      - CORE_PEER_CHAINCODELISTENADDRESS=peer1.org2.example.com:7052

      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org2.example.com:7051

      - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org2.example.com:7051

      - CORE_PEER_LOCALMSPID=Org2MSP

      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=e2ecli_default

      - CORE_LOGGING_LEVEL=DEBUG

      - CORE_PEER_TLS_ENABLED=true

      - CORE_PEER_GOSSIP_USELEADERELECTION=true

      - CORE_PEER_GOSSIP_ORGLEADER=false

      - CORE_PEER_PROFILE_ENABLED=true

      - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt

      - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key

      - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt

working_dir

/opt/gopath/src/github.com/hyperledger/fabric/peer

command

peer node start

volumes

        - /var/run/:/host/var/run/

        - ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp:/etc/hyperledger/fabric/msp

        - ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls:/etc/hyperledger/fabric/tls

ports

      - 10051:7051

      - 10052:7052

      - 10053:7053

 

3.2.1.2.6 cli客户端模拟容器

container_name

cli

image

hyperledger/fabric-tools

environment

      - GOPATH=/opt/gopath

      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock

      - CORE_LOGGING_LEVEL=DEBUG

      - CORE_PEER_ID=cli

      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051

      - CORE_PEER_LOCALMSPID=Org1MSP

      - CORE_PEER_TLS_ENABLED=true

      - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt

      - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key

      - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt

      - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp

working_dir

/opt/gopath/src/github.com/hyperledger/fabric/peer

command

/bin/bash -c './scripts/script.sh ${CHANNEL_NAME}; sleep $TIMEOUT'

volumes

        - /var/run/:/host/var/run/

        - ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go

        - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/

        - ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/

        - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts

depends_on

      - orderer.example.com

      - peer0.org1.example.com

      - peer1.org1.example.com

      - peer0.org2.example.com

      - peer1.org2.example.com

 

其他4个容器都是通过命令行直接启动服务。Cli容器是通过script.sh脚本启动测试用例,script.sh执行步骤:

a. 创建channel

createChannel

命令:

peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx

cli 通过调用peer命令,模拟SDK发送channel create请求到orderer服务端,orderer收到后,会通过请求中的channel.tx配置创建用于后续共识服务的channel

 

b. peer加到channel

joinChannel

命令:

    peer channel join -b $CHANNEL_NAME.block

peer加入到channel

 

c. peerchannel绑定

1Updating anchor peers for org1...

updateAnchorPeers 0

peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/ Org1MSPanchors.tx

2Updating anchor peers for org2...

updateAnchorPeers 2

peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/ Org2MSPanchors.tx

 

d. 初始化chaincode服务

peer0.org1.example.compeer1.org2.example.com 初始化各自的chaincode服务

1Installing chaincode on org1/peer0...

installChaincode 0

chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

其中-p参数指向的是实现了InitInvoke接口的go

 

2Install chaincode on org2/peer2...

installChaincode 2

chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

其中-p参数指向的是实现了InitInvoke接口的go

 

e. 初始化账户

通过某个peer初始化两个账户, 实例中是通过peer1.org2.example.com节点服务初始化

Instantiate chaincode on Peer2/Org2

instantiateChaincode 2

命令:

peer chaincode instantiate -o orderer.example.com:7050 -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR    ('Org1MSP.member','Org2MSP.member')"

 

 

f. 查询测试

Querying chaincode on org1/peer0...

chaincodeQuery 0 100

命令:

peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'

 

g. 交易测试

Sending invoke transaction on org1/peer0...

chaincodeInvoke 0

通过向peer0.org1发送交易请求,由ab转账10

命令: peer chaincode invoke -o orderer.example.com:7050 -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'

 

h. 初始化新的chaincode服务

peer2.org2.example.com 初始化chaincode服务

Installing chaincode on org2/peer3...

installChaincode 3

命令: chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

 

i.              验证交易

通过新创建的peer2.org2.example.comchaincode查询a账户是否还剩余90

Query on chaincode on Peer3/Org2, check if the result is 90

chaincodeQuery 3 90

命令:

peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'

 

j. 手动操作

在上述交易完成后,说明fabric的实例模型e2e_cli实例已经搭建完成,通过

docker exec -it cli bash

登录到cli容器内部,模拟客户端像peer发起交易请求:

peer chaincode invoke -o orderer.example.com:7050  --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem  -C mychannel -n mycc -c '{"Args":["invoke","a","b","20"]}'

a再向b转账20。 由于在第e步时,初始化的ab账户余额分别为100,200, 然后通过脚本执行的时候a转账给b数目为10,执行这一步之前应该是a:90, b:210

通过这一步执行后,应该是a:70, b:230。 接下来我们模拟客户端通过peer chaincode指令查询实际账户信息:

peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

peer chaincode query -C mychannel -n mycc -c '{"Args":["query","b"]}'

可以通过返回的打印日志即可验证此次交易是否完成

 

4 fabric源码结构

请后续熟悉源码后补充

 

5 fabric源码编译

Fabric源码根目录有能够生成各种目标文件的Make文件,我们最终目标是要能够生产可生产部署的peer镜像和orderer镜像,以及能够测试验证整个fabriccli镜像(fabric-tools)

Makefile文件:

5.1 make peer

fabric源目录下执行make peer。会发现要生成peer需要先下载chaintool工具,在Makefile L190

执行期间打印如下:

发现这个任务是永远完成不了的,此时手动打开

chaintool

会提示404目标找不到。 其实目标文件是:

另一种方式,我们下载fabric-chaintool源码到Hyperledger目录下,手动编译该源码,生成chaintool工具:

生成目标文件chaintooltarget目录,然后拷贝chaintoolfabric/build/bin目录下。然后将Makefile L190注释掉:

,此时再执行make peer

这个文件下载速度很慢,长久之计,我们下载好后,保存到我们自己的服务器,然后通过ftp直接下载最快:

修改build/image/javaenv/Dockerfile文件,添加

RUN wget ftp://192.168.13.201/%BC%BC%CA%F5%D6%D0%D0%C4/Hyperledyer/gradle-2.12-bin.zip --ftp-user=*** --ftp-password=***

RUN mv gradle-2.12-bin.zip /tmp/gradle-2.12-bin.zip:

修改后:

此时再执行make peer

至此peer可执行文件编译完成,生成到build/bin/目录下。

可以通过peer –help 查询peer相关使用方法

5.2 make orderer

编译完成后,在build/bin/orderer下即可看到可执行的orderer文件。同时我们也可以直接进到orderer目录下,执行go build,生成orderer到当前目录

 

 

 

 

 

5.3 make peer-docker

为了验证新修改的peer代码已经成功编译部署,可以在peer模块的main.go函数中添加如下代码:

Import “time”

然后执行 make peer-docker命令:

 

执行命令:docker images

network_setup.sh up,等环境启动完成后,执行命令:

docker logs peer0.org2.example.com  -f

发现我们在peer模块的main函数添加的打印函数已经生效了,至此orderer镜像编译完成

5.4 make orderer-docker

为了验证新修改的orderer已经成功编译部署,     可以在orderer模块的main.go函数中添加如下代码:

Import “time”

 

 

此时执行docker images查看镜像,可以看到orderer images已经成了最新的了:

版本号可以通过 makefileBASE_VERSION变量进行控制。然后执行实例开头的network_setup.sh up,等环境启动完成后,执行命令:

docker logs orderer.example.com -f

发现我们在orderer模块的main函数添加的打印函数已经生效了,至此orderer镜像编译完成

5.5 make tools-docker

执行完 make tools-docker后,执行docker images 查看:

这个image就是network_setup.sh用于生成cli 测试客户端的基础镜像

5.6 make release

Makefile中的make release我们已经在network_setup.sh一开始的时候已经执行过,就是依照当前源码,生产可执行的peer,orderer,configtxgen,cryptogen 四个可执行文件到release/linux-amd64/bin目录:

5.7 make release-all

make release-allmake release的区别是,前者是生成多种平台的目标文件,后者仅仅生成当前平台所需要的目标文件。所以我们一般只需要执行make release即可

执行make release命令,只生成 :

而执行make release-all 会生成:

      

5.8 完成

生成最新的docker image后,即可按照一开的e2e_cli实例步骤就可以验证我们修改后的peerorderer服务的功能了

6 源码编辑

依照中配置的golang开发环境并下载好源码编译后,我们接下来所要做的就是进行代码熟悉和改造,在代码基础上开发出符合我们要求的fabric项目。这里以golang中国网站推荐的LiteIDE为例,LiteIDE 是一款简单、开源、跨平台的 Go 语言 IDE。下载地址:

下载后,放到/root下,cd /root; 执行tar xjvf liteidex32.1.linux64-qt4.tar.bz2。 解压完成后,会生成/root/liteide目录,为liteide创建快捷命令:

ln -s /root/liteide/bin/liteide  /usr/local/bin/liteide

执行完成后, 在任何终端执行 liteide命令,即弹出编辑器:

      

7 其他

7.1参考链接

快速搭建一个Fabric 1.0的环境

Ubuntu16.04下Java环境安装与配置

7.2 相关问题

7.2.1 Make问题1

Step 7/15 : RUN mkdir -p /usr/share/maven /usr/share/maven/ref   && curl -fsSL | tar -xzC /usr/share/maven --strip-components=1   && ln -s /usr/share/maven/bin/mvn /usr/bin/mvn

 ---> Running in 45c0169b5377

curl: (22) The requested URL returned error: 404 Not Found

原因: 当通过make **-docker 执行编译并生产对应image的时候,会报404出错,是由于所要下载maven网址通过curl –fsSL下载时,目标文件网址无效导致

解决办法:通过httpmaven下载到我们自己的ftp服务器,然后修改build/image/Dockerfile

#RUN curl -fsSL (注释掉这一句)

RUN wget     ftp://192.168.13.201/技术中心/ Hyperledyer/apache-maven-3.3.9-bin.tar.gz --ftp-user=*** --ftp-password=***

RUN tar -xzvf apache-maven-$MAVEN_VERSION-bin.tar.gz -C /usr/share/maven --strip-components=1 \

  && ln -s /usr/share/maven/bin/mvn /usr/bin/mvn

重新make peer-docker即可

 

7.2.2 Make问题2./lein: 230 : type: java: 未找到

Leiningen coundn't find 'java' executable, which is required.

Please either set JAVA_CMD or put java (>=1.6) in your $PATH (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/go/bin:/snap/bin).

Makefile:22: recipe for target 'target/chaintool' failed

问题原因: java环境未安装

解决办法:Ubuntu16.04下Java环境安装与配置

 

7.2.3 Make问题3:ltdl.h: no such file or directory

问题原因:libtool中未安装ltdl

解决办法: apt install libltdl3-dev

7.2.4  protoc-gen-go找不到, 拷贝protoc-gen-gobuild/docker/gotools/bin即可(protoc-gen-go工具可通过源码后编译也可直接网上下载,有的golang安装包自带)

阅读(2943) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~