所有参考资料贴在最后。

1. Vagrant

官方下载

Vagrant是构建在虚拟化技术之上的虚拟机运行环境管理工具。通过Vagrant可以方便实现的对虚拟机的管理,包括建立和删除虚拟机、配置虚拟机运行参数、管理虚拟机运行状态、自动化配置和安装开发环境必须的各类软件、打包和分发虚拟机运行环境等。 ^foot1

简单地说,Vagrant让我们可以通过代码的方式快速地、可重复地创建针对不同虚拟环境的虚拟机,包括Virtualbox、AWS、Docker等。它使得我们可以一次性地、自动创建多个环境相同的虚拟机,对于软件开发和测试尤其有用。^foot2

使用Vagrant能尽可能避免”Work on my machine“错误,缩短搭建开发环境的时间。^foot2

2. go

官方下载

官方文档

Go语言需要配置GOPATH环境变量,指向代码目录。

管理员模式打开CMD输入go env验证。

3. 下载源码

fabric
fabric-ca

git clone https://github.com/hyperledger/fabric.git                        
git clone https://github.com/hyperledger/fabric-ca.git    

4. 启动vagrant

cd F:\hyperledger\1\fabric\devenv                
vagrant up    
vagrant ssh
  1. “No Usable default provider could be found for your system”

    vagrant up --provider=virtualbox查询错误信息,发现vagrant对virtualbox的版本有要求。具体版本支持。
    重新安装virtualbox 5.1后成功。

  2. “Couldn’t open file /Users/…/base”

    vagrant init hashicorp/fabric 
    vagrant up
    

    具体参见 1 2
    我的解决方法是重新Clone the fabric folder。不要用vagrant init修改原有的Vagrantfile配置文件。

  3. “Can’t download boxes on Windows 10”

    问题:mitchellh/vagrant#6754)
    If the vagrant up command fails it may be because you do not have the Microsoft Visual C++ Redistributable package installed. 下载地址^foot3

  4. “Vagrant box downloads extremely slow”

    #5319
    take a walk or make yourself a sandwich. Get way from screen for a little bit.

  5. “ubuntu xenial64 box password”

    在目录~/.vagrant.d/boxes/ubuntu-VAGRANTSLASH-xenial64/20161221.0.0/virtualbox/Vagrantfile中有密码

5. 使用本地二进制文件

在fabric目录下编译peer和orderer:

make clean
make native

生成ccenv镜像:

make peer-docker

然后打开两个终端都进入vagrant,至此有三个终端都在vagrant里。

前首先清空ledger文件夹·/var/hyperledger/·(每次运行后,为避免错误或重复,都要清空):

rm -rf /var/hyperledger/*

终端1
使用configtxgen工具创建orderer创世区块:

configtxgen -profile SampleSingleMSPSolo -outputBlock orderer.block

终端2
用刚生成的创世区块启动orderer:

ORDERER_GENERAL_GENESISMETHOD=file ORDERER_GENERAL_GENESISFILE=./orderer.block orderer

终端1
创建 channel configuration transaction:

configtxgen -profile SampleSingleMSPSolo -outputCreateChannelTx channel.tx -channelID <channel-ID>

执行成功会在当前目录生成channel.tx

终端3
chainless模式启动peer:

peer node start --peer-defaultchain=false

Create channel
channel.tx为参数创建channel:

peer channel create -o 127.0.0.1:7050 -c mychannel -f channel.tx

执行后在当前目录生成一个channel的创世区块mychannel.block

Join channel
通过channel的创世区块mychannel.block加入channel:

peer channel join -b mychannel.block

Install chaincode
在peer上安装chaincode:

peer chaincode install -o 127.0.0.1:7050 -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

执行成功后查看文件可以看到mycc.1.0:

ls /var/hyperledger/production/chaincodes

Instantiate chaincode
实例化chaincode:

peer chaincode instantiate -o 127.0.0.1:7050 -C mychannel -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{"Args":["init","a", "100", "b","200"]}'

docker ps查看运行中的容器,如果chaincode启动成功,则显示:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
bd9c6bda7560        dev-jdoe-mycc-1.0   "chaincode -peer.a..."   5 seconds ago       Up 5 seconds                            dev-jdoe-mycc-1.0

Invoke chaincode
调用chaincode从“a”转移“10”给“b“:

peer chaincode invoke -o 127.0.0.1:7050 -C mychannel -n mycc -c '{"Args":["invoke","a","b","10"]}'

Query chaincode
查询”a“的值:
返回值应是 90

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

运行完成后不要忘记清空ledger文件夹/var/hyperledger/:

rm -rf /var/hyperledger/*