sb版 java后端(spring boot)应用Conflux Java SDK尝试交互Conflux实录

2023-11-03

sb版 java后端(spring boot)应用Conflux-java-尝试链接Conflux实录

2021/5/3 更新:

请看最新博客!!!内容更详实且包含本文所有内容(不删此篇纯粹是因为阅读量太高了(相对
链接:https://blog.csdn.net/qq_42511414/article/details/115594609?spm=1001.2014.3001.5501

能点进这里的我就默认知道conflux是什么了(一个DAG型的高性能低成本区块链)

前排提示:建议chorme浏览器先下一个钱包,然后至少有个账户有点CFX代币,testnet的也行,不然有的地方会报错或没参数写

前排提示2:Dapp都需要一个服务器,nodejs+JavaScript开发的话,向用户发送前端用户数据即可上链,去中心化程度更高,java开发的话上链操作也是后台在做,去中心化程度降低,主要胜在java后端的应用相对比其他语言更普遍。所以用java还是js是很大的区别,建议先考虑清楚

1.Java-conflux-JDK 引用

先下载依赖包,建议用maven项目,在pom的dependencies中加入conflux包的引用

引用地址如下:

https://search.maven.org/search?q=conflux

点击版本号,跳转页面如下

https://search.maven.org/artifact/io.github.conflux-chain/conflux.web3j/1.0.4/jar

页面右侧Apache Maven框中代码复制进自己spring boot项目 pom的dependencies中刷新即可调用conflux包的引用

2.test测试学习和conflux区块链的交互

如下网站有JDK开发者贴出的使用代码,可以在boot项目test中看情况复制实验

https://github.com/Conflux-Chain/java-conflux-sdk

文档中的示范代码有些未说明的细节或小错误,包括:

1)测试–查看现有epoch中url参数错误,可能报错RPC链接错误,下文链接有很多url,对应不同网络,一般建议学习用test先

https://github.com/conflux-fans/conflux-rpc-endpoints

我用的链接:http://testnet.cfxchain.xyz:12537/rpc/

2)有些类不知道在哪里,介绍也比较模糊,建议IDE直接ctrl+方法or类名,比如 RawTransaction类,ctrl+调用其的test_addtrss ,看到函数原型,再点参数就可看到类原型

3)有个参数是“password”,这个 AccountManager.import(privateKey, password);需要密码,这里是 chorme钱包插件的开启密码

  1. 一个很重要的应用就是事件监听,比如我写了个智能合约,希望新区块如果是调用了我的合约,我后台可以自动更新内容到数据库,对用户进行选择性推送而不是区块链合约调用信息不排序直接混乱全推(虽然目前最大的问题就是监听不知道怎么保活。。。)

​ 总结一下事件监听的概念,更详细的建议看这个链接https://segmentfault.com/a/1190000013240470

​ 分为三个部件----事件源(被监听对象)事件event(封装事件源和动作)开发人员编写的监听器对象

​ 很明显,事件源是一个实体类,调用方法的时候发出event类;事实上,事件源本身一般包含监听器,而监听器本事只是接口,监听到对象后再实例化接口的操作,上一个网住中核心的例子代码如下

    public static void main(String[] args) {
		// 事件源,有 PersonListener 监听器,两个动作,调用 PersonListener的 两个动作(因为是接口,现在只是空,参数为event)
        Person person = new Person();
        // 注册监听器(),person中这个函数只是 this.personListener = personListener;
        // 可以看到只是接口的 personListener 这里用lambda的方式,重载接口,实例化接口方法
        person.registerLister(new PersonListener() {
            @Override
            public void doEat(Event event) {
                Person person1 = event.getResource();
                System.out.println(person1 + "正在吃饭呢!");
            }
            @Override
            public void doSleep(Event event) {
                Person person1 = event.getResource();
                System.out.println(person1 + "正在睡觉呢!");
            }
        });
        //当调用eat方法时,触发事件(调用person内含doEat函数+执行上述lambda行为)
        //将事件对象传递给监听器,最后监听器获得事件源,对事件源进行操作
        person.Eat();
        // 综上,事件源保存监听器接口,对事件的编程应该在于lambda实例化监听器接口
    }

3.转账函数+调用"查"(view和pure)型合约+“增or改”型合约实例

本实验是用spring boot的测试,class挂上@component放入容器,函数挂上@test

