小试牛刀-SpringBoot集成SOL链

目录

一、什么是solanaj?

二、Pom依赖

三、主要类

[3.1 RpcClient](#3.1 RpcClient)

[3.2 PublicKey](#3.2 PublicKey)

[3.3 Transaction](#3.3 Transaction)

[3.4 TransactionInstruction](#3.4 TransactionInstruction)

四、示例代码


Welcome to Code Block's blog

本篇文章主要介绍了

[小试牛刀-SpringBoot集成SOL链 ]

❤博主广交技术好友,喜欢文章的可以关注一下❤

一、什么是solanaj?

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

二、Pom依赖

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

XML 复制代码
    <dependency>
        <groupId>com.mmorrell</groupId>
        <artifactId>solanaj</artifactId>
        <version>1.19.2</version>
    </dependency>

三、主要类

3.1 RpcClient

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

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

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

java 复制代码
String tx = client.getApi().sendTransaction(transaction, sendWallet);

3.2 PublicKey

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

java 复制代码
PublicKey destWallet=new PublicKey("B2NmFbKEvEc8nZXzYdCnkrWKXQuTSr6GmWt8jPeaX2zf");

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

java 复制代码
        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进行添加.

java 复制代码
transaction.addInstruction(transactionInstruction);

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

java 复制代码
transaction.sign();

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

java 复制代码
transaction.setRecentBlockHash();

3.4 TransactionInstruction

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

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

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

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

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

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

java 复制代码
        TransactionInstruction transactionInstruction = 
                TokenProgram.transfer(
                        sendAccount, //发送方 
                        destAccount, //接收方
                        10000000,  //数量
                        sendWallet.getPublicKey() //发送者);

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

四、示例代码

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

java 复制代码
       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(transactionInstruction);
        //初始化调用环境
        RpcClient client = new RpcClient("https://palpable-fittest-shadow.solana-devnet.quiknode.pro/ce7fe4c5d9d1dd80eb5aafa6a965af0957526ad4");
        //发送调用并且进行签名
        String tx = client.getApi().sendTransaction(transaction, sendWallet);

        System.err.println(tx);

社区:区块链社区


相关推荐:


在实验环境下进行,不涉及任何投资方面的建议~

感谢您的关注和收藏!!!!!!

相关推荐
圆蛤镇程序猿1 分钟前
【什么是MVCC?】
java·数据库·oracle
m0_748256783 分钟前
【SQL】掌握SQL查询技巧:数据分组与排序
java·jvm·sql
Damon撇嘴笑5 分钟前
Cause: java.sql.SQLException: sql injection violation, comment not allow异常问题处理
java·数据库·sql
孟秋与你14 分钟前
【redisson】redisson分布式锁原理分析
java·分布式
m0_7482370539 分钟前
【随时随地学算法】本地部署hello-algo结合内网穿透远程学习新体验
java
重剑DS1 小时前
接口开发完后,个人对于接下来接口优化的一些思考
java
m0_748233361 小时前
用JAVA实现人工智能:采用框架Spring AI Java
java·人工智能·spring
sin22012 小时前
springboot整合springmvc
java·spring boot·后端
牛马baby2 小时前
Java高频面试之SE-09
java·开发语言·面试
wangjun51592 小时前
java 转义 反斜杠 Unexpected internal error near index 1
java·正则表达式·反斜杠