# sol4k
**Repository Path**: ProjectOpenSea/sol4k
## Basic Information
- **Project Name**: sol4k
- **Description**: Kotlin, Java, and Android client for Solana ⛓️
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-09-23
- **Last Updated**: 2025-09-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# sol4k [](https://central.sonatype.com/artifact/org.sol4k/sol4k) [](https://github.com/sol4k/sol4k/actions/workflows/build.yml) [](https://github.com/sol4k/sol4k/actions/workflows/lint.yml) [](https://github.com/sol4k/sol4k/blob/main/LICENSE)
English │ 한국어 │ 中文 │ 日本語
Sol4k 是 Solana 的 Kotlin 客户端,可与 Java 或任何其他 JVM 语言以及 Android 一起使用。它支持与 RPC 节点通信,允许用户从区块链查询信息、创建帐户、从帐户读取数据、发送不同类型的交易以及使用密钥对和公钥。客户端还公开了方便的 API,使开发人员的体验顺畅而直接。
## 如何导入
Gradle:
```groovy
implementation 'org.sol4k:sol4k:0.5.17'
```
Maven:
```xml
org.sol4k
sol4k
0.5.17
```
## 何如使用
创建连接,请求最新的区块哈希,并提交从一个账户到另一个账户的 SOL 转账交易
```kotlin
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-examples](https://github.com/sol4k/sol4k-examples) 存储库以查找 立即使用的 sol4k API Java 示例
## 支持的 API:
### 使用密钥对和公钥。
生成密钥对。
```kotlin
val generatedKeypair = Keypair.generate()
```
从现有密钥创建密钥对。
```kotlin
val keypairFromSecretKey = Keypair.fromSecretKey(secretKeyByteArray)
```
从字符串创建公钥。
```kotlin
val publicKey = PublicKey("DxPv2QMA5cWR5Xfg7tXr5YtJ1EEStg5Kiag9HhkY1mSx")
```
从字节数组创建公钥。
```kotlin
val publicKey = PublicKey(publicKeyByteArray)
```
获取SPL令牌的关联令牌帐户地址。
```kotlin
val programDerivedAddress = PublicKey.findProgramDerivedAddress(holderAddress, tokenMintAddress)
```
将公钥转换为字符串。
```kotlin
val publicKey = PublicKey("DxPv2QMA5cWR5Xfg7tXr5YtJ1EEStg5Kiag9HhkY1mSx")
publicKey.toBase58() // DxPv2QMA5cWR5Xfg7tXr5YtJ1EEStg5Kiag9HhkY1mSx
publicKey.toString() // DxPv2QMA5cWR5Xfg7tXr5YtJ1EEStg5Kiag9HhkY1mSx
```
### Base 58编码
解码数据。
```kotlin
val decodedBytes: ByteArray = Base58.decode("DxPv2QMA5cWR5Xfg7tXr5YtJ1EEStg5Kiag9HhkY1mSx")
```
编码数据。
```kotlin
val encodedData: String = Base58.encode(inputByteArray)
```
### 处理签名
签署消息。
```kotlin
val signature: ByteArray = keypair.sign(messageByteArray)
```
验证
```kotlin
val result: Boolean = publicKey.verify(signature, message)
```
### RPC 函数功能
RPC 调用是通过“Connection”类执行的,该类公开了镜像的函数
[JSON RPC 方法](https://docs.solana.com/api/http)。
可以创建连接带有 RPC 节点的 HTTP URL 承诺级别。
```kotlin
val connection = Connection(RpcUrl.DEVNET, Commitment.PROCESSED)
```
如果没有指定承诺级别,默认使用 FINALIZED(最终确定)。
```kotlin
val connection = Connection(RpcUrl.DEVNET)
```
你也可以将 RPC URL 作为字符串传递。
```kotlin
val connection = Connection("https://api.devnet.solana.com")
```
需要承诺级别的 RPC 方法将使用在连接创建时指定的承诺级别,
或者可以通过传递承诺级别作为额外参数来覆盖该默认设置。
```kotlin
val connection = Connection(RpcUrl.DEVNET, Commitment.CONFIRMED)
// 一个具有'confirmed' (已确认) 承诺级别的区块哈希。
val blockhash = connection.getLatestBlockhash()
// 承诺级别被 'finalized'(已最终确定)覆盖。
val finalizedBlockhash = connection.getLatestBlockhash(Commitment.FINALIZED)
```
支持的 API:
- `getAccountInfo`:获取账户信息,返回指定账户的详细数据,包括余额、状态等信息。
- `getBalance`:获取指定账户的余额。
- `getEpochInfo`:获取当前epoch的相关信息,包括epoch编号、slot范围等。
- `getHealth`:检查节点的健康状态,通常用于了解节点是否正常运行。
- `getIdentity`:获取节点的身份信息,通常包含节点的公钥和一些其他的元数据。
- `getLatestBlockhash`:获取当前网络最新区块的哈希,用于提交交易时指定区块哈希。
- `getMinimumBalanceForRentExemption`:获取不需要支付租金的账户余额的最小值,即账户需要持有的最低余额,以避免被清除。
- `getMultipleAccounts`:批量获取多个账户的信息,比单独获取每个账户信息更高效。
- `getTokenAccountBalance`:获取指定代币账户的余额,通常用于获取SPL代币(Solana的代币标准)的余额。
- `getTokenSupply`:获取指定代币的总供应量,显示该代币的发行量。
- `getTransactionCount`:获取指定账户的交易计数(nonce),该计数用于确保交易顺序和避免重放攻击。
- `isBlockhashValid`:验证一个区块哈希是否有效,通常用来检查某个区块哈希是否可以用于提交交易。
- `requestAirdrop`:请求空投指定数量的代币(通常是SOL),用于开发测试目的。
- `sendTransaction`:发送交易,将交易信息提交到网络,通常是进行某些操作(如转账、合约调用等)。
- `simulateTransaction`:模拟执行交易,但不实际提交到网络,用于检查交易是否会成功执行,帮助开发者调试。
### 交易
Sol4k 支持版本化交易和传统交易,分别通过 VersionedTransaction(版本化交易)和 Transaction(传统交易)类来实现这两个类提供了相似的 API,可以用于构建、签名、序列化、反序列化以及发送 Solana 交易。建议在新代码中使用 VersionedTransaction(版本化交易)。交易可以通过指定最新的区块哈希、一个或多个操作指令,以及费用支付者来创建。
```kotlin
val message = TransactionMessage.newMessage(feePayer, blockhash, instruction)
val transaction = VersionedTransaction(message)
```
具有多个指令的版本化交易:
```kotlin
val message = TransactionMessage.newMessage(feePayer, blockhash, instructions)
val transaction = VersionedTransaction(message)
```
传统交易:
```kotlin
val transaction = Transaction(blockhash, instructions, feePayer)
```
`Instruction` (指令)是一个接口,要求包含以下数据:
```kotlin
interface Instruction {
val data: ByteArray
val keys: List
val programId: PublicKey
}
```
`Instruction` (指令)接口有多个实现,例如`TransferInstruction`(转账指令)、
`SplTransferInstruction`(Spl转账指令)、 `CreateAssociatedTokenAccountInstruction`创建关联代币账户指令)和BaseInstruction(基础指令,用于发送任意交易事务)。
`AccountMeta`(账户元数据)是一个类,用于指定在指令中使用的账户的元数据。它需要一个公钥和两个布尔值:`signer`(签名者)和 `writable`(可写)。
```kotlin
val accountMeta = AccountMeta(publicKey, signer = false, writable = true)
```
它还提供了三个方法,用于构造具有不同属性组合的对象。
```kotlin
val signerAndWritable: AccountMeta = AccountMeta.signerAndWritable(publicKey)
val signer: AccountMeta = AccountMeta.signer(publicKey)
val writable: AccountMeta = AccountMeta.writable(publicKey)
```
这是将所有内容组合在一起的示例:创建一个向游戏程序发送信息的交易。
```kotlin
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)
```
这是另一个示例:为用户的钱包创建一个关联代币账户。
```kotlin
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)
```
你可以在[项目的测试中]找到更多示例。
(https://github.com/sol4k/sol4k/blob/main/src/integration-test/kotlin/org/sol4k/ConnectionTest.kt).
## 开发环境设置
为了在本地构建和运行 sol4k,请执行以下步骤:
- 安装 JDK 11 或更高版本作为默认 JDK 版本(运行 `java --version` 应显示 11 或更高版本)。
- 安装 JDK 8,但不要将其设置为默认版本。如果你使用的是 macOS,可以通过运行 `/usr/libexec/java_home -V`来查看 Java 8 是否在列表中。
- 执行 `./gradlew publishToMavenLocal`.
这将把 sol4k 安装到你本地的 Maven 仓库中,你可以在其他项目中导入它
`mavenLocal` is among [ 你的 Maven 仓库](https://github.com/sol4k/sol4k-examples/blob/main/build.gradle#L11-L14)).
在 `gradle.properties` 文件中调整 `currentVersion`,以确保你导入的是你构建的版本。
为了运行端到端测试,你需要设置两个环境变量:
一个 RPC URL和一个用于测试的账户的 Base-58 编码的密钥。
```shell
export E2E_RPC_URL="https://api.devnet.solana.com"
export E2E_SECRET_KEY="base-58-encode-secret-key..."
```
执行测试:
```shell
./gradlew integrationTest
```
账户需要有一些 Devnet SOL 和 Devnet USDC 才能运行测试。你可以使用 [这个水龙头](https://spl-token-faucet.com/?token-name=USDC-Dev) 来空投这两者。
如果你想为测试生成一个新账户,可以按照以下方式操作:
```shell
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](https://github.com/sponsors/Shpota) 进行赞助,或者直接向以下钱包地址捐赠:
```shell
HNFoca4s9e9XG6KBpaQurVj4Yr6k3GQKhnubRxAGwAZs
```