热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hyperledgerfabric1.0部署实操一

2019独角兽企业重金招聘Python工程师标准我操作的系统环境是ubuntu16.04,如果你的系统是windows,先安装一个virtualb

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 

我操作的系统环境是ubuntu16.04,如果你的系统是windows,先安装一个virtualbox。

1  oracle virtual Box 5.1.26安装配置

1.1 虚拟机安装

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

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

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

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

5、时区选上海,语言默认汉语即可;

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

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

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

---重启系统,增强功能生效

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

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
重启dockersudo 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/binsource ~/.profile
cd ~
mkdir gogo 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同级的还有

133802_pGdq_568367.png

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

 


转:https://my.oschina.net/u/568367/blog/1548623



推荐阅读
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 有关phpfgetss()函数的文章推荐10篇
    有关phpfgetss()函数的文章推荐10篇:了解如何使用PHP的各种文件函数。查看诸如fopen、fclose和feof之类的基本文件函数;了解诸如fgets、fgetss和f ... [详细]
  • 找到JDK下载URL当然去官网找了。目前最新的1.8的下载URL(RPM)如下:http:download.oracle.comotn-pubjavajdk8u161-b122f3 ... [详细]
  • 对于一般的扩展包,我们一般直接pipinstallxxx即可安装,但是unrar直接安装后,发现并不能通过Python程序实现解压的功能& ... [详细]
  • MySQL5.6.40在CentOS764下安装过程 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
author-avatar
笃笃声_965
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有