3.1 转账
// 出钱人
public static String confluxWalletAddress = "0x1d23e8060f646bad1b4bb9125a5d1e71f56cb32f";
@Test
    void ConfluxBase_and_Transact() throws Exception {
        // 确定基础参数 公钥私钥和密码,密码不能乱写!必须是浏览器conflux钱包插件的密码!!
        int testNetId = 1;
        // 出钱人私钥
        String privateKey = "0x2e0d3e928841568bcfcc2eaa5bf2424321abe3ae6ac2bdfea6786b659e2e5d51";
        String password = "c45521669";
        // 出钱人公钥
        String publickKey = "0x1d23e8060f646bad1b4bb9125a5d1e71f56cb32f";
        // Address 封装的对象可以用 getABIAddress()获取被封装账号的公钥地址
        Address test_address = new Address(publickKey, testNetId);
        // initialize  an accountManager
        Cfx cfx = Cfx.create("http://testnet.cfxchain.xyz:12537/rpc/ ", 3, 1000);
        AccountManager am = new AccountManager(testNetId);
        // import private key
        am.imports(privateKey, password);
        // 整合一个账户信息,是条链,插件密码和公私钥
        Account account = Account.unlock(cfx,am,test_address,password);
        // 还有一种封印的account函数,详见上文jdk链接
        // 尝试发送部分代币
        // 1.建立交易信息 2.私钥签名 3.发送给本地或公用节点
        // 交易值,前面10进制字符串,单位为drip!!=10^-18 个cfx
        BigInteger value = new BigInteger("1000000", 10);
        // 创建交易,参数发送者地址
        TransactionBuilder txBuilder = new TransactionBuilder(test_address);
        // 参数--链号!!容易遗忘,报bug:chainIdMissed
        txBuilder.withChainId(testNetId);
        // 参数 接收地址和链号
        Address receiverAddress = new Address("0x173329e2a911b3849bf41e65c807ceaefa2b11d1",testNetId);
        // 设置接收者的地址
        txBuilder.withTo(receiverAddress);
        // 交易值确认,类型为biginteger
        txBuilder.withValue(value);
        // 根据之前的交易信息实例化交易
        RawTransaction rawTx = txBuilder.build(cfx);
//        // 交易上传区块链,完成流程,收到确认区块地址哈希
        //这种上传包括加密签名和发送
//        SendTransactionResult result = account.send(rawTx);
//        System.out.println(result.getTxHash());
        // 也可以分开,先加密签名,再传送
        String hexEncodedTx = account.sign(rawTx);
        String txHash = cfx.sendRawTransaction(hexEncodedTx).sendAndGet();
        System.out.println(txHash);
        System.out.println("###############################");
    }
3.2 使用view类型合约函数的函数调用实例:

不需要个人地址

    @Test
    void Call_contract_methods(){
        // 建立链接
        Cfx cfx = Cfx.create("https://testnet-rpc.conflux-chain.org.cn/v2",3, 1000);
        // 建立合约链接对象!!地址0x8开头
        ContractCall contract = new ContractCall(cfx, new Address("0x8284e5a2087628d3a278d2336cdc883d2a98b032", 1));
        // passing method name and parameter to `contract.call`
        // note: parameters should use web3j.abi.datatypes type
        // 这里参数又几个要注意的地方
        // 1.有的view函数没有参数需要输入,如下即可实现合约调用返回值
        // call第一个参数是合约写的方法名,区分大小写,这里是显示合约布置者的函数,没有上传参数
        String amount = contract.call("minter").sendAndGet();
        System.out.print("contract minter: ");
        System.out.println(amount);
        // 2.有参数的view,这里函数balanceOf是指定用户信息查询余额函数,第二个或后面对应参数加上即可
        // 所有参数参考 conflux.web3j.abi.datatypes,不建议java自带格式
//        String amount = contract.call("balanceOf", new Address("0x1d23e8060f646bad1b4bb9125a5d1e71f56cb32f", 1).getABIAddress()).sendAndGet();
//        BigInteger balance = DecodeUtil.decode(amount, Uint256.class);
//        System.out.print("account balance: ");
//        System.out.println(balance);
    }
3.3 调用存储数据或更改数据合约函数实例:

需要发动者个人私钥公钥

