博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hyperledger Fabric 实战(五):第一个链码helloworld
阅读量:7047 次
发布时间:2019-06-28

本文共 3293 字,大约阅读时间需要 10 分钟。

  hot3.png

Chaincode helloworld

目前链码支持 go,node,java 等语言,个人主要用 go,所以以 go 的 chanincode 为例

  • 建 helloworld 文件夹,并在文件夹下新建 helloworld.go 和 helloworld_test.go
  • 编写链上代码 helloworld.go
    • 关键依赖
      import (    "fmt"    /*导入 chaincode shim 包和 peer protobuf 包*/    "github.com/hyperledger/fabric/core/chaincode/shim"    "github.com/hyperledger/fabric/protos/peer")
    • 实现了 Chaincode 接口 Init 方法和 Invoke 方法
      // helloworld 结构体type HelloWorld struct {}//结构体中的初始化方法func (s *HelloWorld) Init(stub shim.ChaincodeStubInterface) peer.Response {	//接受 string 数组    args:= stub.GetStringArgs()    if len(args) != 2 {    	return shim.Error("要输入键和值")    }	//转为 k-v 写入区块链    err := stub.PutState(args[0],[]byte(args[1]))    if err != nil {    	shim.Error(err.Error())    }    return shim.Success(nil)} //调用Chaincodefunc (s *HelloWorld) Invoke(stub shim.ChaincodeStubInterface) peer.Response{	//获取要调用的方法名和方法参数	fn, args := stub.GetFunctionAndParameters()	//根据方法名调用方法(set,get)	if fn =="set" {		return s.set(stub, args)	}else if fn == "get"{		return s.get(stub, args)	}	return shim.Error("方法不存在")}
    • set 和 get 业务方法实现
      func (s *HelloWorld) set(stub shim.ChaincodeStubInterface , args []string) peer.Response{	if len(args) != 2 {		return shim.Error("要输入键和值")	}	//写入	err := stub.PutState(args[0],[]byte(args[1]))	if err != nil {		return shim.Error(err.Error())	}	return shim.Success(nil)}func (s *HelloWorld) get(stub shim.ChaincodeStubInterface, args []string) peer.Response{	if len(args) != 1 {		return shim.Error("要输入一个键")	}	//读出	value, err := stub.GetState(args[0])	if err != nil {		return shim.Error(err.Error())	}	return shim.Success(value)}
    • 最后 main 方法,启动实例
      func main(){	if err := shim.Start(new(HelloWorld)); err != nil {		fmt.Println("HelloWorld start error")	}}
  • 编写链上代码测试用例 helloworld_test.go
    • 利用 chaincode shim包 MockStub 的 MockInit 方法和 MockInvoke 方法 进行模拟测试
      import (    "fmt"    "testing"    "github.com/hyperledger/fabric/core/chaincode/shim")var stub *shim.MockStub//测试 Init 方法func testInit(t *testing.T, args [][]byte) {    res := stub.MockInit("1", args)    if res.Status != shim.OK {        fmt.Println("Init failed : ", string(res.Message))        t.FailNow()    }}//测试 set 方法func testSet(t *testing.T, key string, value string) {    res := stub.MockInvoke("1", [][]byte{[]byte("set"), []byte(key),[]byte(value)})    if res.Status != shim.OK {        fmt.Println("set", key, " failed : ", string(res.Message))        t.FailNow()    }}//测试 get 方法func testGet(t *testing.T, key string) {    res := stub.MockInvoke("1", [][]byte{[]byte("get"), []byte(key)})    if res.Status != shim.OK {        fmt.Println("get", key, "failed", string(res.Message))        t.FailNow()    }    if res.Payload == nil {        fmt.Println("get", key, "failed to get value")        t.FailNow()    }    fmt.Println("get value", key, " : ", string(res.Payload))}//测试func TestHelloWorld(t *testing.T) {    //模拟实例    stub = shim.NewMockStub("helloworld", new(HelloWorld))    testInit(t, [][]byte{[]byte("hi"), []byte("jonluo")})    testGet(t, "hi")    testSet(t, "say","helloworld")    testGet(t,"say")}
    • 在helloworld文件夹下执行 : go test -v helloworld_test.go helloworld.go 结果:
      === RUN   TestHelloWorldget value hi  :  jonluoget value say  :  helloworld--- PASS: TestHelloWorld (0.00s)PASSok      command-line-arguments  0.021s

相关文档

转载于:https://my.oschina.net/jonluo/blog/2998614

你可能感兴趣的文章
mdadm--RAID 5
查看>>
java异常设计
查看>>
服务器的几种时间同步
查看>>
我的友情链接
查看>>
WPF“动画序列”框架的初步研究与实现(附源码)
查看>>
校招求职面试连载(二)
查看>>
网络学习(三十一)操作系统无人值守自动安装之Windows XP
查看>>
handler 机制
查看>>
解决mysql无法导入本地文件的问题
查看>>
HBase 系统架构
查看>>
RichFace标签学习笔记
查看>>
iOS中block介绍(四)揭开神秘面纱(下)
查看>>
更改yum源为阿里云的yum源
查看>>
解决exchang服务器连接不可用问题
查看>>
Tomcat启动权限
查看>>
一步一步學習partitions之hash partitions
查看>>
POJ 1061 青蛙的约会 扩展欧几里得
查看>>
我的友情链接
查看>>
随笔-ftp文件上传,删除
查看>>
Ansible问题汇总
查看>>