REST API
체인은 두 개의 HTTP 서비스로 제공됩니다:
| 서비스 | 기본값 | 용도 |
|---|---|---|
| Gateway (Node.js) | http://localhost:3000 | dApp과 웹 앱이 호출하는 대상입니다. 노드를 프록시하고 WebSocket, AI 도구, 캐싱을 더합니다 |
| 노드 RPC (Rust) | http://localhost:9933 | 신뢰할 수 있는 원본입니다. 일부 운영자용 엔드포인트는 여기에만 있습니다 |
대부분의 경로는 양쪽이 같습니다. 아래 표에는 한쪽에만 있는 엔드포인트가 표시되어 있습니다. 예제에서는 $GATEWAY와 $NODE_RPC를 사용합니다 — 시작하기를 참고하십시오.
규칙
금액
- 온체인 금액은 uNRO 단위의 정수입니다(
1 NRO = 1 000 000 uNRO). - 응답에는 각 금액 옆에 형식화된
*_human문자열(balance_human,value_human,stake_human, …)이 추가됩니다. 이 값을 표시하고, 클라이언트에서 변환하지 마십시오. - 요청 본문에서는 엔드포인트가 달리 명시하지 않는 한 금액을 uNRO 단위의 JSON 숫자로 보내십시오.
서명 작업
상태를 변경하는 모든 엔드포인트에는 서명이 필요합니다. 두 종류가 있습니다:
| 종류 | 서명되는 메시지 | nonce |
|---|---|---|
트랜잭션 (POST /api/v1/transactions) | `nc-tx-v2 | from |
| 작업 (그 밖의 모든 것) | `nc-tx-v2 | actor |
target은 작업을 나타내는 예약된 시스템 주소이며, 표의 서명 대상 열에 나와 있습니다. 모든 요청에는 signature(hex), public_key(hex ML-DSA-65), nonce가 포함됩니다. 지갑 → 서명 작업을 참고하십시오.
CHAIN_ENV=mainnet(기본값)에서는 서명이 없거나 유효하지 않으면 401로 거부됩니다. CHAIN_ENV=testnet에서는 노드가 대신 경고를 기록합니다 — 로컬 개발 전용입니다.
대부분의 작업은 합의에서 적용됩니다: 응답에는 "status": "pending"과 tx_hash가 반환되며, 해당 트랜잭션이 블록에 포함되면 효과가 보입니다.
페이로드 서명
위의 서명은 행위자, 대상, 값을 명시하지만 작업의 나머지 부분 — 수신자, 세션 키의 범위, 투표 — 은 포함하지 않습니다. mainnet에서는 모든 작업이 그 작업이 다루는 모든 것에 대한 페이로드 서명도 함께 가지므로, 블록 제안자도 중계 노드도 이를 변경할 수 없습니다:
- 작업(스테이크, 신뢰 목록, 투표, NFT 전송, 세션 키, 볼트, 등록…): 엔드포인트는 작업을 대기열에 넣지 않습니다. 대신
{ "needs_payload_signature": true, "op", "sign_payload", "prepared" }로 응답합니다. 같은 키로sign_payload(nc-op-v1|…, 노드가 생성)에 서명하고{ …prepared, "payload_signature": "<hex>" }를POST /api/v1/markers/submit으로 보내면 작업이 대기열에 들어갑니다. - 자산 및 거래소 작업: 요청(사람이 읽는 금액)을
route,from,nonce와 함께POST /api/v1/dex/prepare로 보내면canonical메시지, 원시payload, 사람이 읽을 수 있는summary가 반환됩니다.canonical에 서명하고 같은 요청을payload_signature와 함께 해당 엔드포인트로 보내십시오.
캐비닛과 거래소는 두 가지를 모두 대신 처리하며, 서명하기 전에 작업 내용을 보여 줍니다.
오류
오류는 JSON {"error": "<message>"} 형식이며, 때로는 hint나 추가 필드가 포함됩니다. 사용되는 HTTP 코드:
| 코드 | 의미 |
|---|---|
| 200 | 성공 — 단, 일부 오래된 엔드포인트는 200과 함께 {"error": …}를 반환하기도 하므로 항상 error를 확인하십시오 |
| 400 | 잘못된 요청, 검증 실패, Sentinel 거부 |
| 401 | 서명이 없거나 유효하지 않음, 키가 주소에 바인딩되지 않음 |
| 403 | 이 모드에서 금지됨(mainnet의 faucet, mainnet에서 합의 없는 쓰기 호출), VMGuardian이 배포를 거부함 |
| 404 | 찾을 수 없음 |
| 409 | 이미 사용 중인 이름 |
| 429 | 요청 한도 초과 |
| 502 / 503 | Gateway가 노드에 연결할 수 없음 |
페이지네이션
목록 엔드포인트는 limit과 offset(일부는 page도)을 받습니다. 각 엔드포인트는 limit의 상한(보통 100 또는 200)을 둡니다.
요청 한도와 CORS
| 위치 | 기본값 | 변수 |
|---|---|---|
| 노드 RPC, IP당 | 초당 100 요청 | NEUROCHAIN_RPC_RATE_LIMIT |
| Gateway, IP당 | 초당 200 요청 | GLOBAL_RL_MAX_RPS |
Gateway AI 엔드포인트(/contracts/audit, /contracts/generate, …), IP당 | 분당 10 요청 | AI_RL_MAX_RPM |
허용 출처: 두 서비스 모두 CORS_ALLOWED_ORIGINS(기본값 *).
네트워크와 노드
| 메서드 | 경로 | 비고 |
|---|---|---|
| GET | /health | status, height, round, mempool, peers, tps, total_txs, validator_count, bft_quorum, bft_ready |
| GET | /status, /api/v1/status | 노드 전용. 높이, 검증자, 샤드, 네트워크 이름 |
| GET | /api/v1/network/status | Gateway 전용. 익스플로러용 네트워크 요약 |
| GET | /metrics | Prometheus 텍스트 형식 — 노드 실행 참고 |
| GET | /api/v1/shards | 샤드별 높이와 루트 |
| GET | /api/v1/state/root | global_root, shard_roots, height, root_height, n_shards |
| GET | /api/v1/state/snapshot | 노드 전용. 노드 부트스트랩용 전체 서명 상태 스냅샷 |
| GET | /api/v1/checkpoints | 서명된 체크포인트. offset, limit |
| GET | /peers | 노드 전용. 연결된 피어 |
| GET | /api/v1/gas/estimate | base_fee, 작업별 가스, total_burned, nft_transfer_fee — 가스와 수수료 참고 |
| GET | /api/v1/wasm/version | Gateway 전용. 브라우저 WASM 모듈의 버전 매니페스트 |
블록
| 메서드 | 경로 | 비고 |
|---|---|---|
| GET | /api/v1/blocks | limit(≤ 100, 기본값 20), offset, page. 최신순 |
| GET | /api/v1/blocks/latest | Gateway 전용. { "block": … } |
| GET | /api/v1/blocks/:height | 블록 하나: height, hash, parent_hash, proposer, tx_root, state_root, tx_count, gas_used, base_fee, fees_burned, shard, round, timestamp |
| GET | /api/v1/blocks/:height/transactions | 블록에 포함된 트랜잭션 |
트랜잭션
| 메서드 | 경로 | 서명 대상 | 비고 |
|---|---|---|---|
| POST | /api/v1/transactions | 트랜잭션 자체 | 본문은 아래 참고 |
| GET | /api/v1/transactions | — | address, hash, type(스테이킹 작업을 나열하려면 staking), limit(≤ 200), offset, page |
| GET | /api/v1/transactions/:hash | — | status, gas, fee, fee_human, value_human이 포함된 트랜잭션 하나 |
| GET | /api/v1/tx/:hash/proof | — | Merkle 포함 증명: leaf_index, proof, tx_root, block_height |
| POST | /api/v1/transactions/:hash/confirm | neuro:system.trust | 보류된 이체를 승인합니다(소유자의 메인 키만 가능) — Sentinel 참고 |
| POST | /api/v1/transactions/:hash/cancel | neuro:system.trust | 보류된 이체를 취소합니다 |
| GET | /api/v1/held/:address | — | 주소의 보류된 이체 |
| GET | /api/v1/cross-shard/queue | — | 샤드 간 중계. status, limit, offset |
POST /api/v1/transactions 본문
| 필드 | 타입 | 필수 | 의미 |
|---|---|---|---|
from | string | 예 | 발신자 주소 |
to | string | 예 | 수신자, 컨트랙트 또는 neuro:system.deploy |
value | number | 예 | uNRO |
nonce | number | 예 | 다음 계정 nonce |
signature | string | 예 | `nc-tx-v2 |
public_key | string | 예 | ML-DSA-65 공개 키, hex |
gas_price | number | 아니요 | 가스 단위당 uNRO. 기본 수수료 이상이어야 합니다 |
data | string | 아니요 | JSON 문자열로 된 컨트랙트 호출 또는 배포(hex도 허용) — ABI, 배포 참고 |
응답: tx_hash, status: "pending", estimated_block. Sentinel이 플래그를 지정하면 sentinel_score와 sentinel_warning이, 정책 계층이 보류하면 held 세부 정보가 추가됩니다.
계정
| 메서드 | 경로 | 비고 |
|---|---|---|
| GET | /api/v1/accounts/:address | balance, balance_human, nonce, … |
| GET | /api/v1/accounts/:address/transactions | 내역. limit, offset |
| GET | /api/v1/accounts/:address/token-transfers | 해당 주소가 관련된 토큰(NRC-20) 전송 |
| GET | /api/v1/accounts/:address/totals | 노드 전용. 보낸 총액과 받은 총액 |
| POST | /api/v1/faucet | 테스트 네트워크 전용(CHAIN_ENV=testnet). 본문: address, public_key, amount(uNRO, 선택) |
| POST | /api/v1/wallet/derive-address | 본문: words. 구문에서 .human 주소를 도출합니다 — 구문을 서버로 보냅니다. mainnet에서는 꺼져 있으며, 테스트 네트워크에서는 NEUROCHAIN_ALLOW_SERVER_DERIVE=true일 때만 동작합니다 |
이름과 NFT
| 메서드 | 경로 | 서명 대상 | 본문 / 비고 |
|---|---|---|---|
| POST | /api/v1/addresses/human | neuro:system.name | 노드 전용. name, owner, + 서명 필드. 사용자 지정 .human 이름을 등록합니다 |
| GET | /api/v1/addresses/human/price | — | 노드 전용. ?name= → 길이에 따른 가격 |
| POST | /api/v1/nodes/register | neuro:system.node | name, owner, 선택 사항 node_address(.app / .vault 등록용), + 서명 필드 |
| GET | /api/v1/nodes | — | 등록된 노드 |
| GET | /api/v1/nodes/:address | — | 노드 레코드 하나 |
| PUT/POST | /api/v1/nodes/:address/profile | neuro:system.node | description, website, commission_bps, p2p_endpoint, rpc_endpoint |
| POST | /api/v1/nodes/:address/unjail | neuro:system.node | jail 기간이 지난 후 검증자 집합에 다시 들어갑니다(소유자가 서명) |
| POST | /api/v1/nft/transfer | NFT 주소 | nft_address, from(현재 소유자), to, + 서명 필드. 수수료 100 uNRO |
| GET | /api/v1/nft/:address | — | NFT 레코드와 전송 내역 |
| GET | /api/v1/nft/owner/:address | — | 주소가 소유한 NFT |
| POST | /api/v1/agents/register | neuro:system.agent | name, owner, + 서명 필드. .agent를 등록합니다 |
| GET | /api/v1/agents/:address | — | 에이전트 레코드 |
스테이킹
| 메서드 | 경로 | 서명 대상 | 본문 / 비고 |
|---|---|---|---|
| POST | /api/v1/staking/stake | neuro:system.stake | address, amount, + 서명 필드 |
| POST | /api/v1/staking/unstake | neuro:system.stake | address, + 서명 필드 |
| POST | /api/v1/staking/delegate | 검증자 주소 | delegator, validator, amount, + 서명 필드 |
| POST | /api/v1/staking/undelegate | 검증자 주소 | delegator, validator, + 서명 필드 |
| GET | /api/v1/staking/info/:address | — | 주소의 스테이크, 잠금, 보상 |
| GET | /api/v1/staking/validators | — | 스테이크와 위임이 포함된 검증자 |
| GET | /api/v1/staking/delegations/:validator | — | 검증자에 대한 위임 |
| GET | /api/v1/staking/my-delegations/:address | — | 주소가 한 위임 |
| GET | /api/v1/staking/rewards/:address | — | 보상 내역. `source=stake |
| GET | /api/v1/validators | — | stake, trust_score, blocks_proposed, votes_cast, last_active가 포함된 합의 검증자 |
| GET | /api/v1/slashing/history | — | 노드 전용. 슬래싱 내역. limit |
스테이킹과 위임을 참고하십시오.
거버넌스
| 메서드 | 경로 | 서명 대상 | 본문 / 비고 |
|---|---|---|---|
| POST | /api/v1/governance/propose | neuro:system.governance | proposer, title, description, kind(text / PARAM_CHANGE), payload, voting_duration, + 서명 필드 |
| POST | /api/v1/governance/:id/vote | neuro:system.governance | voter, accept(bool), + 서명 필드 |
| GET | /api/v1/governance/proposals | — | status, limit(≤ 100), offset |
| GET | /api/v1/governance/:id | — | 투표가 포함된 제안 하나 |
| GET | /api/v1/governance/params | — | 값과 설명이 포함된 모든 파라미터 |
거버넌스를 참고하십시오.
볼트(다중 서명)
| 메서드 | 경로 | 서명 대상 | 본문 / 비고 |
|---|---|---|---|
| GET | /api/v1/vault/:addr/config | — | threshold, members |
| GET | /api/v1/vault/:addr/proposals | — | 지급 제안 |
| GET | /api/v1/vault/member/:addr | — | 주소가 속한 볼트 |
| POST | /api/v1/vault/:addr/proposals | 볼트 주소 | proposer, to, amount, description, + 서명 필드 |
| POST | /api/v1/vault/:addr/proposals/:id/sign | 볼트 주소 | signer, + 서명 필드. 서명 수가 임계값에 도달하면 지급됩니다 |
| POST | /api/v1/vault/:addr/members | 볼트 주소 | member, requester, + 서명 필드 |
| POST | /api/v1/vault/:addr/threshold | 볼트 주소 | threshold, requester, + 서명 필드 |
실험적
볼트 작업은 현재 합의가 아니라 요청을 받은 노드가 적용합니다. 이 기능이 합의로 옮겨질 때까지 볼트 하나에는 노드 하나만 사용하십시오.
컨트랙트
| 메서드 | 경로 | 서명 대상 | 본문 / 비고 |
|---|---|---|---|
| GET | /api/v1/contracts | — | owner, limit, offset |
| GET | /api/v1/contracts/:address | — | 메타데이터, security_score, 소유자, 코드 해시 |
| GET | /api/v1/contracts/:address/token-info | — | Gateway 전용. NRC-20 이름, 심볼, decimals, 공급량 |
| POST | /api/v1/contracts/:address/call | — | function, args, dry_run, gas_limit, caller. dry_run: true로 읽기. mainnet에서는 쓰기가 거부됩니다 |
| POST | /api/v1/contracts/deploy | neuro:system.deploy | 노드 전용. owner, bytecode_hex 또는 base64_wasm, name, description, template, + 서명 필드 |
| POST | /api/v1/contracts/analyze | — | 노드 전용. bytecode_hex → risk_score, security_score, ml_score, model, violations |
| POST | /api/v1/contracts/attest | — | bytecode_hex → ML-DSA-65로 서명된 분석: score, bytecode_hash, timestamp, signature, pubkey |
| POST | /api/v1/contracts/audit | — | Gateway 전용. bytecode_hex → 노드 분석(소스 코드는 받지 않습니다) |
| POST | /api/v1/contracts/reaudit | — | Gateway 전용. address → 배포된 컨트랙트의 분석을 다시 실행합니다 |
| POST | /api/v1/contracts/generate | — | Gateway 전용. 컨트랙트 템플릿 생성(SmartForge) |
| POST | /api/v1/contracts/certify | neuro:system.cert | 보안 인증서 발급(VMGuardian 운영자) |
| POST | /api/v1/contracts/whitelist | neuro:system.whitelist | 노드 전용. bytecode_hash — 신뢰할 수 있는 템플릿 바이트코드 |
| PATCH | /api/v1/contracts/:address/score | neuro:system.score | 노드 전용. security_score |
| GET | /api/v1/certificates | — | owner, limit, offset |
| GET | /api/v1/certificates/:id | — | 인증서 하나 |
| GET | /api/v1/certificates/contract/:address | — | 컨트랙트의 인증서 |
| GET | /api/v1/templates | — | 등록된 컨트랙트 템플릿 |
| GET | /api/v1/templates/:id | — | ABI가 포함된 템플릿 하나 |
| POST | /api/v1/templates/register | neuro:system.templates | author(.node), name, description, category, bytecode_hex, abi_json, fee_unro, + 서명 필드 |
| POST | /api/v1/templates/deprecate | neuro:system.templates | 노드 전용. template_id, author, delete, + 서명 필드 |
AI와 모델
| 메서드 | 경로 | 비고 |
|---|---|---|
| GET | /api/v1/ai/status | Gateway 전용. AI 모델 상태 |
| POST | /api/v1/sentinel/score | 트랜잭션 형태를 평가합니다: value, gas_price, nonce, last_nonce, balance, tx_count_last_10, recipient_tx_count, is_self_transfer → score, anomalous, category |
| GET | /api/v1/oracle/log | AI 결정 로그. model, kind, subject, limit, offset |
| GET | /api/v1/oracle/log/:id | 결정 하나 |
| GET | /api/v1/models/registry | 온체인 모델 레지스트리. limit, offset |
| GET | /api/v1/models/registry/:id | 모델 버전 하나 |
| POST | /api/v1/models/register | 검증자 전용. neuro:models.registry에 대해 서명합니다. from, name, version, weights_hash, architecture, params_count, accuracy, + 서명 필드 |
| GET | /api/v1/ai/export/{blocks,txs,validators,oracle} | 학습 데이터 내보내기(JSON Lines) |
| POST | /api/v1/assistant/ask, GET /api/v1/assistant/health | Gateway 전용. 문서 도우미(ASSISTANT_ENABLED=1이 아니면 꺼져 있음) |
Sentinel 신뢰 목록
| 메서드 | 경로 | 서명 대상 | 본문 |
|---|---|---|---|
| POST | /api/v1/trust/add | neuro:system.trust | owner, recipient, + 서명 필드 |
| POST | /api/v1/trust/remove | neuro:system.trust | owner, recipient, + 서명 필드 |
| GET | /api/v1/trust/:owner | — | 활성화 높이가 포함된 신뢰 수신자 |
계정 추상화
| 메서드 | 경로 | 서명 대상 | 본문 |
|---|---|---|---|
| POST | /api/v1/session/grant | neuro:system.session | account, session_pk, scope, cap, expiry_block, + 서명 필드 |
| POST | /api/v1/session/revoke | neuro:system.session | account, session_pk, + 서명 필드 |
| GET | /api/v1/session/list/:account | — | 계정의 세션 키 |
| POST | /api/v1/sponsor/deposit | neuro:system.sponsor | address, amount, + 서명 필드 |
| POST | /api/v1/sponsor/withdraw | neuro:system.sponsor | address, amount, + 서명 필드 |
| GET | /api/v1/sponsor/:address | — | 스폰서 풀 잔액 |
계정 추상화를 참고하십시오.
신원과 복구
이 작업들은 nc-tx-v2가 아닌 자체 메시지(예: nc-rotate|addr|add|remove|nonce)에 서명합니다. 신원을 참고하십시오.
| 메서드 | 경로 | 본문 |
|---|---|---|
| POST | /api/v1/identity/rotate | owner, add, remove, + 서명 필드 |
| POST | /api/v1/identity/recovery/setup | owner, guardians, threshold, timelock, + 서명 필드 |
| POST | /api/v1/identity/recovery/request | target, new_key, + 서명 필드 |
| POST | /api/v1/identity/recovery/approve | target, guardian, + 서명 필드 |
| POST | /api/v1/identity/recovery/reject | target, guardian, + 서명 필드 |
| POST | /api/v1/identity/recovery/withdraw | target, + 서명 필드 |
| POST | /api/v1/identity/recovery/cancel | owner, + 서명 필드 |
| GET | /api/v1/identity/:addr | 키와 버전 |
| GET | /api/v1/identity/recovery/:addr | 복구 설정과 진행 중인 요청(있는 경우) |
| GET | /api/v1/identity/guardian-of/:addr | 이 주소가 보호하는 신원 |
네이티브 자산과 거래소
| 메서드 | 경로 | 본문 / 비고 |
|---|---|---|
| GET | /api/v1/assets | 발행된 자산 |
| GET | /api/v1/assets/:id | 자산 하나 |
| GET | /api/v1/assets/check-symbol | ?symbol= — 티커가 사용 가능하고 유효한지 확인합니다 |
| GET | /api/v1/assets/balances/:addr | 자산 잔액 |
| POST | /api/v1/assets/issue | from, name, symbol, decimals, initial, max_supply, reissuable, reissue_unlock_height, issue_nonce, + 서명 필드. 수수료 asset_issue_fee |
| POST | /api/v1/assets/transfer | from, to, asset_id, amount, + 서명 필드 |
| GET | /api/v1/dex/pools, /api/v1/dex/pools/:id | 풀 |
| POST | /api/v1/dex/pools | from, asset_x, asset_y, amount_x, amount_y, + 서명 필드 |
| POST | /api/v1/dex/liquidity/add | from, pool_id, max_a, max_b, + 서명 필드 |
| POST | /api/v1/dex/liquidity/remove | from, pool_id, shares, + 서명 필드 |
| GET | /api/v1/dex/quote | 스왑 견적 |
| POST | /api/v1/dex/swap | from, pool_id, asset_in, amount_in, min_out, deadline_height, + 서명 필드. 다음 블록이 커밋될 때 배치로 체결됩니다 |
| GET | /api/v1/dex/window | 현재 배치 윈도우 |
| POST | /api/v1/dex/deposit, /api/v1/dex/withdraw | 메인 잔액과 거래소 잔액 간에 자금을 옮깁니다 |
| GET | /api/v1/dex/balances/:addr, /dex/positions/:addr, /dex/activity/:addr, /dex/transactions | 거래소 잔액, LP 포지션, 활동 |
| POST | /api/v1/dex/prepare | 위 작업 중 하나의 요청에 route(예: dex/swap), from, nonce를 더한 것 → canonical, payload, summary. 아무것도 대기열에 들어가지 않습니다 |
모든 자산 및 거래소 작업은 neuro:system.assets에 대해 서명하고 합의에서 적용되며, 노드가 준비한 메시지(nc-asset-op-v1|op|from|fields|nonce)에 대한 페이로드 서명을 payload_signature로 포함합니다. 보호되거나 예약된 티커 또는 자산 이름은 거부됩니다.
준비된 작업
| 메서드 | 경로 | 본문 / 비고 |
|---|---|---|
| POST | /api/v1/markers/submit | { tx, auth_to, auth_value, payload_signature } — 작업 응답의 prepared 부분과 그 sign_payload에 대한 서명입니다. 두 서명을 모두 확인하고 작업을 대기열에 넣습니다 |
IBC v2 실험적
| 메서드 | 경로 | 본문 / 비고 |
|---|---|---|
| POST | /api/v1/ibc/channel/open | from, channel, port, counterparty_chain, allowed_denoms, + 서명 필드 |
| POST | /api/v1/ibc/channel/pause | from, channel, paused, + 서명 필드 |
| POST | /api/v1/ibc/transfer | from, channel, dest_chain, receiver, denom, amount, + 서명 필드 |
| POST | /api/v1/ibc/recv | from, packet_id, receiver, denom, amount, + 서명 필드 |
| POST | /api/v1/ibc/ack | from, id, + 서명 필드 |
| POST | /api/v1/ibc/redeem | from, channel, dest_chain, receiver, denom, amount, + 서명 필드 |
| POST | /api/v1/ibc/client/update, /api/v1/ibc/attest | 라이트 클라이언트 업데이트와 증명(릴레이어) |
| GET | /api/v1/ibc/channels, /ibc/packets, /ibc/denoms, /ibc/client/:chainId, /ibc/header/latest, /ibc/voucher/:addr, /ibc/pq/test-vector | 상태와 테스트 벡터 |
모든 IBC v2 작업은 neuro:system.ibc에 대해 서명합니다. recv, ack, 채널 및 클라이언트 작업은 IBC 운영자 키로 제한됩니다. IBC v2와 샤딩을 참고하십시오.