hyperledger fabric1.0部署实操 一

 

我操做的系统环境是ubuntu16.04,若是你的系统是windows,先安装一个virtualbox。javascript

1  oracle virtual Box 5.1.26安装配置

1.1 虚拟机安装

一、新建{名字:超级帐本1.0;linux;ubuntu桌面版16,0.4  64bit}     --64位须要更改bios以支持虚拟化,事先下好ubuntu镜像;java

二、份内存2G,建立虚拟硬盘,文件类型选VDI模式,把文件设置为保存在E盘,分上20G以上;node

三、开始安装ubuntu,我用到版本是16.4桌面版,选中文简体,勾选“安装ubuntu是下载更新”,选择“其余选项”,本身手工设置分区;python

四、分区的设置:分给交换分区500m,分给/boot300m,其余的都分给/根目录,其中根目录是主分区,其余逻辑分区;linux

五、时区选上海,语言默认汉语便可;ios

1.2 共享粘贴板、共享文件夹的设置

1)运行 设备-安装加强功能git

2)设备-共享粘帖板,选择双向github

---重启系统,加强功能生效golang

3)设备-共享文件夹,点选右侧增长按钮添加共享文件夹,在弹出框设置以下:docker

l 共享文件夹路径,选“其余”,而后选择你本机的共享文件夹(例如个人D:\share);

l 勾选“固定分配”;

mkdir /mnt/share/
sudo mount -t vboxsf share /mnt/share/

1.3 ssh配置

sudo apt-get install openssh-server

2  hyperdeger fabric1.0安装

登录你刚装好的virtualbox,先配置环境:

lsb_release -a  (查询本身系统的版本号,个人是xenial,下面找源的时候要对应上)
cp /etc/apt/sources.list /etc/apt/sources.list.bak
vim  /etc/apt/sources.list

修改源内容(彻底替换掉就内容):

先清空旧的内容,在命令模式下输入:

ggdG

而后切换到插入模式拷贝如下内容粘贴过去(输入i便可切换到输入模式,按esc键切换回命令模式,在命令模式输入:wq进行保存):

#deb包
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse  
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse  
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse  
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse  
##测试版源  
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse  
# 源码   
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse  
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse  
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse  
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse  
##测试版源  
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse

修改DNS:

sudo vim /etc/resolvconf/resolv.conf.d/base
nameserver 202.96.134.133
nameserver 8.8.8.8
sudo resolvconf -u

更新源:

sudo apt update

安装crul:

sudo apt install curl

若是git默认没有安装也执行安装:

sudo apt install git

设置git参数:

git config --global http.postBuffer 524288000

2.1 配置docker

从daocloud安装docker:

curl -sSL https://get.daocloud.io/docker | sh

添加当前用户到docker:

sudo usermod -aG docker zpc
sudo gpasswd -a zpc docker
newgrp - docker

修改 Docker 服务配置:

sudo vim /etc/default/docker     
添加
DOCKER_OPTS="$DOCKER_OPTS -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --api-cors-header='*'"

设置国内Daocloud的Docker加速器地址:

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://8d37c888.m.daocloud.io
重启docker

sudo service docker restart

测试:

docker -v
docker pull hello-world
docker run hello-world

2.2 配置docker-compse

安装pip:

sudo apt-get install python-pip

修改权限:

su - zpc
sudo chmod +x /usr/local/bin/docker-compose

查看安装的版本:

docker-compose -v

2.3 安装配置GO

查看本地源中go的版本
apt-cache madison golang
若是版本低则手动从官网下载安装(当前是1.9)
wget --no-check-certificate https://studygolang.com/dl/golang/go1.9.2.linux-amd64.tar.gz
##若是此连接地址很差用换这个https://dl.gocn.io/golang/1.9.2/go1.9.2.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz
vi ~/.profile
export PATH=$PATH:/usr/local/go/bin 
export GOROOT=/usr/local/go 
export GOPATH=$HOME/go 
export PATH=$PATH:$HOME/go/bin

source ~/.profile
cd ~
mkdir go

go version

2.4 安装配置node、npm、cnpm

用nvm安装node与npm

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash
关闭重启终端
nvm ls-remote
nvm install v9.1.0

cnpm配置:

npm install -g cnpm --registry=https://registry.npm.taobao.org

2.5 下载fabric

mkdir -p ~/go/src/github.com/hyperledger
cd ~/go/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric.git      
cd ~/go/src/github.com/hyperledger/fabric
git init
git checkout -b v1.0.0

3 e2e_cli样例实操

e2e_cli是fabric下面的一个独立样例:与e2e_cli同级的还有

cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli/
下载fabric相关镜像:
source download-dockerimages.sh -c x86_64-1.0.0 -f x86_64-1.0.0

