Centos 7 部署Hyperledger Fabric2.0并尝试使用fabric

其实该方法也基本适用于Ubuntu系统,区别在于CentOS用yum下载工具包,Ubuntu用apt-get下载工具包,用Ubuntu的小伙伴可灵活使用该方法

安装go语言环境到/usr/local下

wget链接获取来源链接https://studygolang.com/dl,如果以下wget命令失效请到以上网站获取或下载
打开终端,输入指令

1sudo wget -P /usr/local https://studygolang.com/dl/golang/go1.15.linux-amd64.tar.gz 2cd /usr/local 3sudo tar -zxvf go1.15.linux-amd64.tar.gz

添加环境变量

vi ~/.bashrc

将以下内容复制到bashrc文件中,按“I”插入,插入完成后按“ESC”退出插入,输出“:wq!”保存退出,如下图所示

1export GOROOT=/usr/local/go 2export PATH=$PATH:$GOROOT/bin 3export GOPATH=$HOME/go

source ~/.bashrc

验证go是否安装成功

go version

安装docker

1sudo yum install -y yum-utils 2sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 3yum makecache fast 4sudo yum -y install docker-ce

启动Docker-ce

1sudo systemctl start docker 2sudo systemctl enable docker

将当前用户添加到docker组中

sudo usermod -aG docker $USER

检查docker是否安装成功

docker -v

在这里插入图片描述

安装docker-compose

1curl -L https://get.daocloud.io/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > ~/docker-compose 2sudo mv ~/docker-compose /usr/local/bin/docker-compose 3chmod +x /usr/local/bin/docker-compose

查看docker是否安装成功

docker-compose -v

下载Hyperledger Fabric源码

安装git

1wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 2sudo rpm -ivh epel-release-latest-7.noarch.rpm 3sudo yum install -y git

下面第一条指令中yujialing为你的用户名

1cd /home/yujialing 2mkdir go 3mkdir go/src 4mkdir go/src/github.com 5mkdir go/src/github.com/hyperledger 6mkdir go/pkg 7mkdir go/bin 8cd go/src/github.com/hyperledger 9git clone https://github.com/hyperledger/fabric.git

下载速度还是很慢的小伙伴可以Ctrl+C结束以上github克隆进程,试下我的gitee仓库克隆,一样的

git clone https://gitee.com/yu_jialing/fabric.git

下载完成

1cd fabric 2git checkout release-2.0

编译并拉取docker镜像

1sudo yum install gcc 2make all

查看docker镜像

sudo docker images

下载Fabric的例程

1git clone https://github.com/hyperledger/fabric-samples.git 2git checkout v2.0.0

将编译后的可执行文件放入fabric-samples中

1cd fabric-samples 2cp -r build/bin fabric-samples

启动简单的联盟链网络

切换到first-network中的abstore智能合约文件中下载依赖并启动例程联盟链网络

1cd first-network/chaincode/abstore/go 2cd ~/go/src/github.com/hyperledger/fabric/fabric-samples/chaincode/fabcar/go 3go env -w GOPROXY=https://goproxy.io,direct 4go env -w GO111MODULE=on 5go mod vendor 6cd ../../.. 7cd first-network/ 8./byfn.sh up

出现END则表示网络启动成功,网络启动过程详情可以到first-network/scripts文件夹中的script.sh和utils.sh这两个脚本中查看

fabric-gateway-java2.0.0实现与hyperledger联盟链的交互

建立一个maven工程
在pom.xml中导入依赖

1<!-- hyperledger fabric2.0的java依赖 --> 2<dependency> 3 <groupId>org.hyperledger.fabric</groupId> 4 <artifactId>fabric-gateway-java</artifactId> 5 <version>2.0.0</version> 6</dependency>

回到虚拟机中将执行./byfn.sh up后生成的证书文件(在first-network文件夹下)复制到项目中的resources文件夹下

同时在resources文件夹下新建connection.json文件,用来放连接联盟链网络参数

查看IP地址,connection.json要用到

ifconfig env33

connection.json如下,里面涉及的IP地址是你开启区块链网络的主机地址,记得改下面的IP否则连接不上

