Перейти к содержимому
Курс USDC:$1,0000Газ:
Arcscan

Публичный RPC

https://rpc.arc-scan.io — это бесплатная точка JSON-RPC для основной сети Arc, стоящая перед несколькими независимыми поставщиками, поэтому отказ одного из них для вас не виден.

https://rpc.arc-scan.io
Ни ключа, ни аккаунта, ни регистрации.
Пользуетесь кошельком? Подключите RPC в один кликКнопка — и тот единственный шаг, который MetaMask и Rabby всё-таки требуют от вас.

Точка#

Одно имя хоста, одна сеть, никаких учётных данных. Она отвечает на обычные методы чтения, по политике отказывает в коротком списке других и на web3_clientVersion представляется как arcscan-rpc-gateway/1 — так вы и понимаете, что дошли до нас, а не до какой-то другой точки, настроенной в вашем кошельке.

СвойствоЗначение
URLhttps://rpc.arc-scan.io
СетьТолько основная сеть Arc — ID сети 5042, hex 0x13b2
ТранспортТолько HTTPS POST. На GET приходит 405 с allow: POST, OPTIONS.
АутентификацияНет. Ни ключа, ни аккаунта, ни регистрации, ни заголовка.
Вызовы из браузераРазрешены — в каждом ответе есть access-control-allow-origin: *.
СтоимостьБесплатно, с ограничением частоты на каждого вызывающего.

Только основная сеть

Эта точка обслуживает сеть 5042 и ничто иное — спросите её net_version, и она ответит 5042. Публичной точки JSON-RPC Arcscan для Arc Testnet не существует. Если вы работаете с тестовой сетью, используйте testnet.arc-scan.ioОткроется в новой вкладке для обозревателя и собственную ноду или поставщика для RPC.

Ваш первый вызов#

Регистрироваться не нужно нигде, поэтому первый вызов и есть всё начало работы. Спросите, с какой сетью вы разговариваете:

curl -s -X POST https://rpc.arc-scan.io \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_chainId"}'

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": "0x13b2"
}

И голову цепи. Arc выпускает блок примерно раз в полсекунды, поэтому это число сдвигается, пока вы его читаете.

curl -s -X POST https://rpc.arc-scan.io \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber"}'

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": "0xe2a22d"
}

Пакеты#

На JSON-массив вызовов приходит массив результатов в порядке id. До 50 записей и 131 072 байт на запрос; при превышении любого из двух весь запрос отклоняется с 413 ещё до того, как что-либо из него выполнится.

curl -s -X POST https://rpc.arc-scan.io \
  -H 'content-type: application/json' \
  -d '[{"jsonrpc":"2.0","id":1,"method":"eth_chainId"},
       {"jsonrpc":"2.0","id":2,"method":"eth_blockNumber"}]'

[
  {
    "jsonrpc": "2.0",
    "id": 1,
    "result": "0x13b2"
  },
  {
    "jsonrpc": "2.0",
    "id": 2,
    "result": "0xe2a22e"
  }
]

Пакет — это не снимок

Две высоты выше различаются на единицу. Каждая запись обслуживается независимо, и цепь между ними движется, поэтому пакет никогда не даёт согласованного вида на один момент. Когда вам нужно несколько фактов об одном блоке, привязывайте их к номеру блока или к хешу, а не к latest.

На что она отвечает#

Обычные методы чтения eth_ работают: получение блока, транзакции и квитанции, eth_getBalance, eth_call, eth_getLogs, eth_gasPrice, eth_estimateGas. Четыре метода точка отвечает сама, без единого исходящего запроса, — eth_chainId, net_version, web3_clientVersion и eth_accounts, который возвращает пустой массив, потому что аккаунтов мы не держим.

Вместо того чтобы публиковать список всех работающих методов, спросите иначе: всё, что не отклонено ниже, пересылается. Метод, которого не предлагает ни один источник, возвращается как -32601 с data.reason, равным method_not_served, — это другой факт, нежели отказ по политике, и он об этом говорит.

В чём она отказывает#

Отказы намеренны, и каждый называет, кто решил и почему. Причина машиночитаема: error.data.reason равно refused_by_policy, а error.data.policy — один из слагов ниже; именно это клиенту и следует читать, чтобы решить, может ли повторный запрос позже хоть чем-то помочь. Ни для одного слага отсюда — не может.

