Справочникdocs/reference/rpc.md

JSON-RPC API

Core предоставляет JSON-RPC 2.0 через HTTP. Стандартный адрес:

text
http://127.0.0.1:9401

Имена всех методов начинаются с префикса пространства имён paranoid_. Параметры передаются позиционными JSON-массивами.

sh
curl --silent --show-error \
  -H 'Content-Type: application/json' \
  --data '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "paranoid_getChainInfo",
    "params": []
  }' \
  http://127.0.0.1:9401

Соглашения

  • Целочисленные денежные поля выражены в μNOID.
  • Один NOID равен 1 000 000 μNOID.
  • Хеши передаются в нижнем регистре hex без 0x.
  • Целевое значение PoW и байты nonce используют канонический порядок от младшего байта к старшему (little-endian).
  • Адреса имеют каноническую форму bech32m o1…, если поле явно не требует hex.
  • Неизвестный постоянный объект обычно возвращает null.
  • После 18-блочного окна старое тело блока возвращает null, но его заголовок остаётся доступен.
  • Десятичные строки используются для агрегатов, которые могут выйти за диапазон точного представления чисел JSON.
  • Поля с плавающей точкой *_noid предназначены для отображения. Учётный код должен использовать соответствующее целое поле *_micronoid.

Аутентификация

По умолчанию RPC не имеет аутентификации и должен оставаться на локальном интерфейсе.

При запуске Core с --mining-key TOKEN требуется заголовок:

http
Authorization: Bearer TOKEN

во всех RPC-запросах, а не только в методах майнинга. При отсутствующем или другом токене сервер отвечает HTTP 401 без JSON-RPC-результата. Токен аутентифицирует, но не шифрует соединение; удалённо используйте приватный транспорт или TLS-прокси.

Методы цепи

Суффикс метода Позиционные параметры Результат
blockCount [] Высота вершины u64
getChainInfo [] ChainInfo
getBlockHash [height: u64] string | null
getBlockHeader [height: u64] BlockHeaderInfo | null
getBlockHeaderByHash [hash: string] BlockHeaderInfo | null
getHeaderByHeight [height: u64] Необработанный 212-байтный заголовок в hex или null
getHeaderByHash [hash: string] Необработанный 212-байтный заголовок в hex или null
getHistoryStepTerminal [] Текущее терминальное доказательство в hex или null
getSlot [slot_index: u32] SlotInfo
getSlotsByOwner [address: string] SlotInfo[]
getActiveSlotCount [] u64
getStateInfo [] StateInfo
getStateMap [] StateMapInfo
getTx [txid: string] TxInfo | null
getBlock [height: u64] Сохранённый канонический блок в hex или null
getBlockDetails [height: u64] BlockDetailsInfo | null
getRecentTransactions [page: u32, page_size: u32, address: string | null] RecentTransactionsPage

getRecentTransactions сканирует только сохранённые полные блоки. Нумерация страниц начинается с единицы, размер ограничен диапазоном 1–32. Переданный адрес добавляет точные суммы расходования и получения этого владельца.

getSlot возвращает ошибку для индекса вне текущего домена 2^log_slots. Пустой слот внутри диапазона возвращает empty: true, нулевую стоимость и пустую строку владельца.

Методы ноды, сети и комиссий

Суффикс метода Позиционные параметры Результат
getMiningInfo [] MiningInfo
getPeerCount [] Число подключённых пиров
getNodeStatus [] NodeStatus
estimateFee [n_outputs: u32] Принимаемый минимум в μNOID для одного входа
estimateFeeDetailed [n_inputs: u32, n_outputs: u32] FeeEstimate

Подробный расчёт принимает от 1 до 1 020 входов и от 1 до 256 выходов. Возвращаемая комиссия учитывает текущую локальную границу ретрансляции.

Вспомогательные методы и отправка

Суффикс метода Позиционные параметры Результат
validateAddress [address: string] AddressInfo
getSlotHints [count: u32] u32[]
getSlotHintsSalted [count: u32, salt_hex: string] u32[]
getEpochAnchor [] Текущий якорь пользовательской транзакции в hex
submitTxIntent [intent_hex: string] Логический ID транзакции

Подсказки слотов ничего не резервируют. Оба метода исключают выходы, зарезервированные в мемпуле, возвращают не более 256 записей и могут вернуть меньше, если свободных слотов недостаточно. Декодированный salt ограничен 256 байтами.

submitTxIntent принимает один канонически закодированный PagedSpendIntent вместе с отдельной капсулой авторизации. До парсинга и проверки доказательства декодированный вход ограничен 303 495 байтами.

Методы мемпула

