学习记录:fabric(6)- 系统设计(1)

准备

首先有一个网络,我用test-network的脚本简单弄了一下,可以简单的一条命令反复安装链码。

在例子中,发现一个问题,官方给的教程调用的包是
“github.com/hyperledger/fabric-chaincode-go/shim”
“github.com/hyperledger/fabric-protos-go/peer”
使用的链码类是shim.ChaincodeStubInterface,启动方法是shim.Start(new(链码类)),而且链码类直接写成这样:

type SimpleAsset struct {
}

而在assets-transfer-basic中,使用的包是
“github.com/hyperledger/fabric-contract-api-go/contractapi”
使用的链码类是contractapi.TransactionContextInterface,而错误则直接用的go默认的错误类型。启动类型是contractapi.NewChaincode(&链码类{}),而且链码类声明为:

type SmartContract struct {
	contractapi.Contract
}

通过查看fabric-contract-api-go/contractapi,发现TransactionContextInterface定义中是这样写的:

type TransactionContextInterface interface {
	// GetStub should provide a way to access the stub set by Init/Invoke
	GetStub() shim.ChaincodeStubInterface
	// GetClientIdentity should provide a way to access the client identity set by Init/Invoke
	GetClientIdentity() cid.ClientIdentity
}

所以,都一样,其实都可以引入,在fabric-contract-api-go包的介绍中,还写了这样一段:
This repository contains the packages for the implementation of the contract API for use in Go chaincode running on Fabric v2.1
所以,估计是最后有的东西。

我尝试修改了TransactionContextInterface的返回值的类型,是可以的,第一个可以是自定义类型,第二个是error。参数最多是两个。不可以多,可以少。

设计

基于go的web框架改造一下

MVC,不要V,只有数据和控制

通信部分(协议),这里使用fabric链码的接口,不使用其他的HTTP包。响应也是fabric内置pb的,不需要考虑,只需要调用就行。换句话说,这里不用gin而是fabric

写法参照2.2版本的链码,不要全都放在一个文件里,分一下功能,肯定会有比较多的文件。

设计为3部分:

  1. 数据库部分
  2. 区块链部分
  3. 接口响应部分

基本上例子中给出的,都可以算是接口部分。可以先根据这个,弄一下接口规定。

然后其他部分需要参考go web项目。

总体设计

各个peer都有一个mysql数据库,各节点都可以提案,调用链码提交交易,
首先有身份校验,这个交给区块链;然后是相关事务,其实也就是数据库操作(初始化的只有一个空库);这里不需要为交易排队,orderer节点自己会去处理。这里只需要交给数据库先进行入库,并维护好状态,以便回滚。

数据库部分

chainsql中,表名加密,字段名不加密,数据加密。

先不考虑加密的事,先把日志保存到链上

对数据库的各种操作:

  • DDL:建表、表授权、删除表、表重命名
  • DML:插入、更新、删除、查询(支持复杂查询)
  • 数据库事务:可同时对多张表进行操作

此处有一个问题,不能排队了,那么事务的处理可能就要重新考虑,也就是要等到最终收到orderer的确认才能算是真正可以入库,否则,按照一定时间(一轮共识)强行回滚。

chainsql的库里有一个同步设置表,字段为
| Owner | TableName | TableNameInDB | TxnLedgerHash| TxnLedgerSeq | LedgerHash| LedgerSeq | TxnUpdateHash | deleted | AutoSync | TxnLedgerTime | PreviousCommit | ChainId |
±-----------------------------------±-----------±-----------------------------------------±-----------------------------------------------------------------±-------------±-----------------------------------------------------------------±----------±-----------------------------------------------------------------±--------±---------±--------------±---------------±-----------------------------------------------------------------+
| zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh | table_test | 54183A6127156D3461A99A93181D40A5B093FD38 | 8F0DE9D2CCE6AD2B45B284A36F1A32042F3D0CD17F1F1DFDD12AE510E710E219 | 11 | 1C933BA153D2AD5B27286CAD6C23A7F418A24C0F6DD291664203B0CDFFDF9926 | 119 | 0000000000000000000000000000000000000000000000000000000000000000 | 0 | 1 | 663312613 | | BBA00C09EAA2B98BEA473BFA0756715DAA5F3237A8281D54FA9486BD007C7CE2 |

这里需要看一下表

接口部分

这个就按照fabric的API设计,然后具体内容就是chainsql。

理一下chainsql/rpc部分:
impl
- TableAssistant
- TableUtils
- TxCommonPrepare-TxPrepareBase
- TxPrepareBase
- TxSingleTransPrepare-TxPrepareBase
- TxTransactionPrepare-TxPrepareBase

handlers
- GenCsr 不需要
- LedgerTxsHandler 查询区块中的成功、失败交易数,以及错误交易的hash及错误码
- SmartContractHandler 不需要
- TableAudit 溯源,审计一条记录
- TableAuthority
- TableCheckHash
- TableDump
- TableHandler
- TableName

区块链部分

这部分最难,最后弄

日志

不是链码的问题,可能网络有问题,fabcar也实例化不了。等明天测试一下吧,今晚回去接着看论文。
还是官方教程靠谱
https://hyperledger-fabric.readthedocs.io/en/release-1.4/chaincode4ade.html

如果需要不断安装链码,还是需要寻找到最高版本的,然后生成一个新的版本号,不行就hash,这个绝对不会碰撞

OK现在行了。弄了几个shell命令,这样方便。但是似乎重复的实例化还有问题,这个不是实例化而是upgrade

暂时先这样吧,无法更新 链码是很诡异的一个事情。

再弄一下多go文件的编译。
把版本换成1.14.12。编译成执行文件没问题,但是安装链码会出问题,似乎1.4还没有使用go mod管理的机制,而且例子中都是单个文件。

2021-6-1

现在是goland随时崩溃,勉强用一下把

通过 Exec() 方法插入数据,返回的结果是 sql.Result 类型
Query() 方法返回的是一个 sql.Rows 类型的结果集

遇到一个问题,需要延后关闭连接
关闭了连接,就需要重新打开

知道了为什么总是出错,是SQL语句的?不能乱放,不是什么地方都能用?

SQL语句查表存在,这里只能用字符串拼接, 不能用?,?只能用于record参数。

参考

  1. https://www.cnblogs.com/cbkj-xd/p/11940323.html
  2. https://www.cnblogs.com/ezgod/p/14153291.html
  3. https://jasperxu.com/Programming/Golang/GORM/advanced.html#661-%E8%87%AA%E5%AE%9A%E4%B9%89%E6%97%A5%E5%BF%97
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值