启动fabric

./network_setup.sh up

OK了以后,如下尝试一些简单操做:

另行打开一个命令行  

docker exec -it cli bash

查询A帐户余额

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

查询结果应该有90

把a帐户的余额再转20元给b帐户

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帐户看是否剩下70了

退出cli容器      
exit 
cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli
关闭fabric
./network_setup.sh down

用node客户端sdk在节点本地链接操做区块链

mkdir ~/nodeTest
cd ~/nodeTest
vi package.json

{ 
     "name": "nodeTest", 
     "version": "1.0.0", 
     "description": "Hyperledger Fabric Node SDK Test Application", 
     "scripts": { 
         "test": "echo \"Error: no test specified\" && exit 1" 
     }, 
     "dependencies": { 
         "fabric-ca-client": "^1.0.0", 
         "fabric-client": "^1.0.0" 
     }, 
     "author": "zpc", 
     "license": "Apache-2.0", 
     "keywords": [ 
         "Hyperledger", 
         "Fabric", 
         "Test", 
         "Application" 
     ] 
}
npm install --registry=https://registry.npm.taobao.org       (走国内淘宝的镜像)

vi query.js

'use strict';

var hfc = require('fabric-client'); 
var path = require('path'); 
var sdkUtils = require('fabric-client/lib/utils') 
var fs = require('fs'); 
var options = { 
    user_id: 'Admin@org1.example.com', 
    msp_id:'Org1MSP', 
    channel_id: 'mychannel', 
    chaincode_id: 'mycc',  
    network_url: 'grpcs://localhost:7051',//由于启用了TLS,因此是grpcs,若是没有启用TLS,那么就是grpc 
    privateKeyFolder:'/home/zpc/go/src/github.com/hyperledger/fabric/examples/e2e_cli/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore', 
    signedCert:'/home/zpc/go/src/github.com/hyperledger/fabric/examples/e2e_cli/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem', 
    tls_cacerts:'/home/zpc/go/src/github.com/hyperledger/fabric/examples/e2e_cli/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt', 
    server_hostname: "peer0.org1.example.com" 
};

var channel = {}; 
var client = null; 
const getKeyFilesInDir = (dir) => { 
//该函数用于找到keystore目录下的私钥文件的路径 
    var files = fs.readdirSync(dir) 
    var keyFiles = [] 
    files.forEach((file_name) => { 
        let filePath = path.join(dir, file_name) 
        if (file_name.endsWith('_sk')) { 
            keyFiles.push(filePath) 
        } 
    }) 
    return keyFiles 
} 
Promise.resolve().then(() => { 
    console.log("Load privateKey and signedCert"); 
    client = new hfc(); 
    var    createUserOpt = { 
                username: options.user_id, 
                 mspid: options.msp_id, 
                cryptoContent: { privateKey: getKeyFilesInDir(options.privateKeyFolder)[0], 
  signedCert: options.signedCert } 
        } 
//以上代码指定了当前用户的私钥,证书等基本信息 
return sdkUtils.newKeyValueStore({ 
                        path: "/tmp/fabric-client-stateStore/" 
                }).then((store) => { 
                        client.setStateStore(store) 
                         return client.createUser(createUserOpt) 
                 }) 
}).then((user) => { 
    channel = client.newChannel(options.channel_id); 
    
    let data = fs.readFileSync(options.tls_cacerts); 
    let peer = client.newPeer(options.network_url, 
         { 
            pem: Buffer.from(data).toString(), 
             'ssl-target-name-override': options.server_hostname 
        } 
    ); 
    peer.setName("peer0"); 
    //由于启用了TLS,因此上面的代码就是指定TLS的CA证书 
    channel.addPeer(peer); 
    return; 
}).then(() => { 
    console.log("Make query"); 
    var transaction_id = client.newTransactionID(); 
    console.log("Assigning transaction_id: ", transaction_id._transaction_id); 
//构造查询request参数 
    const request = { 
        chaincodeId: options.chaincode_id, 
        txId: transaction_id, 
        fcn: 'query', 
        args: ['a'] 
    }; 
     return channel.queryByChaincode(request); 
}).then((query_responses) => { 
    console.log("returned from query"); 
    if (!query_responses.length) { 
        console.log("No payloads were returned from query"); 
    } else { 
        console.log("Query result count = ", query_responses.length) 
    } 
    if (query_responses[0] instanceof Error) { 
        console.error("error from query = ", query_responses[0]); 
    } 
    console.log("Response is ", query_responses[0].toString());//打印返回的结果 
}).catch((err) => { 
    console.error("Caught Error", err); 
});

node query.js

相关文章
相关标签/搜索