小试牛刀-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多签账户


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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/949607.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LLM之RAG实战(五十一)| 使用python和Cypher解析PDF数据,并加载到Neo4j数据库

一、必备条件&#xff1a; python语言Neo4j数据库python库&#xff1a;neo4j、llmsherpa、glob、dotenv 二、代码&#xff1a; from llmsherpa.readers import LayoutPDFReaderfrom neo4j import GraphDatabaseimport uuidimport hashlibimport osimport globfrom datetime …

牛客网刷题 ——C语言初阶(5操作符)——BC117 小乐乐走台阶

1.题目 &#xff1a;BC117 小乐乐走台阶 牛客OJ题链接 描述 小乐乐上课需要走n阶台阶&#xff0c;因为他腿比较长&#xff0c;所以每次可以选择走一阶或者走两阶&#xff0c;那么他一共有多少种走法&#xff1f; 输入描述&#xff1a; 输入包含一个整数n (1 ≤ n ≤ 30) …

gitlab高级功能之 CICD Steps

CICD Steps 1. 介绍2. 定义 Steps2.1 Inputs2.2 Outputs 3. Using steps3.1 Set environment variables3.2 Running steps locally 4. Scripts5. Actions5.1 已知的问题 6. 表达式7. 实操7.1 单个step7.2 多个step7.3 复用steps7.4 添加output到step7.5 使用远程step 1. 介绍 …

【Unity3D】UGUI Canvas画布渲染流程

目录 Screen Space - Overlay Screen Space - Camera World Space UI合批分析&#xff08;建议不看 直接看FrameDebugger测试&#xff09; 优化UI合批 1、Image图片纹理不同导致合批失败 2、文本和图片相交以及排序对合批的影响 3、Mask对合批的影响&#xff08;情况…

平安产险安徽分公司携手安徽中医药临床研究中心附属医院 共筑儿童安全防护网

为响应金融知识普及教育号召&#xff0c;平安产险安徽分公司联动安徽中医药临床研究中心附属医院&#xff0c;于近日在朝霞小学举办了一场儿童安全防范与健康守护活动。此次活动旨在提升学生的安全防范意识&#xff0c;守护儿童健康成长&#xff0c;同时有力推动金融知识与传统…

zephyr移植到STM32

