小试牛刀-SpringBoot集成SOL链

简介: java工程师:如何在java/springboot中使用solana区块链呢?不用担心,现在solanaj来了!

 目录

一、什么是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>

image.gif

三、主要类

3.1 RpcClient

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

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

image.gif

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

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

image.gif

3.2 PublicKey

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

PublicKey destWallet=new PublicKey("B2NmFbKEvEc8nZXzYdCnkrWKXQuTSr6GmWt8jPeaX2zf");

image.gif

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

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

image.gif

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

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

3.3 Transaction

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

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

transaction.addInstruction(transactionInstruction);

image.gif

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

transaction.sign();

image.gif

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

transaction.setRecentBlockHash();

image.gif

3.4 TransactionInstruction

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

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

image.gif

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

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

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

image.gif

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

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

image.gif

注:这里的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);

image.gif


社区:区块链社区


相关推荐:


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

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

image.gif 编辑


目录
相关文章
|
9月前
|
存储 Java 区块链
Springboot应用开发:工具类整理
在实际的Springboot应用开发中,有很多类可作为工具类,这些类将实际开发中可能用到的重复性代码进行提取,方便在后续的开发中使用,在这里我对在开发中经常用到的工具类进行整理,方便自己之后查找,同时希望可以帮助到有实现相关功能的朋友。
347 0
|
9月前
|
存储 算法 fastjson
火点监测:Nasa高分卫星接入
NASA(美国国家航空航天局)是美国联邦政府的一个独立机构,负责国家的航空航天研究和探索任务。NASA成立于1958年,其使命是探索太空并推动科学技术的发展。NASA的主要任务包括研究地球和太空的物理特性、开发和测试航空航天技术、进行太空探索和科学研究,以及促进航空航天技术的应用和技术转移。这里使用其开发的系统firms(火灾资源管理系统),通过Http请求获取数据来实现火点的监测,帮助需要实现相关功能,有类似开发任务的朋友。
303 7
|
9月前
|
区块链 数据安全/隐私保护 Python
小试牛刀-区块链WalletConnect协议数据解密
最近在学习如何使用Wallet Connect,查阅官方文档后,发现并没有太多的中文参考资料,英文直译读起来也有一些偏差,所以这边直接采用网页Demo的方式,对WC协议有了一定了解.在此进行记录,同时希望帮助到有实现相关功能的朋友.
1345 4
|
11月前
|
人工智能 前端开发 JavaScript
SpringBoot实现网页消息推送的5种方法
本文详细介绍了在SpringBoot中实现网页消息推送的几种主流方案,包括短轮询、长轮询、SSE(Server-Sent Events)、WebSocket以及STOMP。每种方案各有优缺点,适用于不同的场景需求。短轮询简单易实现但效率低;长轮询提升了实时性但仍有限制;SSE适合单向通信且轻量高效;WebSocket支持全双工通信,适合高实时性要求的场景;STOMP基于WebSocket,提供更高级的消息传递功能。通过对比分析,开发者可根据业务需求、性能要求及浏览器兼容性选择最适合的技术方案,同时可结合多种技术实现优雅降级,优化用户体验。
1986 57
|
9月前
|
存储 JavaScript 区块链
小试牛刀-walletconnect二维码及交互
最近在使用walletconnect协议和typescript语言实现相关交互功能,在此对从walletconnet协议二维码生成、连接后发送交易事务、签名事务、签名任意信息的处理进行记录,加深对walletconnect的理解,熟悉对其组件的使用,同时希望帮助到有实现相关功能的朋友。
347 2
|
9月前
|
存储 前端开发 测试技术
小试牛刀-区块链代币锁仓合约实战
记录一下自己在开发代币合约中的过程,加深自己对合约功能的理解,在后续的学习过程中可以进行资料查阅,以及帮助有这方面开发要求或想学习的朋友进行更方便的入门。
238 1
|
9月前
|
存储 Rust IDE
小试牛刀-Solana合约账户详解
开发语言上,Solana合约使用Rust为主要开发语言,其次是Solana合约并不像其它链那样将数据直接存到合约里,而是使用了更加独立的账户来代币转移和存储数据。按功能可以分为以下账户
313 1
|
9月前
|
区块链
小试牛刀-区块链Solana多签账户
在 Solana 区块链中,多签账户(Multisig Account)是一种智能合约账户,允许多个签名者共同管理和控制账户上的资产或操作。这种机制增强了账户的安全性和灵活性,特别适用于需要多个权限共同批准的操作场景,如资产管理、资金转移、或项目治理。
521 1
|
9月前
|
缓存 监控 Linux
Linux系统性能调优技巧和相关工具
Linux 作为一种应用应展和系统服务的优选操作系统,在处理性能和端到端点评估上持有出色表现。但是,在处理进程或系统处于低效状态时,性能调优就显得十分重要。本文将探讨一些 Linux 系统性能调优的常用技巧,并介绍相关工具
240 0
Linux系统性能调优技巧和相关工具
|
9月前
|
Python
小试牛刀-Python生成solana Wallet公私钥
在使用Python开发solana应用过程中,需要生成solana Wallet公私钥,以实现后续应用操作.这里将Python生成方法进行整理,方便日后的查阅,也能帮助到实现相关功能的朋友。
232 5