> ## Documentation Index
> Fetch the complete documentation index at: https://www.helius.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# getBlockの使用方法

> getBlockの使用例、コード例、リクエストパラメータ、レスポンス構造、およびヒントを学ぶ。

[`getBlock`](https://www.helius.dev/docs/api-reference/rpc/http/getblock) RPCメソッドは、Solana元帳内の確認済みブロックに関する詳細情報を取得することを可能にします。これは、ブロックエクスプローラー、トランザクション履歴の分析、特定の時点でのチェーンの状態を理解するために不可欠です。

<Warning>
  **性能向上のためバッチ処理を避ける**

  アーカイブメソッドのバッチ処理は遅延を大幅に増加させます。10件以上のリクエストのバッチは許可されていません。
</Warning>

## 一般的な使用例

* **ブロック内容の確認:** 特定の[ブロック](https://www.helius.dev/blog/solana-slots-blocks-and-epochs)に含まれるすべてのトランザクションを表示。
* **ブロックハッシュの取得:** 指定されたスロットのブロックハッシュ、その親のブロックハッシュ、およびその親のスロットを取得します。
* **ブロックの高さと時間の確認:** ブロックの高さ（シーケンス番号）と推定生成時間を確認します。
* **トランザクション詳細の分析:** 適切なパラメータを使用して、手数料、ステータス、前後の残高、内部命令などのメタデータを含む完全なトランザクションデータを取得できます。
* **報酬の取得:** ブロックの報酬情報をオプションで含めることができます。

## パラメータ

1. `slot` (number, required): クエリするブロックのスロット番号 (u64)。

2. `config` (object, optional): 以下のフィールドを持つ構成オブジェクト:
   * `commitment` (string, optional): 使用する[コミットメントレベル](https://www.helius.dev/blog/solana-commitment-levels)を指定します。このメソッドでは`processed`はサポートされていません。デフォルトは`finalized`です。
   * `encoding` (string, optional): トランザクションデータのエンコーディング。`transactionDetails`が`full`または`accounts`の場合はデフォルトで`json`、それ以外の場合は`base64`。
     * `json`: JSON形式でトランザクションとアカウントデータを返します（`jsonParsed`に置き換えられました）。
     * `jsonParsed`: パースされたJSONとしてトランザクションとアカウントデータを返します。これは、アドレスルックアップテーブルからのものを含むすべてのトランザクションアカウントキーを含むため推奨されます。
     * `base58` (遅い)
     * `base64`
     * `base64+zstd`
   * `transactionDetails` (string, optional): 返されるトランザクション詳細レベルを指定します。デフォルトは`full`です。
     * `full`: トランザクションメタデータを含む完全なトランザクション詳細を返します。
     * `accounts`: 各トランザクションで詳細にされたアカウントのリストを返しますが、トランザクションデータやメタデータは含まれません。
     * `signatures`: トランザクションの署名のみを返します。
     * `none`: トランザクション詳細を返しません。
   * `rewards` (boolean, optional): レスポンスに報酬配列を含めるかどうか。デフォルトは`false`です。
   * `maxSupportedTransactionVersion` (number, optional): 返される最大トランザクションバージョン。ブロックにより高いバージョンのトランザクションが含まれている場合、エラーが返されます。省略された場合、レガシートランザクションのみが返され、バージョントランザクションを含むブロックはエラーになります。アドレスルックアップテーブルを使用したバージョントランザクションを含めるためには`0`を設定します。

## レスポンス

指定されたブロックが確認されて見つかった場合、`result`フィールドはブロックに関する情報を含むオブジェクトになります。ブロックが見つからないか確認されていない場合、`result`は`null`になります。

ブロックオブジェクトの主要フィールドには次のものがあります:

* `blockhash` (string): このブロックのベース58でエンコードされたブロックハッシュ。
* `previousBlockhash` (string): 前回のブロックのベース58でエンコードされたブロックハッシュ。親が利用できない場合（元帳のクリーンアップにより）、システムプログラムIDとなる可能性があります。
* `parentSlot` (number): 親ブロックのスロット番号。
* `transactions` (array): ブロックに含まれるトランザクションオブジェクトの配列。これらのオブジェクトの構造は、`encoding`および`transactionDetails`パラメータに依存します。
  * 各トランザクションオブジェクトには通常、`meta`（手数料、ステータス、ログ、前後の残高などのメタデータ）および`transaction`（メッセージと署名を含む実際のトランザクションデータ）が含まれています。
* `rewards` (array, optional): `rewards: true`が指定された場合に存在する報酬オブジェクトの配列。各オブジェクトは、`pubkey`、`lamports`、`postBalance`、`rewardType`、可能であれば`commission`を詳細に示します。
* `blockTime` (number | null): Unixタイムスタンプ（エポックからの秒）としてのブロックの推定生成時間、または利用できない場合は`null`。
* `blockHeight` (number | null): このブロックの高さ（スロット0から始まるチェーンでその前にあるブロックの数）、または利用できない場合は`null`。

レスポンス内のトランザクションとメタオブジェクトの完全で詳細な構造については、公式のSolana RPCドキュメントを参照してください。

## 例: ブロック情報の取得

Devnetの例示的なスロット番号の情報を取得してみましょう。
**重要:** スロット番号は迅速に処理されます。以下のスロット番号（`250000000`）はプレースホルダーです。例を実行する際には、実際に存在するターゲットネットワーク（DevnetやMainnet）の最近の確認済みスロットで置き換えてください。最近のスロット番号はSolanaブロックエクスプローラーを使用して見つけることができます。

**注:** 以下の例では、実際のHelius APIキーで`YOUR_API_KEY`を置き換えてください。

<CodeGroup>
  ```bash curl theme={"system"}
  # Replace 250000000 with a valid, recent slot number on Devnet/Mainnet
  curl https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY -X POST -H "Content-Type: application/json" -d \
  '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getBlock",
    "params": [
      250000000, 
      {
        "encoding": "jsonParsed",
        "transactionDetails": "full",
        "rewards": true,
        "maxSupportedTransactionVersion": 0
      }
    ]
  }'
  ```

  ```javascript JavaScript (using @solana/web3.js) theme={"system"}
  const { Connection } = require('@solana/web3.js');

  async function getBlockDetails() {
    const rpcUrl = 'https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY'; // Replace YOUR_API_KEY
    const connection = new Connection(rpcUrl, 'confirmed');
    
    // Replace with a valid, recent slot number on your target network
    const slotToQuery = 250000000; 

    try {
      const block = await connection.getBlock(slotToQuery, {
        encoding: "jsonParsed",
        transactionDetails: "full",
        rewards: true,
        maxSupportedTransactionVersion: 0 
      });

      if (block) {
        console.log('Block Details:');
        console.log(`   Slot: ${slotToQuery}`);
        console.log(`   Blockhash: ${block.blockhash}`);
        console.log(`   Previous Blockhash: ${block.previousBlockhash}`);
        console.log(`   Parent Slot: ${block.parentSlot}`);
        console.log(`   Block Height: ${block.blockHeight !== null ? block.blockHeight : 'N/A'}`);
        console.log(`   Block Time: ${block.blockTime ? new Date(block.blockTime * 1000).toISOString() : 'N/A'}`);
        console.log(`   Transactions Count: ${block.transactions.length}`);
        // console.log('   Transactions:', JSON.stringify(block.transactions, null, 2)); // Full transaction details
        // console.log('   Rewards:', JSON.stringify(block.rewards, null, 2)); // Reward details
      } else {
        console.log(`Block at slot ${slotToQuery} not found or not confirmed.`);
      }
    } catch (error) {
      console.error(`Error fetching block ${slotToQuery}:`, error);
    }
  }

  getBlockDetails();
  ```

  ```typescript Kit theme={"system"}
  import { createSolanaRpc } from "@solana/kit";

  const rpc_url = "https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY";
  const rpc = createSolanaRpc(rpc_url);

  const slot_number = BigInt(377261141);

  let block = await rpc
    .getBlock(
      slot_number,
      {
        commitment: "finalized",
        encoding: "json",
        transactionDetails: "full",
        maxSupportedTransactionVersion: 0,
        rewards: false,
      },
    )
    .send();

  console.log("block:", block);
  ```

  ```rust Rust theme={"system"}
  use anyhow::Result;
  use solana_client::nonblocking::rpc_client::RpcClient;
  use solana_sdk::commitment_config::CommitmentConfig;
  use solana_transaction_status_client_types::{TransactionDetails, UiTransactionEncoding};

  #[tokio::main]
  async fn main() -> Result<()> {
      let client = RpcClient::new_with_commitment(
          String::from("https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY"),
          CommitmentConfig::confirmed(),
      );

      let slot_number = 377261141;

      let config = solana_client::rpc_config::RpcBlockConfig {
          encoding: UiTransactionEncoding::Base58.into(),
          transaction_details: TransactionDetails::Full.into(),
          rewards: None,
          commitment: CommitmentConfig::finalized().into(),
          max_supported_transaction_version: Some(0),
      };
      let block = client.get_block_with_config(slot_number, config).await?;

      println!("Block: {:#?}", block);

      Ok(())
  }
  ```
</CodeGroup>

## 開発者のヒント

* **スロットとブロックの高さ:** `getBlock`は入力として`slot`の番号を取りますが、必ずしもブロックの高さではありません。スロットは連続していますが、リーダーによってスキップされることがあります。レスポンスの`blockHeight`フィールドは、このブロックの前に実際にいくつのブロックがあるかを示します。
* **`maxSupportedTransactionVersion`は重要:** バージョン付きトランザクションを持つブロックを確認するには、`maxSupportedTransactionVersion: 0`（または新しい標準が出現した場合はより高いバージョン）を設定する必要があります。これを忘れると、ほとんどのモダンブロックでエラーが発生します。
* **`transactionDetails`の選択:**
  * `full`は最も詳細な分析に必要ですが、最も多くのデータを返します。
  * `signatures`は、ブロック内のトランザクションをリストするだけで良い場合に便利です。
  * `accounts`は、中間的な選択であり、どのアカウントが関与していたかを全部の命令データを取得せずに確認する場合に役立ちます。
  * `none`は、まれですが、`blockhash`や`rewards`のようなブロックレベルのメタデータのみを気にする場合に使われることがあります。
* **エンコーディングには`jsonParsed`を推奨:** トランザクション詳細をリクエストする際、`jsonParsed`は最も開発者に優しい出力を提供し、アドレスルックアップテーブルからのアカウントを適切に解決しますが、`json`（廃止予定）はそうではありません。
* **ブロックの利用不可:** `null`の結果は、そのスロットのブロックが見つからなかったことを意味します。これはスロットがスキップされた、指定したコミットメントレベルまでブロックが確認されていない、またはRPCノードがその元帳から古いスロットを削除したため（古いスロットでは一般的）という理由が考えられます。
* **報酬情報:** ブロック報酬の分配をバリデーター（および報酬タイプによってはステーカー）に見るには、`rewards: true`を設定する必要があります。これによりレスポンスサイズが増加します。
* **ブロック構造の理解:** Solanaのアーキテクチャにおけるブロックの位置付けの詳細理解には、[Understanding Slots, Blocks, and Epochs on Solana](https://www.helius.dev/blog/solana-slots-blocks-and-epochs)を参照してください。
