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



进入区块链浏览器验证



数据验证正确

最新文章

  1. 标题栏显示icon
  2. 分享在winform下实现模块化插件编程
  3. curl get
  4. How to address this problem?
  5. LoRaWAN协议(六)--OTAA KEY生成过程
  6. CodeSnippetsLibrary的使用方法
  7. 烦烦烦SharePoint2013 以其他用户登录和修改AD域用户密码
  8. 小甲鱼PE详解之输入表(导出表)详解(PE详解09)
  9. 10.关联(Association)
  10. Chord算法(原理)
  11. Very simple problem - SGU 111(大数开方)
  12. Python3.5 入门学习记录——变量类型
  13. UVA 489-- Hangman Judge(暴力串处理)
  14. Ibatis根据id获取拼接好的sql语句案例
  15. linux系统中的删除操作
  16. linux中/bin和/sbin和/usr/bin和/usr/sbin
  17. 访问github慢的解决方案
  18. springboot security
  19. C# 未能加载文件或程序集或它的某一个依赖项。需要强名称程序集
  20. web socket RFC6455 frame 打包、解包

热门文章

  1. MSF内网信息收集
  2. 00_java基础笔记
  3. Traefik官方文档以及翻译文档
  4. kubernetes service服务发现两种方式
  5. 用keil调试程序的时候,一点击调试就弹出STARTUP.A51那个窗口,解决办法
  6. jquery获取文档的或某个元素的html 闲的没事凑活事的教学
  7. Linux 第八节(防火墙 )
  8. HIVE 调优思路和实践
  9. DPU02是一个高度集成的USB转UART的桥接控制器
  10. grep的正则匹配使用方式