1{ 2 "name": "basic-network", 3 "version": "1.0.0", 4 "client": { 5 "organization": "Org1", 6 "connection": { 7 "timeout": { 8 "peer": { 9 "endorser": "300" 10 }, 11 "orderer": "300" 12 } 13 } 14 }, 15 "channels": { 16 "mychannel": { 17 "orderers": [ 18 "orderer.example.com" 19 ], 20 "peers": { 21 "peer0.org1.example.com": { 22 "endorsingPeer": true, 23 "chaincodeQuery": true, 24 "ledgerQuery": true, 25 "eventSource": true 26 }, 27 "peer0.org2.example.com": { 28 "endorsingPeer": true, 29 "chaincodeQuery": true, 30 "ledgerQuery": true, 31 "eventSource": true 32 } 33 } 34 } 35 }, 36 "organizations": { 37 "Org1": { 38 "mspid": "Org1MSP", 39 "peers": [ 40 "peer0.org1.example.com" 41 ], 42 "certificateAuthorities": [ 43 "ca-org1" 44 ], 45 "adminPrivateKeyPEM": { 46 "path": "src/main/resources/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore/priv_sk" 47 }, 48 "signedCertPEM": { 49 "path": "src/main/resources/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem" 50 } 51 }, 52 "Org2": { 53 "mspid": "Org2MSP", 54 "peers": [ 55 "peer0.org2.example.com" 56 ], 57 "certificateAuthorities": [ 58 "ca-org2" 59 ], 60 "adminPrivateKeyPEM": { 61 "path": "src/main/resources/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/keystore/priv_sk" 62 }, 63 "signedCertPEM": { 64 "path": "src/main/resources/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/signcerts/Admin@org2.example.com-cert.pem" 65 } 66 } 67 }, 68 "orderers": { 69 "orderer.example.com": { 70 "url": "grpcs://192.168.171.xxx:7050", 71 "mspid": "OrdererMSP", 72 "grpcOptions": { 73 "ssl-target-name-override": "orderer.example.com", 74 "hostnameOverride": "orderer.example.com" 75 }, 76 "tlsCACerts": { 77 "path": "src/main/resources/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt" 78 }, 79 "adminPrivateKeyPEM": { 80 "path": "src/main/resources/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/keystore/priv_sk" 81 }, 82 "signedCertPEM": { 83 "path": "src/main/resources/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/signcerts/Admin@example.com-cert.pem" 84 } 85 } 86 }, 87 "peers": { 88 "peer0.org1.example.com": { 89 "url": "grpcs://192.168.171.xxx:7051", 90 "grpcOptions": { 91 "ssl-target-name-override": "peer0.org1.example.com", 92 "hostnameOverride": "peer0.org1.example.com", 93 "request-timeout": 120001 94 }, 95 "tlsCACerts": { 96 "path": "src/main/resources/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" 97 } 98 }, 99 "peer0.org2.example.com": { 100 "url": "grpcs://192.168.171.xxx:9051", 101 "grpcOptions": { 102 "ssl-target-name-override": "peer0.org2.example.com", 103 "hostnameOverride": "peer0.org2.example.com", 104 "request-timeout": 120001 105 }, 106 "tlsCACerts": { 107 "path": "src/main/resources/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" 108 } 109 } 110 }, 111 "certificateAuthorities": { 112 "ca-org1": { 113 "url": "https://192.168.171.xxx:7054", 114 "grpcOptions": { 115 "verify": true 116 }, 117 "tlsCACerts": { 118 "path": "src/main/resources/crypto-config/peerOrganizations/org1.example.com/ca/ca.org1.example.com-cert.pem" 119 }, 120 "registrar": [ 121 { 122 "enrollId": "admin", 123 "enrollSecret": "adminpw" 124 } 125 ] 126 }, 127 "ca-org2": { 128 "url": "https://192.168.171.xxx:8054", 129 "grpcOptions": { 130 "verify": true 131 }, 132 "tlsCACerts": { 133 "path": "src/main/resources/crypto-config/peerOrganizations/org2.example.com/ca/ca.org2.example.com-cert.pem" 134 }, 135 "registrar": [ 136 { 137 "enrollId": "admin", 138 "enrollSecret": "adminpw" 139 } 140 ] 141 } 142 } 143}

运行以下代码(随便命名demo.java就行)

