ERC-1450 RTA 통제 증권형 토큰 (RTA-Controlled Security Token)

Final · 토큰 · 2018-09-25 작성

미국 증권 규제(Reg CF, D, A)에 맞춰 발행된 증권을 토큰으로 기록하고 등록 명의개서 대리인(RTA)만 이전·발행·소각을 실행할 수 있게 하는 표준입니다.

왜 필요한가

주식 같은 증권을 블록체인 토큰으로 만들면 소유권 기록과 이전이 간편해지지만 일반 ERC-20 토큰은 누구나 자유롭게 보낼 수 있어 증권 규제와 충돌합니다. 미국 증권 규제는 등록 명의개서 대리인(Registered Transfer Agent, RTA)이 증권 이전을 독점적으로 통제하도록 요구하고 투자자 신원 확인(KYC)과 자금세탁 방지(AML), 분실·도난 증권의 복구, 법원 명령(이혼, 상속, 사기 피해 회복 등)에 따른 강제 이전, 감독 기관 검사를 위한 기록 유지도 요구합니다. 기존 ERC-20에는 이런 규제 역할이 없고 다른 증권형 토큰 표준도 미국의 RTA 제도를 직접 다루지 않았습니다. ERC-1450은 모든 토큰 이동을 RTA를 통해서만 실행하게 만들어 이 간극을 메웁니다.

구현해야 하는 것

심층 설명

직접 전송을 막는 제한형 ERC-20 인터페이스

ERC-1450은 ERC-20을 확장하지만 동작은 다릅니다. transfer, approve, transferFrom은 항상 ERC1450TransferDisabled 오류로 되돌려져야 하고 allowance는 항상 0을 반환해야 합니다. 실제 가치 이동은 RTA 전용 함수인 transferFromRegulated, mint, burnFrom으로만 일어납니다. 이렇게 하면 balanceOf, totalSupply 같은 읽기 함수는 기존 ERC-20 인프라와 호환을 유지하면서도 모든 토큰 이동을 규제받는 RTA 한 곳으로 모을 수 있습니다. 오류는 도구 호환성을 위해 ERC-6093 표준 오류 형식을 따릅니다.

세 역할의 분리와 changeIssuer의 보안 설계

역할은 발행자(Owner/Issuer), RTA, 토큰 보유자 셋으로 나뉩니다. 발행자는 증권을 만들고 소유하지만 토큰 이전을 통제할 수 없고 RTA만 이전·발행·소각 권한을 갖습니다. 특히 changeIssuer는 발행자가 아니라 RTA만 호출할 수 있습니다. OpenZeppelin Ownable처럼 소유자가 스스로 소유권을 넘기는 방식과 달라서 발행자의 개인키가 탈취돼도 공격자가 RTA를 바꾸거나 토큰을 훔칠 수 없습니다. setTransferAgent는 발행자가 최초 1회 RTAProxy로 설정하는 용도이고 그 뒤에는 잠겨서 RTA만 프록시를 통해 스스로 교체할 수 있습니다.

규정 유형과 발행일을 묶음 단위로 추적

모든 발행은 규정 유형(regulationType, uint16)과 원 발행일(issuanceDate)을 지정해야 하며 규정 없는 증권은 존재하지 않습니다. mint마다 TokensMinted 이벤트가, 소각마다 TokensBurned 이벤트가 반드시 발생해 이벤트만으로 전체 주주 명부(캡 테이블)를 재구성할 수 있습니다. 기존 증권을 토큰화할 때 issuanceDate는 투자자가 원래 매수한 시점으로 적고 RTA는 이를 보유 기간 계산에 씁니다. getHolderRegulations, getRegulationSupply, getDetailedBatchInfo로 보유자의 묶음별 구성과 규정별 총 발행량을 조회할 수 있고 batchMint·batchTransferFrom·batchBurnFrom으로 배당 분배나 환매 같은 대량 작업을 처리합니다.

이전 요청과 수수료, 브로커 제도

보유자는 requestTransferWithFee로 이전을 요청할 수 있지만 RTA가 승인·실행하기 전에는 가치가 움직이지 않습니다. msg.sender가 보유자 본인이 아니면 setBrokerStatus로 등록된 브로커여야 하며 브로커는 오프체인 신청과 KYC·AML 심사, 계약 체결을 거쳐 RTA가 승인합니다. 수수료는 RTA가 설정한 수수료 토큰(getFeeToken)으로 내며 정액(flat) 또는 베이시스 포인트 기준 비율(percentage) 방식입니다. 요청은 Requested, UnderReview, Approved, Rejected, Executed, Expired 상태 기계를 따르고 각 requestId는 한 번만 실행됩니다. 거절 시에는 uint16 사유 코드(예: 1 KYC 실패, 13 관할권 제한, 14 적격투자자 요건 미충족)와 수수료 환불 여부를 기록하며 환불 정책은 구현이 명확히 문서화해야 합니다.

분실 지갑 복구와 법원 명령 이전

복구의 필수 기반은 controllerTransfer입니다. RTA가 기존 오프체인 KYC 기록으로 투자자 신원을 확인하고 즉시 이전을 실행하며 ControllerTransfer 이벤트를 반드시 발생시킵니다(ERC-1644 호환). 이혼·상속·사기 피해 회복 같은 법원 명령에도 같은 함수를 씁니다. 선택 확장인 구조화 복구 절차는 initiateRecovery로 증빙 문서(ERC-1643 방식의 이름·URI·해시)를 올리고 분쟁 대비 시간 잠금(예: 30일)이 지난 뒤 executeRecovery로 실행합니다. 사기 증빙이 드러나거나 원 소유자가 접근을 증명하면 cancelRecovery로 취소합니다. 개인정보는 체인에 직접 저장하지 않고 문서 URI와 해시만 올립니다. 이와 별도로 setAccountFrozen으로 계정을 동결해 송수신을 막을 수 있습니다.

인터페이스 감지와 선택 확장

supportsInterface는 ERC-165 ID(0x01ffc9a7)와 IERC1450 고유 ID에 true를, ERC-20 ID(0x36372b07)에는 반드시 false를 반환해야 합니다. ABI는 ERC-20과 호환되지만 transfer가 항상 실패하므로 동작까지 호환된다고 지갑이 오해하지 않게 하려는 설계입니다. isSecurityToken은 항상 true를 반환해 제한 토큰임을 알립니다. 선택 확장으로는 문서 관리(setDocument 등), 구조화 복구 절차, KYC 상태 조회(isKYCVerified), EIP-2612 permit을 쓰는 수수료 가스리스 승인(requestTransferWithPermit), EIP-3668(CCIP-Read) 기반 오프체인 사전 규정 검사(preCheckCompliance)가 있습니다. 사전 검사는 참고용일 뿐 구속력이 없고 최종 권한은 항상 RTA에 있습니다. 이 표준은 Final 상태로 확정되었습니다.

ERC 원문 · ← ERCs