一、chaincode项目整体结构
下面介绍项目中各部分具体内容
1.build.gradle
整个gradle项目的一些配置和依赖
1.repositories:从官方reposiry、url途径/或第三方(阿里云镜像)拿到的jar文件/package 保证无误
2.dependencies键值对存储,json保存value,实现复杂查询逻辑。把json格式转换成java instance:安装org.json
3.shadowjar:sourcecode打包成可以用来部署的package
4.test:用于单元测试
总的来说,其他步骤主要还是为第3步服务,即链码打包
2.chaincode开发
1.chaincoede的metadata(紫色部分):识别constract smart,用于描述基本信息
2.defalt :默认构造器
若要构造非默认的:通过紫色的name
3.其余都是一些类似对链码进行读写的函数
3.chaincodeAPI
两种数据:状态(worldstate)数据(都是以键值对存在、账本数据(余额))和历史(block)数据
通过调用API实现对chaincode的增删改查
·
1.getState:获取、查询键,得到值
2.putState:写、更新(两者无区别,写后存在即可)
3.getStateByRange批量查询:key的起始值和终止值(注意:同一类key字符串长度要相等,否则(比如9到10范围(改成09-10),否则查不出来(9比10大,ascll码排序))要做补齐操纵(左边加空格或0)),value是json形式。
4.getHistoryForKey:唯一一个查询历史(block)数据,基于database,什么被iput\update\delete,并非基于block.
5.privatedata:只保存在特定节点本地里,通过private hash广播、交易。
6.setevent:跟外部(应用程序)交互/集成,是基于消息的集成(可以是application层面,也可以是智能合约层面集成),监听、触发外部某些程序。
(application之间(或与智能合约)层面集成invokechaincode:从一个chaincode调用另一个chaincode(可以同一个channel,也可以不同channel),智能合约层面的集成
4.单元测试
可在没有fabric环境下进行测试
1.构造一个虚拟实例
用mock方式创建Context对象,通过Context、mock拿到chaincodeStub对象(
所有API都基于context、stub),流程就是:
2.测试smartcontract方法
assert:比较查询和预期结果相等,则通过(判断查)
indorder–verify:是否按指定顺序执行(判断写)
5.链码查询Query(读账本)
注:对链码的query和下面的invoke都要通过外部SDK来操作
正常情况下,不同智能合约是不能直接访问的,即一个peer只能查询它对应的智能合约。当它们在同一个网络中,可以通过给与适当的权限,达到跨合约访问的目的,不同通道之间,只能查询状态。
6.链码调用Invoke(写账本)
相比较于Query,Invoke方法要复杂的多,主要是因为Invoke需要和Orderer通信,而且发起了Transaction之后,还要设置EventHub来接收消息。