---------------------------------------------------------------------------------------------
[版权申明:本文系作者原创,转载请注明出处] 
文章出处:https://blog.csdn.net/sdksdk0/article/details/82222792

作者:朱培      ID:sdksdk0     
--------------------------------------------------------------------------------------------

一、Fabric开发基础必备

hash:相同的数据内容,会生成相同的hash值。

区块:区块有区块的编号、交易数据、时间戳等来生成一系列的哈希值

挖矿:去计算一个随机数、满足我们hash值的一个随机数。

安装nodejs环境:

https://nodejs.org/en/download/

下载安装

windows安装NodeJS

npm  install  blockchain-cli  -g

安装完成后直接输入  blockchain  进入

输入内容,从创世区块开始,例如我这里输入bc

挖矿,通过 mine 这个命令

例如:   mime   "ab 100"

可以通过创世区块的名称  我这边是  bc来查看区块,目前一共两个区块了。当前区块的  pre  Hash就是上一个区块的哈希值。

挖矿的时候回有竞争的问题,类似于在猜某个数字,猜中表示为挖矿成功,然后广播给各个节点,然后再验证是否正确,如果正确,就设置为下一个区块。假设有100个人,如果两个人同时猜对了,就会出现两个分叉的问题,矿池与矿池之间的竞争,

hash值的4个前导0,是有效散列的最低要求,所需的前导0的数量为难度。

https://blockchaindemo.io/

https://anders.com/blockchain/block.html

http://remix.ethereum.org/#optimize=false&version=builtin

有时报错mock compiler: source not found的话可以使用这个地址,就换成这个地址:https://ethereum.github.io/browser-solidity/#optimize=false&version=soljson-v0.4.23+commit.124ca40d.js

pragma solidity ^0.413;

contract Ballot {

struct Voter {

uint weight;

bool voted;

uint8 vote;

address delegate;

}

struct Proposal {

uint voteCount;

}

address chairperson;

mapping(address => Voter) voters;

Proposal[] proposals;

/// Create a new ballot with $(_numProposals) different proposals.

function Ballot(uint8 _numProposals) public {

chairperson = msg.sender;

voters[chairperson].weight = 1;

proposals.length = _numProposals;

}

/// Give $(toVoter) the right to vote on this ballot.

/// May only be called by $(chairperson).

function giveRightToVote(address toVoter) public {

if (msg.sender != chairperson || voters[toVoter].voted) return;

voters[toVoter].weight = 1;

}

/// Delegate your vote to the voter $(to).

function delegate(address to) public {

Voter storage sender = voters[msg.sender]; // assigns reference

if (sender.voted) return;

while (voters[to].delegate != address(0) && voters[to].delegate != msg.sender)

to = voters[to].delegate;

if (to == msg.sender) return;

sender.voted = true;

sender.delegate = to;

Voter storage delegateTo = voters[to];

if (delegateTo.voted)

proposals[delegateTo.vote].voteCount += sender.weight;

else

delegateTo.weight += sender.weight;

}

/// Give a single vote to proposal $(toProposal).

function vote(uint8 toProposal) public {

Voter storage sender = voters[msg.sender];

if (sender.voted || toProposal >= proposals.length) return;

sender.voted = true;

sender.vote = toProposal;

proposals[toProposal].voteCount += sender.weight;

}

function winningProposal() public constant returns (uint8 _winningProposal) {

uint256 winningVoteCount = 0;

for (uint8 prop = 0; prop < proposals.length; prop++)

if (proposals[prop].voteCount > winningVoteCount) {

winningVoteCount = proposals[prop].voteCount;

_winningProposal = prop;

}

}

}


metamask  以太坊钱包:

下载好之后,在谷歌浏览器中添加扩展插件;metamask_extension_4_3_0_0.crx

获得测试币的方法:

http://ju.outofmemory.cn/entry/344321

地址:https://ethereum.github.io/browser-solidity/#optimize=false&version=soljson-v0.4.23+commit.124ca40d.js

pragma solidity ^0.4.13;

contract Apple {

uint price;

uint size;

function Apple() public{

price = 11000;

size = 15;

}

function getSize() constant  returns(uint){

return size;

}

}


二、Hyperledger

区块是一组有序的交易集合,在通道中经过加密后与前序区块连接。

Instancetiate  -实例化

Invoke - 调用

Leading Peer  -主导节点

https://cn.hyperledger.org/members

三、hyperedger  fabric  centos 环境搭建

1、安装cURL

查看版本: curl  --version

2、安装docker 和docker compose

yum install –y  docker gcc gcc-c++

首先安装epel扩展源:

sudo yum -y install epel-release

