Appearance
通用智能合约
ODC 智能合约引擎支持通用智能合约编写,通用智能合约部署后无需修改支持各种格式数据类型上链,并支持虚拟节点动态确权等功能
配置文件
通用合约由于使用动态确权方式,不用配置节点名称及节点的公私钥信息
WARNING
新版本 ODC 智能合约引擎中部分属性需通过 odc-waf 插件配置
odc:
contract:
chain-name: 子链名称
contract-name: 合约名称
contract-public-key: 合约公钥
contract-private-key: 合约私钥
is-encrypt: n
#bind-path: all
#bind-ip: 0.0.0.0
合约示例代码 ContractPayload
TIP
通用合约接收的参数为 ContractPayload 对象,ContractPayload 由上链用户构建,节点公私钥只在本地使用,可保障用户上链数据隐私信息(推荐)
/**
* 数据上链
*
* @param payload 数据上链对象
* @return Mono<ODCResponse>
*/
@Operation(summary = "数据上链-通用合约")
@PostMapping("/general.dataset.upsert")
public Mono<ODCResponse> upsert(@RequestBody ContractPayload payload) throws IllegalAccessException {
//获取交易对象
Transaction transaction = context.getTransaction();
log.debug("ContractPayload : {}", jsonUtils.toJson(payload));
// 数据上链
return transaction.upsert(payload);
}
/**
* 批量数据上链
*
* @param payloads 数据上链对象列表
* @return Publisher<ODCResponse>
*/
@Operation(summary = "批量数据上链-通用合约")
@PostMapping("/general.dataset.upsert.batch")
public Publisher<ODCResponse> upsertBatch(@RequestBody List<ContractPayload> payloads) {
//获取交易对象
Transaction transaction = context.getTransaction();
log.debug("ContractPayloads size is : {}", payloads.size());
// 数据上链
return transaction.upsertBatch(payloads);
}
如何构建 ContractPayload 对象
TIP
使用或构建合约上链对象时需引入 odc-common.jar,具体详见 SDK 章节说明
// ContractPayload 对象可通过 odc-common.jar 中的 ContractPayloadBuilder 类构建,示例代码如下
String nodeName = "节点名称";
String nodePrivateKey = "节点私钥";
String uid = "数据标识 - 推荐使用 CSTR";
String jsonData = "json 格式上链数据";
String type = "业务类型";
ContractPayload payload = ContractPayloadBuilder.build(nodeName,nodePrivateKey,uid,jsonData,type);
// 构建 List<ContractPayload> 对象列表示例代码如下
List<Dataset> datasets = ... // 原始上链数据对象
List<ContractPayload> payloads = datasets.stream().map(ds ->
// 转换为通用合约上链对象
// 转成Json格式数据可使用 JacksonUtils.create(JacksonUtils.JSON).toJson(ds)
ContractPayloadBuilder.build(nodeName,nodePrivateKey,ds.getCstr(),jsonUtils.toJson(ds),type)
).collect(Collectors.toList());
合约示例代码 CustomPayload (不推荐使用)
TIP
通用合约接收的参数为 CustomPayload 对象,CustomPayload 由合约引擎构建,节点公私钥需通过合约开放接口进行传输,需通过加密传输通道保障数据隐私,如使用 Https 等 建议合约部署在本地使用该方式(节点及合约部署在相同局域网内部或研发条件限制无法独立完成合约开发时使用)
/**
* 批量数据上链 - 自定义数据格式及类型
*
* @param payload 自定义载荷
* @return Publisher<ODCResponse>
*/
public Publisher<ODCResponse> upsertBatch(@RequestBody CustomPayload payload) {
//获取交易对象
Transaction transaction = context.getTransaction();
log.debug("CustomPayload data size is : {}", payload.getData().size());
// 数据上链
return transaction.upsertBatch(ContractPayloadBuilder.build(payload));
}
使用 CustomPayload 对象上链数据
/**
* CustomPayload 用户自定上链对象
*
* @author 郭志斌
* @version odc-common 1.0.0.RELEASE
* <b>Creation Time:</b> 2023/4/21 11:05
*/
@Data
public class CustomPayload {
/**
* 节点名称
*/
private String nodeName;
/**
* 节点私钥
*/
private String privateKey;
/**
* 合约业务类型 - 公共合约使用
*/
private String type;
/**
* 时间戳
*/
private long timestamp;
/**
* 数据 - 用户可自定义上链对象,上链对象需要继承 ODCPayload
*/
private List<? extends ODCPayload> data;
}
ODCPayload 对象中只有一个属性 cstr ,为数据上链的唯一标识
/**
* ODCPayload 所有自定上链对象需继承该类
*
* @author 郭志斌
* @version odc-common 1.0.0.RELEASE
* <b>Creation Time:</b> 2023/4/21 11:23
*/
public class ODCPayload {
/**
* 唯一标识
*/
private String cstr;
public String getCstr() {
return cstr;
}
public void setCstr(String cstr) {
this.cstr = cstr;
}
}
// 自定义上链对象示例
public class Project extends ODCPayload {
//项目名称
private String name;
// 项目编号
private String code;
//其他类型数据
private List<Dataset> datasets;
// 可按实际上链需求,自定义更多属性 ...
}