div#pop_ad { opacity: 0; }
AD
首页 > 数字货币 > 正文

PDX技术视点 | Chaincode智能合约在PDX中的运用

[2021-01-29 06:14:33] 来源: 编辑:wangjia 点击量:
评论 点击收藏
导读: PDX Utopia区块链协议栈,基于PDX共识,能够同时做到安全、公平、多数共识、大规模、低延迟和高并发。PDX Utopia区块链协议栈不仅支持Solidity和WASM智能合约及两者之间的相互

PDX Utopia区块链协议栈,基于PDX共识,能够同时做到安全、公平、多数共识、大规模、低延迟和高并发。

PDX Utopia区块链协议栈不仅支持Solidity和WASM智能合约及两者之间的相互调用,还支持Chaincode智能合约。Chaincode智能合约具体详情请见:

https://hyperledgercn.github.io/hyperledgerDocs/chaincode_developers_zh/

上一期技术文档我们介绍了Solidity和WASM智能合约,相信很多小伙伴都明白了在PDX上进行 Solidity和WASM智能合约开发时如何调用相关 API。本期我们讨论如何在PDX Utopia 区块链中使用 Chaincode 合约。

Chaincode合约

概念

Chaincode是一段由Go语言编写(支持其他编程语言,如Java),并能实现预定义接口的程序。Chaincode运行在一个受保护的docker容器当中,与背书节点的运行互相隔离。Chaincode可通过应用提交的交易对账本状态初始化并进行管理。


优势

1. 超级账本的Chaincode运行在docker环境中,可以直接使用现有的go package,可以做复杂计算;

2. 可插拔的模块,供企业定制、扩展;

3. 企业级联盟链对超级账本的认可度高,有大量企业加入。

Chaincode API

每个Chaincode程序都必须实现Chaincode接口,该接口的方法是为响应接收的事务而调用的。特别地,Init当链代码接收instantiate或upgrade交易时调用该方法,使得链代码可以执行任何必要的初始化,包括应用程序状态的初始化。Invoke响应于接收invoke处理交易提议的交易而调用该方法。

每个链码程序都必须实现Chiancode接口,接口中的方法会在响应传来的交易时被调用。特别地,Init(初始化)方法会在Chaincode接收到instantiate(实例化)或者upgrade(升级)交易时被调用,进而使得Chaincode顺利执行必要的初始化操作,包括初始化应用的状态; Invoke(调用)方法会在响应invoke(调用)交易时被调用以执行交易。

链码“shim”API中的另一个接口是ChaincodeStubInterface,用于访问和修改分类帐,以及在链代码之间进行调用。

其他chaincode shim APIs中的接口被称为Chaincode存根接口,用于访问及修改账本,并实现Chaincode之间的互相调用。

在本教程中,我们将通过实现管理简单“资产”的简单链代码应用程序来演示这些API的使用。

在本篇指南中,我们会通过实现一个能管理简单“资产”的Chaincode应用范例来演示这些接口的使用方法。

PDX技术视点 | Chaincode智能合约在PDX中的运用

如何编写

以java代码为例, 通过实现ChaincodeBase 并重写里面的 `init()` 方法和 `invoke()` 方法;

其中 invoke 方法中可以定义多个方法名, 供交易调用使用;

部分示例代码:

public class MyCc extends ChaincodeBaseX {
privatestatic Logger logger = LoggerFactory.getLogger(MyCc.class);

@Override
publicResponse init(ChaincodeStub stub) {
returnnewSuccessResponse();
}

@Override
publicResponse invoke(ChaincodeStub stub) {
logger.info("invoke..........................");
Stringpayload = "";
try{
finalString function = stub.getFunction();
finalList params = stub.getParameters();

System.out.println("invokemethod receive function :" + function);
System.out.println("invokemethod receive params :" + params);
switch(function) {
case"getHis":
QueryResultsIteratorhistoryForKey = stub.getHistoryForKey(params.get(0));
historyForKey.forEach(e-> {
logger.info("tid: {} /key : {} /value : {} /isDelete : {}", e.getTxId(), params.get(0),e.getStringValue(), e.isDeleted());
});
historyForKey.close();
break;
case"get":
Stringstate = stub.getStringState(params.get(0));
logger.info("get key :{} result : {}", params.get(0), state);
payload= state;
break;
case"put":
stub.putStringState(params.get(0),params.get(1));
logger.info("putkey : {} value : {}", params.get(0), params.get(1));
break;
}
}catch (Exception e) {
e.printStackTrace();
returnnewErrorResponse(e);
}
returnnewSuccessResponse(payload.getBytes());
}

publicstatic void main(String[] args) throws Exception {
// args= new String[]{"-a", "127.0.0.1:9052", "-i","mycc:v1.0", "-c", "739"};
Arrays.stream(args).forEach(System.out::println);
MyCcmyCc = new MyCc();
myCc.start(args);
}
}

部署

以java为例, 当项目启动时, 通过用 `owner``name``version`三个字段生成唯一地址

连接区块链节点的Chaincode端口,建立起长连接后, 即完成合约的部署。

调用

调用方式是通过rpc调用`send_rawTransaction`方法。

其中Transaction的from,nonce,gaslimit,gasprice字段和普通转账一致, value为0, to为`owner``name``version`三个字段生成唯一地址, 调用的invoke中的方法名及相关参数放在data字段中。

智能合约在PDX中的应用集合

1. Solidity合约和wasm合约代码本身通过交易形式发送到链上, 区块链各节点加载或运行在EVM中;

2. Chaincode合约相当于是挂载在区块链的节点上,通过长连接的形式部署;

3. Solidity合约和WASM合约的地址是在部署时通过from和nonce生成的, 而Chaincode合约的地址是通过 `owner``name``version`自定义生成;

4. 它们的调用方式都是通过交易进行,调用数据都放在data字段中。

PDX技术视点 | Chaincode智能合约在PDX中的运用

PDX技术视点 | Chaincode智能合约在PDX中的运用


添加新手交流群:币种分析、每日早晚盘分析

添加助理微信,一对一亲自指导:YoYo8abc

查看更多:

为您推荐