一次跑通 fabric 小汽车例子

# 一次跑通 fabric 小汽车例子
<!-- ### 四月将尽又临暑假,两年光阴恍然醒悟。 -->


## Docker 部分
```
docker --version # 检测docker安装
sudo systemctl start docker # 启动守护程序
sudo usermod -a -G docker $USER # 添加当前用户到docker用户组
docker-compose --version # 检测docker-compose安装
```
上面没有出现问题Docker部分准备完成
## Golang 部分

```
go env # 查看golang环境变量
go env -w GOPROXY=https://goproxy.cn,direct # 更换go代理,也就是换国内源
```
一定要设置好GOPATH,GOROOT等相关变量。

## Java 部分
本次sdk采用fabric-gateway-java v1.4,这个库是fabric-java-sdk的高级库
```
sudo dnf install meavn
cd /etc/maven
code settings.xml # 把146行内容替换成下面的内容,更换为阿里源
maven -v # 检测是否安装成功
```
更换阿里源
```
<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 安装部分

```
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 # 使用最新发布版本 Fabric v2.1.0和Fabric CA v1.4.6和 Docker images v0.4.18
cd ../../
tree ./solo-dev-env -L 3
docker images
```
这个过程会很漫长主要是docker镜像安装预计有12G

docker一定要用国内源,否则等到死

##### 完成后目录和Docker镜像
目录
```
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 镜像

```
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

```

## 启动测试网
```
cd ~/src/solo-dev-env/$mypn/fabric-samples/test-network/
./network.sh up # 启动测试网络
./network.sh deployCC # 部署合约
./network.sh down #清理网络
```
上面应该不会出现什么问题,出现问题大多数是Dokcer权限和golang代理。

这些只是检测这个测试环境已经搭建好了,下面准备fabcar

## 启动fabcar

```
cd ~/src/solo-dev-env/$mypn/fabric-samples/fabcar
./startFabric.sh

```

## 创建Java项目

```
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
```
<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

```
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
```
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
```

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));
}

}
 
}

```

猜你喜欢

转载自www.cnblogs.com/Addoil/p/12806087.html