分类: 服务器与存储
2018-05-23 23:06:19
1 客户端通过命令行方式发送请求道Peer节点(一个或多个)
2 peer节点分别验证(背书)和执行模拟交易(通过chaincode,但是并不将执行结果提交到本地的账本中)
3 参与背书的peer将执行结果(包括自身对背书结果的签名)返回给客户端
4 客户端收到各个Peer的应答后,打包到一起组成一个交易并签名,发送给Orderer
内部后续操作:
1 共识:Orderer对接收到的交易进行排序共识,然后按照区块生成策略,将一批交易打包到一起,生成新的区块,在orderer本地更新ledger
2 同步:orderer执行完共识后,通过初始注册的消息通道分发给给各个已注册的Peer节点,
3 交易校验:Peer节点收到区块后,会对区块中的每笔交易进行校验,检查交易依赖的输入输出是否符合当前区块链的状态,完成后将区块写入账本,并修改K-V状态(state)数据
数据发起端,cli通过命令行执行peer命令去完成操作,客户端只需过段时间查询操作结果即可(其中包括到PEER验证应答后提交数据到Orderer)
Peer节点功能:
a.接收cli数据请求,b.验证数据(背书),c.模拟交易(peer的子服务chaincode), d.返回给cli
Orderer服务又叫共识服务,目的是将各个peer节点的数据请求进行排序共识,保证数据的唯一性,然后在Orderer更新账本,并将更新内容(block)发送给各个连接的peer节点,使peer更新各自的本地账本
在fabric源码的examples中有e2e_cli,所有的部署、初始化都通过脚本和配置文件配置完成,只需要通过network_setup.sh(后续详讲)执行up/down即可完成部署和卸载。在部署之前需要完成所需docker镜像的下载。具体步骤参考:
http://www.cnblogs.com/studyzy/p/7437157.html
数据验证是通过docker命令进入cli的服务中,执行peer相关的各项命令,包括通知orderer服务channel创建,各个模块间通信的建立,各个peer下chaincode服务的创建、调用peer的chaincode指令,执行各项数据操作等(后续在script.sh中详讲)。等实例中各项模块初始化完成后,即可通过初始化账户,查询账户,交易等方式来验证数据的流通性和准确性了。
这一步工作主要是通过工具生成各个模块所需的文件,然后执行Docker配置,进行docker和本地文件共享目录,生成容器,执行各个模块容器中服务。然后通过cli容器中调用peer指令模拟客户端请求执行测试
请结合github上下载的frbric/examples/e2e_cli源码阅读
network_setup.sh执行up后,先执行generateArtifacts.sh脚本,用于生成crypto-config和channel-artifacts目录及其相关文件。然后在通过docker-compose工具以及docker-compose-cli.yaml配置文件,创建各个模块的容器,并启动各项服务
3.2.1.1 调用generateArtifacts.sh 3.2.1.1.1 generateCertsa. 通过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 生成cli,peer,orderer所需使用的证书、密钥。生成的密钥存储于crypty-config目录中,分为orderer和peer所两类使用的两类(参考)
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.block,在channel-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. peer和channel绑定
(1)Updating anchor peers for org1...
updateAnchorPeers 0
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/ Org1MSPanchors.tx
(2)Updating 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.com 和 peer1.org2.example.com 初始化各自的chaincode服务
(1)Installing chaincode on org1/peer0...
installChaincode 0
chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
其中-p参数指向的是实现了Init和Invoke接口的go包
(2)Install chaincode on org2/peer2...
installChaincode 2
chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
其中-p参数指向的是实现了Init和Invoke接口的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发送交易请求,由a给b转账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.com的chaincode查询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步时,初始化的a和b账户余额分别为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"]}'
可以通过返回的打印日志即可验证此次交易是否完成
请后续熟悉源码后补充
Fabric源码根目录有能够生成各种目标文件的Make文件,我们最终目标是要能够生产可生产部署的peer镜像和orderer镜像,以及能够测试验证整个fabric的cli镜像(fabric-tools) 。
Makefile文件:
在fabric源目录下执行make peer。会发现要生成peer需要先下载chaintool工具,在Makefile L190:
执行期间打印如下:
发现这个任务是永远完成不了的,此时手动打开
chaintool
会提示404目标找不到。 其实目标文件是:
。
另一种方式,我们下载fabric-chaintool源码到Hyperledger目录下,手动编译该源码,生成chaintool工具:
生成目标文件chaintool到target目录,然后拷贝chaintool到fabric/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相关使用方法
编译完成后,在build/bin/orderer下即可看到可执行的orderer文件。同时我们也可以直接进到orderer目录下,执行go build,生成orderer到当前目录
为了验证新修改的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镜像编译完成
为了验证新修改的orderer已经成功编译部署, 可以在orderer模块的main.go函数中添加如下代码:
Import “time”
此时执行docker images查看镜像,可以看到orderer images已经成了最新的了:
版本号可以通过 makefile中BASE_VERSION变量进行控制。然后执行实例开头的network_setup.sh up,等环境启动完成后,执行命令:
docker logs orderer.example.com -f
发现我们在orderer模块的main函数添加的打印函数已经生效了,至此orderer镜像编译完成
执行完 make tools-docker后,执行docker images 查看:
这个image就是network_setup.sh用于生成cli 测试客户端的基础镜像
Makefile中的make release我们已经在network_setup.sh一开始的时候已经执行过,就是依照当前源码,生产可执行的peer,orderer,configtxgen,cryptogen 四个可执行文件到release/linux-amd64/bin目录:
make release-all和 make release的区别是,前者是生成多种平台的目标文件,后者仅仅生成当前平台所需要的目标文件。所以我们一般只需要执行make release即可
执行make release命令,只生成 :
而执行make release-all 会生成:
生成最新的docker image后,即可按照一开的e2e_cli实例步骤就可以验证我们修改后的peer和orderer服务的功能了
依照中配置的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.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下载时,目标文件网址无效导致
解决办法:通过http将maven下载到我们自己的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环境未安装
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-go到build/docker/gotools/bin即可(protoc-gen-go工具可通过源码后编译也可直接网上下载,有的golang安装包自带)