【我的区块链之路】- Hyperledger fabric的简单入门(四)链码的编写及调试
      之前的文章中我们有讲过了fabric的一些核心的配置文件的选项说明,讲过fabric 的网络启动的步骤,那么,我们会在这篇文章中讲述如何的编写链码,及本地调试链码,及发布链码调用链码等等操作!

【注意】首先,我们在编写链码之前需要下载几个依赖库:
1、github.com/hyperledger/fabric/core/chaincode/shim
2、github.com/hyperledger/fabric/protos/peer
其中,一个最基本的空链码结构为如下所示:

package myChainCode
 
import (
    "github.com/hyperledger/fabric/core/chaincode/shim"
    "github.com/hyperledger/fabric/protos/peer"
    "fmt"
)
 
 
type FirstChainCode struct {
}
 
/**
实例化/升级链码时调用的方法
 */
func (self *FirstChainCode)Init(stub shim.ChaincodeStubInterface) peer.Response {
    return peer.Response{}
}
 
/**
客户端/cli使用Query或者Invoke的方式调用链码时调用的方法
 */
func (self *FirstChainCode)Invoke(stub shim.ChaincodeStubInterface) peer.Response {
    return peer.Response{}
}
 
func main() {
    if err := shim.Start(new(FirstChainCode)); nil != err {
        fmt.Printf("实例化链码失败,err := %n", err.Error())
    }
}
先来讲解下链码文件的结构:

首先,上述是每个链码文件都需要实现 ChainCode 接口

在源码包的  github.com/hyperledger/fabric/core/chaincode/shim/interfaces.go 中的 ChainCode 接口为:

package shim
 
import (
    "github.com/golang/protobuf/ptypes/timestamp"
 
    "github.com/hyperledger/fabric/protos/ledger/queryresult"
    pb "github.com/hyperledger/fabric/protos/peer"
)
 
// Chaincode interface must be implemented by all chaincodes. The fabric runs
// the transactions by calling these functions as specified.
type Chaincode interface {
    // Init is called during Instantiate transaction after the chaincode container
    // has been established for the first time, allowing the chaincode to
    // initialize its internal data
    Init(stub ChaincodeStubInterface) pb.Response
 
    // Invoke is called to update or query the ledger in a proposal transaction.
    // Updated state variables are not committed to the ledger until the
    // transaction is committed.
    Invoke(stub ChaincodeStubInterface) pb.Response
}
其中,

1、当链码收到 实例化 (instantiate) 或者 升级 (upgrade) 类型交易时,Init 方法会被调用;

2、当链码收到 调用 (invoke) 或者 查询 (query)类型交易时, Invoke 方法会被调用;

下面我们在看一个稍微完善点的链码:

package main
 
import (
    "github.com/hyperledger/fabric/core/chaincode/shim"
    "github.com/hyperledger/fabric/protos/peer"
    "fmt"
)
 
type SimpleChaincode struct {
}
 
/**
实例化/升级链码时被自动调用
 -c '{"Args":["Hello","World"]'
*/
func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) peer.Response {
    // 获取参数
    //args := stub.GetStringArgs()
    _, args := stub.GetFunctionAndParameters()
    // 判断参数长度是否为2个
    if len(args) != 2 {
        return shim.Error("指定了错误的参数个数")
    }
 
    // 通过调用PutState方法将数据保存在账本中
    err := stub.PutState(args[0], []byte(args[1]))
    if err != nil {
        return shim.Error("保存数据时发生错误...")
    }
    return shim.Success("链码实例化成功~")
 
}
 
/**
对账本数据进行操作时被自动调用(query, invoke)
peer chaincode query -n hello -C myc -c '{"Args":["queryData","Hello"]}'
*/
func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) peer.Response {
    // 获取调用链码时传递的参数内容(包括要调用的函数名及参数)
    fun, args := stub.GetFunctionAndParameters()
    if fun == "queryData" {
        return queryData(stub, args)
    }
    return shim.Error("非法操作, 指定功能不能实现")
}
 
