前言
这篇文章咱们先简单的叙述下官方刚发布的最新版本中的native部署java语言编写的智能合约的过程然后再说下存证合约的代码实现逻辑,下一篇文章咱们说下如何根据自己公司的业务逻辑定义合约里面的数据结构来实现智能合约
先简单说下关于文档访问慢的问题
官方文档是 https://xuperchain.readthedocs.io/zh/latest/design_documents/XuperModel.html
该文档是在国外部署的,所以国内访问的话,如果自己所在的网络不太好的情况下,打开网页是很慢的,这种情况大家可以将相应版本的文档下载到自己的本地,这样的话 就不会受网速的影响了
下载地址:
https://readthedocs.org/projects/xuperchain/downloads/
选择相应的版本即可
版本升级已支持java语言编写的智能合约
大概2020年7月13号左右的时候 官方更新了一版本 在master分支上 该版本已支持了java语言编写的智能合约
接下来咱们首先下拉下最新的代码、然后编译、运行下,这个过程咱之前发过的文章也已经很详细的描述过了,这里就不再赘述了,感兴趣的朋友 可以看下这2篇文章
在百度超级链Xuper上部署智能合约并实现存证功能和对百度超级链Xuper使用过程中的进一步理解
native模式下java智能合约的部署
java智能合约是native部署的方式,所以首先需要修改下配置文件以开启native合约部署
vim 每个节点路径/conf/xchain.yaml # 管理native合约的配置 native: enable: true
启动命令
nohup ./xchain & 这里没有加--vm ixvm 这个是wasm合约部署的方式
因为这里修改了配置 所以需要先删除数据,再启动 我这是在本地环境搭建的,所以节点数据都不太重要,要是公司的数据,那么就不需要轻易的修改配置了
编译环境
编译Java sdk:Java版本不低于Java1.8版本
包管理器:maven,mvn版本3.6+
配置maven环境
vim /etc/profile export M2_HOME=/Users/mengfanxiao/Documents/third_software/maven/apache-maven-3.6.2 export PATH=$PATH:$M2_HOME/bin source /etc/profile mvn -v
编译合约sdk
cd xuperchain/core/contractsdk/java mvn install -f pom.xml
产出二进制文件target/java-contract-sdk-0.1.0.jar,并自动安装到mvn本地仓库下
编译native合约时,以contractsdk/java/example中的counter合约为例
cd contractsdk/java/example/counter mvn package -f pom.xml
产出二进制文件target/counter-0.1.0-jar-with-dependencies.jar,用于合约部署
合约部署
./xchain-cli native deploy --account XC1111111111111111@xuper --fee 15587517 --runtime java xuperchain/data/javacontract/counter-0.1.0-jar-with-dependencies.jar --cname javacounter
合约调用
- 命令行调用
./xchain-cli native invoke --method Increase -a '{"key":"test"}' javacounter --fee 10
- 通过java sdk 发起合约交易
@Test public void invokeContract() throws Exception { Map<String, byte[]> args = new HashMap<>(); args.put("key", "icexin".getBytes()); Transaction tx = client.invokeContract(account, "native", "javacounter", "increase", args); System.out.println("invoke txid: " + tx.getTxid()); System.out.println("response: " + tx.getContractResponse().getBodyStr()); System.out.println("gas: " + tx.getGasUsed()); }
注意这里一定要是native模式
合约查询
- 通过Java sdk 查询
@Test public void queryContractJava() throws Exception { Map<String, byte[]> args = new HashMap<>(); args.put("key", "icexin".getBytes()); Transaction tx = client.queryContract(account, "native", "javacounter", "get", args); System.out.println("response: " + tx.getContractResponse().getBodyStr()); System.out.println("gas: " + tx.getGasUsed()); }