Суффикс метода Позиционные параметры Результат
getMempoolInfo [] MempoolInfo
getMempoolSize [] Число ожидающих логических транзакций
getMempoolStats [] MempoolStats
getMempoolEntry [txid: string] MempoolTxInfo | null

Ответы мемпула описывают атомарные логические транзакции, а не физические страницы.

Проверка чека

Суффикс метода Позиционные параметры Результат
verifyReceipt [receipt_hex: string] ReceiptVerifyResult

После декодирования hex вход чека ограничен 128 KiB. merkle_valid и canonical независимы: математически согласованный чек может ссылаться на корень вне канонической цепи этой ноды.

Методы внешнего майнинга

Суффикс метода Позиционные параметры Результат
getBlockTemplate [miner_address: string] BlockTemplateResponse
submitBlock [template_id: string, nonce_hex: string] ID принятого блока

Нода должна работать в режиме внешнего майнера. Пустой miner_address использует адрес выплаты ноды; непустой принимается только при разрешённом пользовательском адресе выплаты.

nonce_hex состоит ровно из 32 строчных hex-символов, кодирующих 16 байт в порядке от младшего к старшему. Шаблоны одноразовые и истекают через 30 секунд.

Управление нодой

Суффикс метода Позиционные параметры Результат
stop [] Строка состояния

Первый вызов запрашивает корректное завершение. Повторные вызовы безопасны, пока процесс закрывается.

Методы кошелька

Суффикс метода Позиционные параметры Результат
walletStatus [] WalletStatus
walletGetAddress [index: u32] Строка адреса
walletGetBalance [] WalletBalance
walletListUtxos [] WalletUtxoInfo[]
walletHistory [] WalletHistoryEntry[], сначала старые
walletReceipts [page: u32, page_size: u32] WalletReceiptsPage
walletMinedBlocks [page: u32, page_size: u32] WalletMinedBlocksPage
walletScan [] WalletScanResult
walletDiscoverAddresses [max_additional: u32] WalletAddressInfo[]
walletPlanSend [to: string, amount: u64, fee: u64] WalletSendPlan
walletSend [to: string, amount: u64, fee: u64] WalletSendResult
walletPlanConsolidation [] WalletConsolidationPlan
walletConsolidate [slots: u32[], expected_fee: u64, expected_output: u64] WalletConsolidationResult
walletExportReceipt [txid: string] Чек в hex
walletNextAddress [] WalletAddressInfo
walletListAddresses [] WalletAddressInfo[]
walletActiveAddress [] WalletAddressInfo
walletSetActiveAddress [index: u32] WalletAddressInfo

Суммы и комиссии выражены в μNOID. Нулевая комиссия в отправке или плане запрашивает автоматический подбор.

Страницы чеков и добытых блоков начинаются с единицы и принимают размер 1–50. walletDiscoverAddresses принимает 1–20 и останавливается на первом пустом производном владельце.

walletConsolidate привязан к расчёту. Список слотов, комиссия и стоимость выхода должны точно совпадать с последним планом; иначе вызов завершится ошибкой и потребуется новый расчёт.

Схемы ответов

В следующих схемах ? обозначает необязательное поле, а null — явное отсутствие значения в JSON.

Цепь и State

text
ChainInfo {
  height: u64
  best_hash: string
  difficulty_target: string
  active_slot_count: u64
  log_slots: u32
  circulating_supply_micronoid: decimal string
}

BlockHeaderInfo {
  height: u64
  hash: string
  prev_hash: string
  state_root: string
  tx_root: string
  timestamp: u64
  miner: string
  nonce_hex: string
  difficulty_target: string
  log_slots: u32
  active_slot_count: u64
  alloc_counter: u64
}

SlotInfo {
  slot_index: u32
  value: u64
  creation_id: u64
  owner: string
  empty: bool
}

TxInfo {
  tx_hash: string
  height: u64
  block_hash: string
  tx_position: u32
}

circulating_supply_micronoid — точная сумма стоимости всех UTXO в Live State, выраженная в μNOID. Поле передаётся десятичной строкой, чтобы JSON не терял точность.

text
StateInfo {
  log_slots: u32
  capacity: u64
  active_slots: u64
  fill_pct: number
  slots_until_expand: i64
  expand_trigger_pct: u8
  log_slots_max: u32
  state_bytes: u64
  state_size_human: string
}

StateMapInfo {
  log_slots: u32
  bucket_capacity: u64
  live_counts: u64[]
}

state_bytes — канонически кодированные данные сегментов без страниц MDBX, индексов и накладных расходов файловой системы.

Подробности блока

text
BlockDetailsInfo {
  header: BlockHeaderInfo
  retained: RetainedBlockInfo | null
}

