区块链简单成绩系统实现

参考
从0到1:Hyperledger Fabric开发精要【最系统】
hubwiz私人博客
CSDN TLpigff博客
CSDN 烟火不完美博客

github.com/hyperledger/fabric/core/chaincode/shim
github.com/hyperledger/fabric/protos/peer
改为
github.com/hyperledger/fabric-chaincode-go/shim
github.com/hyperledger/fabric-protos-go/peer

报错:undefined:discovery.ChaincodeCall
go.mod中
github.com/hyperledger/fabric-protos-go v0.0.0-20211006172752-14f4318ce71c
改为
github.com/hyperledger/fabric-protos-go v0.0.0-20200707132912-fee30f3ccd23

开发流程

以目录为检索结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
│  config.yaml
│ main.go//重点,执行入口

├─chaincode
│ │ edu.go//业务层重点
│ │ go.mod
│ │ go.sum
│ └─vendor

├─fixtures
│ │ configtx.yaml//网络层重点
│ │ crypto-config.yaml//网络层重点
│ │ docker-compose.yaml//网络层重点
│ ├─channel-artifacts
│ └─crypto-config

├─sdkInit
│ integration.go//重点
│ sdkInfo.go//重点
│ sdkSetting.go//重点

├─service
│ domain.go//业务层重点
│ eduService.go//业务层重点

└─web//常见go网页应用工程MVC模式
│ webServer.go//各种http.HandleFunc
├─controller
├─static
└─tpl

fixtures

三种配置文件、根据配置文件生成的组织结构以及基础区块

crypto-config.yaml

用于生成相关组织的私钥和证书
Fabric 中会有两种类型的公私钥和证书

  • 给节点之间通讯安全而准备的TLS证书
  • 用户登录和权限控制的用户证书。

配置参考crypto-config配置参考

configtx.yaml

configtx.yaml主要用来配置fabric的组织结构,通道及锚节点的配置。它主要完成以下几个功能:

  • 生成启动 Orderer 需要的创世区块orderer.block(genesis.block)
  • 创建应用通道所需的配置交易文件
  • 生成组织锚节点更新配置交易文件

配置参考configtx配置参考
之后可以使用configtxgen进行生成操作

docker-compose.yaml

用以配置fabric网络的相关容器
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。
fabric区块链中多使用docker来创建虚拟容器

chaincode

链码,合约,或者这里我们理解为接口API
是在可执行代码中定义不同组织之间业务规则的代码
是业务逻辑中需要的组织交互逻辑而不是全部业务逻辑

sdkinit

这一块结合main.go主函数理解,主要用于初始化启动SDK

按执行顺序

.sh脚本内容:

1
2
3
4
5
6
7
8
9
10
11
12
sudo docker rm -f $(sudo docker ps -aq)
sudo docker network prune
sudo docker volume prune
删除可能的网络与容器
cd fixtures && docker-compose up -d
启动docker容器(按fixtures配置)
cd ..
sudo rm education
go build
编译主函数
./education
执行

第一步:

sdkInit.Setup
包含

  • fabsdk.New
  • sdk.Context

主要工作:初始化SDK

第二步:

sdkInit.CreateAndJoinChannel
包含

  • createChannel
  • org.OrgResMgmt.JoinChannel

主要工作:创建通道并将组织加入通道

第三步:

sdkInit.CreateCCLifecycle
分为:

  • 打包智能合约
  • 安装智能合约
  • “认可”智能合约(Approve)
  • 智能合约初始化

主要工作:智能合约上链与初始化

第四步:

service.InitService
包含

  • sdk.ChannelContext
  • channel.New

主要功能:创建通道客户端实例。
通道客户端用于查询链码,执行链码,注册/取消特定通道上的链码事件。

第五步

serviceSetup.SaveEdu
进行交易实验(添加信息)
可跳过

第六步

serviceSetup.FindEduInfoByEntityID
进行交易实验(查询信息)
可跳过

第七步

1
2
3
4
fmt.Println("第七步")
app := controller.Application{
Setup: serviceSetup,
}

启动服务

第八步

1
2
fmt.Println("第八步")
web.WebStart(app)

建立服务网站

怎么调用链码的

req := channel.Request{ChaincodeID: t.ChaincodeID, Fcn: "addEdu", Args: [][]byte{b, []byte(eventID)}}
用这种语句在GO中调用链码写入信息

couchDB

fabric支持的唯二数据库,是一个NoSQL文档存储数据库。
它使用JSON存储数据(文档),使用http协议为api访问文档,使用Web浏览器查询索引。

问题:为什么老是运行的以前的链码?

太大意了!

已经将文件命名为5edu了,却没有改对应路径QAQ

---------------THEEND---------------