然后安装python-pip

sudo yum -y install python-pip

pip install docker-compose

docker-compose  --version   #查询版本

yum -y install nodejs npm --enablerepo=epel  #使用epel源安装nodejs及npm

验证npm安装:

npm install npm@latest

查看npm版本:

npm -v

3、go语言

yum  install go

4、Nodejs运行环境

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh | bash

vim ~/.bashrc

export NVM_DIR="/root/.nvm"

[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm

source  ~/.bashrc

nvm install 6.9.5

5、安装git

1.安装依赖包:

sudo yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker

2.下载git源码并解压:

$ wget https://github.com/git/git/archive/v2.3.0.zip

$ unzip v2.3.0.zip

$ cd git-2.3.0

3.编译安装:

3.编译安装:

make prefix=/usr/local/git all

sudo make prefix=/usr/local/git install

4.修改环境变量:

sudo vim /etc/profile

然后在文件的最后一行,添加下面的内容,然后保存退出。

export PATH=/usr/local/git/bin:$PATH

5.使用source命令立即保存

source /etc/profile

6.查看版本

git version

镜像安装


1、下载Hyperledger的simple demo

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

cd 到这个目录中

2、平台特定二进制文件安装:

curl  -sSL https:goo.gl/byy2Qj | bash -s 1.0.5

离线地址:

https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/

https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/darwin-amd64-1.0.5/

选择:linux-amd64-1.1.0/进行下载

将这个文件解压到fabric-samples中的bin目录下

3、启动文件配置

这个时候还需要一个init.sh

https://raw.githubusercontent.com/hyperledger/fabric/v1.0.5/scripts/bootstrap.sh

注释掉这两行内容:

echo "===> Downloading platform binaries"

curl https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/${ARCH}-${VERSION}/hyperledger-fabric-${ARCH}-${VERSION}.tar.gz | tar xz

4、赋权:

chmod -R 777 init.sh

5、运行:

./init.sh 1.0.5

这个时候会安装镜像

-----------------------

备用网址:

https://github.com/hyperledger/fabric/blob/master/scripts/bootstrap.sh

https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/

wget https://github.com/hyperledger/fabric-samples/archive/release-1.0.zip

http://hub-mirror.c.163.com

https://registry.docker-cn.com

---------------------------------

在fabric-samples文件夹中

$    cd first-network/

先把所有网络关闭掉:

./byfn.sh -m down

然后再开始

$   ./byfn.sh -m generate

生成初始的区块:

.$   ../bin/cryptogen generate --config=./crypto-config.yaml

$   export  FABRIC_CFG_PATH=$PWD

../bin/configtxgen  -profile TwoOrgsOrdererGenesis -outputBlock  ./channel-artifacts/genesis.block

生成应用通道的配置信息

$   export CHANNEL_NAME=mychannel

$   ../bin/configtxgen -profile  TwoOrgsChannel   -outputCreateChannelTx ./channel-artifacts/channel.tx  -channelID $CHANNEL_NAME

生成锚节点配置更新文件

$   ../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate  ./channel-artifacts/Org1MSPanchors.tx  -channelID $CHANNEL_NAME   -asOrg Org1MSP

$   ../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate  ./channel-artifacts/Org2MSPanchors.tx  -channelID $CHANNEL_NAME   -asOrg Org2MSP

操作网络

编辑docker-compose-cli.yaml ,注释command命令

# command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME} ${DELAY}; sleep $TIMEOUT'

在命令行执行:

$   CHANNEL_NAME=$CHANNER_NAME TIMEOUT=600 docker-compose -f docker-compose-cli.yaml up -d


创建和加入通道

进入docker容器

$    docker exec -it cli bash

进入docker中创建通道:

$   export CHANNEL_NAME=mychannel

peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

加入通道

peer channel join -b mychannel.block

链码:

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

实例化链码

peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --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 $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR('Org1MSP.member','Org2MSP.member')"

查询:

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

现操作A转账给B 10 块钱

peer chaincode invoke -o orderer.example.com:7050  --tls  $CORE_PEER_TLS_ENABLED   --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 $CHANNEL_NAME -n mycc    -c '{"Args":["invoke","a","b","10"]}'

查询 a 账户的金额

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

遇到的问题:

在阿里的服务器(CentOS 7.3、CentOS 7.2、Ubuntu 16)运行first-network报错

运行cli容器的script.sh时候,创建渠道时cli控制台错误摘要:

添加这样一行:

- GODEBUG=netdns=go

1

你删除的镜像可能被其他容器使用,可以试试这条命令:

root@192.168.0.109:~# sudo docker rmi -f 1dd

docker rm$(docker ps -a -q)

docker rmi $(docker images -q)


四、nodejs  sdk和fabice合约互动。

1、在fabric-samples-release-1.0/fabcar目录下执行:   npm  install  进行安装node_modules,安装好之后就会有很多文件出现。

2、杀掉活跃的相关容器

docker  rm -f $(docker ps -aq)

3、清理缓存的网络

docker network prune

4、删除fabcar智能合约的底层链码图像,如果是第一次运行这个项目可以不执行(可以通过 docker  images来查询需要删除的镜像)

docker rmi dev-peer0.org1.example.com-mycc-1.0-384f11f484b9302df90b453200cfb25174305fce8f53f4e94d45ee3b6cab0ce9

5、启动网络

./startFabric.sh node

6、注册管理员用户

node  enrollAdmin.js

注册user1 用户

node registerUser.js

查询账目

node query.js

运行结果:

Store path:/Users/fujinliang/fabric/fabric-samples/fabcar/hfc-key-store
Successfully loaded user1 from persistence
Query has completed, checking results
Response is [{"Key":"CAR0", "Record":{"colour":"blue","make":"Toyota","model":"Prius","owner":"Tomoko"}},{"Key":"CAR1", "Record":{"colour":"red","make":"Ford","model":"Mustang","owner":"Brad"}},{"Key":"CAR2", "Record":{"colour":"green","make":"Hyundai","model":"Tucson","owner":"Jin Soo"}},{"Key":"CAR3", "Record":{"colour":"yellow","make":"Volkswagen","model":"Passat","owner":"Max"}},{"Key":"CAR4", "Record":{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}},{"Key":"CAR5", "Record":{"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"}},{"Key":"CAR6", "Record":{"colour":"white","make":"Chery","model":"S22L","owner":"Aarav"}},{"Key":"CAR7", "Record":{"colour":"violet","make":"Fiat","model":"Punto","owner":"Pari"}},{"Key":"CAR8", "Record":{"colour":"indigo","make":"Tata","model":"Nano","owner":"Valeria"}},{"Key":"CAR9", "Record":{"colour":"brown","make":"Holden","model":"Barina","owner":"Shotaro"}}]

查询某一个的账目

修改 query.js , 可以查询key为CAR4 的记录

const request = {
//targets : --- letting this default to the peers assigned to the channel
chaincodeId: 'fabcar',
fcn: 'queryCar',
args: ['CAR4']
};

运行 node query.js

Response is {"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}

更新账目

修改 invoke.js, 添加一条数据

var request = {
//targets: let default to the peer assigned to the client
chaincodeId: 'fabcar',
fcn: 'createCar',
args: ['CAR10', 'Chevy', 'Volt', 'Red', 'Nick'],
chainId: 'mychannel',
txId: tx_id
};

执行 node invoke.js,可以添加一条数据进入账目

修改 query.js

const request = {
//targets : --- letting this default to the peers assigned to the channel
chaincodeId: 'fabcar',
fcn: 'queryCar',
args: ['CAR10']
};

运行 node query.js ,

Response is {"colour":"Red","make":"Chevy","model":"Volt","owner":"Nick"}

修改 invoke.js, 修改CAR10的拥有者为 Dave

var request = {
//targets: let default to the peer assigned to the client
chaincodeId: 'fabcar',
fcn: 'changeCarOwner',
args: ['CAR10', 'Dave'],
chainId: 'mychannel',
txId: tx_id
};

执行 node invoke.js, 再运行 node query.js , 运行结果:

Response is {"colour":"Red","make":"Chevy","model":"Volt","owner":"Dave"}


五、链码开发环境搭建:

1、链码存放:  将chaincode002 复制到fabric-samples/chaincode目录下

2、开启3个终端

终端1:启动网络

cd chaincode-docker-devmode/

docker-compose -f  docker-compose-simple.yaml up


遇到的问题:启动时报错:

Error: Invalid channel create transaction : mismatched channel ID mycc != myc

解决方案:

修改chaincode-docker-devmode目录下的scripts.sh

将里面的myc   换成mycc


终端2:编译且启动链码

docker exec -it chaincode bash

cd chaincode002

go build

CORE_PEER_ADDRESS=peer:7051 CORE_CHAINCODE_ID_NAME=myccc:0 ./chaincode002

终端3: 操作链码

docker exec -it cli bash

安装链码

peer  chaincode install -p chaincodedev/chaincode/chaincode002  -n  myccc  -v 0

实例化链码

peer chaincode  instantiate  -n  mycc -v 0 -c '{"Args":["str","helloworld"]}'  -C mycc

hyperedger +fabric 区块链实践相关推荐

  1. Fabric区块链开发详解

    Hyperledger是一个旨在推动区块链跨行业应用的开源项目,由Linux基金会在2015年12月主导发起该项目,成员包括金融.银行.物联网.供应链.制造和科技等多个行业的领头羊,托管了众多面向企业 ...

  2. 宜信区块链|一篇干货文读懂宜信的区块链实践

    12月6日下午,每月一次的CEO座谈会在北京如期举办,近百位同事到场参加.本期座谈会邀请了宜信首席技术官向江旭.宜信区块链实验室主任.翼启云服区块链业务总监于明扬.宜信金融科技产业基金合伙人秦琴等三位 ...

  3. Fabric区块链网络

    翻译自fabric官方文档: https://hyperledger-fabric.readthedocs.io/en/release-1.3/network/network.html Fabric区 ...

  4. Fabric区块链官方浏览器【中文版】

    个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 blockchain-explorer是Hyperledger官方提供的区块链浏览器,目前支持Fabric 1.4.x区块链,中文版 ...

  5. java与fabric区块链--fabric-java-jdk部署搭建--(1)

    作为一名java开发者,目前比较火的区块链多少应该了解一些 fabric-java-jdk 是区块链提供的java开发者的jdk 下载 下载地址:https://github.com/hyperled ...

  6. Hyperledger Fabric区块链工具configtxgen配置configtx.yaml

    configtx.yaml是Hyperledger Fabric区块链网络运维工具configtxgen用于生成通道创世块或通道交易的配置文件,configtx.yaml的内容直接决定了所生成的创世区 ...

  7. 容器中运行Fabric区块链网络

    2019独角兽企业重金招聘Python工程师标准>>> 容器中运行Fabric区块链网络 Fabric是区块链项目Hyperleger的主要工程,可以在容器中运行,快速建立实验区块链 ...

  8. 微众银行张开翔: FISCO BCOS - 开放的区块链实践之道 | 11月25日【区块链技术与实践】论坛...

    张开翔老师,微众银行区块链首席架构师. 张老师在互联网业和金融行业工作多年,有丰富的分布式系统和海量服务实践经历,于2015年专注投入区块链.隐私计算的技术和行业研究,主持微众银行区块链全栈技术体系设 ...

  9. 北斗计划|区块链实践课·清华大学专场

    3 月 17 日,清华大学选修<区块链与加密数字货币>课程的同学们在清华经管数字金融资产研究中心罗玫教授的带领下,来到 Conflux 参与了"北斗计划"区块链实践课· ...

  10. (Fabric 超级账本学习【5】)Fabric2.4网络环境下——搭建Hyperledger Fabric区块链浏览器

    博主最近在搭建Hyperledger Fabric区块链浏览器过程中也学习了很多博主的搭建流程,踩了很多雷,踩 了很多坑,现将成功搭建好的Hyperledger Fabric区块链浏览器详细流程分享如 ...

最新文章

  1. 《Effective C#中文版:改善C#程序的50种方法》读书笔记
  2. jsoncpp 不能处理long类型数据
  3. oracle 回闪技术恢复误删数据
  4. 弹幕,你知道是怎样练成的?
  5. directx 游戏模拟键盘输入
  6. div css页面布局 模板_HTML 布局
  7. Python小白的数学建模课-23.数据拟合全集
  8. 51单片机之控制转移指令SJMP、LJMP等
  9. matlab现值与终值函数_Matlab金融工具箱中的主要功能函数
  10. HTML+CSS+JS 制作简单动漫网页
  11. Typescript浅尝
  12. Y7000P 2020安装黑苹果教程
  13. 【mmdetection】mmdetection学习率设置
  14. 小封装SOT23车规加密认证芯片ALPU-CV
  15. C++计算机二级操作题(二)
  16. AtCoder Beginner Contest 165 D Floor Function 公式推导
  17. 基于Java+SpringMVC+Mybaties+jsp+layui实现的宿舍管理系统设计与实现
  18. Google创新机器
  19. 输油管道监测解决方案
  20. 常用ASP代码加密工具的工作原理

热门文章

  1. 混沌数学之Lorenz(洛伦茨)吸引子
  2. Android音频系统学习二:Android音频框架
  3. IT与商业管理的三大阶段
  4. swarm主网BZZ挖矿:钱包如何添加BZZ合约?如何查钱包余额?
  5. java实现向PDF中插入图片
  6. AR/VR研究框架——迎接AR元年
  7. 分布临界值表python
  8. 1055 集体照(JAVA)
  9. 移动通信基础(8)帧结构
  10. 产品更新|用于语音压缩的新型极低比特率编解码器,Lyra 长什么样?