/**
自定义方法
*/
func queryData(stub shim.ChaincodeStubInterface, args []string) peer.Response {
    // 检查传递的参数个数是否为1外
    if len(args) != 1 {
        return shim.Error("只能指定相应的Key")
    }
    // 根据指定的Key调用GetState方法查询数据
    result, err := stub.GetState(args[0])
    if err != nil {
        return shim.Error("根据指定的 " + args[0] + " 查询数据时发生错误")
    }
    if result == nil {
        return shim.Error("根据指定的 " + args[0] + " 没有查询到相应的数据")
    }
    // 返回查询结果
    return shim.Success(result)
}
 
func main() {
    if err := shim.Start(new(SimpleChaincode)); nil != err {
        fmt.Printf("链码启动失败: %v", err)
    }
}
以上就是我们的链码的编写,其中【stub shim.ChaincodeStubInterface 为我们提供了操作 账本的API,具体请参考相关资料】下面我们来查看链码的本地调试及 远端的安装部署

首先,我们要本地调试的话需要具备可以启动简单的本地fabric网络的配置,我这里就直接用了fabric-sample提供的 chaincode 目录来存放本地链码,使用 chaincode-docker-devmode 目录来运行链码,【为什么这么做呢,首先,我们在Hyperledger fabric的简单入门(一)fabric-samples的下载及自动启动网络脚本演示 一文中就有说明了 chaincode 和 chaincode-docker-devmode 的作用,且在 chaincode-docker-devmode 中的 docker-compose-simple.yaml 中就能看到,该本地测试环境所引用的链码是 挂载了 chaincode  到容器的】

步骤:

1、先进入 chaincode-docker-devmode 启动本地测试网络 :docker-compose -f docker-compose-simple.yaml up

2、进入对应的链码所在目录【当然进入到chaincode容器中的对应挂载的目录也是可以的】,如:/fabric-samples/chaincode/sacc 执行go build 把链码编译成go的可执行文件【或者直接把可执行文件拖到这里面来】;

3、在 链码容器 【注意: 一定是去到容器里面启动链码哦】的 对应的链码的可执行文件所在的目录,如:/opt/gopath/src/chaincode/sacc

这时候我们需要手动启动链码:CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mycc:0 ./sacc 【其中,CORE_PEER_ADDRESS 和 docker-compose-simple.yaml 中peer 的CORE_PEER_ADDRESS 端口不一样,为什么是这样,请查看之前的Hyperledger fabric的简单入门(三)fabric主要配置文件细讲 中的 peer 的配置文件 core.yaml 讲解自明 】

启动链码显示:

链码启动成功!【当然,正式环境链码的启动是有Endorser节点来启动链码容器启动的】

升级链码,在没有关闭本地网络的情况下,升级链码需要,把更改的的执行文件替换(当然不替换也是可以的需要不同名) 且在链码容器中启动链码时,指定 新的版本号【一般是网上叠加的版本号】和指定新的执行文件:

CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mycc:2 ./sacc

OK,这时候我们就可以,启动一个客户端来调用对应的链码了,步骤和正常的链码调用一直,如:

安装 -> 实例化 /升级 ->  调用

peer chaincode install -p chaincodedev/chaincode/sacc -n mycc -v 0

peer chaincode instantiate -n mycc -v 0 -c '{"Args":["a","10"]}' -C myc

peer chaincode invoke -n mycc -c '{"Args":["set", "a", "20"]}' -C myc

【注意】本地环境中默认通道为 myc;且本地环境安装及实例化/升级等都不需要一大堆 --tls --msp 等等参数

OK,以上就是我们在本地环境测试链码的方式,正式环境是如何操作链码的,请参考【Hyperledger fabric的简单入门(二)单机演示fabric网络启动全过程】最后面操作链码那部分!
————————————————
版权声明:本文为CSDN博主「GavinXujiacan」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_25870633/article/details/81751101

