代码示例
首先引入依赖
bash
<dependency>
<groupId>com.mmorrell</groupId>
<artifactId>solanaj</artifactId>
<version>1.19.2</version>
</dependency>
java
public static String SECRET_KEY = "";
public static RpcClient SOL_RPC_CLIENT = null;
@BeforeAll
public static void readTradeAccountSecretKey() {
SOL_RPC_CLIENT = new RpcClient(Cluster.MAINNET);
String skPath = "/Users/xxx/.config/solana/id.json";
try (BufferedReader reader = new BufferedReader(new FileReader(skPath))) {
String line;
while ((line = reader.readLine()) != null) {
SECRET_KEY = line;
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testTransfer() throws RpcException {
PublicKey toPublickKey = new PublicKey("");
int lamports = 3000;
Account signer = Account.fromJson(SECRET_KEY);
log.info(signer.getPublicKey().toString());
Transaction transaction = new Transaction();
transaction.addInstruction(SystemProgram.transfer(signer.getPublicKey(), toPublickKey, lamports));
String signature = SOL_RPC_CLIENT.getApi().sendTransaction(transaction, signer);
log.info(signature);
}
说明
-
这里Account对象的生成可以由json字节数组生成也通过另外一个方法 Account.fromBase58PrivateKey(), 这种适合从Phantom这样的钱包中复制的私钥来生成。
由私钥可以生成Account对象,Account对象可以获取PublicKey,PublicKey的字符串形式就是solana上的地址。
-
要想发送交易,需要先构造一个Transaction对象,对象中包含了要执行的指令。
比如本例中,我们需要先构造转账交易,即SystemProgram.transfer(), 有三个参数,from地址,to地址,以及要转账的solana数量,SystemProgram.transfer() 得到的就一个TransactionInstruction类型的对象。将构造好的指令加入到transaction对象中。
-
接着用rpcClient将构造好的交易发送上链,这里需要说明的是:
sendTransaction方法中还包含了获取最新交易区块的动作以及使用singer私钥签名的动作:
最后,这里的转账交易仅能转原生token solana, 其他类型的token需要别的指令,这个后面再写一篇。