@Test
void Update_Contract_state() throws Exception {
    // 调用者私钥
    String privateKey = "0x2e0d3e928841568bcfcc2eaa5bf2424321abe3ae6ac2bdfea6786b659e2e5d51";
    int netId = 1;
    // 合约地址
    Address contractAddress = new Address("0x8284e5a2087628d3a278d2336cdc883d2a98b032", netId);
    // 调用者地址
    Address recipient = new Address("0x1d23e8060f646bad1b4bb9125a5d1e71f56cb32f", netId);
    Cfx cfx = Cfx.create("https://testnet-rpc.conflux-chain.org.cn/v2", 3, 1000);
    // create account, then call contract's method
    // 链接+私钥=调用者账户
    Account account = Account.create(cfx, privateKey);
    // 估计这里写入各种字段,以次调用多种方法
    // 可以查看原型,发现可以定义update交易的gas
    // build transaction option info: nonce, gas, gasPrice and etc
    Account.Option opt = new Account.Option();
    // opt要设置用户参数的id!!不然报错chainIdMismatch
    opt.withChainId(1);
    BigInteger amount = BigInteger.valueOf(100);
    // 这里合约方法是给指定对象印发 amount 量的代币
    // 第三个参数是合约方法名,其后是合约方法参数,有几个,是啥看自己的合约
    String txHash = account.call(opt, contractAddress,
            "mint", recipient.getABIAddress(), new Uint256(amount));
    // 返回64位开头0x8的哈希交易地址
    // 具体内容可以在 https://testnet.confluxscan.io/ 输入返回哈希搜到
    System.out.println("tx hash: " + txHash);
}

4.未完成和接下来想解决的问题:

如果有大佬看到这里,如果可以请指导一下下面两个需求完成方法,不胜感激,联系方式qq如名字,也可以下面留言

4.1 监听订阅及其保活

因为之前没有写过保活,网上的看了觉得不知道怎么带入

大佬原话:

“这个是订阅,有数据后会回调event->()”

“只需要处理event数据即可”

“然后写个监听,保活这个订阅”

“意外停了,就重起”

然而看了java的监听感觉得监听器,事件源和事件相互嵌合。。。而且也不知道怎么个保活,更何况是lambda的event,我觉得一直while(true)大佬说不对,不知道怎么处理。。。若有大佬懂的,还请不吝赐教。

