パブリック RPC
https://rpc.arc-scan.io は Arc メインネットのための無料の JSON-RPC エンドポイントで、複数の独立したプロバイダーの前に立つため、1 つのプロバイダーの障害はあなたには見えません。
https://rpc.arc-scan.ioエンドポイント#
ホスト名は 1 つ、チェーンは 1 つ、資格情報は不要です。通常の読み取りメソッドに応答し、方針として短い一覧のメソッドを断り、web3_clientVersion を尋ねると arcscan-rpc-gateway/1 と名乗ります — これが、ウォレットに設定されていた別のエンドポイントではなく当方に到達したと分かる方法です。
| 項目 | 値 |
|---|---|
| URL | https://rpc.arc-scan.io |
| チェーン | Arc メインネットのみ — チェーン ID 5042、16 進では 0x13b2 |
| トランスポート | HTTPS の POST のみ。GET には allow: POST, OPTIONS を伴う 405 を返します。 |
| 認証 | なし。キーも、アカウントも、登録も、ヘッダーも不要です。 |
| ブラウザからの呼び出し | 許可しています — どの応答にも access-control-allow-origin: * が付きます。 |
| 費用 | 無料で、呼び出し元ごとにレート制限があります。 |
メインネット専用
このエンドポイントはチェーン5042 だけを提供します — net_version を尋ねれば 5042 と答えます。Arc Testnet 向けのパブリックな Arcscan の JSON-RPC エンドポイントはありません。テストネットで作業しているなら、エクスプローラーには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 はおよそ 0.5 秒に 1 ブロックを生成するので、この数値は読んでいるあいだにも動きます。
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 の順で返ります。1 リクエストあたり最大 50 件、131,072 バイトまでです。どちらかの上限を超えると、1 つも実行される前にリクエスト全体が 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" } ]
バッチはスナップショットではありません
上の 2 つの高さは 1 つ違います。各項目は独立に処理され、そのあいだにもチェーンは動くため、バッチが 1 つの時点についての一貫したビューを与えることは決してありません。1 つのブロックについて複数の事実が必要なときは、latest ではなくブロック番号かハッシュに固定してください。何に応答するか#
通常の eth_ の読み取りメソッドは動きます。ブロック・トランザクション・レシートの参照、eth_getBalance、eth_call、eth_getLogs、eth_gasPrice、eth_estimateGas です。4 つのメソッドは外部へのリクエストなしにエンドポイント自身が答えます — eth_chainId、net_version、web3_clientVersion、そして当方がアカウントを持たないため空の配列を返す eth_accounts です。
動くメソッドをすべて一覧にするのではなく、こう考えてください。以下で断られていないものは転送されます。どの取得元も提供していないメソッドは、data.reason が method_not_served の -32601 として返ります。これは方針による拒否とは別の事実であり、そのようにそう述べます。
何を断るか#
拒否は意図的なもので、それぞれが誰が決めたのかと理由を述べます。理由は機械可読です。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 | このエンドポイントの背後にある取得元のうち 1 つしか提供していないため、公開すれば予告なく消えうる機能を約束することになります。 | 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 で応答し、エラーは JSON-RPC の error オブジェクトの中に入ります。これは JSON-RPC の仕様が求めていることです。したがって HTTP のステータスだけを見る監視は、これらすべてを正常と判定します。ステータス行ではなく error.code と error.data.reason を読んでください。トランザクションを送る#
当方は鍵を保持していないため、鍵を預かることを必要とするメソッドはすべて断ります — 署名はローカルで行ってください。署名済みのトランザクションはブロードキャストできます。eth_sendRawTransaction は転送され、意図的にちょうど 1 つのプロバイダーへ送られ、再試行は決してしません。ブロードキャストを再試行するプロキシは、あなたのトランザクションを二重に提出しかねないからです。
エラーを読み、やみくもに再送しないでください
already known と nonce too low は、丸めずにノードからそのまま返ります。どちらもたいてい、あなたのトランザクションがすでに飛んでいることを意味します。形式が不正なペイロードは、ノード自身のデコードのメッセージを伴う -32602 として返ります。フェイルオーバー#
1 つのホスト名の背後には、複数の独立した Arc メインネットのプロバイダーがあります。ある取得元で失敗した呼び出しは別の取得元で再試行され、エラーを出し始めた、あるいは当方をレート制限し始めたプロバイダーは冷却されて飛ばされます。そのどれもあなたの応答には現れません。得られるのは答えか、正直なエラーであって、どの取得元が応じたかの手がかりが出ることは決してありません。それが誰であるかは公開していません。
知っておく価値のある 2 つの帰結
1 つのプロバイダーしか提供していないメソッドは、提供せずに断ります(上のsingle_leg の行)— 1 つの取得元が冷却された瞬間に消えるような機能を、当方は約束しません。そして、どの取得元もまったく答えられなかった場合は、data.reason が unreachable の -32603 と、結果について何も仮定すべきでない旨のメッセージが返ります。「チェーン上で何も起きなかった」と読まれかねない空の結果は返しません。制限とエラー#
リクエストは呼び出し元ごとにレート制限されます。しきい値はここに公開しません — 引用できるのは設定上の値だけで、実際にあなたが出会うのは配備されたエッジのほうだからです — ですから 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 | 1 つの呼び出し元からのリクエストが多すぎます。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 です。メッセージがそのことを明示しており、結果について何も仮定すべきではありません。 |