参数
要验证的 blockhash(base-58 编码)
响应
blockhash 是否仍然有效(true)或无效(false)
代码示例
基本请求
复制
curl https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY -X POST -H "Content-Type: application/json" -d '{
"jsonrpc": "2.0",
"id": 1,
"method": "isBlockhashValid",
"params": [
"J7rBdM6AecPDEZp8aPq5tPmsPzPhQG4HD6YtAcQBDfJj"
]
}'
使用 web3.js
复制
import { Connection } from '@solana/web3.js';
const connection = new Connection('https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY');
// Check if blockhash is valid
const isValid = await connection.isBlockhashValid('J7rBdM6AecPDEZp8aPq5tPmsPzPhQG4HD6YtAcQBDfJj');
console.log('Is blockhash valid:', isValid);
// Check blockhash validity with analysis
async function checkBlockhashValidityWithAnalysis(
blockhash: string,
config: {
commitment?: string;
minContextSlot?: number;
}
) {
const isValid = await connection.isBlockhashValid(blockhash, config);
return {
blockhash,
validity: {
isValid,
checkedAt: Date.now()
},
config: {
commitment: config.commitment,
minContextSlot: config.minContextSlot
}
};
}
注意事项
- 返回 blockhash 是否仍然有效
- blockhash 在经过一定数量的 slot 后会过期
- 响应是即时的,因为它从当前状态读取
- 无效的 blockhash 不能在交易中使用
- blockhash 必须是 base-58 编码的
最佳实践
- 根据需求使用适当的 commitment 级别
- 在适当时缓存结果以减少 RPC 负载
- 在发送交易之前检查 blockhash 有效性
- 考虑使用 WebSocket 订阅获取实时更新
- 适当处理网络错误并重试
常见错误
| 错误码 | 消息 | 解决方案 |
|---|---|---|
| -32601 | Method not found | 验证是否连接到 Solana RPC 节点 |
| -32602 | Invalid params | 检查 blockhash 格式 |
| -32007 | Blockhash not found | blockhash 已过期或无效 |
用例
-
Blockhash 验证
复制
interface BlockhashValidation { blockhash: string; validity: { isValid: boolean; checkedAt: number; }; config: { commitment?: string; minContextSlot?: number; }; } class BlockhashValidator { async validateBlockhash( blockhash: string, config: { commitment?: string; minContextSlot?: number; } ): Promise<BlockhashValidation> { const isValid = await connection.isBlockhashValid(blockhash, config); return { blockhash, validity: { isValid, checkedAt: Date.now() }, config: { commitment: config.commitment, minContextSlot: config.minContextSlot } }; } } -
Blockhash 监控
复制
interface BlockhashStatus { blockhash: string; status: { isValid: boolean; lastChecked: number; checkCount: number; }; history: Array<{ timestamp: number; isValid: boolean; }>; } class BlockhashMonitor { private statuses: Map<string, BlockhashStatus> = new Map(); async monitorBlockhash( blockhash: string, config: { commitment?: string; minContextSlot?: number; } ): Promise<BlockhashStatus> { const isValid = await connection.isBlockhashValid(blockhash, config); const now = Date.now(); let status = this.statuses.get(blockhash); if (!status) { status = { blockhash, status: { isValid, lastChecked: now, checkCount: 1 }, history: [{ timestamp: now, isValid }] }; } else { status.status.isValid = isValid; status.status.lastChecked = now; status.status.checkCount++; status.history.push({ timestamp: now, isValid }); } this.statuses.set(blockhash, status); return status; } } -
交易规划
复制
interface TransactionPlan { blockhash: string; validity: { isValid: boolean; checkedAt: number; }; recommendations: Array<{ type: 'proceed' | 'retry' | 'abort'; reason: string; }>; metadata: { timestamp: number; }; } class TransactionPlanner { private readonly maxRetries = 3; private readonly validityCheckInterval = 1000; async planTransaction( blockhash: string, config: { commitment?: string; minContextSlot?: number; } ): Promise<TransactionPlan> { const isValid = await connection.isBlockhashValid(blockhash, config); const now = Date.now(); const recommendations: Array<{ type: 'proceed' | 'retry' | 'abort'; reason: string; }> = []; if (isValid) { recommendations.push({ type: 'proceed', reason: 'Blockhash is valid' }); } else { recommendations.push({ type: 'abort', reason: 'Blockhash is invalid' }); recommendations.push({ type: 'retry', reason: 'Get a new blockhash and retry' }); } return { blockhash, validity: { isValid, checkedAt: now }, recommendations, metadata: { timestamp: now } }; } async waitForValidBlockhash( blockhash: string, config: { commitment?: string; minContextSlot?: number; } ): Promise<boolean> { let retries = 0; while (retries < this.maxRetries) { const isValid = await connection.isBlockhashValid(blockhash, config); if (isValid) { return true; } retries++; await new Promise(resolve => setTimeout(resolve, this.validityCheckInterval)); } return false; } }