SpringBoot集成SOL链的详细过程

2025-01-07 15:50

本文主要是介绍SpringBoot集成SOL链的详细过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SpringBoot集成SOL链的详细过程》Solanaj是一个用于与Solana区块链交互的Java库,它为Java开发者提供了一套功能丰富的API,使得在Java环境中可以轻松构建与Solana...

一、什么是solanaj?

        Solanaj 是一个用于与 Solana 区块链交互的iFuLWgOD Java 库。它为 Java 开发者提供了一套功能丰富的 API,使得在 Java 环境中可以轻松构建与 Solana 区块链交互的应用程序,例如钱包、交易、账户管理以及智能合约调用等功能。

二、Pom依赖

        solanaj可以很方便的通过pom文件进行导入,这样我们就可以将其集成到Spring/Boot程序中了.Pom依赖如下:

    <dependency>
        <groupId>com.mmorrell</groupId>
        <artifactId>solanaj</artifactId>
        <version>1.19.2</version>
    </dependency>

三、主要类

3.1 RpcClient

        RpcClient为调用节点的主要类,该节点在创建时需要设置是在主网、测试网、开发网进行调用,创建方法如下:

RpcClient client = new RpcClient("https://palpable-fittest-shadow.solana-devnet.quiknode.pro/ce7fe4c5d9d1dd80eb5aafa6a965af0957526ad4");

 使用client.getApi()可以快速的调用相关远程方法,主要使用sendTransaction()向节点发送事务方法.使用方法如下:

String tx = client.getApi().sendTransaction(transaction, sendwallet);

3.2 PublicKey

        在 Solanaj 中,PublicKey 类是一个核心类,用于表示 Solana 区块链中的公钥。公钥是 Solana 系统中的一个基础元素,用于标识账户、程序以及其他资源。主要用法如下:

PublicKey destWallet=new PublicKey("B2NmFbKEvEc8nZXzYdCnkrWKXQuTSr6GmWt8jPeaX2zf");

在上述代码中,功能为将字符串地址转换为在代码中可用的公钥账户类.

        PublicKey destAccount = PublicKey.findProgramAddress(
                Arrays.asList(destWallet.toByteArray(), 
                              TokenProgram.PROGRAM_ID.toByteArray(), 
                              mintKey.toByteArray()),
                AssociatedTokenProgram.PROGRAM_ID
        ).getAddress();

在上述代码中,findProgramAddress为查找PDA账户的功能,但上述为特殊的PDA账户,该账户根据官方的ATA账户计算方法生成,所以生成的账户为一个ATA账户.该账户用于存储非原生的代币。

注:ATA账户={
        seeds={拥有者地址,TokenProgram地址,铸造地址},
        AssociatedTokenProgram地址
}

3.3 Transaction

        Transaction为调用时的发送对象,该类可理解为操作的集合,该类中主要有三部分,即:

TransactionInstruction:一个或多个,每个TransactionInstruction为一个操作,可使用addInstruction进行添加.

transaction.addInstruction(transactionInstruction);

sign签名:一个或多个,该签名数量需要看资源变动的主体是否需要多个签名.可使用以下方法添加:

transaction.sign();

RecenChina编程tblockHash:最近的的区块hash.该设置为了保证链上数据的有效性.可以使用以下方法添加:

transaction.setRecentBlockHash();

3.4 TransactionInstruction

TransactionInstruction为一个单独的链上操作.其结构如下:

    private final PublicKey programId; //调用的programId
    private final List<AccountMeta> keys; //需要的Account
    private final byte[] data;  //数据

可通过查阅官方programId和调用参数等进行功能调用.也可以通过以下已封装的类进行合约调用:

SystemProgram:该类可以方便的生成与原生代币有关的TransactionInstruction,如:要实现转移SOL操作可以用以下实现:

TransactionInstruction transactionInstruction = SystemProgram.transfer(
    account.getPublicKey(),//源地址
    new PublicKey("B2NmFbKEvEc8nZXzYdCnkrWKXQuTSr6GmWt8jPeaX2zf"), //目的地址
    1000000); //数量

TokenProgram:该类可以方便生成与非原生代币(自定义)有关的TransactionInstruction,如:要转移自定义的代币可以用以下实现:

        TransactionInstruction transactionInstruction = 
                TokenProgram.transfer(
                   iFuLWgOD     sendAccount, //发送方 
                        destAccount, //接收方
                        10000000,  //数量
          http://www.chinasem.cn              sendWallet.getPublicKey() //发送者);

注:这里的sendAccount为ATA账户,因为非原生代币只能通过ATA Account接收。

四、示例代码

使用以下代码实现从非原生代币到B2NmFbKEvEc8nZXzYdCnkrWKXQuTSr6GmWt8jPeaX2zf的转移操作:

       String privateKey="私钥";
        //代币mint地址
        PublicKey mintKey=new PublicKey("3ufbMZs57L1qfNPXTR6Nn7WA5pdzPEaLzcFo1aUpj6KE");
        //接收方地址
        PublicKey destWallet=new PublicKey("B2NmFbKEvEc8nZXzYdCnkrWKXQuTSr6GmWt8jPeaX2zf");
        //发送方地址
        Account sendWallet = Account.fromBase58PrivateKey(privateKey);
        //如果接收方没有ATA账号,创建ATA账号
        TransactionInstruction idempotent = AssociatedTokenProgram.createIdempotent(
                sendWallet.getPublicKey(),
                destWallet,
                mintKey
        );
        //---------------------计算ATA账号地址---------------------
        List<byte[]> seeds=new ArrayList<>();
        seeds.add(sendWallet.getPublicKey().toByteArray());
        seeds.add(TokenProgram.PROGRAM_ID.toByteArray());
        seeds.add(mintKey.toByteArray());
        PublicKey sendAccount = PublicKey.findProgramAddress(
                seeds,
                AssociatedTokenProgram.PROGRAM_ID
        ).getAddress();
        PublicKey destAccount = PublicKey.findProgramAddress(
                Arrays.asList(destWallet.toByteArray(), TokenProgram.PROGRAM_ID.toByteArray(), mintKey.toByteArray()),
                AssociatedTokenProgram.PROGRAM_ID
        ).getAddress();
        //--------------------------------------------------
        //获取TransactionInstruction
        TransactionInstruction transactionInstruction =
                TokenProgram.transfer(
                        sendAccount,
                        destAccount,
                        10000000,
                        sendWallet.getPublicKey());
        //添加到Transaction
        Transaction transaction=new Transaction();
        transaction.addInstruction(idempotent);
        transaction.addInstruction(transactionInstructChina编程ion);
        //初始化调用环境
        RpcClient client = new RpcClient("https://palpable-fittest-shadow.solana-devnet.quiknode.pro/ce7fe4c5d9d1dd80eb5aafa6a965af0957526ad4");
        //发送调用并且进行签名
        String tx = client.getApi().sendTransaction(transaction, sendWallet);
        System.err.println(tx);

到此这篇关于SpringBoot集成SOL链的文章就介绍到这了,更多相关SpringBoot集成SOL链内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于SpringBoot集成SOL链的详细过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1152966

相关文章

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll