我操做的系统环境是ubuntu16.04,若是你的系统是windows,先安装一个virtualbox。javascript
一、新建{名字:超级帐本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)运行 设备-安装加强功能git
2)设备-共享粘帖板,选择双向github
---重启系统,加强功能生效golang
3)设备-共享文件夹,点选右侧增长按钮添加共享文件夹,在弹出框设置以下:docker
l 共享文件夹路径,选“其余”,而后选择你本机的共享文件夹(例如个人D:\share);
l 勾选“固定分配”;
mkdir /mnt/share/ sudo mount -t vboxsf share /mnt/share/
sudo apt-get install openssh-server
登录你刚装好的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
从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
安装pip:
sudo apt-get install python-pip
修改权限:
su - zpc sudo chmod +x /usr/local/bin/docker-compose
查看安装的版本:
docker-compose -v
查看本地源中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
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
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