RetainedBlockInfo {
  proof_class: string
  logical_transactions: u16
  user_pages: u16
  live_inputs: u16
  live_outputs: u16
  reward_micronoid: u64
  reward_noid: number
  total_fees_micronoid: decimal string
  block_bytes: u64
  history_step_bytes: u64
  bundle_bytes: u64
  transactions: BlockTransactionInfo[]
}
text
BlockTransactionInfo {
  position: u16
  txid: string
  page_count: u16
  live_inputs: u16
  live_outputs: u16
  fee_micronoid: u64
  coinbase: bool
  development_payout: bool
  epoch_anchor: string
  input_owner: string | null
  input_sum_micronoid: decimal string
  output_sum_micronoid: decimal string
  page_hashes: string[]
  inputs: BlockTransactionInputInfo[]
  outputs: BlockTransactionOutputInfo[]
}

BlockTransactionInputInfo {
  page: u16
  lane: u8
  slot_index: u32
  amount_micronoid: u64
  creation_id: u64
}

BlockTransactionOutputInfo {
  page: u16
  lane: u8
  slot_index: u32
  amount_micronoid: u64
  owner: string
  creation_id: u64
}
text
RecentTransactionsPage {
  page: u32
  page_size: u32
  total: usize
  total_pages: u32
  tip_height: u64
  retained_from_height: u64
  address: string | null
  transactions: RecentTransactionInfo[]
}

RecentTransactionInfo {
  height: u64
  block_hash: string
  timestamp: u64
  position: u16
  txid: string
  page_count: u16
  live_inputs: u16
  live_outputs: u16
  fee_micronoid: u64
  coinbase: bool
  development_payout: bool
  input_owner: string | null
  input_sum_micronoid: decimal string
  output_sum_micronoid: decimal string
  address_spent_micronoid: decimal string | null
  address_received_micronoid: decimal string | null
}

Нода и майнинг

text
MiningInfo {
  height: u64
  difficulty_bits: u32
  difficulty_target: string
  block_reward_micronoid: u64
  block_reward_noid: number
  active_slot_count: u64
}

NodeStatus {
  synced: bool
  mining: bool
  mining_ready: bool
  mining_confirmed_peers: usize
  mining_required_peers: usize
  isolated_mining: bool
  backend: string
  available_threads: usize
  worker_threads: usize
}

isolated_mining — состояние ноды, запущенной в специальном операторском контексте. В публичном развёртывании это поле нельзя использовать как удалённое управление или свойство пира.

Комиссии

text
FeeEstimate {
  n_inputs: usize
  n_outputs: usize
  net_new_slots: u64
  active_slot_count: u64
  log_slots: u32
  fee_micronoid: u64
  breakdown: FeeBreakdownInfo
}

FeeBreakdownInfo {
  base: u64
  input: u64
  output: u64
  io: u64
  state_growth: u64
  required_total: u64
  relay_floor: u64
  relay_total: u64
  paid_total: u64
  burned: u64
  miner_claimable: u64
}

Мемпул

text
MempoolInfo {
  size: usize
  fee_floor: u64
  txs: MempoolTxInfo[]
}

MempoolStats {
  size: usize
  capacity: usize
  intent_bytes: u64
  max_intent_bytes: u64
  fee_floor: u64
}

MempoolTxInfo {
  tx_hash: string
  fee_micronoid: u64
  fee_rate: u64
  n_inputs: usize
  n_outputs: usize
  page_count: usize
  minimum_proof_class: string
  requires_b255_miner: bool
  admitted_height: u64
  has_authorization: bool
}

Ставка комиссии (fee rate) использует взвешенные единицы:

text
inputs + outputs + 4 × net_new_slots

Проверка адреса

text
AddressInfo {
  valid: bool
  bech32: string | null
  hex: string | null
  error: string | null
}

Некорректный синтаксис адреса возвращается как valid: false, а не как транспортная ошибка JSON-RPC.

Идентичность и баланс кошелька

text
WalletAddressInfo {
  address: string
  key_index: u32
  is_active: bool
}

WalletStatus {
  exists: bool
  address: string
  active_index: u32
  balance_micronoid: u64
  balance_noid: number
  utxo_count: usize
  address_count: u32
}

WalletBalance {
  balance_micronoid: u64
  balance_noid: number
  utxo_count: usize
  pending_outbound_micronoid: u64
  pending_incoming_micronoid: u64
  spendable_micronoid: u64
  spendable_noid: number
}
text
WalletUtxoInfo {
  slot_index: u32
  value_micronoid: u64
  creation_id: u64
  value_noid: number
  address: string
  key_index: u32
  confirmed_height: u64
  reserved: bool
}

