> For the complete documentation index, see [llms.txt](https://docs.rome.builders/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.rome.builders/vi/tai-lieu-tham-khao/json-rpc.md).

# Hỗ trợ JSON-RPC

Các phương thức Ethereum JSON-RPC được hỗ trợ bởi các endpoint Rome EVM, cùng với các hành vi đặc thù của Rome — dành cho Foundry, Hardhat, ethers, viem và MetaMask.

Các điểm cuối Rome EVM dùng JSON-RPC Ethereum tiêu chuẩn. Foundry, Hardhat, ethers, viem và MetaMask hoạt động với Rome giống như trên bất kỳ chuỗi EVM nào khác. Trang này liệt kê những gì được hỗ trợ và một vài hành vi đặc thù của Rome đáng biết.

## Các phương thức được hỗ trợ

**Cốt lõi (trạng thái & thực thi):** `eth_chainId`, `eth_blockNumber`, `eth_getBalance`, `eth_getCode`, `eth_getStorageAt`, `eth_getTransactionCount`, `eth_call`, `eth_estimateGas`, `eth_gasPrice`, `eth_maxPriorityFeePerGas`, `eth_feeHistory`.

**Block & giao dịch:** `eth_getBlockByNumber`, `eth_getBlockByHash`, `eth_getBlockReceipts`, `eth_getTransactionByHash`, `eth_getTransactionReceipt`, `eth_sendRawTransaction`, các biến thể theo chỉ số/số lượng block.

**Nhật ký & bộ lọc:** `eth_getLogs`, `eth_newFilter`, `eth_newBlockFilter`, `eth_getFilterChanges`, `eth_getFilterLogs`, `eth_uninstallFilter`.

**Đăng ký WebSocket:** `eth_subscribe` / `eth_unsubscribe` (`newHeads`, `logs`). Xem [Đăng ký WebSocket](/vi/huong-dan-cho-nha-phat-trien/websocket-subscriptions.md).

**Net / web3:** `net_version`, `net_listening`, `net_peerCount`, `web3_clientVersion`.

**Các phương thức tự thăm dò nhỏ:** `rpc_modules` (liệt kê `debug`, `eth`, `net`, `rome`, `rpc`, `txpool`, `web3`), `eth_syncing` (luôn `false`), `eth_accounts` (luôn là một danh sách rỗng), `eth_getUncleCountByBlockNumber`, `eth_getUncleCountByBlockHash`, `eth_getUncleByBlockNumberAndIndex` và `eth_getUncleByBlockHashAndIndex` (không có uncle, nên số đếm là `0x0` và tra cứu trả về `null`), `eth_newPendingTransactionFilter` (được chấp nhận, nhưng không bao giờ trả về hash vì không có mempool công khai), và `txpool_status`, luôn trả về `{"pending":"0x0","queued":"0x0"}` vì không có mempool công khai.

**Tracing:** `debug_traceRomeTransaction` nhận một hash giao dịch và trả về phân rã theo từng sub-call và từng CPI cho một giao dịch gộp nhiều lời gọi thành một batch duy nhất. Các giao dịch thông thường trả về `null`, cũng như một hash chưa biết hoặc chưa được lập chỉ mục.

### Không được hỗ trợ

`debug_traceTransaction` / `trace_*` (tracing giao dịch kiểu Ethereum; chúng trả về `-32601`), `eth_getProof`, `eth_createAccessList`, `eth_blobBaseFee` (không có giao dịch blob), và các `txpool_*` phương thức ngoài `txpool_status` (không có mempool công khai). `newPendingTransactions` đăng ký được chấp nhận nhưng không bao giờ phát ra.

## Các phương thức mở rộng của Rome

Ngoài RPC Ethereum tiêu chuẩn, proxy cung cấp `rome_*` các phương thức:

| Phương thức                       | Mục đích                                                                                                                                                                                                                          |
| --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `rome_emulateTx`                  | Mô phỏng một giao dịch ngoài chuỗi (trả về kết quả thực thi Solana)                                                                                                                                                               |
| `rome_emulateTxWithPayer`         | Mô phỏng với một người trả phí cụ thể                                                                                                                                                                                             |
| `rome_emulateCallAccounts`        | Mô phỏng và trả về các tài khoản Solana mà một lời gọi chạm tới                                                                                                                                                                   |
| `rome_emulateRegRollup`           | Mô phỏng việc đăng ký rollup                                                                                                                                                                                                      |
| `rome_getResources`               | Báo cáo trạng thái pool tài nguyên của proxy (người trả phí, người giữ)                                                                                                                                                           |
| `rome_mintId`                     | Giải quyết mint SPL đứng sau một wrapper ERC-20                                                                                                                                                                                   |
| `rome_buildInfo`                  | Thông tin bản dựng của proxy + chương trình trên chuỗi                                                                                                                                                                            |
| `rome_isCompatible`               | Kiểm tra tính tương thích giữa proxy/chương trình                                                                                                                                                                                 |
| `rome_solanaTxForEvmTx`           | Lấy các giao dịch Solana cho một hash tx EVM                                                                                                                                                                                      |
| `rome_sendUnsignedTransaction`    | Gửi một giao dịch chưa ký (luồng synthetic-sender)                                                                                                                                                                                |
| `rome_composeUnsignedAtomicV1`    | Tạo một giao dịch Solana v1 duy nhất cho phần thân EIP-1559 chưa ký, được ủy quyền bằng chữ ký Ed25519 của ví Solana; ví sẽ ký nó và ứng dụng phát broadcast. Từ chối khi lời gọi không khớp với một giao dịch nguyên tử duy nhất |
| `rome_composeUnsignedIterativeV1` | Tương tự, nhưng trả về mọi chặng (nguyên tử nếu phù hợp, nếu không thì các chặng lặp); ví ký từng chặng và gửi chúng với `rome_submitSignedV1Plan`                                                                                |
| `rome_submitSignedV1Plan`         | Phát broadcast một kế hoạch đã ký (tối đa 64 chặng); proxy chỉ đóng vai trò vận chuyển, ví vẫn là fee payer                                                                                                                       |
| `rome_relayUnsignedV1`            | Một chữ ký ví, người trả phí của proxy điều khiển các chặng; synthetic trả phí gas Rome (nạp tiền trước bằng `rome_composeExternalDepositV1`). Trả về hash giao dịch EVM                                                          |
| `rome_composeExternalDepositV1`   | Một giao dịch do ví ký sẽ nạp số dư gas native của synthetic từ token của ví                                                                                                                                                      |

## Hành vi đặc thù của Rome

### Gas được suy ra từ Solana — hãy ước tính, đừng mã cứng

Rome tính đo lường việc thực thi theo đơn vị tính toán Solana, hiển thị dưới dạng gas EVM. Phần lớn chi phí của một thao tác ghi là việc tạo tài khoản Solana: một người nhận chưa từng được dùng, một tài khoản token mới, một hợp đồng đã triển khai. Các tài khoản đó nằm trong ước tính. Hệ quả thực tế:

* **Sử dụng `eth_estimateGas`, và đừng bao giờ mã cứng `21000`.** Công cụ tiêu chuẩn (`forge create`, `cast`, Hardhat, ethers, viem, MetaMask) đã gọi nó và nhận được một giá trị hữu dụng. Với các lời gọi chạm tới chương trình Solana, hãy cộng thêm một biên độ (biên độ của SDK `submitRomeTx` đệm thêm 1.3x) và đặt trần gas nếu chính ước tính cũng bị revert. Một giá trị gas limit mã cứng `21000` sẽ thất bại bất cứ khi nào thao tác ghi tạo ra tài khoản, ví dụ một chuyển tiền tới địa chỉ chưa từng được dùng.
* **Rome tính phí đúng lượng gas thực sự đã dùng.** Trong các phép đo dưới đây, gas đã dùng chưa bao giờ vượt quá ước tính, nên một ước tính cao hơn công việc thực tế sẽ không khiến bạn mất phần chênh lệch.
* **Hãy giữ lại biên độ mà công cụ của bạn thêm vào.** Trạng thái có thể thay đổi giữa lúc ước tính và thời điểm giao dịch được đưa vào chuỗi, và ước tính cho một lời gọi tạo CPI Solana có thể bị thấp. Biên độ của SDK `submitRomeTx` đệm thêm 1.3x vào ước tính như một biên độ.

Đo trên Hadrian, với giá gas khoảng 10.4 gwei vào thời điểm đó:

| Ghi                                                  | `eth_estimateGas` | Gas đã dùng |
| ---------------------------------------------------- | ----------------- | ----------- |
| Chuyển native tới một địa chỉ chưa từng được dùng    | 1,086,961         | 1,086,961   |
| Chuyển native tới một địa chỉ đã tồn tại             | 21,000            | 10,001      |
| Chuyển wUSDC tới một địa chỉ chưa từng được dùng     | 2,544,921         | 2,544,921   |
| Bọc gas thành wUSDC (`withdraw_to_ata`)              | 21,000            | 10,001      |
| Cấp quyền bọc (`approve_spl` trên Helper precompile) | 21,000            | 10,001      |
| Triển khai một hợp đồng 10 byte                      | 1,147,921         | 1,147,921   |

Đây là các phép đo đơn lẻ trên một chain, không phải giới hạn. Con số phụ thuộc vào những tài khoản mà một lời gọi phải tạo ra, vì vậy hãy ước tính từng thao tác ghi thay vì sao chép chúng.

### `forge script --broadcast` cần `--skip-simulation`

`forge script` đặt giới hạn gas broadcast từ một **mô phỏng cục bộ** , điều này sẽ cấp phát thiếu so với mô hình gas của Rome. Thêm `--skip-simulation` để Foundry dùng mức của chain `eth_estimateGas` thay vào đó:

```bash
forge script script/Deploy.s.sol:Deploy \

  --rpc-url <RPC> --private-key $PRIVATE_KEY --broadcast --skip-simulation
```

`forge create`, `cast send`, và Hardhat không bị ảnh hưởng — chúng đã ước tính trên chuỗi.

### `eth_getLogs` bị giới hạn phạm vi (\~12.000 block)

Giống như Infura, Alchemy và các RPC sản xuất khác, `eth_getLogs` từ chối các phạm vi block quá rộng (lỗi `-32005`). Hãy giới hạn truy vấn của bạn:

```javascript
const latest = await provider.getBlockNumber();
const logs = await contract.queryFilter(filter, latest - 5000, latest);
```

Một ứng dụng `queryFilter` không có phạm vi sẽ quét toàn bộ lịch sử và sẽ vượt quá giới hạn — hãy truyền rõ `fromBlock`/`toBlock`. Các khẳng định sự kiện dựa trên receipt (ví dụ: chờ tx và đọc log của nó) không bị ảnh hưởng.

### Phí

`eth_gasPrice` trả về giá thực, được oracle xác định; ví (bao gồm MetaMask) dùng nó và hiển thị phí chính xác. Các trường phí được gửi vào được chấp nhận linh hoạt — cả giao dịch legacy và EIP-1559 đều đi vào với các giá trị mặc định của công cụ tiêu chuẩn.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.rome.builders/vi/tai-lieu-tham-khao/json-rpc.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