1package com.scau.amops.hyperledger; 2 3import lombok.extern.slf4j.Slf4j; 4import org.hyperledger.fabric.gateway.*; 5import org.hyperledger.fabric.gateway.impl.GatewayImpl; 6import org.hyperledger.fabric.sdk.Peer; 7 8import java.io.IOException; 9import java.io.Reader; 10import java.nio.charset.StandardCharsets; 11import java.nio.file.Files; 12import java.nio.file.Path; 13import java.nio.file.Paths; 14import java.security.InvalidKeyException; 15import java.security.PrivateKey; 16import java.security.cert.CertificateException; 17import java.security.cert.X509Certificate; 18import java.util.EnumSet; 19/** 20 * <p> 21 * 超级账本DEMO 22 * </p> 23 */ 24@Slf4j 25public class demo{ 26 private Gateway gateway; 27 private Network network; 28 private static final Path NETWORK_CONFIG_PATH = Paths.get("src", "main", "resources", "connection.json"); 29 private static final Path credentialPath = Paths.get("src", "main","resources", "crypto-config", 30 "peerOrganizations", "org1.example.com", "users", "User1@org1.example.com", "msp"); 31 32 public static void main(String[] args) { 33 34 X509Certificate certificate = null; 35 PrivateKey privateKey = null; 36 Gateway gateway = null; 37 try { 38 //使用org1中的user1初始化一个网关wallet账户用于连接网络 39 Wallet wallet = Wallets.newInMemoryWallet(); 40 Path certificatePath = credentialPath.resolve(Paths.get("signcerts", "User1@org1.example.com-cert.pem")); 41 certificate = readX509Certificate(certificatePath); 42 43 Path privateKeyPath = credentialPath.resolve(Paths.get("keystore", "priv_sk")); 44 privateKey = getPrivateKey(privateKeyPath); 45 46 wallet.put("user",Identities.newX509Identity("Org1MSP",certificate,privateKey)); 47 48 //根据connection.json 获取Fabric网络连接对象 49 GatewayImpl.Builder builder = (GatewayImpl.Builder) Gateway.createBuilder(); 50 51 builder.identity(wallet, "user").networkConfig(NETWORK_CONFIG_PATH); 52 //连接网关 53 gateway = builder.connect(); 54 //获取mychannel通道 55 Network network = gateway.getNetwork("mychannel"); 56 //获取合约对象 57 Contract contract = network.getContract("mycc"); 58 //查询a的余额 59 byte[] queryAResultBefore = contract.evaluateTransaction("query","a"); 60 System.out.println("交易前:"+new String(queryAResultBefore, StandardCharsets.UTF_8)); 61 62 // a转50给b 63 byte[] invokeResult = contract.createTransaction("invoke") 64 .setEndorsingPeers(network.getChannel().getPeers(EnumSet.of(Peer.PeerRole.ENDORSING_PEER))) 65 .submit("a", "b", "50"); 66 System.out.println(new String(invokeResult, StandardCharsets.UTF_8)); 67 68 //查询交易结果 69 byte[] queryAResultAfter = contract.evaluateTransaction("query","a"); 70 System.out.println("交易后:"+new String(queryAResultAfter, StandardCharsets.UTF_8)); 71 72 } catch (Exception e) { 73 e.printStackTrace(); 74 } 75 76 } 77 78 private static X509Certificate readX509Certificate(final Path certificatePath) throws IOException, CertificateException { 79 try (Reader certificateReader = Files.newBufferedReader(certificatePath, StandardCharsets.UTF_8)) { 80 return Identities.readX509Certificate(certificateReader); 81 } 82 } 83 84 private static PrivateKey getPrivateKey(final Path privateKeyPath) throws IOException, InvalidKeyException { 85 try (Reader privateKeyReader = Files.newBufferedReader(privateKeyPath, StandardCharsets.UTF_8)) { 86 return Identities.readPrivateKey(privateKeyReader); 87 } 88 } 89}

运行结果显示
在这里插入图片描述
到虚拟机上查一查,a的余额的确变为40

1docker exec -it cli bash 2peer chaincode query -C mychannel -n mycc -c '{"Args":["query", "a"]}'

成功实现外部与联盟链网络交互

持续更新中!!!
(将更新:修改启动网络的脚本实现其他智能合约的应用)

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid