在Xuper链上部署Java语言智能合约和分析存证合约的实现逻辑
前言
这篇文章咱们先简单的叙述下官方刚发布的最新版本中的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/profileexport M2_HOME=/Users/mengfanxiao/Documents/third_software/maven/apache-maven-3.6.2
export PATH=$PATH:$M2_HOME/binsource /etc/profilemvn -v
编译合约sdk
cd xuperchain/core/contractsdk/javamvn install -f pom.xml
产出二进制文件target/java-contract-sdk-0.1.0.jar,并自动安装到mvn本地仓库下
编译native合约时,以contractsdk/java/example中的counter合约为例
cd contractsdk/java/example/countermvn 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());
}
native模式下go语言编写的智能合约部署
还是以counter合约文件为例
cd contractsdk/go/example/counter
go build counter.go
部署合约文件
./xchain-cli native deploy --account XC1111111111111111@xuper -a '{"creator":"XC1111111111111111@xuper"}' --fee 15587517 --runtime go xuperchain/data/gocontract/counter --cname golangcounter
调用合约文件
命令行调用
./xchain-cli native invoke --method Increase -a '{"key":"test"}' golangcounter --fee 10
Javasdk调用
@Test
public void invokeContractG0() throws Exception {Map<String, byte[]> args = new HashMap<>();args.put("key", "icexin".getBytes());Transaction tx = client.invokeContract(account, "native", "golangcounter", "increase", args);System.out.println("invoke txid: " + tx.getTxid());System.out.println("response: " + tx.getContractResponse().getBodyStr());System.out.println("gas: " + tx.getGasUsed());
}
查询合约文件
通过Javasdk查询
@Test
public void queryContractGo() throws Exception {Map<String, byte[]> args = new HashMap<>();args.put("key", "icexin".getBytes());Transaction tx = client.queryContract(account, "native", "golangcounter", "get", args);System.out.println("response: " + tx.getContractResponse().getBodyStr());System.out.println("gas: " + tx.getGasUsed());
}
分别部署完了java和go语言写的counter合约之后 咱们其实就知道了 流程都是一模一样的
可能出现的异常信息
如果报 contract type native not found 说明没有开启native合约配置
如果报 context deadline exceeded 说明 你可能用的是旧版本的合约文件 所以需要重新编译下新版本的合约源码生成合约文件
上面简单描述了截止目前7月15号基于最新版本部署的过程以及通过native合约部署的方式分别部署和使用go和java2种语言编写的智能合约的过程,下面结合公司的业务来描述下存证智能合约的实现逻辑
存证智能合约目前版本还没有java语言编写的合约模版,大概2周之后才会有
下面咱分析下go语言版本的存证合约的逻辑
先简单说下数据结构
user对象的数据结构{"Owner":"xiaoming" , # 这个表示用户名
"UserFiles":{ # 这个是一个map集合"filehash":{ # map集合的key是文件hash"Timestamp":"" # 时间戳"Hashval":"" # []byte(filehash) 其实也是hash值}}
}
合约部署的时候数据初始化
在合约部署的时候会调用Initialize方法
首先获取到部署命令中的owner参数表示用户名 然后调用链上的方法GetObject来查询该用户名对应的value
智能合约调用的链上的方法就2个 一个是PutObject 将key-value保存到链上
另外一个是GetObject 根据key获取对应的value
如果value为空的话 则初始化一个空的user对象 并转换成json字符串上链保存
合约上链交易的方法
这个方法首先根据owner(代表用户名称)去链上查询对应的value 根据上面的分析 该value保存着一个用户对象,第一次调用的时候该用户对象是里面的属性都没有进行初始化呢 然后调用putFile方法
首先初始化一个UserFile对象 这里面保存了一条上链的信息
将该对象作为一个元素 保存到 user对象里面的userfiles这个map集合中 key是filehash value是userFile
然后将用户对象转换成json字符串保存到链上
合约交易查询
通过用户名称到链上查询到了用户对象
根据filehash遍历该用户对象的userfiles这个map集合 找到对应的userfile元素
截止到这里 是不是发现了 这个存证合约模版的逻辑其实很简单
总结下上面的逻辑
智能合约调用链上的2个方法
PutObject 将k-v上链保存
GetObject 通过k查询v
一个数据结构
一个user对象 里面有一个map集合 里面的元素是每次上链的数据 可以通过map的key来定位到那一条上链数据
问题发现
filehash重复
大家看过上面的代码有没有发现一个问题
圈红的地方是将单次上链数据userFile 放入map集合中 ,key是filehash,如果2次上传的filehash相同,那么就会把之前的filehash对应的value值给替换掉
但是呢 相同的上链数据却返回不同的交易id,内部实现机制是怎样的和如果根据公司的业务来定义数据结构以实现智能合约等下一篇文章咱们再分析下。
本文使用 mdnice 排版
在Xuper链上部署Java语言智能合约和分析存证合约的实现逻辑相关推荐
- 《Java语言程序设计》 课程分析与总结(上)---我为什么这样设计考试试卷?
<Java语言程序设计>课程分析与总结(上) 我为什么这样设计考试试卷? 自2003年以来,我承担了北京理工大学计算机学院<Java语言程序设计>这门课的教学任务,从2000级 ...
- 如何在虚拟主机上部署java项目_如何在购买的虚拟主机上部署java项目
如何在购买的虚拟主机上部署java项目?要选购的虚拟主机来部署Java新项目,第一步要确保虚拟主机能够支持Java的项目,随后采用ftp客户端软件将Java的项目上传至虚拟主机的主目录下,如此一来就能 ...
- 本篇文档介绍如何手动在ECS实例上部署Java web项目
本篇文档介绍如何手动在ECS实例上部署Java web项目.适用于刚开始使用阿里云进行建站的个人用户. 项目配置 { .section} 本篇教程在示例步骤中使用了以下版本的软件.操作时,请您以实际软 ...
- 如何在虚拟主机上部署java项目_如何在虚拟主机上部署java项目
如何在虚拟主机上部署java项目?在虚拟主机上部署 JavaWeb 项目也离不开Web项目部署的基础三要素:基础的 JDK 环境:一个 Web服务器,如 Tomcat.JBoss:一款数据库,如:my ...
- [Linux]在Linux上部署Java开发环境笔记(一)-- 补充:Linux下如何手动设置IP及配置DNS服务
在Linux上部署Java开发环境笔记(一) -- 补充:Linux下如何手动设置IP及配置DNS服务 2010/06/17 有的Linux系统会有网络设置的图形操作界面,比如"红旗Linu ...
- java语言开发手机游戏_手机上的JAVA游戏和JAVA软件,是电脑上的JAVA语言编写的吗?他们之间有什么联系...
手机上的JAVA游戏和JAVA软件,是电脑上的JAVA语言编写的吗?他们之间有什么联系以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起 ...
- “链引擎”入驻案例 | 每天超过35万条存证上链,长安链支撑链上价值流动
引言 长安链"链引擎"计划(Powered by Chainmaker)(简称:PBC计划)是由长安链生态联盟发起的一项应用赋能计划,旨在以长安链技术体系为核心支撑,汇聚产业各方力 ...
- 区块链技术赋能音乐作品版权保护 法院采信存证证书作为有效权属证据
区块链技术以低成本.高效率的取证.存证流程,为著作权保护提供了新的保护方案,该技术的合理有效运用,能够推动版权行业环境建设,为版权行业营造良性生态环境. 互联网的发展让音乐作品在网络世界的复制.流转. ...
- 重塑云上的 Java 语言
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 Photo @ Toa Heftiba 文 |郁磊 音乐无国界, ...
最新文章
- Unity空间射击游戏开发教程
- php能做定时关机吗,浅谈系统的定时关机
- Linux的yum指令
- NYOJ 161 取石子(四)
- [译]第三章:什么是组织结构
- java免费游戏,java – 分配免费游戏
- 重装系统后mac语言怎么改成中文?
- 计算机应用基础教材提纲,《计算机应用基础》课程教学大纲
- 万稞pw80线切割编程软件_数控编程软件(CAM)大盘点,你选用的哪种?
- go语言:sync.Once的用法(转)
- 牛客练习赛53.老瞎眼 pk 小鲜肉(线段树思维)
- 程序员刷简历领导看见很寒心,网友:找工作也要经过你同意?
- 店盈通:拼多多商品怎么上架?
- 【XSY3657】因数分解(容斥,DP)
- 有计算机考试励志的文案,抖音冲刺高考励志文案
- 【android精品源码系列】安卓线上购物商城
- 设置.env.development无效
- 记录Android Killer反编译时遇到的异常
- java读XML到实体bean中
- 2022-05-18 牛客网每日选择题--前端
热门文章
- SpringBoot+Vue 完整的外卖系统,手机端和后台管理
- python的migratetodb_Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
- q learning简单理解_班级励志标语格言-生活其实很简单,过了今天就是明天
- 洛谷P1073 最优贸易
- 解决Oracle 本地可以连接,远程不能连接问题
- sql server 向mysql前移数据-单引号问题
- 这是一项颠覆性技术 - 容器
- 最全的“大数据”学习资源
- sicp 2.3-2.5 习题
- 如何让apache支持3gp下载