Hyperledger Fabric智能合约

史圣杰 · · 1443 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Hyperledger Fabric的智能合约叫做Chaincode,是业务的成载体,负责具体的业务逻辑

Chaincode代码

Fabric的Chaincode运行在容器中,可以使用Go,Java,Node.js语言开发,Golang是目前为主比较成熟稳定的。

Chaincode组成

Chaincode主要由下面几个组成:

  • 必须在main包下
  • 引用必要的依赖
  • 定义一个结构体,并为结构体绑定Init和Invoke方法
  • shim.ChaincodeStubInterface和pb.Response
  • main方法

下面以一个例子进行说明

// 1.在main包下
package main
// 2.引入必要的依赖
import(
   "fmt"
   "github.com/hyperledger/fabric/core/chaincode/shim"
   pb "github.com/hyperledger/fabric/protos/peer"
)
// 3.定义一个结构体
type mychaincode struct {
}
// 4.为结构体绑定init和invoke方法
func (t *mychaincode) Init(stub shim.ChaincodeStubInterface) pb.Response{
    fmt.Println(" << ====[Init] success init it is view in docker ======")
    return shim.Success([]byte("success init"))
}

func (t *mychaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response{
    fmt.Println(" << ====[Invoke] success init it is view in docker ======")
    return shim.Success([]byte("success init"))
}
// 5.主方法
func main(){
    err := shim.Start(new(mychaincode))
    if err != nil{
        fmt.Println("Error starting Simple chaincode : %s",err)
    }
}

Chaincode部署

Chaincode的运行分为:install,instantiate和invoke三步

编写以上的代码后,我们将其放入一个文件夹,例如: /home/ssj234/fabricwksp/05-chaincode/下,在部署的时候,会去$GOPATH的src下面寻找文件夹,因此,我们在如下路径编写Chaincode

cd /home/ssj234/fabricwksp/05-chaincode/
mkdir -p src/firstchaincode
cd src/firstchaincode
# 编写代码
vim firstchaincode.go
go build

安装

# 设置GOPATH,让其能够找到Chaincode代码
# 设置要链接的Peer节点和Peer的Admin证书
export set GOPATH=/home/ssj234/fabricwksp/05-chaincode
export set FABRIC_CFG_PATH=/home/ssj234/fabricwksp/02-helloworld/peer
export set CORE_PEER_LOCALMSPID=Org1MSP
export set CORE_PEER_ADDRESS=peer0.org1.cmbc.com:7051
export set CORE_PEER_MSPCONFIGPATH=/home/ssj234/fabricwksp/02-helloworld/fabricconfig/crypto-config/peerOrganizations/org1.cmbc.com/users/Admin@org1.cmbc.com/msp

# 部署chaincode 代码,-n后面是名字 -v 是Chaincode的版本  -p后面是在$GOPAT/src下的相对路径
peer chaincode install -n hellochaincode -v 1.1 -p hellochaincode

实例化
实例化的时候会调用init方法

# 设置GOPATH
# 设置要连接的Peer节点和其Admin证书
export set GOPATH=/home/ssj234/fabricwksp/05-chaincode
export set FABRIC_CFG_PATH=/home/ssj234/fabricwksp/02-helloworld/peer
export set CORE_PEER_LOCALMSPID=Org1MSP
export set CORE_PEER_ADDRESS=peer0.org1.cmbc.com:7051
export set CORE_PEER_MSPCONFIGPATH=/home/ssj234/fabricwksp/02-helloworld/fabricconfig/crypto-config/peerOrganizations/org1.cmbc.com/users/Admin@org1.cmbc.com/msp

# 初始化chaincode 代码,需要指定channel的名字,-c是传入的参数
peer chaincode instantiate -o orderer.cmbc.com:7050 -C cmbcchannel666 -n firstchaincode -v 1.1 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"

instantiate实例化命令运行的时间较长,银行会启动一个docker容器来执行chaincode,我们可以通过docker ps命令观察,会看到下面的一个容器正在运行

 STATUS                  PORTS                       NAMES
bee440516894        dev-peer0.org1.cmbc.com-firstchaincode-1.2-876a5b6466d4eeac14cf940b95e3538a8ace73b133fad7c70041ea17d7cf4b8e   "chaincode -peer.a..."   2 minutes ago       Up 2 minutes 

使用docker logs bee440516894查看日志,会输出Init方法中打印的内容

<< ====[Init] success init it is view in docker ======

调用

使用peer chaincode invoke可以调用chaincode的invoke方法

# 设置$GOPATH
# 设置要连接的Peer和Peer的Admin证书
export set GOPATH=/home/ssj234/fabricwksp/05-chaincode
export set FABRIC_CFG_PATH=/home/ssj234/fabricwksp/02-helloworld/peer
export set CORE_PEER_LOCALMSPID=Org1MSP
export set CORE_PEER_ADDRESS=peer0.org1.cmbc.com:7051
export set CORE_PEER_MSPCONFIGPATH=/home/ssj234/fabricwksp/02-helloworld/fabricconfig/crypto-config/peerOrganizations/org1.cmbc.com/users/Admin@org1.cmbc.com/msp

# 调用chaincode 代码,需要制定orderer服务器,channel的名称和Chaincode的名称和版本号
peer chaincode invoke -o orderer.cmbc.com:7050 -C cmbcchannel666 -n firstchaincode -v 1.1 -c '{"Args":["invoke","a","100","b","200"]}'

执行完成,通过docker logs命令可以查看到Invoke方法的打印内容。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:史圣杰

查看原文:Hyperledger Fabric智能合约

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1443 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传