@Test
void pubsub_test() throws ConnectException {
    // websocket和一般通信的区别(据说不同在于双方平等)
    // 初始化 WebSocketService 链接,连接到CFX网络
    WebSocketService wsService = new WebSocketService("ws://testnet.cfxchain.xyz:12535", false);
    wsService.connect();
    Cfx cfx = Cfx.create(wsService);
    // 范例:可以调用CFX方法,和 http 无异
    BigInteger epoch = cfx.getEpochNumber().sendAndGet();
    System.out.println("Current epoch: " + epoch);
    // PubSub Subscribe to incoming events and process incoming events
    // PubSub 最重要的就是事件订阅(貌似?
    final Flowable<NewHeadsNotification> events = cfx.subscribeNewHeads();
    final Disposable disposable = events.subscribe(event -> {
        // You can get the detail through getters
        System.out.println("##############");
        while(true){
            System.out.println(event.getParams().getResult());
            System.out.println("##############");
        }
    });
    // close
    disposable.dispose();
}
4.2 ipfs和conflux的链接合作实现保存多文本
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sb版 java后端(spring boot)应用Conflux Java SDK尝试交互Conflux实录 的相关文章

  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 如何在发布期间复制未版本化的测试资源:执行?

    我的问题与 Maven 在发布时不会复制未跟踪的资源 https stackoverflow com questions 10378708 maven doesnt copy untracked resources while releas
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • python 画虚线_提取视频中的音频——python三行程序搞定!

    写在开头 身处数据爆炸增长的时代 各种各样的数据都飞速增长 视频数据也不例外 我们可以使用 python 来提取视频中的音频 而这仅仅需要安装一个体量很小的python包 然后执行三行程序 语音数据在数据分析领域极为重要 比如可以分析语义
  • java HttpClient 访问webservice并解析返回json数据

    关于webservice的普及就不多说了 直接进入主题吧 1 导包
  • Qt使用QAxObject写入Excel表格,包括填色、合并单元格、多行写入等

    Qt使用QAxObject写入Excel表格 包括填色 合并单元格 多行写入等 QAxObject可以调用Excel表中的各种函数或者事件 来操控读写Excel表格 Excel表中所有的接口可以查看官方文档 末尾可见源码 第一步 明确自己需
  • 最优化课程设计——单纯形法

    单纯形法的基本原理及实践案例分析应用 摘 要 单纯形法是解决线性规划问题的一个有效算法 同时无约束优化的单纯形法可利用对简单几何图形各顶点的目标函数值进行比较 逐步以目标函数值较小的顶点取代目标数值最大的顶点 从而进行求优 本文将从线性规划
  • 全网最全markdown数学物理公式输入速查表

    全网最全Markdown数学物理公式输入要速查表 如果一个 不行就换成两个 因为我发现再Typora中用 一个 就行 但是csdn里有些只用一个 就不行 公式符号输入 公式 源代码 x a x a xa x a
  • java 作用域

    变量作用域 在 java 编程中 主要的变量就是类中的属性 成员变量 和局部变量 局部变量指的是方法中定义的变量或者块作用域中定义的变量 作用域范围为定义它的代码块中 全局变量 也就是属性 作用域为整个类的大括号 中 全局变量可以不赋值而直
  • 史上最全的SpringMVC教程,终于整理出来了

    1 为啥要学 SpringMVC 1 1 SpringMVC 简介 在学习 SpringMVC 之前我们先看看在使用 Servlet 的时候我们是如何处理用户请求的 配置web xml
  • Python GUI之tkinter的皮肤(ttkbootstrap)打造出你的窗口之美

    Python GUI之ttkbootstrap 前言 官方文档 https ttkbootstrap readthedocs io en latest https ttkbootstrap readthedocs io en latest
  • 2020-03-19

    小程序页面栈控制 转自 https blog csdn net jackjyy article details 82392312 utm source app
  • Talib技术因子详解(八)

    talib安装方式 pip install Ta lib Tushare数据获取请参考 金融量化分析基础环境搭建 数据获取代码请参考 Talib技术因子详解 一 71 CDLDARKCLOUDCOVER名称 Dark Cloud Cover
  • 逻辑地址(段地址,偏移地址)知识点全面回顾

    1 什么是逻辑地址 逻辑地址是用户编程时使用的地址 分为段地址和偏移地址两部分 逻辑地址表示形式 3020 055AH 汇编语言中 数字后面加H表示16进制 2 为什么要用逻辑地址 逻辑地址的产生背景 8086cpu访问存储器时 地址寄存器
  • C语言 - 循环结构程序设计

    一 编写一个程序 依次输入5个学生的7门课程的成绩 每输入一个学生的7门课程成绩后 立即统计并输出该学生的总分和平均分 include
  • Android:DataBinding详细使用教程

    DataBinding是什么就不介绍了 直接开始 先配置 build gradle Module android dataBinding enabled true 布局文件
  • OCRNet 论文解读

    论文 Segmentation Transformer Object Contextual Representations for Semantic Segmentation 文章提出一种新的对象上下文特征表示方法 方法本质上是用注意力建立
  • LaTex为字母添加圆圈

    对于有为数字或字母添加圆圈需求的可以采用如下代码 已经验证 非常Nice 有效 documentclass article usepackage tikz newcommand circled 1 tikz baseline char ba
  • 最好用的数据恢复软件——EasyRecovery

    21世纪的互联网时代 数据信息传递非常快 需要保存的数据也是很多 所以需要用到很多的存储设备 比如硬盘 U盘 SD卡等 那么这些设备上的信息就是绝对安全吗 这个就让人很怀疑了 数据丢失的问题在我们的生活和工作中经常发生 那么有没有什么好的办
  • oracle更改用户的密码

    第一种情况 不知道该用户的密码 以管理员身份或者其他有权限的用户更改 1 以system或者sys的身份登录 登录语句sqlplus system psw ora name或者sqlplus sys psw ora name as sysd
  • STM32—ADC(直接采集、双通道DMA采集) Day6

    软件 STM32CubeMX MDK ARM 硬件 蓝桥杯物联网Lora开发板 板载芯片STM32L071 一 前言 ADC 模拟信号只有通过A D转化为数字信号后才能用软件进行处理 这一切都是通过A D转换器 ADC 来实现的 板子上所使
  • 22张塞尔达amiibo大全_Switch上的Amiibo是什么?

    估计很多小伙伴都有听说过 Amiibo 但可能对它不是很了解 今天毕方就写篇文章详细地告诉大家有关 Amiibo 的一些科普哦 1 什么是amiibo 简单来说 Amiibo 是任天堂官方推出的带有虚拟内容的实体手办或者卡片 玩家只需利用S
  • sb版 java后端(spring boot)应用Conflux Java SDK尝试交互Conflux实录

    sb版 java后端 spring boot 应用Conflux java 尝试链接Conflux实录 2021 5 3 更新 请看最新博客 内容更详实且包含本文所有内容 不删此篇纯粹是因为阅读量太高了 相对 链接 https blog c