Sol4kは、Javaや他のJVM言語、Androidでも使用できるSolana用のKotlinクライアントです。このクライアントを使用すると、RPCノードと通信し、ブロックチェーンから情報をクエリし、アカウントを作成し、データを読み取り、さまざまな種類のトランザクションを送信し、キーペアや公開鍵を操作できます。また、開発者がスムーズかつ簡単に作業できるように便利なAPIも提供しています。
Gradle:
implementation 'org.sol4k:sol4k:0.7.0'Maven:
<dependency>
<groupId>org.sol4k</groupId>
<artifactId>sol4k</artifactId>
<version>0.7.0</version>
</dependency>接続を作成し、最新のブロックハッシュをリクエストし、1つのアカウントから別のアカウントにSOL転送トランザクションを送信します。
val connection = Connection(RpcUrl.DEVNET)
val blockhash = connection.getLatestBlockhash()
val sender = Keypair.fromSecretKey(secretKeyBytes)
val receiver = PublicKey("DxPv2QMA5cWR5Xfg7tXr5YtJ1EEStg5Kiag9HhkY1mSx")
val instruction = TransferInstruction(sender.publicKey, receiver, lamports = 1000)
val message = TransactionMessage.newMessage(sender.publicKey, blockhash, instruction)
val transaction = VersionedTransaction(message)
transaction.sign(sender)
val signature = connection.sendTransaction(transaction)sol4k APIのJavaの例を見つけるには、sol4k-examplesリポジトリを参照してください。
キーペアの生成。
val generatedKeypair = Keypair.generate()既存の秘密鍵からキーペアを作成。
val keypairFromSecretKey = Keypair.fromSecretKey(secretKeyByteArray)文字列から公開鍵を作成。
val publicKey = PublicKey("DxPv2QMA5cWR5Xfg7tXr5YtJ1EEStg5Kiag9HhkY1mSx")バイト配列から公開鍵を作成。
val publicKey = PublicKey(publicKeyByteArray)SPLトークンの関連トークンアカウントアドレスを取得。
val programDerivedAddress = PublicKey.findProgramDerivedAddress(holderAddress, tokenMintAddress)公開鍵を文字列に変換。
val publicKey = PublicKey("DxPv2QMA5cWR5Xfg7tXr5YtJ1EEStg5Kiag9HhkY1mSx")
publicKey.toBase58() // DxPv2QMA5cWR5Xfg7tXr5YtJ1EEStg5Kiag9HhkY1mSx
publicKey.toString() // DxPv2QMA5cWR5Xfg7tXr5YtJ1EEStg5Kiag9HhkY1mSxデータのデコード。
val decodedBytes: ByteArray = Base58.decode("DxPv2QMA5cWR5Xfg7tXr5YtJ1EEStg5Kiag9HhkY1mSx")データのエンコード。
val encodedData: String = Base58.encode(inputByteArray)メッセージの署名。
val signature: ByteArray = keypair.sign(messageByteArray)検証。
val result: Boolean = publicKey.verify(signature, message)RPC呼び出しは、Connectionクラスを介して行われ、このクラスはJSON RPCメソッドを反映する関数を公開します。接続は、HTTP URLとコミットメントを使用して作成できます。
val connection = Connection(RpcUrl.DEVNET, Commitment.PROCESSED)コミットメントが指定されていない場合、デフォルトでFINALIZEDが使用されます。
val connection = Connection(RpcUrl.DEVNET)RPC URLを文字列として渡すこともできます。
val connection = Connection("https://api.devnet.solana.com")コミットメントが必要なRPCメソッドは、接続作成時に指定されたコミットメントを使用するか、追加の引数としてコミットメントを渡して上書きできます。
val connection = Connection(RpcUrl.DEVNET, Commitment.CONFIRMED)
// 'confirmed'コミットメントのブロックハッシュ
val blockhash = connection.getLatestBlockhash()
// コミットメントは'finalized'で上書きされます
val finalizedBlockhash = connection.getLatestBlockhash(Commitment.FINALIZED)サポートされているAPI:
getAccountInfogetBalancegetEpochInfogetFeeForMessagegetHealthgetIdentitygetLatestBlockhashgetMinimumBalanceForRentExemptiongetMultipleAccountsgetRecentPrioritizationFeesgetTokenAccountBalancegetTokenSupplygetTransactionCountgetVersionisBlockhashValidrequestAirdropsendTransactionsimulateTransaction
sol4kは、VersionedTransactionおよびTransactionクラスを使用して、バージョン化されたトランザクションとレガシートランザクションをサポートします。両方のクラスは類似したAPIをサポートしており、Solanaトランザクションの構築、署名、シリアル化、逆シリアル化、および送信に使用できます。新しいコードではVersionedTransactionを使用することをお勧めします。トランザクションは、最新のブロックハッシュ、1つ以上の命令、および手数料支払者を指定して作成できます。
val message = TransactionMessage.newMessage(feePayer, blockhash, instruction)
val transaction = VersionedTransaction(message)複数の命令を持つバージョン化されたトランザクション:
val message = TransactionMessage.newMessage(feePayer, blockhash, instructions)
val transaction = VersionedTransaction(message)レガシートランザクション:
val transaction = Transaction(blockhash, instructions, feePayer)Instructionは、次のデータを必要とするインターフェースです:
interface Instruction {
val data: ByteArray
val keys: List<AccountMeta>
val programId: PublicKey
}Instructionインターフェースには、TransferInstruction、SplTransferInstruction、CreateAssociatedTokenAccountInstruction、および任意のトランザクションを送信するために使用されるBaseInstructionなどのいくつかの実装があります。
AccountMetaは、命令で使用されるアカウントのメタデータを指定できるクラスです。公開鍵と2つのboolean値(signerおよびwritable)が必要です。
val accountMeta = AccountMeta(publicKey, signer = false, writable = true)異なるプロパティの組み合わせでオブジェクトを作成するための3つの便利な関数も提供しています。
val signerAndWritable: AccountMeta = AccountMeta.signerAndWritable(publicKey)
val signer: AccountMeta = AccountMeta.signer(publicKey)
val writable: AccountMeta = AccountMeta.writable(publicKey)すべてを組み合わせた例: ゲームプログラムに情報を送信するトランザクションの作成。
val instructionData = byteArrayOf(-3, -42, 48, -55, 100, -55, -29, -37)
val accounts = listOf(
AccountMeta.writable(gameAccount),
AccountMeta.signerAndWritable(playerPublicKey)
)
val joinGameInstruction = BaseInstruction(instructionData, accounts, programId)
val blockhash = connection.getLatestBlockhash()
val joinGameMessage = TransactionMessage.newMessage(playerPublicKey, blockhash, joinGameInstruction)
val joinGameTransaction = VersionedTransaction(joinGameMessage)
joinGameTransaction.sign(playerKeypair)
val signature = connection.sendTransaction(joinGameTransaction)別の例: ユーザーのウォレットに関連するトークンアカウントを作成する。
val blockhash = connection.getLatestBlockhash()
val payerWallet = Keypair.fromSecretKey(secretKeyBytes)
val usdcMintAddress = PublicKey("Gh9ZwEmdLJ8DscKNTkTqPbNwLNNBjuSzaG9Vp2KGtKJr")
val destinationWallet = Keypair.generate().publicKey
val (associatedAccount) = PublicKey.findProgramDerivedAddress(destinationWallet, usdcMintAddress)
val instruction = CreateAssociatedTokenAccountInstruction(
payer = payerWallet.publicKey,
associatedToken = associatedAccount,
owner = destinationWallet,
mint = usdcMintAddress,
)
val message = TransactionMessage.newMessage(payerWallet.publicKey, blockhash, instruction)
val transaction = Transaction(message)
transaction.sign(payerWallet)
val signature = connection.sendTransaction(transaction)プロジェクトテストでさらに多くの例を見つけることができます。
sol4kをローカルでビルドして実行するには、次の手順を実行します:
- デフォルトのJDKバージョンとしてJDK 11以上をインストールします(
java --versionを実行して11以上が表示されることを確認)。 - JDK 8をインストールしますが、デフォルトとして選択しません。macOSを使用している場合は、
/usr/libexec/java_home -Vを実行してJava 8がリストにあるか確認できます。 ./gradlew publishToMavenLocalを実行します。
これにより、sol4kがローカルのMavenリポジトリにインストールされ、他のプロジェクトでインポートできるようになります(MavenリポジトリにmavenLocalが含まれていることを確認してください)。gradle.propertiesのcurrentVersionを調整して、ビルドしたバージョンをインポートしていることを確認してください。
エンドツーエンドテストを実行するには、2つの環境変数を設定する必要があります: RPC URLとテストに使用するアカウントのBase-58でエンコードされた秘密鍵です。
export E2E_RPC_URL="https://api.devnet.solana.com"
export E2E_SECRET_KEY="base-58-encode-secret-key..."テストを実行します:
./gradlew integrationTestテストを実行するには、アカウントにDevnet SOLとDevnet USDCが必要です。どちらもこのfaucetを使用して受け取ることができます。
テスト用に新しいアカウントを作成する場合は、次のように行うことができます:
val keypair = Keypair.generate()
val secret = Base58.encode(keypair.secret)
println("Secret: $secret")
println("Public Key: ${keypair.publicKey}")環境変数が設定されていない場合、エンドツーエンドテストはEwtJVgZQGHe9MXmrNWmujwcc6JoVESU2pmq7wTDBvReFを使用してブロックチェーンと対話します。この秘密鍵はソースコードで公開されているため、これを使用する場合はDevnet USDCとSOLがあることを確認してください。
sol4kが気に入ってプロジェクトを継続してほしい場合は、GitHub Sponsorsを通じてスポンサーになるか、次のウォレットアドレスに直接寄付を検討してください:
HNFoca4s9e9XG6KBpaQurVj4Yr6k3GQKhnubRxAGwAZs