一、什么是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链内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论