Agent 프리컴파일
ERC-8004 IdentityRegistry / ReputationRegistry 주소를 반환하고, 인덱싱된 getAgentIds(wallet) 조회를 제공합니다. 그 외 에이전트 작업은 IdentityRegistry를 직접 호출합니다.
0x100000000000000000000000000000000000000A의 Agent 프리컴파일은 얇은 discovery + 인덱싱 surface입니다. 두 개의 view 메서드를 노출합니다. getParams()는 이 체인의 ERC-8004 IdentityRegistry와 ReputationRegistry preinstall 주소를 반환하며, getAgentIds(wallet, pageRequest)는 주어진 지갑이 등록한 에이전트 ID의 페이지네이션 목록을 반환합니다(x/agent 체인 측 인덱스가 백엔드로 저렴한 조회를 제공합니다). 모든 실제 에이전트 상태 작업 — 등록, attestation, 폐기, 메타데이터 조회 — 는 getParams()가 반환하는 주소의 ERC-8004 IdentityRegistry preinstall에서 일어납니다.
IAgent 인터페이스 (전체 surface)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {PageRequest, PageResponse} from "cosmos-evm-contracts/precompiles/common/Types.sol";
interface IAgent {
error InvalidArgsLength(string method, uint256 got, uint256 want);
error InvalidAddress(string method, uint256 index, string value);
error InvalidPageRequest(string method, uint256 index, string value);
struct Params {
address identityRegistry;
address reputationRegistry;
}
function getParams() external view returns (Params memory);
function getAgentIds(address wallet, PageRequest calldata pageRequest)
external
view
returns (uint256[] memory agentIds, PageResponse calldata pageResponse);
} 메서드는 두 개뿐이며 이것이 전체 surface입니다. Agent 프리컴파일은 의도적으로 최소화되어 있으며, 풍부한 agent surface(라이프사이클, 메타데이터, 위임)는 ERC-8004 표준 컨트랙트에 있기 때문입니다.
왜 분리했는가 (precompile vs registry)
ERC-8004 IdentityRegistry는 에이전트 라이프사이클을 처리하는 표준 Solidity 컨트랙트로,
1. 지갑별 열거 — "지갑 X가 소유한 모든 agent ID를 나열하는 것"입니다. 컨트랙트 안에서 IdentityRegistry 스토리지를 순회하면 비용이 크지만, 프리컴파일은 동기화된 체인 측 인덱스에서 읽어 저렴하게 처리하고 페이지네이션을 지원합니다.
2. 네트워크 이식 discovery —
쓰기와 대부분의 읽기는 여전히 IdentityRegistry 컨트랙트를 거칩니다. 프리컴파일은 쿼리/discovery 도우미이며 권한자가 아닙니다.
register, attest, revoke, 메타데이터 조회 등을 담당합니다. 마루 프리컴파일은 표준 컨트랙트가 EVM 레이어에서 저렴하게 처리할 수 없는 두 가지를 보완합니다.1. 지갑별 열거 — "지갑 X가 소유한 모든 agent ID를 나열하는 것"입니다. 컨트랙트 안에서 IdentityRegistry 스토리지를 순회하면 비용이 크지만, 프리컴파일은 동기화된 체인 측 인덱스에서 읽어 저렴하게 처리하고 페이지네이션을 지원합니다.
2. 네트워크 이식 discovery —
getParams()로 컨트랙트가 IdentityRegistry / ReputationRegistry 주소를 하드코딩 없이 조회할 수 있습니다. testnet과 mainnet 모두에서 수정 없이 동작하는 코드에 유용합니다.쓰기와 대부분의 읽기는 여전히 IdentityRegistry 컨트랙트를 거칩니다. 프리컴파일은 쿼리/discovery 도우미이며 권한자가 아닙니다.
호출 패턴
import {PageRequest, PageResponse} from "cosmos-evm-contracts/precompiles/common/Types.sol";
interface IAgent {
struct Params { address identityRegistry; address reputationRegistry; }
function getParams() external view returns (Params memory);
function getAgentIds(address wallet, PageRequest calldata pageRequest)
external view
returns (uint256[] memory agentIds, PageResponse calldata pageResponse);
}
IAgent constant AGENT = IAgent(0x100000000000000000000000000000000000000A);
contract MyAgentDashboard {
function listAgents(address wallet) external view returns (uint256[] memory) {
// 첫 페이지 (페이지네이션 키 없음, 기본 limit)
PageRequest memory pr;
(uint256[] memory ids, ) = AGENT.getAgentIds(wallet, pr);
return ids;
}
function identityRegistry() external view returns (address) {
return AGENT.getParams().identityRegistry;
}
} 에이전트 등록, 메타데이터, attestation은 IdentityRegistry를 직접 호출합니다(주소는
getParams()가 반환하거나 testnet에서는 0x8004000000000000000000000000000000000001로 하드코딩 가능). 자세한 내용은 erc-8004-identity-registry 페이지를 참고합니다.V1 범위
마루 라이트페이퍼에 따라 V1은 Identity Registry만 적극 사용합니다. ReputationRegistry는
0x8004000000000000000000000000000000000002에 preinstall로 존재하지만 V2+ 활용을 위해 예약되어 있으며, getParams().reputationRegistry는 활성화 여부와 무관하게 주소를 반환합니다. ERC-8004 표준의 ValidationRegistry는 V1에 없습니다.