Публичный RPC
https://rpc.arc-scan.io — это бесплатная точка JSON-RPC для основной сети Arc, стоящая перед несколькими независимыми поставщиками, поэтому отказ одного из них для вас не виден.
https://rpc.arc-scan.ioТочка#
Одно имя хоста, одна сеть, никаких учётных данных. Она отвечает на обычные методы чтения, по политике отказывает в коротком списке других и на web3_clientVersion представляется как arcscan-rpc-gateway/1 — так вы и понимаете, что дошли до нас, а не до какой-то другой точки, настроенной в вашем кошельке.
| Свойство | Значение |
|---|---|
| URL | https://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. Сообщение говорит об этом прямо, и о результате нельзя предполагать ничего. |