首页 > 其他分享 >fabric2.2学习笔记1

fabric2.2学习笔记1

时间:2023-01-09 12:01:26浏览次数:47  
标签:stub err return string fabric2.2 shim args 笔记 学习

fabric2.2学习笔记1

20201303张奕博 2023年1月9日

hyperledger fabric 结构分析

每个Server作用:

AdminServer:控制该节点的命运,可以删除该节点所在的进程。(Start Stop GetStatus )

EventHubServer:Peer节点支持客户端对指定事件进行监听,例如Rejection等。客户端需要先注册自己关心的Events,当事件发生时trigger 监听者。

OpenChainServer:对外提供ledger的访问接口,涉及GetBlockchainInfo GetBlockByNumber等。

DevopsServer:负责与CLI Client对接,外部进行CC操作的入口,Deploy invoke query。

ChaincodeSupportServer:负责与shim/Chaincode通信,ChainCode的所有调用接收发送都要与该Server信息交互。

PeerServer:该Server是一个Engine,Engine关联了内部消息响应实现,同时为周围Peer节点创建Client与之通信。

RESTServer:该Server没有进行分析,应该是REST接口格式相关。

fabric智能合约分析

部分代码截图:

package main

import (
	"encoding/json"
	"fmt"
	"strconv"

	"github.com/hyperledger/fabric-chaincode-go/shim"
	"github.com/hyperledger/fabric-protos-go/peer"
)

type Trace struct {
}

type CropUpload struct {
	CropID    string
	Timestamp string
	Healthy   string
	Pic       string
	Action    string
	Name      string
}

type ProcessUpload struct {
	ProductID string
	Timestamp string
	Pic       string
	Process   string
	Name      string
}

type BindUpload struct {
	ProductID string
	CropID    string
	Timestamp string
	Name      string
}

type TransportUpload struct {
	ProductID string
	Src       string
	Dst       string
	State     string
	Timestamp string
	Name      string
}

type SaleUpload struct {
	ProductID    string
	Timestamp    string
	ConsumerName string
	Name         string
}

func (t *Trace) Init(stub shim.ChaincodeStubInterface) peer.Response {
	return shim.Success(nil)
}

func (t *Trace) Invoke(stub shim.ChaincodeStubInterface) peer.Response {
	function, args := stub.GetFunctionAndParameters()
	switch function {
	case "crop_upload":
		return t.recordCrops(stub, args)
	case "processing_upload":
		return t.recordProcess(stub, args)
	case "crop_product_bind":
		return t.recordBind(stub, args)
	case "transport_upload":
		return t.recordTransport(stub, args)
	case "sale_upload":
		return t.recordSale(stub, args)
	case "query":
		return t.query(stub, args)
	}

	return shim.Error("Invalid invoke function name. " + function)
}
func (t *Trace) recordCrops(stub shim.ChaincodeStubInterface, args []string) peer.Response {
	if len(args) != 6 {
		return shim.Error("Invalid args length != 6, length: " + strconv.Itoa(len(args)))
	}

	//将参数填入数据结构中
	uploadData := &CropUpload{
		CropID:    args[0],
		Timestamp: args[1],
		Healthy:   args[2],
		Pic:       args[3],
		Action:    args[4],
		Name:      args[5],
	}

	//将对象序列化成数组存储
	m, _ := json.Marshal(uploadData)
	// 根据设计文档 创建索引
	err := stub.PutState("crpoid#"+uploadData.CropID+"#"+uploadData.Timestamp, m)
	if err != nil {
		return shim.Error(err.Error())
	}
	err = stub.PutState("uploadname#"+uploadData.Name+"#"+uploadData.Timestamp, m)
	if err != nil {
		return shim.Error(err.Error())
	}

	return shim.Success(nil)
}

func (t *Trace) recordProcess(stub shim.ChaincodeStubInterface, args []string) peer.Response {
	if len(args) != 5 {
		return shim.Error("Invalid args length != 5, length: " + strconv.Itoa(len(args)))
	}

	//将参数填入数据结构中
	uploadData := &ProcessUpload{
		ProductID: args[0],
		Timestamp: args[1],
		Pic:       args[2],
		Process:   args[3],
		Name:      args[4],
	}

	//将对象序列化成数组存储
	m, _ := json.Marshal(uploadData)
	// 根据设计文档 创建索引
	err := stub.PutState("productid#"+uploadData.ProductID+"#"+uploadData.Timestamp, m)
	if err != nil {
		return shim.Error(err.Error())
	}
	err = stub.PutState("uploadname#"+uploadData.Name+"#"+uploadData.Timestamp, m)
	if err != nil {
		return shim.Error(err.Error())
	}

	return shim.Success(nil)
}


func main() {
	if err := shim.Start(new(Trace)); err != nil {
		fmt.Printf("Error starting SimpleAsset chaincode: %s", err)
	}
}

chaincode验证


进入区块链浏览器验证

数据验证正确

标签:stub,err,return,string,fabric2.2,shim,args,笔记,学习
From: https://www.cnblogs.com/sanfeng-ooo/p/17036601.html

相关文章

  • CCSP学习笔记-NIST 800-145
    本文英文版来自美国国家标准与技术实验室的文档SpecialPublication800-145《TheNISTDefinitionofCloudComputing》September2011版本。一 云计算概念定义Clo......
  • Linux学习笔记:终端删除键失效解决办法
    一、删除键变空格近日在安装vi时遇到报错,遂卸载了部分包进行重新安装。安装后出现终端乱序,输错命令按Backspace删除键进行删除时不能删除反而添加空格,并且导致某些快......
  • 机器学习16:简单, 直观的方法理解CNN(卷积神经网络)核心原理及实现
    1.CNN(卷积神经网络)的典型应用场景1.1WaveNet模型:​​https://deepmind.com/blog/wavenet-generative-model-raw-audio/​​如果你能训练人工智能机器人唱歌,干嘛还训练它......
  • 【linux】RabbitMQ学习-vhost 详解
    vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的队列、绑定、交换器和权限控制;vhost通过在各个实例间提供逻辑上分离,允许你为不同应用程序安全保密地运行数据;vhost是......
  • Linux学习记录(四)Shell编程
    0、学习shell的目的:方便运维;编写shell程序管理集群、提高开发效率;1、Shell概述(1)shell是解释器;​ 核心:硬件系统(主机+外设);​外层:操作系统;​......
  • Linux学习记录(五)DHCP服务器配置(Net模式)
    一、DHCP协议DHCP(动态主机配置协议)是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情......
  • wps 笔记
    table.Cell(arr[3].length/2+3+num00,1).Range.ParagraphFormat.Alignment=0 //文字居左对齐table.Range.Cells.VerticalAlignment=1;//文字垂直居中 ......
  • 2023.1.9 学习
    一、优势相比传统的机械传感器,MEMS具有着巨大的竞争优势:1.MEMS传感器具有着体积小、重量轻、功耗低的特点。其内部结构可达微米甚至纳米量级。同时其内部的机械部件由于......
  • 近几日的算法学习(背包问题+回溯递归算法)附例题
    最近两天都没有更新博客力(其实是去学了些算法,算是对计算机科学有了全新的认识吧(我之前在课本学的是什么勾八玩意儿)CP1055  有多少个数的和是素数(经典的回溯算法,暴力枚......
  • 读编程与类型系统笔记02_基本类型
    1. 空类型1.1. uninhabitabletype1.1.1. 声明从不返回的函数1.2. 不能有任何值的类型,其可取值的集合是一个空集合1.3. 函数不返回的原因1.3.1. 函数在所有代......