Zephy如何移植到单片机 1. Window下搭建开发环境1.1 安装Choncolatey1.2 安装相关依赖1.3创建虚拟python环境1.4 安装west1.4.1 使用 pip 安装 west1.4.2 检查 west 安装路径1.4.3 将 Scripts路径添加到环境变量1.4.4 验证安装 1.5 获取zephyr源码和[安装python](https://so.cs…

fail api scope is not declared in the privacy agreement微信小程序uniapp 解决录音无法播放、授权

已解决 fail api scope is not declared in the privacy agreement微信小程序uniapp 解决录音无法播放、授权 没有声明内容协议导致的 微信公众平台&#xff1a;https://mp.weixin.qq.com/【1.左下角的-移动过去后会出现 “帐号设置”】 【2.基本设置->服务内容声明->修…

虚拟机 网络防御(预防信息泄露)

了解VMware网络基本配置 Bridged(桥接模式):虚拟机和主机好比在同一个网络环境下的两台电脑。 NAT(网络地址转换模式):NAT模式虚拟机通过主机进行联网。&#xff08;推荐&#xff09; Host-0nly(主机模式):主机模式将虚拟机与外网隔开&#xff0c;只能让虚拟机和虚拟机之间联…

打包部署若依(RuoYi)SpringBoot后端和Vue前端图文教程

打包后端‘ 1&#xff0c;打开若依&#xff0c;点击右侧的Maven展开Maven管理&#xff0c;选择ruoyi>Lifecycle 先双击clean清除原本启动项目时生成的文件。然后点击package等待项目打包&#xff0c;切记要取消运行再打包 打包完成后会在ruoyi-admin>src>target里面…

矩阵碰一碰发视频源码搭建全解析,支持OEM

在数字化营销与互动体验需求日益增长的当下&#xff0c;矩阵碰一碰发视频功能以其独特的交互性和高效的信息传播能力&#xff0c;正逐渐成为吸引用户、提升品牌影响力的有力工具。本文将深入探讨如何搭建矩阵碰一碰发视频的源码&#xff0c;帮助开发者实现这一创新功能。 一、技…

专题十四——BFS

目录 一BFS解决FloodFill算法 1图像渲染 2岛屿数量 3岛屿的最大面积 4被环绕的区域 二BFS解决蛋源最短路径问题 1迷宫中离入口最近的出口 2最小基因变化 3单词接龙 4为高尔夫比赛砍树 三BFS解决多源最短路径问题 1 01矩阵 2飞地的数量 3地图中的最高点 4地图分…

openwrt 清缓存命令行

一、查看缓存 &#xff1a; free -m 二、清缓存&#xff1a;echo 3 > /proc/sys/vm/drop_caches  三、详解。 释放物理页缓存 echo 1 > /proc/sys/vm/drop_caches 释放可回收的slab对象&#xff0c;包含inode and dentry echo 2 > /proc/sys/vm/drop_caches 同时…

huggingface 下载方法 测试ok

目录 python下载方法&#xff1a; 设置环境变量 ~/.bashrc 缓存目录&#xff0c;默认模型下载目录 安装方法&#xff1a; python 下载无token&#xff1a; python 下载带token 常见报错 登录后创建Read token 2.3 创建token 使用token登录 python下载方法&#xff1…

滑动窗口_⻓度最⼩的⼦数组⽆重复字符的最⻓⼦串将x减到0的最⼩操作数

⻓度最⼩的⼦数组&#xff08;medium https://leetcode.cn/problems/minimum-size-subarray-sum/ 思路一&#xff1a;两个指针&#xff0c;p1 p2同时指向第一个元素。sump2,如果sum<target&#xff0c;p2直到大于&#xff0c;然后记录lenright-left。p1 p2再同时指向第二个…

【无标题】linux

Linux工具快速教程 Linux 基础 Linux工具快速教程1、使用命令帮助1.1 查看命令的简要说明1.2 查看路径 2. 文件及目录2.1 创建和删除2.2 切换目录2.3 列出目录项2.4 查找文件或目录 find2.5 查看文件内容2.6 查找文件内容 好用小工具linux工具电源统计1. 查询公网IPhttp://www.…

HarmonyOS-面试资料

1. HarmonyOS-面试资料 1.1. HarmonyOS 优点、特点 1.1.1. 优点 &#xff08;1&#xff09;在国家方面&#xff0c;是国产的系统&#xff0c;受国家支持不会有限制的情况。   &#xff08;2&#xff09;设备互连18N(1:手机 8&#xff1a;平板、PC、vr设备、可穿戴设备、智慧…

关于物联网的基础知识(一)

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于物联网的基础知识&#xff08;一&a…

基于Thinkphp6+uniapp的陪玩陪聊软件开发方案分析

使用uni-app框架进行前端开发。uni-app是一个使用Vue.js开发所有前端应用的框架&#xff0c;支持一次编写&#xff0c;多端发布&#xff0c;包括APP、小程序、H5等。 使用Thinkphp6框架进行后端开发。Thinkphp6是一个轻量级、高性能、面向对象的PHP开发框架&#xff0c;具有易…

springcloud 介绍

Spring Cloud是一个基于Spring Boot的微服务架构解决方案集合&#xff0c;它提供了一套完整的工具集&#xff0c;用于快速构建分布式系统。在Spring Cloud的架构中&#xff0c;服务被拆分为一系列小型、自治的微服务&#xff0c;每个服务运行在其独立的进程中&#xff0c;并通过…

jenkins入门6 --拉取代码

Jenkins代码拉取 需要的插件&#xff0c;缺少的安装下 新建一个item,选择freestyle project 源码管理配置如下&#xff1a;需要添加git库地址&#xff0c;和登录git的用户密码 配置好后执行编译&#xff0c;成功后拉取的代码在工作空间里