# 탐색과 속도 조절

계약과 루프

*레슨 5/5 · 12분 · 고급 · 개발자*

## 이번 레슨에서는

레슨을 마치면 다음을 할 수 있습니다.

- token을 지정해 지갑을 탐색하고 hops[].nodes, volume_usd6, frontier_truncated, window_from 읽기
- 202 building 그래프, 스냅샷, 저하된 응답 읽기
- ETag, 백오프, 요청 id로 분당 1,200건 아래에서 읽기 속도 조절하기

## 탐색

`get-wallet-graph-walk`와 그 REST 트윈 `/v1/addresses/{address}/walk?chain=&token=&hops=`는 [홉](https://achivx.kr/academy/reference/glossary/#g-hop)을 `hops[].nodes`로 반환합니다. *최상위 `nodes`는 없습니다*. 각 노드에는 `address`, `direction`, `volume`(원시 최소 단위), `volume_usd6`, `score`(카드에 따르면 *가치 가중*)가 있고, 그 밖에 `nodes_explored`, `frontier_truncated`(`frontier_cap`, 기본값이자 최대값 500), `window`, `window_from`이 있습니다. 스킬에서는 `token`이 필수이고, REST에서는 기본값이 적용되며 `token_source`에 밝혀집니다. 그래도 넘기십시오. 그래프 탐색 절차는 `hops=2`에서 시작하며(REST와 [MCP](https://stablescan.achivx.com/mcp) 도구의 기본값이고, 카드에는 기본값이 선언되어 있지 않습니다), 질문이 필요로 할 때만 더 깊이 갑니다. 2026-10-13에 아카데미의 제재 대상 예시에 대해 이더리움(Ethereum) USDT 1홉으로 `/walk`를 요청하자 `nodes_explored: 0`, `window_from: "2026-09-22"`로 응답했습니다. 그 날짜 이후로 USDT 거래 상대가 없으며, 그 이전의 것은 보이는 범위에 없습니다.

**`window_from`** — *답은 요청한 기간의 시작이 아니라 그 날짜, 즉 엣지 단위의 범위 경계부터 만들어졌습니다 … 거래 상대, 경로 또는 제재 대상 노드가 없다는 것을 그 날짜 이전의 어떤 것에 대한 증거로도 취급하지 마십시오.* **잘림** — `frontier_cap`(직접 낮추지 않으면 500)보다 넓은 [탐색 경계(frontier)](https://achivx.kr/academy/reference/glossary/#g-frontier), 또는 시간 예산 때문입니다. 그래프 탐색 스킬의 규칙: *도달한 것과 멈췄다는 사실을 보고하고, 나머지가 비어 있다고는 결코 보고하지 마십시오*. 방법론의 두 가지 규칙: 차수 기준을 넘는 대상은 `frontier_truncated: true`와 함께 1홉만 답합니다(`mega_hub_degree_gate`). 무거운 대상에서 3홉 이상은 요청 예산을 넘어 오류를 반환할 수 있습니다. *hops <= 2로 다시 시도하십시오*(`deep_hops_time_budget`). **솔라나(Solana)** — 대상의 `coverage_status`를 읽으십시오. `window_from`이 2026-09-14 또는 그 이전이면 2026-07-20..2026-09-14를 하한으로 취급하십시오. 그보다 늦은 `window_from`에는 그 날짜들이 하나도 포함되지 않습니다.

## 1홉 그림

`/v1/addresses/{address}/graph`는 저장된 [스냅샷](https://achivx.kr/academy/reference/glossary/#g-snapshot)에서 제공될 수 있습니다(`snapshot_served`, `snapshot_age_seconds` — 체인의 지연이 아니라 그림의 경과 시간). 저하된 응답은 `degraded_reason`과 `X-Degraded` 헤더에 그 이유를 밝히며 `no-store`입니다. 사용할 수 있는 스냅샷이 없는 무거운 주소는 `503` 시간 초과 대신 **`202`**로 `{"status": "building", "retry_after_seconds": 5}`와 `Retry-After: 5`를 응답할 수 있습니다. *그래프도 아니고 오류도 아닙니다*. 기다린 뒤 반복하고, *`2xx`를 그래프로 읽기 전에 상태 또는 본문의 `status`를 확인하십시오*.

## 속도 조절

IP마다 토큰 버킷 하나, 분당 1,200건입니다(카드의 `rateLimits`. 스킬과 [openapi.json](https://stablescan.achivx.com/openapi.json)에서는 초당 20건, 버스트 40). `429`를 받으면 `Retry-After`만큼 기다리십시오. 시간 초과는 REST에서는 `error.code: "timeout"`과 `Retry-After: 5`가 붙은 `503`, A2A에서는 `data.retryable`이 붙은 `-32050`, [MCP](https://stablescan.achivx.com/mcp)에서는 도구 오류입니다. 무거운 읽기는 *아무것도 읽지 않은 채* `busy`로 거부할 수도 있습니다. REST에서는 `error.code: "busy"`, `Retry-After: 5`, `no-store`가 붙은 `503`이고, MCP에서는 도구 오류입니다. `get_wallet_graph_walk` 도구의 조언: *백오프, 더 좁은 기간 또는 더 낮은 frontier_cap으로 다시 시도하십시오*. 재검증하는 GET에는 `If-None-Match`를 보내십시오. `/v1/sanctions`, [`/v1/methodology`](https://stablescan.achivx.com/v1/methodology), 카드, 다시 요청한 그래프 읽기가 해당되며, 주소 응답은 거의 일치하지 않습니다. 자신의 `X-Request-Id`를 보내고 응답의 것을 인용하십시오. 설명서가 엣지 캐시된다고 나열한 읽기(`GET /v1/addresses/…`(따라서 `/walk`와 `/graph`도), `/v1/transfers`, `/v1/methodology`, 카드 등)에서는 `no-store` 응답에서도 이것이 Cloudflare ray입니다(2026-10-20의 바이낸스(Binance) `503`에도 붙어 있었습니다). `cf-cache-status: HIT`는 스캐너가 요청을 전혀 보지 못했다는 뜻입니다. 그리고 `/health`와 `/ready`를 정직하게 읽으면 이렇습니다. *프로세스는 살아 있습니다 … 둘 다 `200`으로 응답하는 동안에도 네트워크는 몇 시간 뒤처져 있을 수 있습니다*. 최신성은 `/v1/sync/status?chain=`입니다.

## 핵심 정리

- token 지정, hops는 2부터, 노드는 hops[].nodes 아래, 달러는 volume_usd6
- window_from은 탐색이 본 범위의 경계이며, 잘림은 멈췄다는 뜻이지 결코 비어 있다는 뜻이 아닙니다
- 202 building 그래프는 그래프도 오류도 아닙니다. retry_after_seconds만큼 기다렸다가 다시 요청하십시오
- 분당 1,200건. 시간 초과와 busy는 유형이 정해져 있습니다. 간격을 두고, 결코 반복하지 마십시오
- 일치하는 곳에서는 ETag 재검증, 모든 호출에 요청 id. /health는 최신성이 아닙니다

## Stablecoin scanner ACHIVX에서 직접 해 보기

1. [제재 대상 예시의 1홉 탐색](https://stablescan.achivx.com/v1/addresses/0x098B716B8Aaf21512996dC57EB0615e2383E2f96/walk?chain=1&token=USDT&hops=1)을 열고 `token_source`, `window_from`, `nodes_explored`, `frontier_truncated`를 읽습니다.
2. 바이낸스 핫월렛의 `/walk`를 읽습니다. `GET /v1/addresses/0x28C6c06298d514Db089934071355E5743bf21d60/walk?chain=1&token=USDT&hops=1`. 그 정도 규모의 허브는 기한을 넘길 수 있습니다. 2026-10-13에는 `error.code: "timeout"`과 `Retry-After`가 붙은 `503`으로 응답했습니다. 이 두 가지를 읽고, 기다렸다가 한 번 다시 시도합니다. 응답이 오면 `frontier_truncated`를 읽고, 첫 번째 노드의 `volume`을 10^`decimals`로, `volume_usd6`을 1,000,000으로 나눕니다. 페그가 1이면 두 값은 일치합니다.
3. [이더리움의 SLO 응답](https://stablescan.achivx.com/v1/stats/slo?chain=1)을 열고 두 개의 `freshness` 기준점을 `budget_seconds`, `scope`와 함께 읽습니다.
4. 아무 읽기나 두 번 보내되, 두 번째에는 `If-None-Match`를 첫 번째 응답의 `ETag`로 설정합니다. 어느 경로가 `304`로 응답하는지 기록합니다.

## 레슨 돌아보기

- 내 읽기 중 탐색 경계 상한에 걸릴 것은 무엇이며, 보고서는 그것을 어떻게 밝히겠습니까?
- 503 시간 초과 뒤, 그리고 busy 뒤의 백오프는 각각 어떻게 됩니까?

## 다음 내용

이것으로 과정을 마칩니다. 퀴즈는 다섯 문제이고, 그다음 배지를 받습니다. *에이전트를 위한 Stablecoin scanner ACHIVX* 섹션에는 접근 경로마다, 스킬마다 페이지가 하나씩 있습니다.

## 함께 보기

- 가이드: [용어집](https://achivx.kr/academy/reference/glossary/)

## 더 알아보기

- [get-wallet-graph-walk는 무엇을 반환합니까?](https://achivx.kr/academy/for-agents/get-wallet-graph-walk/)
- [한도는 무엇이며, 거부는 어떤 모습입니까?](https://achivx.kr/academy/for-agents/what-are-the-limits-and-refusals/)
- [답은 어떤 것일 수 있습니까? REST, A2A, MCP의 모든 상태와 코드](https://achivx.kr/academy/for-agents/every-answer-code-on-every-door/)

레슨 5/5 · 에이전트를 위한 Stablecoin scanner ACHIVX · 위에 링크된 사용자 가이드를 바탕으로 합니다.

---

출처: https://achivx.kr/academy/courses/the-scanner-for-agents/the-scanner-for-agents-05-the-walk-and-pacing/ · 영어 원문: https://achivx.com/academy/courses/the-scanner-for-agents/the-scanner-for-agents-05-the-walk-and-pacing.html
