一次跑通 fabric 小汽车例子
一次跑通 fabric 小汽车例子
Docker 部分
1 2 3 4 | docker --version # 检测docker安装 sudo systemctl start docker # 启动守护程序 sudo usermod -a -G docker $USER # 添加当前用户到docker用户组 docker-compose --version # 检测docker-compose安装 |
上面没有出现问题Docker部分准备完成
Golang 部分
1 2 | go env # 查看golang环境变量 go env -w GOPROXY=https: //goproxy.cn,direct # 更换go代理,也就是换国内源 |
一定要设置好GOPATH,GOROOT等相关变量。
Java 部分
本次sdk采用fabric-gateway-java v1.4,这个库是fabric-java-sdk的高级库
1 2 3 4 | sudo dnf install maven cd /etc/maven code settings.xml # 把 146 行内容替换成下面的内容,更换为阿里源 mvn -v # 检测是否安装成功 |
更换阿里源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <mirrors> <!-- mirror | Specifies a repository mirror site to use instead of a given repository. The repository that | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used | for inheritance and direct lookup purposes, and must be unique across the set of mirrors. | <mirror> <id>mirrorId</id> <mirrorOf>repositoryId</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http: //my.repository.com/repo/path</url> </mirror> --> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http: //maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> |
fabric 安装部分
1 2 3 4 5 6 7 | cd ~ export mypn=ska # 这里设置一个环境变量,ska换成你自己的项目名 mkdir -p src/solo-dev-env/$mypn # 创建项目目录 cd ./src/solo-dev-env/$mypn # 进入目录, curl -sSL https: //bit.ly/2ysbOFE | bash # 使用最新发布版本 <br>cd ../../ tree ./solo-dev-env -L 3 docker images |
这个过程会很漫长主要是docker镜像安装预计有12G
docker一定要用国内源,否则等到死
如果执行 网络安装错误可以执行下面步骤
# 如果出错,复制附录内容,在文章目录, #执行 code bootstrap.sh 把内容粘贴进去,然后保存, #然后执行 sudo chmod +x ./bootstrap.sh 执行脚本 ./bootstrap.sh # 完整如下 cd ~ export mypn=ska # 这里设置一个环境变量,ska换成你自己的项目名 mkdir -p src/solo-dev-env/$mypn # 创建项目目录 cd ./src/solo-dev-env/$mypn # 进入目录 # 上面是之前操作的,不用执行了,直接执行下面部分 code bootstrap.sh # 复制附录内容保存。 sudo chmod +x ./bootstrap.sh ./bootstrap.sh cd ../../ tree ./solo-dev-env -L 3 docker images
目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | solo-dev-env/ └── ska ├── fabric-samples ---------------------------------> clone 的仓库 │ ├── bin ---------------------------------> 下载的二进制文件都在里面 │ ├── chaincode │ ├── chaincode-docker-devmode │ ├── ci │ ├── CODE_OF_CONDUCT.md │ ├── CODEOWNERS │ ├── commercial-paper │ ├── config │ ├── CONTRIBUTING.md │ ├── fabcar ---------------------------------> 要跑的例子使用的是测试网 │ ├── first-network -----------------------------> 被淘汰的例子 │ ├── high-throughput │ ├── interest_rate_swaps │ ├── LICENSE │ ├── MAINTAINERS.md │ ├── off_chain_data │ ├── README.md │ ├── SECURITY.md │ └── test-network -----------------------------> 新出的测试网 |
Docker 镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | REPOSITORY TAG IMAGE ID CREATED SIZE hyperledger/fabric-tools 2.1 bf6ec47ac5fd 8 days ago 522MB hyperledger/fabric-tools 2.1 . 0 bf6ec47ac5fd 8 days ago 522MB hyperledger/fabric-tools latest bf6ec47ac5fd 8 days ago 522MB hyperledger/fabric-peer 2.1 4136ba27e279 8 days ago 56 .6MB hyperledger/fabric-peer 2.1 . 0 4136ba27e279 8 days ago 56 .6MB hyperledger/fabric-peer latest 4136ba27e279 8 days ago 56 .6MB hyperledger/fabric-orderer 2.1 af4fdf2df06c 8 days ago 39 .4MB hyperledger/fabric-orderer 2.1 . 0 af4fdf2df06c 8 days ago 39 .4MB hyperledger/fabric-orderer latest af4fdf2df06c 8 days ago 39 .4MB hyperledger/fabric-ccenv 2.1 eefa22c7b7e7 8 days ago 554MB hyperledger/fabric-ccenv 2.1 . 0 eefa22c7b7e7 8 days ago 554MB hyperledger/fabric-ccenv latest eefa22c7b7e7 8 days ago 554MB hyperledger/fabric-baseos 2.1 52bb8d969801 8 days ago 6 .94MB hyperledger/fabric-baseos 2.1 . 0 52bb8d969801 8 days ago 6 .94MB hyperledger/fabric-baseos latest 52bb8d969801 8 days ago 6 .94MB hyperledger/fabric-nodeenv 2.1 8f2b5101881b 9 days ago 292MB hyperledger/fabric-nodeenv 2.1 . 0 8f2b5101881b 9 days ago 292MB hyperledger/fabric-nodeenv latest 8f2b5101881b 9 days ago 292MB hyperledger/fabric-javaenv 2.1 3e83cbc5b332 10 days ago 505MB hyperledger/fabric-javaenv 2.1 . 0 3e83cbc5b332 10 days ago 505MB hyperledger/fabric-javaenv latest 3e83cbc5b332 10 days ago 505MB hyperledger/fabric-ca 1.4 3b96a893c1e4 8 weeks ago 150MB hyperledger/fabric-ca 1.4 . 6 3b96a893c1e4 8 weeks ago 150MB hyperledger/fabric-ca latest 3b96a893c1e4 8 weeks ago 150MB hyperledger/fabric-tools 2.0 . 0 639ab50feac9 2 months ago 514MB hyperledger/fabric-zookeeper 0.4 ede9389347db 5 months ago 276MB hyperledger/fabric-zookeeper 0.4 . 18 ede9389347db 5 months ago 276MB hyperledger/fabric-zookeeper latest ede9389347db 5 months ago 276MB hyperledger/fabric-kafka 0.4 caaae0474ef2 5 months ago 270MB hyperledger/fabric-kafka 0.4 . 18 caaae0474ef2 5 months ago 270MB hyperledger/fabric-kafka latest caaae0474ef2 5 months ago 270MB hyperledger/fabric-couchdb 0.4 d369d4eaa0fd 5 months ago 261MB hyperledger/fabric-couchdb 0.4 . 18 d369d4eaa0fd 5 months ago 261MB hyperledger/fabric-couchdb latest d369d4eaa0fd 5 months ago 261MB hyperledger/fabric-couchdb 0.4 . 16 5a66d69b7d4d 6 months ago 261MB |
启动测试网
1 2 3 4 | cd ~/src/solo-dev-env/$mypn/fabric-samples/test-network/ ./network.sh up # 启动测试网络./network.sh createChannel # 创建通道,默认名字mychannel ./network.sh deployCC # 部署合约 ./network.sh down #清理网络 |
上面应该不会出现什么问题,出现问题大多数是Dokcer权限和golang代理。
这些只是检测这个测试环境已经搭建好了,下面准备fabcar
启动fabcar
1 2 | cd ~/src/solo-dev-env/$mypn/fabric-samples/fabcar ./startFabric.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | cd ~ mkdir -p src/java/MVN/project # 创建java项目目录 cd src/java/MVN/project mkdir github.com # 创建github库目录 cd github.com git clone -b release- 1.4 https: //github.com/hyperledger/fabric-gateway-java.git # clone 1.4 sdk cd fabric-gateway-java export ORG_HYPERLEDGER_FABRIC_SDK_CONNECTIONS_SSL_SSLPROVIDER=JDK # 设置SSL mvn install # 安装到本地仓库,可以在本地仓库 ~/.m2 中找到,安装好后就可以 Ctrl + C,不执行Test cd ../../ mvn archetype:generate # 创建mvn项目 7 # 模板版本 cn.edu.zzuli # 组ID fabricIecTest # 项目名 1.0 # 版本号 cn.edu.zzuli # 包名 cd ./fabricIecTest code pom.xml # 更改为下面内容 mvn clean cd ./src/main/java/cn/edu/zzuli code EnrollAdmin.java # 内容如下 code RegisterUser.java # 内容如下 code App.java # 内容如下 cd ../../../../../../../ code ./fabricIecTest # 执行这些代码 |
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <properties> <project.build.sourceEncoding>UTF- 8 </project.build.sourceEncoding> <!-- 标明版本号 --> <project.reporting.outputEncoding>UTF- 8 </project.reporting.outputEncoding> <java.version> 1.8 </java.version> <maven.compiler.source> 1.8 </maven.compiler.source> <maven.compiler.target> 1.8 </maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version> 3.8 . 1 </version> <scope>test</scope> </dependency> <!-- 添加依赖 --> <dependency> <groupId>org.hyperledger.fabric</groupId> <artifactId>fabric-gateway-java</artifactId> <version> 1.4 . 2 </version> </dependency> </dependencies> |
EnrollAdmin.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | package cn.edu.zzuli; import java.nio.file.Paths; import java.util.Properties; import org.hyperledger.fabric.gateway.Wallet; import org.hyperledger.fabric.gateway.Wallet.Identity; import org.hyperledger.fabric.sdk.Enrollment; import org.hyperledger.fabric.sdk.security.CryptoSuite; import org.hyperledger.fabric.sdk.security.CryptoSuiteFactory; import org.hyperledger.fabric_ca.sdk.EnrollmentRequest; import org.hyperledger.fabric_ca.sdk.HFCAClient; public class EnrollAdmin { static { System.setProperty( "org.hyperledger.fabric.sdk.service_discovery.as_localhost" , "true" ); } public static void main(String[] args) throws Exception { // Create a CA client for interacting with the CA. Properties props = new Properties(); // 注意带 $ 变量 props.put( "pemFile" , "/home/$USER/src/solo-dev-env/$mypn/fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/ca/ca.org1.example.com-cert.pem" ); props.put( "allowAllHostNames" , "true" ); HFCAClient caClient = HFCAClient.createNewInstance( "https://localhost:7054" , props); CryptoSuite cryptoSuite = CryptoSuiteFactory.getDefault().getCryptoSuite(); caClient.setCryptoSuite(cryptoSuite); // Create a wallet for managing identities Wallet wallet = Wallet.createFileSystemWallet(Paths.get( "wallet" )); // Check to see if we've already enrolled the admin user. boolean adminExists = wallet.exists( "admin" ); if (adminExists) { System.out.println( "An identity for the admin user \"admin\" already exists in the wallet" ); return ; } // Enroll the admin user, and import the new identity into the wallet. final EnrollmentRequest enrollmentRequestTLS = new EnrollmentRequest(); enrollmentRequestTLS.addHost( "localhost" ); enrollmentRequestTLS.setProfile( "tls" ); Enrollment enrollment = caClient.enroll( "admin" , "adminpw" , enrollmentRequestTLS); Identity user = Identity.createIdentity( "Org1MSP" , enrollment.getCert(), enrollment.getKey()); wallet.put( "admin" , user); System.out.println( "Successfully enrolled user \"admin\" and imported it into the wallet" ); } } |
RegisterUser.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | package cn.edu.zzuli; import java.nio.file.Paths; import java.security.PrivateKey; import java.util.Properties; import java.util.Set; import org.hyperledger.fabric.gateway.Wallet; import org.hyperledger.fabric.gateway.Wallet.Identity; import org.hyperledger.fabric.sdk.Enrollment; import org.hyperledger.fabric.sdk.User; import org.hyperledger.fabric.sdk.security.CryptoSuite; import org.hyperledger.fabric.sdk.security.CryptoSuiteFactory; import org.hyperledger.fabric_ca.sdk.HFCAClient; import org.hyperledger.fabric_ca.sdk.RegistrationRequest; public class RegisterUser { static { System.setProperty( "org.hyperledger.fabric.sdk.service_discovery.as_localhost" , "true" ); } public static void main(String[] args) throws Exception { //创建用于与CA进行交互的CA客户端。 Properties props = new Properties(); // 注意带 $ 变量 props.put( "pemFile" , "/home/$USER/src/solo-dev-env/$mypn/fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/ca/ca.org1.example.com-cert.pem" ); props.put( "allowAllHostNames" , "true" ); HFCAClient caClient = HFCAClient.createNewInstance( "https://localhost:7054" , props); CryptoSuite cryptoSuite = CryptoSuiteFactory.getDefault().getCryptoSuite(); caClient.setCryptoSuite(cryptoSuite); // 创建一个用于管理身份的钱包 Wallet wallet = Wallet.createFileSystemWallet(Paths.get( "wallet" )); // 检查我们是否已经注册了该用户。 boolean userExists = wallet.exists( "appUser" ); if (userExists) { System.out.println( "An identity for the user \"appUser\" already exists in the wallet" ); return ; } userExists = wallet.exists( "admin" ); if (!userExists) { System.out.println( "\"admin\" needs to be enrolled and added to the wallet first" ); return ; } Identity adminIdentity = wallet.get( "admin" ); User admin = new User() { @Override public String getName() { return "admin" ; } @Override public Set<String> getRoles() { return null ; } @Override public String getAccount() { return null ; } @Override public String getAffiliation() { return "org1.department1" ; } @Override public Enrollment getEnrollment() { return new Enrollment() { @Override public PrivateKey getKey() { return adminIdentity.getPrivateKey(); } @Override public String getCert() { return adminIdentity.getCertificate(); } }; } @Override public String getMspId() { return "Org1MSP" ; } }; // 注册用户,加入用户,并将新身份导入钱包。 RegistrationRequest registrationRequest = new RegistrationRequest( "appUser" ); registrationRequest.setAffiliation( "org1.department1" ); registrationRequest.setEnrollmentID( "appUser" ); String enrollmentSecret = caClient.register(registrationRequest, admin); Enrollment enrollment = caClient.enroll( "appUser" , enrollmentSecret); Identity user = Identity.createIdentity( "Org1MSP" , enrollment.getCert(), enrollment.getKey()); wallet.put( "appUser" , user); System.out.println( "Successfully enrolled user \"appUser\" and imported it into the wallet" ); } } |
App.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | package cn.edu.zzuli; import java.nio.file.Path; import java.nio.file.Paths; import org.hyperledger.fabric.gateway.Contract; import org.hyperledger.fabric.gateway.Gateway; import org.hyperledger.fabric.gateway.Network; import org.hyperledger.fabric.gateway.Wallet; /** * Hello world! * */ public class App { static { System.setProperty( "org.hyperledger.fabric.sdk.service_discovery.as_localhost" , "true" ); } public static void main( String[] args ) throws Exception { // Load a file system based wallet for managing identities. Path walletPath = Paths.get( "wallet" ); Wallet wallet = Wallet.createFileSystemWallet(walletPath); // 注意带 $ 的变量 String yamlPath = "/home/$USER/src/solo-dev-env/$mypn/fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/connection-org1.yaml" ; Path networkConfigPath = Paths.get(yamlPath); Gateway.Builder builder = Gateway.createBuilder(); builder.identity(wallet, "appUser" ).networkConfig(networkConfigPath).discovery( true ); // create a gateway connection try (Gateway gateway = builder.connect()) { // get the network and contract Network network = gateway.getNetwork( "mychannel" ); Contract contract = network.getContract( "fabcar" ); byte [] result; result = contract.evaluateTransaction( "queryAllCars" ); System.out.println( new String(result)); contract.submitTransaction( "createCar" , "CAR10" , "VW" , "Polo" , "Grey" , "Mary" ); result = contract.evaluateTransaction( "queryCar" , "CAR10" ); System.out.println( new String(result)); contract.submitTransaction( "changeCarOwner" , "CAR10" , "Archie" ); result = contract.evaluateTransaction( "queryCar" , "CAR10" ); System.out.println( new String(result)); } } } |
附录
bootstrap.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 | #!/bin/bash # # Copyright IBM Corp. All Rights Reserved. # # SPDX-License-Identifier: Apache- 2.0 # # if version not passed in, default to latest released version VERSION= 2.1 . 0 # if ca version not passed in, default to latest released version CA_VERSION= 1.4 . 6 # current version of thirdparty images (couchdb, kafka and zookeeper) released THIRDPARTY_IMAGE_VERSION= 0.4 . 18 ARCH=$(echo "$(uname -s|tr '[:upper:]' '[:lower:]'|sed 's/mingw64_nt.*/windows/')-$(uname -m | sed 's/x86_64/amd64/g')" ) MARCH=$(uname -m) printHelp() { echo "Usage: bootstrap.sh [version [ca_version [thirdparty_version]]] [options]" echo echo "options:" echo "-h : this help" echo "-d : bypass docker image download" echo "-s : bypass fabric-samples repo clone" echo "-b : bypass download of platform-specific binaries" echo echo "e.g. bootstrap.sh 2.1.0 1.4.6 0.4.18 -s" echo "would download docker images and binaries for Fabric v2.1.0 and Fabric CA v1.4.6" } # dockerPull() pulls docker images from fabric and chaincode repositories # note, if a docker image doesn't exist for a requested release, it will simply # be skipped, since this script doesn't terminate upon errors. dockerPull() { #three_digit_image_tag is passed in, e.g. "1.4.6" three_digit_image_tag=$ 1 shift #two_digit_image_tag is derived, e.g. "1.4" , especially useful as a local tag for two digit references to most recent baseos, ccenv, javaenv, nodeenv patch releases two_digit_image_tag=$(echo $three_digit_image_tag | cut -d '.' -f1, 2 ) while [[ $# -gt 0 ]] do image_name= "$1" echo "====> hyperledger/fabric-$image_name:$three_digit_image_tag" docker pull "hyperledger/fabric-$image_name:$three_digit_image_tag" docker tag "hyperledger/fabric-$image_name:$three_digit_image_tag" "hyperledger/fabric-$image_name" docker tag "hyperledger/fabric-$image_name:$three_digit_image_tag" "hyperledger/fabric-$image_name:$two_digit_image_tag" shift done } cloneSamplesRepo() { # clone ( if needed) hyperledger/fabric-samples and checkout corresponding # version to the binaries and docker images to be downloaded if [ -d first-network ]; then # if we are in the fabric-samples repo, checkout corresponding version echo "===> Checking out v${VERSION} of hyperledger/fabric-samples" git checkout v${VERSION} elif [ -d fabric-samples ]; then # if fabric-samples repo already cloned and in current directory, # cd fabric-samples and checkout corresponding version echo "===> Checking out v${VERSION} of hyperledger/fabric-samples" cd fabric-samples && git checkout v${VERSION} else echo "===> Cloning hyperledger/fabric-samples repo and checkout v${VERSION}" git clone -b master https: //github.com/hyperledger/fabric-samples.git && cd fabric-samples && git checkout v${VERSION} fi } # This will download the .tar.gz download() { local BINARY_FILE=$ 1 local URL=$ 2 echo "===> Downloading: " "${URL}" curl -L --retry 5 --retry-delay 3 "${URL}" | tar xz || rc=$? if [ -n "$rc" ]; then echo "==> There was an error downloading the binary file." return 22 else echo "==> Done." fi } pullBinaries() { echo "===> Downloading version ${FABRIC_TAG} platform specific fabric binaries" download "${BINARY_FILE}" "https://github.com/hyperledger/fabric/releases/download/v${VERSION}/${BINARY_FILE}" if [ $? -eq 22 ]; then echo echo "------> ${FABRIC_TAG} platform specific fabric binary is not available to download <----" echo exit fi echo "===> Downloading version ${CA_TAG} platform specific fabric-ca-client binary" download "${CA_BINARY_FILE}" "https://github.com/hyperledger/fabric-ca/releases/download/v${CA_VERSION}/${CA_BINARY_FILE}" if [ $? -eq 22 ]; then echo echo "------> ${CA_TAG} fabric-ca-client binary is not available to download (Available from 1.1.0-rc1) <----" echo exit fi } pullDockerImages() { command -v docker >& /dev/ null NODOCKER=$? if [ "${NODOCKER}" == 0 ]; then FABRIC_IMAGES=(peer orderer ccenv tools) case "$VERSION" in 1 .*) FABRIC_IMAGES+=(javaenv) shift ;; 2 .*) FABRIC_IMAGES+=(nodeenv baseos javaenv) shift ;; esac echo "FABRIC_IMAGES:" "${FABRIC_IMAGES[@]}" echo "===> Pulling fabric Images" dockerPull "${FABRIC_TAG}" "${FABRIC_IMAGES[@]}" echo "===> Pulling fabric ca Image" CA_IMAGE=(ca) dockerPull "${CA_TAG}" "${CA_IMAGE[@]}" echo "===> Pulling thirdparty docker images" THIRDPARTY_IMAGES=(zookeeper kafka couchdb) dockerPull "${THIRDPARTY_TAG}" "${THIRDPARTY_IMAGES[@]}" echo echo "===> List out hyperledger docker images" docker images | grep hyperledger else echo "=========================================================" echo "Docker not installed, bypassing download of Fabric images" echo "=========================================================" fi } DOCKER= true SAMPLES= true BINARIES= true # Parse commandline args pull out # version and/or ca-version strings first if [ -n "$1" ] && [ "${1:0:1}" != "-" ]; then VERSION=$ 1 ;shift if [ -n "$1" ] && [ "${1:0:1}" != "-" ]; then CA_VERSION=$ 1 ;shift if [ -n "$1" ] && [ "${1:0:1}" != "-" ]; then THIRDPARTY_IMAGE_VERSION=$ 1 ;shift fi fi fi # prior to 1.2 . 0 architecture was determined by uname -m if [[ $VERSION =~ ^ 1 \.[ 0 - 1 ]\.* ]]; then export FABRIC_TAG=${MARCH}-${VERSION} export CA_TAG=${MARCH}-${CA_VERSION} export THIRDPARTY_TAG=${MARCH}-${THIRDPARTY_IMAGE_VERSION} else # starting with 1.2 . 0 , multi-arch images will be default : "${CA_TAG:=" $CA_VERSION "}" : "${FABRIC_TAG:=" $VERSION "}" : "${THIRDPARTY_TAG:=" $THIRDPARTY_IMAGE_VERSION "}" fi BINARY_FILE=hyperledger-fabric-${ARCH}-${VERSION}.tar.gz CA_BINARY_FILE=hyperledger-fabric-ca-${ARCH}-${CA_VERSION}.tar.gz # then parse opts while getopts "h?dsb" opt; do case "$opt" in h|\?) printHelp exit 0 ;; d) DOCKER= false ;; s) SAMPLES= false ;; b) BINARIES= false ;; esac done if [ "$SAMPLES" == "true" ]; then echo echo "Clone hyperledger/fabric-samples repo" echo cloneSamplesRepo fi if [ "$BINARIES" == "true" ]; then echo echo "Pull Hyperledger Fabric binaries" echo pullBinaries fi if [ "$DOCKER" == "true" ]; then echo echo "Pull Hyperledger Fabric docker images" echo pullDockerImages fi |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