【我的区块链之路】- Hyperledger fabric的简单入门(四)链码的编写及调试相关推荐

  1. 大厂的区块链之路 | 百度开启富场景模式直达宇宙

    大厂的区块链之路 | 百度开启富场景模式直达宇宙 2015-2017年,是比特币等数字货币以及ICO爆红的时期,各大巨头对于区块链布局一直保持低调.2018年,随着数字货币的低迷和ICO被监管部门明确 ...

  2. 揭秘大公司区块链之路:迅雷是如何成为区块链领军者的?

    点击上方"蓝色字"可关注我们! 编辑:铅笔盒 有人说,区块链是21世纪最伟大的发明:也有人说,区块链是最有争议的科技之一.无论技术未来会走向何方,显而易见的是,在机会面前,谁都不甘 ...

  3. 区块链:Hyperledger Fabric环境配置及fabric-sample测试运行

    环境准备 安装go1.11 以及以上版本 安装docker 17.06.2-ce 以及以上版本 安装docker-compose 1.14.0 以及以上版本 git 拉下 fabric-sample ...

  4. Linux搭建Hyperledger Fabric区块链框架 - Hyperledger Fabric模型概念

    企业选型的区块链底层技术 Hyperledger Fabric 概念 2015年,Linux基金会启动了Hyperledger项目,目标是发展跨行业的区块链技术. Hyperledger Fabric ...

  5. 【我的区块链之路】- 去中心化的神级大作Hashgraph的讲解

    [转载请标明出处]: https://blog.csdn.net/qq_25870633/article/details/82057232 本文章参考自: https://blog.csdn.net/ ...

  6. 十一、区块链学习-Hyperledger Fabric (基于release-1.0) 链码开发-marbles管理

    链码开发-marbles管理 1. 概述 2. marble弹珠管理 2.1实现功能 2.2chaincode链码 2.3编写测试类 2.4 跑测试类 3 搭建本地测试环境 并测试链码 3.1 挂载链 ...

  7. Hyperledger Fabric学习笔记(四)- fabric单机部署 solo 版

    一.前言: 1.底下的配置文件很重要,一配置错了就有问题了,下面附出这篇文章所需要的配置文件,下载链接:https://download.csdn.net/download/u012561176/15 ...

  8. Hyperledger fabric high-throughput(高吞吐量链码示例)部署

    此文主要对官方fabric-samples/high-throughtput 示例readme进行翻译,并填好在部署中遇到的坑. 原文地址high-throughput 话不多说,开始吧. 目的 该网 ...

  9. 【Fabric】简单测试:链码单元测试+fabric-go-sdk

    纯粹记录一下,也不知道干了啥~ 链码单元测试 在Ubuntu中安装VScode 下载安装包 打开Ubuntu的火狐,访问网址:https://code.visualstudio.com/docs=&g ...

最新文章

  1. Review Python Numpy 数组的初始化和基本操作
  2. python主要用途-python的主要用途是什么
  3. python视频教程大全
  4. 域环境下用组策略禁止客户机更改IP
  5. 微服务实践沙龙-上海站
  6. vue笔记(三)生命周期、组件(嵌套)、数据传递
  7. 【转】Golang 关于通道 Chan 详解
  8. oracle的exp程序,数据库expimp迁移的整个过程,及注意事项
  9. Google整体架构猜想
  10. 我收藏的PDF电子书第一部分
  11. 数字信号处理 史林 课本答案---第三章
  12. [IOS APP]婷婷诗教-有声系列
  13. excel函数自变量linux,excle 求自变量 | 如何用EXCEL已知自变量和函数值求函数式
  14. 快速检查局域网内网络延迟
  15. 苹果手表 WatchKit 应用架构简介
  16. 整理的strace命令参考文档
  17. CG中的深度学习 |Siggraph 2017 相关论文总结
  18. 高通sm4350平台指纹移植
  19. STM32、NBIOT、Lora模块烧写方法-Hex文件烧录步骤详解-新大陆物联网设备-NEWLab开发板
  20. ISC 2018 蓝鲸魔塔线上赛-pwn

热门文章

  1. Android中的Fragment
  2. shared_ptr和weak_ptr使用介绍
  3. Aix oracle 自动启动,AIX如何自动启动和关闭软件的运行
  4. 门限的限意思是什么_门限是什么意思_门限英文翻译
  5. 《基于张量网络的机器学习入门》学习笔记4
  6. 读计算机平面设计要什么文化好,浅谈计算机平面设计的有关论文
  7. java软件测试方法有哪些方法有哪些_如何才算掌握Java
  8. Linux下CMake简明教程(一)简单入门
  9. 判断一个点是否在三角形内部
  10. python programming training(四):动态规划