WalletHistoryEntry {
  tx_hash: string
  height: u64
  direction: "sent" | "received"
  is_coinbase: bool
  amount_micronoid: u64
  amount_noid: number
  peer_address: string | null
  timestamp: u64
  own_address: string | null
  own_key_index: u32 | null
}

Отправка и консолидация кошелька

text
WalletSendPlan {
  amount_micronoid: u64
  fee_micronoid: u64
  total_spend_micronoid: u64
  input_count: usize
  output_count: usize
  change_micronoid: u64
  fee_breakdown: FeeBreakdownInfo
}

WalletSendResult {
  txid: string
  amount_micronoid: u64
  fee_micronoid: u64
  input_count: usize
  output_count: usize
}
text
WalletConsolidationPlan {
  input_value_micronoid: u64
  fee_micronoid: u64
  output_value_micronoid: u64
  balance_before_micronoid: u64
  balance_after_micronoid: u64
  input_count: usize
  untouched_count: usize
  remaining_count: usize
  freed_slots: usize
  selected_input_slots: u32[]
  fee_breakdown: FeeBreakdownInfo
}

WalletConsolidationResult {
  txid: string
  input_value_micronoid: u64
  fee_micronoid: u64
  output_value_micronoid: u64
  input_count: usize
  output_count: usize
  freed_slots: usize
}

Сканирование и страницы кошелька

text
WalletScanResult {
  found_utxos: usize
  balance_micronoid: u64
  balance_noid: number
  active_index: u32
  snapshot_height: u64
  snapshot_tip_hash: string
  snapshot_state_root: string
}
text
WalletReceiptsPage {
  page: u32
  page_size: u32
  total: usize
  total_pages: u32
  receipts: WalletReceiptInfo[]
}

WalletReceiptInfo {
  txid: string
  height: u64
  timestamp: u64
  amount_micronoid: u64
  fee_micronoid: u64
  peer_address: string | null
  own_address: string | null
  own_key_index: u32 | null
  input_count: usize
  output_count: usize
  receipt_bytes: usize
}
text
WalletMinedBlocksPage {
  page: u32
  page_size: u32
  total: usize
  total_pages: u32
  blocks: WalletMinedBlockInfo[]
}

WalletMinedBlockInfo {
  height: u64
  block_hash: string
  coinbase_txid: string
  timestamp: u64
  reward_micronoid: u64
  reward_noid: number
  payout_address: string
  payout_key_index: u32
  confirmations: u64
  full_block_available: bool
}

Проверка чека

text
ReceiptVerifyResult {
  merkle_valid: bool
  canonical: bool
  confirmed: bool
  error: string | null
  authenticated_summary?: ReceiptSummaryInfo
}

ReceiptSummaryInfo {
  txid: string
  claimed_height: u64
  confirmed_unix: u64
  tx_index: u16
  tx_count: u16
  fee_micronoid: u64
  inputs: ReceiptInputInfo[]
  outputs: ReceiptOutputInfo[]
}

ReceiptInputInfo {
  slot_index: u32
  owner: string
}

ReceiptOutputInfo {
  slot_index: u32
  amount_micronoid: u64
  owner: string
}

authenticated_summary присутствует только при корректном доказательстве Merkle.

Внешний шаблон

text
BlockTemplateResponse {
  template_id: string
  pow_fields_hex: string
  nonce_field_index: usize
  difficulty_target_hex: string
  height: u64
  expires_in_seconds: u64
  n_txs: usize
  tx_input_counts?: usize[]
  tx_output_counts?: usize[]
  coinbase_value_micronoid: u64
  claimable_fees_micronoid: u64
}

pow_fields_hex содержит 16 последовательных 16-байтных little-endian полей. Внешний вычислитель заменяет поле nonce_field_index, канонически равное 10.

Ошибки

Ошибки парсинга, некорректного запроса, метода и параметров используют стандартные коды JSON-RPC.

Ошибки приложения обычно используют:

text
-32000

с человекочитаемым сообщением.

Одна ошибка планирования кошелька имеет стабильный машиночитаемый контракт:

json
{
  "code": -32011,
  "message": "InputLimitExceeded",
  "data": {
    "max_inputs": 1020
  }
}

Это означает, что средств может быть достаточно, но в каноническом лимите входов невозможно построить корректный платёж.

Клиент должен:

  1. проверить HTTP-статус до декодирования JSON;
  2. проверить объект JSON-RPC error;
  3. обрабатывать документированные стабильные коды;
  4. показывать остальные сообщения приложения оператору, не пытаясь разбирать их текст.
Техническая документация ParanO(1)dПоведение консенсуса определяется исходным кодом.