在Xuper链上部署Java语言智能合约和分析存证合约的实现逻辑(1)

简介: 在Xuper链上部署Java语言智能合约和分析存证合约的实现逻辑(1)

前言


这篇文章咱们先简单的叙述下官方刚发布的最新版本中的native部署java语言编写的智能合约的过程然后再说下存证合约的代码实现逻辑,下一篇文章咱们说下如何根据自己公司的业务逻辑定义合约里面的数据结构来实现智能合约


先简单说下关于文档访问慢的问题


官方文档是 https://xuperchain.readthedocs.io/zh/latest/design_documents/XuperModel.html

该文档是在国外部署的,所以国内访问的话,如果自己所在的网络不太好的情况下,打开网页是很慢的,这种情况大家可以将相应版本的文档下载到自己的本地,这样的话 就不会受网速的影响了


下载地址:


https://readthedocs.org/projects/xuperchain/downloads/

选择相应的版本即可


image.png


版本升级已支持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());
}
相关文章
|
2月前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
1天前
|
存储 监控 算法
探秘局域网桌面监控:深入剖析 Java 语言核心算法
在数字化办公时代,局域网桌面监控如同企业的“智慧鹰眼”,确保工作效率与数据安全。本文以Java为载体,揭示哈希表在监控中的关键应用。通过高效的数据结构和算法,哈希表能快速索引设备连接信息,大幅提升监控的时效性和响应速度。代码示例展示了如何用Java实现设备网络连接监控,结合未来技术如AI、大数据,展望更智能的监控体系,助力企业在数字化浪潮中稳健前行。
|
16天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
27 6
|
2月前
|
监控 算法 Java
jvm-48-java 变更导致压测应用性能下降,如何分析定位原因?
【11月更文挑战第17天】当JVM相关变更导致压测应用性能下降时,可通过检查变更内容(如JVM参数、Java版本、代码变更)、收集性能监控数据(使用JVM监控工具、应用性能监控工具、系统资源监控)、分析垃圾回收情况(GC日志分析、内存泄漏检查)、分析线程和锁(线程状态分析、锁竞争分析)及分析代码执行路径(使用代码性能分析工具、代码审查)等步骤来定位和解决问题。
|
2月前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
59 4
|
2月前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
73 2
|
2月前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
47 2
|
3月前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
70 3
|
3月前
|
移动开发 Java 大数据
深入探索Java语言的核心优势与现代应用实践
【10月更文挑战第10天】深入探索Java语言的核心优势与现代应用实践
117 4
|
2月前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
59 0