AA — 위임형 계정 & 세션 키
ERC-7715로 세션 키에 한도 권한을 위임하고, ERC-7710이 온체인에서 강제하는 데모입니다. EIP-7702는 오너 EOA를 스마트 계정으로 만드는 전제조건으로, 이 페이지가 아니라 MetaMask가 처리합니다. @metamask/smart-accounts-kit · Sepolia — 실제 자금은 사용되지 않습니다.
불러오는 중… / Loading…
에이전트를 위한 AA — 4가지 구성요소
①은 위 세션 키 데모 — 아래 ②~④는 thirdweb의 ERC-4337 스마트 계정으로 시연합니다. 일반 지갑(EOA)이 자율 에이전트에게 줄 수 없는 네 가지 능력입니다.
불러오는 중… / Loading…
이 구성요소로 만드는 에이전트
위 버튼은 전부 사람이 누릅니다 — 즉 이 페이지는 에이전트에게 필요한 능력을 보여줄 뿐, 에이전트 자체를 보여주지는 않습니다. 빠진 조각은 결정 루프입니다: 무엇을 언제 할지 스스로 정하고, 사람에게 매번 묻지 않는 것. 아래는 그 루프를 얹었을 때 각 구성요소가 실제로 하는 일입니다.
에이전트가 여러 공급자에서 대신 구매하고 각각 정산하되, 한 번 승인한 한도를 절대 넘지 않습니다. 한 건이라도 실패하면 주문 전체가 되돌아갑니다.
쓰이는 구성요소: ① + ③ · 관계도와 순서도 보기 →
모델 호출마다 몇 센트씩 내는 에이전트는 매번 서명을 위해 멈출 수 없고, 시작 전에 자금을 채워둘 필요도 없어야 합니다.
쓰이는 구성요소: ① + ② · 관계도와 순서도 보기 →
리밸런서나 갱신 작업이 자는 동안 돕니다. 이걸 안전하게 만드는 건 신뢰가 아니라 산수입니다.
쓰이는 구성요소: ① · 관계도와 순서도 보기 →
에이전트끼리 거래하기 시작하면 질문이 '얼마를 쓸 수 있나'에서 '지금까지 정직하게 행동했나'로 옮겨갑니다.
쓰이는 구성요소: ④ · 관계도와 순서도 보기 →
기술 노트
각 항목이 실제로 무엇을 보여주고 어떻게 동작하는지 — 위 카드보다 자세한 기술 설명입니다.
목적: 계정 추상화(AA)가 일반 지갑(EOA)은 줄 수 없는, 자율 에이전트를 위한 네 가지 속성 — 범위 제한 위임, 가스 독립, 원자적 다단계 실행, 그리고 (개념적으로) 온체인 신원 확인 — 을 보여줍니다. 서로 다른 두 AA 표준을 나란히 사용해, 겹치는 문제를 다른 방식으로 푸는 것을 대비시킵니다.
동작 방식: ① 세션 키는 MetaMask의 ERC-7715 권한 API를 사용합니다: 소유자 지갑이 서명된 권한 요청으로, 브라우저에서 생성한 1회용 세션 계정에 한도가 걸린 ERC-20 허용량("최대 5 테스트 USDC, 1시간")을 부여합니다. 이후 세션 계정은 그 한도 안에서 직접 서명·전송하며, 권한 자체가 인가이므로 추가 지갑 팝업이 없습니다. ②~③은 thirdweb을 통한 ERC-4337(번들러 기반 스마트 계정)로 전환됩니다: 지갑을 연결하면 스마트 컨트랙트 계정으로 감싸지고, 가스는 사용자의 ETH 대신 paymaster가 대신 냅니다(②). 두 개의 호출을 하나의 UserOperation으로 묶어 성공/실패가 원자적으로 함께 처리됩니다(③). ④(ERC-8004 기반 온체인 신원/평판)는 라이브 데모 대신 설명으로만 제공하는데, 해당 표준의 테스트넷 배포 여부가 아직 확인되지 않았기 때문입니다. 페이지가 분명히 밝히는 점 하나: 여기의 모든 동작은 사람이 버튼을 눌러 시작됩니다. 따라서 이 페이지는 자율 에이전트에게 필요한 능력을 보여줄 뿐 에이전트 자체를 보여주지는 않습니다 — 빠진 조각은 결정 루프이고, "agentic"이라는 단어로 덮는 대신 그 간극을 명시했습니다.
"""AA -- delegatable accounts & session keys PoC.
Illustrates the core mechanism: a session key granted a scoped, capped allowance that
decrements per spend and is rejected once exhausted -- no re-sign popup needed.
"""
from dataclasses import dataclass
@dataclass
class SessionKey:
owner: str
cap: float # e.g. "<=5 test USDC"
remaining: float
revoked: bool = False
def spend(self, amount: float, memo: str) -> str:
if self.revoked:
return f"DENIED ({memo}): session key revoked"
if amount > self.remaining:
return f"DENIED ({memo}): {amount} exceeds remaining cap {self.remaining}"
self.remaining -= amount
return f"OK ({memo}): spent {amount}, {self.remaining} remaining of {self.cap}"
def grant_session_key(owner: str, cap: float) -> SessionKey:
"""Owner wallet signs one ERC-7715 permission request; no further popups after this."""
print(f"{owner} signs a permission request granting a session key <= {cap} USDC")
return SessionKey(owner=owner, cap=cap, remaining=cap)
if __name__ == "__main__":
session = grant_session_key("0xOwnerEOA...", cap=5.0)
print("\nsession key spends within its cap, no wallet popup each time:")
for amount, memo in [(1.5, "buy dataset A"), (2.0, "buy dataset B"), (2.0, "buy dataset C")]:
print(" ", session.spend(amount, memo))
print("\nrevoke or exhaustion still blocks further spends:")
print(" ", session.spend(0.5, "buy dataset D (exhausted)"))
session2 = grant_session_key("0xOwnerEOA...", cap=3.0)
session2.revoked = True
print(" ", session2.spend(0.1, "buy dataset E (revoked)"))