policyПочемуИзмеренные примеры
no_custodyЭта точка не держит ключей и не станет пересылать запрос на подпись.eth_sendTransaction, eth_sign, eth_signTypedData_v4
namespaceЦелое пространство имён, которое здесь не обслуживается.debug_traceTransaction, ots_getApiLevel
costОтвет очень велик, а эта точка учитывает расход.trace_block
no_transportТолько HTTP. Транспорта для подписок, по которому это можно было бы отдавать, здесь нет.eth_subscribe, eth_unsubscribe
single_legЕго предлагает лишь один из источников за этой точкой, поэтому публикация обещала бы возможность, способную исчезнуть без предупреждения.eth_getProof
opacityОтвет описывал бы ноду, которой эта точка не управляет, поэтому честного значения здесь нет.net_peerCount, net_listening
curl -s -X POST https://rpc.arc-scan.io \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_sendTransaction","params":[{}]}'

{
  "jsonrpc": "2.0",
  "id": 1,
  "error": {
    "code": -32601,
    "message": "arc-scan.io does not serve eth_sendTransaction on this endpoint. This is our own policy decision, not a limitation of the Arc network. This endpoint holds no keys and will not forward a signing request. Sign locally and use eth_sendRawTransaction.",
    "data": {
      "reason": "refused_by_policy",
      "method": "eth_sendTransaction",
      "policy": "no_custody",
      "documentation": "https://arc-scan.io/developers"
    }
  }
}

Отказ — это HTTP 200

Каждый отказ выше отвечает 200 OK, а сама ошибка лежит внутри объекта error JSON-RPC, чего спецификация JSON-RPC и требует. Поэтому монитор, следящий только за HTTP-статусом, назовёт всё это здоровым. Читайте error.code и error.data.reason, а не строку статуса.

Отправка транзакции#

Ключей мы не держим, поэтому каждый метод, который потребовал бы владения ключом, отклоняется — подписывайте локально. Уже подписанную транзакцию отправить можно: eth_sendRawTransaction пересылается и намеренно уходит ровно к одному поставщику и никогда не повторяется, потому что прокси, повторяющий отправку, мог бы отправить вашу транзакцию дважды.

Прочитайте ошибку, не отправляйте вслепую заново

already known и nonce too low приходят от ноды без изменений, а не сглаживаются, и обычно оба означают, что ваша транзакция уже в пути. Некорректная полезная нагрузка возвращается как -32602 с собственным сообщением ноды о разборе.

Переключение при отказе#

За одним именем хоста стоит несколько независимых поставщиков основной сети Arc. Вызов, не удавшийся у одного, повторяется у другого; поставщик, начавший отдавать ошибки или ограничивать нас по частоте, остывает и пропускается, и ничто из этого в вашем ответе не видно: вы получаете ответ или честную ошибку и никогда — намёка на то, какой источник вас обслужил. Кто они, мы не публикуем.

Два следствия, о которых стоит знать

Метод, который предлагает только один поставщик, отклоняется, а не обслуживается (строка single_leg выше): возможность, исчезающую в тот момент, когда один источник остынет, мы обещать не станем. А если ответить не смог ни один источник, вы получаете -32603 с data.reason, равным unreachable, и сообщением о том, что о результате нельзя предполагать ничего, — а не пустой результат, который читался бы как «в цепи ничего не произошло».

Ограничения и ошибки#

Запросы ограничены по частоте на каждого вызывающего. Порог мы здесь не публикуем — единственная величина, которую мы могли бы назвать, это настроенная, а встречаете вы развёрнутый периметр, — поэтому считайте сигналом 429, соблюдайте его retry-after и отступайте, а не подстраивайтесь под число. Ограничения по размеру точны и названы в самом отказе.

HTTP/1.1 429 Too Many Requests
retry-after: 1
content-type: application/json

{
  "jsonrpc": "2.0",
  "id": null,
  "error": {
    "code": -32005,
    "message": "arc-scan.io is rate limiting requests from this client. Retry shortly.",
    "data": {
      "reason": "edge_rate_limited",
      "retry_after_seconds": 1,
      "scope": "client"
    }
  }
}
HTTP · код JSON-RPCЧто произошло
405 · -32600Вы использовали GET. Запросы JSON-RPC должны идти через POST.
413 · -32600Запрос превысил 131072 байт или 50 записей в пакете; data.reason равно request_too_large, и оба предела названы в сообщении.
429 · -32005Слишком много запросов от одного вызывающего. data.reason равно edge_rate_limited; соблюдайте retry-after.
200 · -32601Либо метод, в котором мы отказываем (data.reason равно refused_by_policy, со слагом policy), либо метод, которого не предлагает ни один источник (method_not_served).
200 · -32602Ваши параметры отклонены. Здесь это собственное сообщение ноды, переданное без изменений.
200 · -32603Ответа не удалось получить вовсе — data.reason равно unreachable. Сообщение говорит об этом прямо, и о результате нельзя предполагать ничего.
Публичный RPC · Документация Arcscan | Arcscan