新一代公链代表Solana(7) --- Solana的公链交互之RPC远程调用
在之前的文章中,我们学会了如何通过命令行操作钱包,包括新建账户,查询余额,转账等核心操作。在这篇文章中,我们将讨论如何通过RPC远程调用获Solana公链信息。
·
在之前的文章中,我们学会了如何通过命令行操作钱包,包括新建账户,查询余额,转账等核心操作。在这篇文章中,我们将讨论如何通过RPC远程调用获取Solana公链信息
1.节点相关接口
获取集群节点信息
curl https://api.testnet.solana.com -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc": "2.0", "id": 1,
"method": "getClusterNodes"
}
'
返回结果:
{
"jsonrpc": "2.0",
"result": [
{
"featureSet": 743568211, // 节点支持的特性集合,用于标识节点支持的特性和功能
"gossip": "35.90.185.39:8000", // 节点的 Gossip 服务地址,用于传播消息和状态更新
"pubkey": "Gp9R3ts3j9Akhmvyky8WCrUYRVdUhzTyct4M4WXz937d", // 节点的公钥,用于标识和验证节点身份
"pubsub": "35.90.185.39:8900", // 节点的 PubSub 服务地址,用于发布和订阅消息
"rpc": "35.90.185.39:8899", // 节点的 RPC 服务地址,用于与节点进行交互和查询
"shredVersion": 503, // 节点的 Shred 版本,用于分片和传播区块的数据结构
"tpu": "35.90.185.39:8003", // 节点的 TPU 服务地址,用于执行事务处理
"tpuQuic": "35.90.185.39:8009", // 节点的 TPU Quic 服务地址,用于通过 QUIC 协议执行事务处理
"version": "1.18.7" // 节点的 Solana 软件版本号,用于标识节点所运行的 Solana 软件的版本
}
]
}
2. 区块相关接口
获取当前区块高度
curl https://api.testnet.solana.com -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc":"2.0","id":1,
"method":"getBlockHeight"
}
'
返回结果:
{
"jsonrpc": "2.0",
"result": 278287924, // 区块高度
"id": 1
}
获取最近的Block Hash
curl https://api.testnet.solana.com -X POST -H "Content-Type: application/json" -d '
{
"id":1,
"jsonrpc":"2.0",
"method":"getLatestBlockhash",
"params":[
{
"commitment":"processed"
}
]
}
'
返回结果
{
"jsonrpc": "2.0",
"result": {
"context": {
"apiVersion": "1.18.4",
"slot": 289997028
},
"value": {
"blockhash": "6AN3deqvbfzwYot8W8iMETR7Ek11e29jPoibz8Gw1MKL",
"lastValidBlockHeight": 278289671
}
},
"id": 1
}
获取指定高度block的信息
curl https://api.testnet.solana.com -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc": "2.0","id":1,
"method":"getBlock",
"params": [
278289671,
{
"encoding": "jsonParsed",
"maxSupportedTransactionVersion":0,
"transactionDetails":"full",
"rewards":false
}
]
}
返回结果
{
"jsonrpc": "2.0",
"result": {
"blockHeight": 266588679,
"blockTime": 1707482369,
"blockhash": "W6x1uEJcEiJdnAeLZfujpWVMYTfTJjtjngyeU7Dai6Z",
"parentSlot": 278289670,
"previousBlockhash": "8bwQ1N5wcJrqxFZRL8n5drdUYQpHYbHwpNf1rSHs4daZ",
"transactions": [
{
"meta": {
"computeUnitsConsumed": 64956,
"err": null,
"fee": 5000,
"innerInstructions": [
{
"index": 1,
"instructions": [
{
"accounts": [
"HXoZZBWv25N4fm2vfSKnHXTeDJ31qaAcWZe3ZKeM6dQv",
"3u6T92C2x18s39a7WNM8NGaQK1YEtstTtqamZGsLvNZN"
],
"data": "6y43XFem5gjyytzPY3JPiGE3jsNhobnCxQTVsR3bTDuR",
"programId": "HEvSKofvBgfaexv23kMabbYqxasxU3mQ4ibBMEmJWHny",
"stackHeight": 2
}
]
}
],
"logMessages": [
"Program ComputeBudget111111111111111111111111111111 invoke [1]",
"Program ComputeBudget111111111111111111111111111111 success",
"Program cjg3oHmg9uuPsP8D6g29NWvhySJkdYdAo9D25PRbKXJ invoke [1]",
"Program data: gjbLTR5rT6gV1swAAAN30/iLBm0GRKxe6y9hGtvvKCPLmscA16aVgw6AKe3At4NtAAAAAAAAAAAAAAAAAwAdxmUEAwECAAAAAAAAAAAAAAAAAAAAADL7EVgBAAAAvnAAAAAAAAA=",
"Program HEvSKofvBgfaexv23kMabbYqxasxU3mQ4ibBMEmJWHny invoke [2]",
"Program log: Instruction: Submit",
"Program HEvSKofvBgfaexv23kMabbYqxasxU3mQ4ibBMEmJWHny consumed 4430 of 140117 compute units",
"Program HEvSKofvBgfaexv23kMabbYqxasxU3mQ4ibBMEmJWHny success",
"Program cjg3oHmg9uuPsP8D6g29NWvhySJkdYdAo9D25PRbKXJ consumed 64806 of 199850 compute units",
"Program cjg3oHmg9uuPsP8D6g29NWvhySJkdYdAo9D25PRbKXJ success"
],
"postBalances": [
1032209313370,
49054080,
2616960,
1141440,
0,
0,
1141440,
1
],
"postTokenBalances": [],
"preBalances": [
1032209318370,
49054080,
2616960,
1141440,
0,
0,
1141440,
1
],
"preTokenBalances": [],
"rewards": null,
"status": {
"Ok": null
}
},
"transaction": {
"message": {
"accountKeys": [
{
"pubkey": "9YR7YttJFfptQJSo5xrnYoAw1fJyVonC1vxUSqzAgyjY",
"signer": true,
"source": "transaction",
"writable": true
},
{
"pubkey": "Ghm1a2c2NGPg6pKGG3PP1GLAuJkHm1RKMPqqJwPM7JpJ",
"signer": false,
"source": "transaction",
"writable": true
},
{
"pubkey": "HXoZZBWv25N4fm2vfSKnHXTeDJ31qaAcWZe3ZKeM6dQv",
"signer": false,
"source": "transaction",
"writable": true
},
{
"pubkey": "HEvSKofvBgfaexv23kMabbYqxasxU3mQ4ibBMEmJWHny",
"signer": false,
"source": "transaction",
"writable": false
},
{
"pubkey": "3u6T92C2x18s39a7WNM8NGaQK1YEtstTtqamZGsLvNZN",
"signer": false,
"source": "transaction",
"writable": false
},
{
"pubkey": "Sysvar1nstructions1111111111111111111111111",
"signer": false,
"source": "transaction",
"writable": false
},
{
"pubkey": "cjg3oHmg9uuPsP8D6g29NWvhySJkdYdAo9D25PRbKXJ",
"signer": false,
"source": "transaction",
"writable": false
},
{
"pubkey": "ComputeBudget111111111111111111111111111111",
"signer": false,
"source": "transaction",
"writable": false
}
],
"instructions": [
{
"accounts": [],
"data": "3DTZbgwsozUF",
"programId": "ComputeBudget111111111111111111111111111111",
"stackHeight": null
},
{
"accounts": [
"Ghm1a2c2NGPg6pKGG3PP1GLAuJkHm1RKMPqqJwPM7JpJ",
"9YR7YttJFfptQJSo5xrnYoAw1fJyVonC1vxUSqzAgyjY",
"HXoZZBWv25N4fm2vfSKnHXTeDJ31qaAcWZe3ZKeM6dQv",
"HEvSKofvBgfaexv23kMabbYqxasxU3mQ4ibBMEmJWHny",
"3u6T92C2x18s39a7WNM8NGaQK1YEtstTtqamZGsLvNZN",
"Sysvar1nstructions1111111111111111111111111"
],
"data": "4W4pS7SH6dugDLwXWijhmW3dGTP7WENQa9vbUjvati1j95ghou2jUJHxvPUoowhZk2bHk21uKk4uFRQrpVF5d1jaBLTbXsFyocFyh8Wc4iMfeDcfGXThHPE9zv6jmM8LAPfcc3AGPo1C9tLorhXLQMXvkvUegHLVSfqn7zfHfenLC3XHnjT7jExJMhymz16cDGzr8X1jV6V9KkdtbTrh6M6p2zeyjbVuCFcqpGd6VVrXRqgjhhnd7FNMjPGAFN9Bj4ejsXaQkoeQpZ8deQRSM2w6tDox3N3B6fmiFhPa9AaDvVZQpZBjypriUinduwksz8tFhGc9P2yaNiiDrCT68kGUpMkkFENGz2aWy22Tj7AcWBJ2yQLrgsj5ePDkS3SEx6kVbs8Rjd",
"programId": "cjg3oHmg9uuPsP8D6g29NWvhySJkdYdAo9D25PRbKXJ",
"stackHeight": null
}
],
"recentBlockhash": "4bn9cKAw28iFD5xpDoKwrVfnTfzVVNzA2uFXwhGZsyA4"
},
"signatures": [
"BfoyR5cqfWbK3urEgV1kudW55n8K3CSmCMFyvC3KdvuD5mujZLj3vPiQULMtYGRL7Dd8fdVTRe73L9aojfvM6oz"
]
},
"version": "legacy"
},
获取指定block的确认状态
curl https://api.testnet.solana.com -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc": "2.0", "id": 1,
"method": "getBlockCommitment",
"params":[278287910]
}
'
返回结果
{
"jsonrpc": "2.0",
"result": {
"commitment": null,
"totalStake": 158624660219335800
},
"id": 1
}
3. Slot和Epoch相关接口
在 Solana 区块链中,Slot 和 Epoch 是两个重要的概念,用于帮助理解和管理区块链的时间和进度。
Slot:
- Slot 是 Solana 区块链的基本时间单位。每个 Slot 大约是 400 毫秒。在 Solana 中,时间是分成小的时间段(Slot)来管理的,而不是使用传统的区块间隔。
- 每个 Slot 都包含了一个区块,用于记录交易和状态更新。Solana 区块链是一个连续的时间流,不同于传统区块链系统中固定大小的区块间隔。
- Solana 的高吞吐量和低延迟设计使得每个 Slot 都可以容纳大量的交易和状态更新,从而实现了高效的区块链运行。
Epoch:
- Epoch 是 Solana 区块链中更高级别的时间单位。它是由多个 Slot 组成的时间周期。
- 在 Solana 中,Epoch 的长度由时间而不是固定的 Slot 数量来确定。一个 Epoch 的长度通常是几个小时,由网络的活动水平和时间流逝而变化。
- 每个 Epoch 结束时,会对网络进行验证和确认,然后开始新的 Epoch。Epoch 的变化通常会触发一些网络参数的更新和调整,如质押奖励、验证器轮换等。
总的来说,Slot 是 Solana 区块链的基本时间单位,每个 Slot 包含一个区块;而 Epoch 则是更高级别的时间单位,由多个 Slot 组成,用于实现网络参数的更新和调整。理解 Slot 和 Epoch 的概念有助于更好地了解 Solana 区块链的运行方式和时间流逝。
获取当前Epoch信息
curl https://api.testnet.solana.com -X POST -H "Content-Type: application/json" -d '
{"jsonrpc":"2.0","id":1, "method":"getEpochInfo"}
'
返回结果
{
"jsonrpc": "2.0",
"result": [
{
"featureSet": 743568211, // 节点支持的特性集合,用于标识节点支持的特性和功能
"gossip": "35.90.185.39:8000", // 节点的 Gossip 服务地址,用于传播消息和状态更新
"pubkey": "Gp9R3ts3j9Akhmvyky8WCrUYRVdUhzTyct4M4WXz937d", // 节点的公钥,用于标识和验证节点身份
"pubsub": "35.90.185.39:8900", // 节点的 PubSub 服务地址,用于发布和订阅消息
"rpc": "35.90.185.39:8899", // 节点的 RPC 服务地址,用于与节点进行交互和查询
"shredVersion": 503, // 节点的 Shred 版本,用于分片和传播区块的数据结构
"tpu": "35.90.185.39:8003", // 节点的 TPU 服务地址,用于执行事务处理
"tpuQuic": "35.90.185.39:8009", // 节点的 TPU Quic 服务地址,用于通过 QUIC 协议执行事务处理
"version": "1.18.7" // 节点的 Solana 软件版本号,用于标识节点所运行的 Solana 软件的版本
}
]
}
获取Epoch的调度信息
curl https://api.testnet.solana.com -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc":"2.0","id":1,
"method":"getEpochSchedule"
}
'
返回结果
{
"jsonrpc": "2.0", // 表示 JSON-RPC 协议版本号,这里是 2.0 版本。
"result": { // 包含了有关 Epoch 的具体信息。
"firstNormalEpoch": 0, // 第一个正常 Epoch 的索引。在 Solana 中,有一些特殊的 Epoch 可能会存在,例如创世 Epoch,而 firstNormalEpoch 表示从第一个正常的 Epoch 开始的索引。
"firstNormalSlot": 0, // 第一个正常 Epoch 的第一个 Slot 的索引。在 Solana 中,Slot 是 Epoch 的基本时间单位,而 firstNormalSlot 表示从第一个正常的 Epoch 开始的第一个 Slot 的索引。
"leaderScheduleSlotOffset": 432000, // leader 调度 Slot 偏移量。这个值表示 leader 调度开始的 Slot 相对于当前 Epoch 的第一个 Slot 的偏移量。
"slotsPerEpoch": 432000, // 每个 Epoch 包含的 Slot 数量。在 Solana 中,每个 Epoch 的长度由 slotsPerEpoch 参数定义。
"warmup": false // 表示当前网络是否处于热身阶段。如果 warmup 为 true,则表示网络处于热身阶段,即还没有正式启动;如果 warmup 为 false,则表示网络已经正式启动。
},
"id": 1 // 请求的唯一标识符,用于与响应进行匹配。
}
获取最新Slot
curl https://api.testnet.solana.com -X POST -H "Content-Type: application/json" -d '
{"jsonrpc":"2.0","id":1, "method":"getSlot"}
'
返回结果
{
"jsonrpc": "2.0",
"result": 289999956,
"id": 1
}
4. 账号相关接口
获取Account信息
curl https://api.testnet.solana.com -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc": "2.0",
"id": 1,
"method": "getAccountInfo",
"params": [
"E3NAyseUZrgwSbYe2g47TuFJr5CxAeneK63mR4Ufbqhh",
{
"encoding": "base58",
"commitment": "finalized"
}
]
}
'
返回结果
{
"jsonrpc": "2.0", // 表示 JSON-RPC 协议版本号,这里是 2.0 版本。
"result": { // 包含了有关账户的具体信息。
"context": { // 包含了与账户相关的上下文信息。
"apiVersion": "1.18.7", // Solana 节点的 API 版本号。
"slot": 262450222 // 当前账户状态的槽号。在 Solana 中,槽号表示时间的单位,每个槽包含一个区块。
},
"value": { // 包含了账户的值信息。
"data": [ // 账户的数据字段。在这个示例中为空。
"",
"base58"
],
"executable": false, // 表示账户是否可执行。在这个示例中,账户不可执行。
"lamports": 894429840, // 账户的 Lamports 余额。Lamports 是 Solana 中的最小单位,用于衡量账户的余额。 1 Sol = 10^9 lamports
"owner": "11111111111111111111111111111111", // 账户的所有者公钥。在这个示例中,所有者是系统默认的空地址。
"rentEpoch": 18446744073709552000, // 账户的租金周期。在这个示例中,租金周期为一个非常大的值,表示账户已经完全偿还租金。
"space": 0 // 账户的存储空间。在这个示例中,账户的存储空间为0,表示未使用任何存储空间。
}
},
"id": 1
}
获取账号余额
curl https://api.testnet.solana.com -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc": "2.0", "id": 1,
"method": "getBalance",
"params": [
"E3NAyseUZrgwSbYe2g47TuFJr5CxAeneK63mR4Ufbqhh"
]
}
'
返回结果
{
"jsonrpc": "2.0",
"result": {
"context": {
"apiVersion": "1.18.7",
"slot": 262451228
},
"value": 894429840
},
"id": 1
}
5. SPL-Token相关接口
按照需求查询账号
curl https://api.testnet.solana.com -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc": "2.0",
"id": 1,
"method": "getTokenAccountsByOwner",
"params": [
"E3NAyseUZrgwSbYe2g47TuFJr5CxAeneK63mR4Ufbqhh",
{
"mint": "E69iMAYn5k9HcWiPRZtthMDmyv1owgiWSbZCtTn9VMzy"
},
{
"encoding": "jsonParsed"
}
]
}
'
返回结果
{
"jsonrpc": "2.0", // 使用 JSON-RPC 2.0 版本协议
"result": { // RPC 请求的结果
"context": { // 结果中的上下文信息
"apiVersion": "1.18.7", // Solana 节点的 API 版本号
"slot": 262453839 // 当前账户状态的槽号
},
"value": [ // 结果中的值,这是一个数组
{
"account": { // 账户对象
"data": { // 账户数据
"parsed": { // 解析后的数据
"info": { // 账户信息
"isNative": false, // 账户是否为本地账户
"mint": "E69iMAYn5k9HcWiPRZtthMDmyv1owgiWSbZCtTn9VMzy", // 账户所属的 Token 的地址
"owner": "E3NAyseUZrgwSbYe2g47TuFJr5CxAeneK63mR4Ufbqhh", // 账户的所有者地址
"state": "initialized", // 账户的状态,这里是已初始化状态
"tokenAmount": { // Token 金额信息
"amount": "9900000000000", // Token 金额(单位:最小单位)
"decimals": 9, // Token 的小数位数
"uiAmount": 9900, // Token 金额的用户友好格式
"uiAmountString": "9900" // Token 金额的字符串表示
}
},
"type": "account" // 数据类型为账户类型
},
"program": "spl-token", // 程序名称
"space": 165 // 账户的存储空间大小
},
"executable": false, // 账户是否可执行
"lamports": 2039280, // 账户的 Lamports 余额
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", // 账户的所有者地址
"rentEpoch": 18446744073709552000, // 账户的租金周期
"space": 165 // 账户的存储空间大小
},
"pubkey": "Cemt9DSnRUZCJo7HtYeS75GrnfM6fne1HinqnUkiFdVz" // 账户的公钥地址
}
]
},
"id": 1
}
获取某个Token Account账号的余额
curl https://api.testnet.solana.com -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc": "2.0", "id": 1,
"method": "getTokenAccountBalance",
"params": [
"Cemt9DSnRUZCJo7HtYeS75GrnfM6fne1HinqnUkiFdVz" // ATA账户
]
}
'
返回结果
{
"jsonrpc": "2.0",
"result": {
"context": {
"apiVersion": "1.18.7",
"slot": 262454844
},
"value": {
"amount": "9900000000000",
"decimals": 9,
"uiAmount": 9900,
"uiAmountString": "9900"
}
},
"id": 1
}
6. 交易相关接口
获取交易详情
curl https://api.testnet.solana.com -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc": "2.0",
"id": 1,
"method": "getTransaction",
"params": [
"49woXcXq7vT2ivvJVmBpanNyauGc7yzxVMaUM3skYCQKfaHF1greiphyZuBn9LaBBBNpJtemnairHPak38pxoWUT",
"jsonParsed"
]
}
'
返回结果
{
"jsonrpc": "2.0",
"result": {
"blockTime": 1712128483,
"meta": {
"computeUnitsConsumed": 150,
"err": null,
"fee": 5000,
"innerInstructions": [],
"logMessages": [
"Program 11111111111111111111111111111111 invoke [1]",
"Program 11111111111111111111111111111111 success"
],
"postBalances": [
190195326052848,
1000000000,
1
],
"postTokenBalances": [],
"preBalances": [
190196326057848,
0,
1
],
"preTokenBalances": [],
"rewards": [],
"status": {
"Ok": null
}
},
"slot": 262227104,
"transaction": {
"message": {
"accountKeys": [
{
"pubkey": "5K4KLyoqBwS58sWjuJvhnuu794us4XGjTcXSTDUjwmJ2",
"signer": true,
"source": "transaction",
"writable": true
},
{
"pubkey": "E3NAyseUZrgwSbYe2g47TuFJr5CxAeneK63mR4Ufbqhh",
"signer": false,
"source": "transaction",
"writable": true
},
{
"pubkey": "11111111111111111111111111111111",
"signer": false,
"source": "transaction",
"writable": false
}
],
"instructions": [
{
"parsed": {
"info": {
"destination": "E3NAyseUZrgwSbYe2g47TuFJr5CxAeneK63mR4Ufbqhh",
"lamports": 1000000000,
"source": "5K4KLyoqBwS58sWjuJvhnuu794us4XGjTcXSTDUjwmJ2"
},
"type": "transfer"
},
"program": "system",
"programId": "11111111111111111111111111111111",
"stackHeight": null
}
],
"recentBlockhash": "FN6GnuxET75qmgoxW9d4XpTfVVWh7KY2wup3TxL7NR4c"
},
"signatures": [
"49woXcXq7vT2ivvJVmBpanNyauGc7yzxVMaUM3skYCQKfaHF1greiphyZuBn9LaBBBNpJtemnairHPak38pxoWUT"
]
}
},
"id": 1
}
对应区块链交易信息
https://solscan.io/tx/49woXcXq7vT2ivvJVmBpanNyauGc7yzxVMaUM3skYCQKfaHF1greiphyZuBn9LaBBBNpJtemnairHPak38pxoWUT?cluster=testnet
更多推荐
所有评论(0)