SpringBoot集成SOL链的详细过程

Solanaj 是一个用于与 Solana 区块链交互的 Java 库,它为 Java 开发者提供了一套功能丰富的 API,使得在 Java 环境中可以轻松构建与 Solana 区块链交互的应用程序,这篇文章主要介绍了SpringBoot集成SOL链的详细过程,需要的朋友可以参考下

目录
  • 一、什么是solanaj?
  • 二、Pom依赖
  • 三、主要类
    • 3.1 RpcClient
    • 3.2 PublicKey
    • 3.3 Transaction
    • 3.4 TransactionInstruction
  • 四、示例代码

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

    到此这篇关于SpringBoot集成SOL链的文章就介绍到这了,更多相关SpringBoot集成SOL链内容请搜索骃骐网以前的文章或继续浏览下面的相关文章希望大家以后多多支持骃骐网!

    您可能感兴趣的文章:

    • 解决springboot报错Could not resolve placeholder‘xxx‘ in value“${XXXX}
    • SpringBoot整合Solr实现文档检索
    • IDEA SpringBoot:Cannot resolve configuration property配置文件问题
    • SpringBoot测试时卡在Resolving Maven dependencies的问题
    • springboot 自定义LocaleResolver实现切换语言
    • springboot整合solr的方法详解

    相关推荐:

    如何在 Vespa 中正确集成 ONNX 模型(使用 pyvespa)

    本文详解在 pyvespa 中部署 onnx 模型时常见的路径引用错误,重点说明为何不能在应用包中直接引用宿主机或 docker 卷中的 onnx 文件,并提供可落地的解决方案:将模型文件嵌入 zip 包、正确配置 schema 与 model 定义、确保资源分配充足。 本文详解在 pyvespa 中部署 onnx 模型时常见的路径引用错误,重点说明为何不能在应用包中直接引用宿主机或 docker...

    如何在 Vespa 中正确集成 ONNX 模型(PyVespa 教程)

    本文详解在 pyvespa 中部署 onnx 模型时常见的路径引用错误,指出应用包内不可使用宿主机或 docker 卷路径,所有模型文件必须打包进应用 zip 并通过相对路径引用,同时提供可运行的 schema 配置与部署实践要点。 本文详解在 pyvespa 中部署 onnx 模型时常见的路径引用错误,指出应用包内不可使用宿主机或 docker 卷路径,所有模型文件必须打包进应用 zip 并通过...

    如何在Flask中集成百度地图API_通过Python后端转发请求处理跨域

    前端不能直接调用百度地图API,因为AK必须绑定域名白名单,写在前端会暴露密钥导致盗用、配额超限或封禁;后端转发核心是保护密钥,而非绕过跨域,所有带AK的接口均需服务端中转。 为什么不能让前端直接调用百度地图API 因为百度地图JavaScript API强制要求使用ak(Access Key)且该密钥**仅限绑定域名白名单**,而一旦把ak写在前端代码里,就等于公开暴露——别人抓包就能盗用,触发...

    怎样在Python Flask中集成Swagger接口文档_使用flasgger插件

    用flasgger是Flask项目集成Swagger文档最轻量靠谱的选择;它通过装饰器和docstring生成可交互UI,需安装pyyaml并调用Swagger(app),注意YAML语法、definitions引用及类型书写规范。 Flask 项目里加 Swagger 文档,flasgger 是最轻量靠谱的选择 直接说结论:用 flasgger 比手写 OpenAPI YAML、或套 apisp...

    Python中Scikit-learn 1.2版本如何处理缺失值_了解集成算法的原生支持

    SimpleImputer是scikit-learn中处理缺失值的核心工具,自1.2版本起Imputer已移除,且strategy参数必须显式指定;支持mean、median(仅数值)、most_frequent(数值/类别)、constant(需fill_value)四种策略;不支持混合数据类型统一填充,须分列处理;fit_transform仅限训练集,测试集只能transform,否则导致评估...

    Python Django 5.0如何集成数据库读写分离_配置DATABASES路由机制

    Django 5.0 本身不自动做读写分离,必须靠 DATABASES 多库配置 + 自定义 DatabaseRouter 类 + DATABASE_ROUTERS 注册三者配合,缺一不可;手动用 .using("slave") 是兜底手段,不是集成方案。 直接说结论:Django 5.0 本身不自动做读写分离,必须靠 DATABASES 多库配置 + 自定义 DatabaseRouter 类 +...

    Python爬虫如何识别图片内容_集成Tesseract进行OCR文字提取

    pytesseract调用Tesseract是Python爬虫轻量级OCR最可行方案,但必须显式设置tesseract_cmd路径和lang参数(如lang='chi_sim'),否则90%报错源于此;中文识别需下载chi_sim.traineddata放入tessdata目录,并确保Tesseract版本≥5.3。 直接说结论:pytesseract 调用 Tesseract 是目前 Pytho...

    如何在Jenkins中集成Python代码质量检查_配置Pylint与Flake8插件

    Jenkins不原生支持Pylint/Flake8,需用Shell脚本调用并配合Warnings Next Generation插件等方案;Violations插件仅兼容Pylint特定格式,且新版Jenkins存在路径、环境、编码等多重兼容问题。 直接说结论:Jenkins 本身不原生支持 Pylint/Flake8,必须靠 Shell 脚本 + Violations 插件(仅对 Pylint ...

    如何在Python中优化PyTorch大模型的显存占用_使用DeepSpeed集成优化

    DeepSpeed集成前必须确认三件事:CUDA可用且驱动≥525.60.13;模型已封装为torch.nn.Module;训练循环未手动调用.to(device)或.cuda(),否则张量跨设备错误。 DeepSpeed集成前必须确认的三件事 不装DeepSpeed就直接改代码,大概率白忙活。它不是“加个装饰器就能省显存”的轻量工具,而是要重走训练流程的系统级改造。 先检查这三项是否全部满足: ...

    Flask 与 Laravel API 集成中 503 错误的定位与修复指南

    本文详解 flask 后端与 laravel 前端(或反向)api 通信时出现 503 service unavailable 的根本原因——http 方法不匹配,并提供完整可运行的调试方案与最佳实践。 本文详解 flask 后端与 laravel 前端(或反向)api 通信时出现 503 service unavailable 的根本原因——http 方法不匹配,并提供完整可运行的调试方案与最佳...