小试牛刀-SpringBoot集成SOL链
目录
一、什么是solanaj?
二、Pom依赖
三、主要类
3.1 RpcClient
3.2 PublicKey
3.3 Transaction
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依赖如下:
<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();
RecentBlockHash:最近的的区块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(
sendAccount, //发送方
destAccount, //接收方
10000000, //数量
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(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);
社区:区块链社区
相关推荐:
-
小试牛刀-SOL链swap程序
-
小试牛刀-SOL链创建Token
-
小试牛刀-区块链Solana多签账户
在实验环境下进行,不涉及任何投资方面的建议~
感谢您的关注和收藏!!!!!!