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验证



进入区块链浏览器验证



数据验证正确

fabric2.2学习笔记1的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  3. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  4. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  7. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  8. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

  9. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

  10. ucos实时操作系统学习笔记——任务间通信(消息)

    ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...

随机推荐

  1. 【面试题】面试突击71:GET 和 POST 有什么区别?

    携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情 GET 和 POST 是 HTTP 请求中最常用的两种请求方法,在日常开发的 RESTful 接口中,都能 ...

  2. seqsever 查询多个表的条数,并以列的形式展现

    select sum(a) a,sum(b) b,sum(c) c,SUM(d) d,sum(a1) a1,sum(b1) b1,sum(c1) c1,SUM(d1) d1 from( select ...

  3. 使用svg让页面自适应浏览器大小,整体等比缩放

    网页代码: <!DOCTYPE html> <html> <head> <style> body { margin:0; padding:0; widt ...

  4. doskey: windows版 Alias

    1.编辑doskey.bat文件 2.打开注册表寻找.HKEY_CURRENT_USER \ Software \ Microsoft \ Command Processor (自行百度) 3.添加d ...

  5. finalshell如何查看密码

    1.右键点击导出 2.打开导出的配置文件,搜索password,找到password的编码后的字符串复制 3.运行下面代码,即可查看原来的密码,把main()方法的字符串替换成上一步复制的字符串imp ...

  6. MC 末影人

    #include <iostream> #include "minecraft.h" using namespace std; int x=225,y=115,z=23 ...

  7. 利用Word文档的宏命令,仿信纸写文件报告

    一,首先写好稿件内容. 二,选择合适字体,然后设置信纸下划线格式. 三,启用宏命令.文件-选项-信任中心-信任中心设置-启用所有宏. 四,创建宏命令.视图-宏-创建一个宏 Sub 字体修改()'' 字 ...

  8. web基础(7): JavaScript 简介/语法

    chapter4 JS简介 JS 可以实现表单验证(比如填写简历时,必要的项目是否已经填写).返回顶部.小游戏.网页特效等. JS 的开发工具 Hbuilder 官网www.dcloud.io, 能快 ...

  9. Ubuntu截图软件

    Ubuntu截图软件 方法一:使用系统自带的快捷键 可以将其修改为自己习惯的快捷键 如图: 方式二:使用软件ksnip GitHub: https://github.com/ksnip/ksnip 安 ...

  10. -bash: pip: command not found

    使用pip安装软件包时报错命令不存在 [root@test ~]# pip -V -bash: pip: command not found 机器上没有安装pip,需要手动进行安装 centos系统: ...