ERC-7878 상속 가능한 컨트랙트 (Bequeathable Contracts)
Final · 토큰 · 2025-02-01 작성
토큰 소유자가 미리 유언장을 설정해 두면, 사망 후 집행인이 정해진 대기 기간을 거쳐 토큰을 상속인에게 넘길 수 있게 하는 표준 인터페이스입니다.
왜 필요한가
암호화폐 토큰, 그중에서도 NFT(대체 불가능 토큰)는 실물 자산을 토큰으로 만드는 데 쓰이기 시작했습니다. 주류 금융이 이런 토큰을 받아들이려면 소유자가 세상을 떠난 뒤 토큰을 물려줄 길이 있어야 하는데, 지금은 토큰 보유자가 사망했을 때 디지털 자산을 넘겨줄 표준화된 방법이 없습니다. 또한 상속 과정에는 분쟁이 생길 수 있으므로, 실제 이전이 일어나기 전에 누군가 개입해 절차를 멈출 수 있는 안전장치도 필요합니다. 이 표준은 현실 세계의 유언장 작성과 집행 절차를 본떠서 소유자가 미리 유언장(Will)을 쓰고 집행인(executor)을 지정해 두면 사망 후 정해진 대기 기간을 거쳐 토큰이 상속인에게 안전하고 투명하게 넘어가도록 하는 공통 인터페이스를 정의합니다.
구현해야 하는 것
event ObituaryStarted(address indexed owner, address indexed inheritor);: 소유자의 토큰이 상속될 예정임을 알립니다. announceObit이 호출될 때 발생하며 원래 소유자와 상속인 주소를 담습니다.event ObituaryCancelled(address indexed owner, address indexed cancelledBy);: 진행 중이던 부고와 대기 기간이 취소되었음을 알립니다. 누가 취소했는지 주소를 함께 담습니다.function setWill(address[] memory executors, uint256 moratoriumTTL) external;: 토큰 소유자가 유언장을 설정합니다. 집행인 주소 목록과 부고 이후 이전까지 기다려야 하는 시간(초)을 등록하며, 다시 호출하면 기존 유언장을 덮어씁니다.function getWill(address owner) external view returns (address[] memory executors, uint256 moratoriumTTL);: 특정 소유자의 유언장 내용을 조회합니다. 집행인 목록과 대기 시간을 돌려주어 소유자가 설정을 확인할 수 있습니다.function announceObit(address owner, address inheritor) external;: 부고 절차를 시작합니다. 소유자와 토큰을 물려받을 상속인 주소를 선언합니다.function cancelObit(address owner) external;: 이미 알려진 부고를 취소합니다. 집행인 누구나, 또는 소유자 본인이 호출할 수 있습니다.function getObit(address owner) external view returns (address inheritor, int256 moratoriumTTL);: 지정된 상속인과 대기 시간이 얼마나 남았는지 조회합니다. 음수이면 대기 시간이 지나 이전이 가능하다는 뜻입니다.function bequeath(address owner) external;: 대기 기간이 끝난 뒤 토큰을 부고 때 선언한 상속인 주소로 실제 이전합니다.
심층 설명
Bequeathable 인터페이스 의무 구현
이 표준을 따르는 컨트랙트는 Bequeathable 인터페이스를 반드시(MUST) 구현해야 합니다. 인터페이스는 함수 6개와 이벤트 2개로 구성됩니다. 함수는 setWill(유언장 설정·갱신), getWill(유언장 조회), announceObit(부고 알림으로 상속 절차 시작), cancelObit(부고 취소), getObit(부고 상태 조회), bequeath(상속인에게 토큰 이전)입니다. 이벤트는 부고가 알려질 때 발생하는 ObituaryStarted와 부고가 취소될 때 발생하는 ObituaryCancelled입니다. 헤더 기준으로 ERC-20, ERC-165, ERC-721, ERC-1155를 요구합니다.
setWill과 getWill: 유언장 설정과 확인
setWill은 토큰 소유자가 집행인 주소 배열(executors)과 대기 시간(moratoriumTTL, 초 단위)을 등록하는 함수입니다. 집행인은 법률 자문, 배우자, 자녀처럼 여러 명을 지정할 수 있지만 절차 시작과 이전에는 그중 한 명만 있으면 됩니다. 이 함수를 다시 호출하면 기존 유언장을 덮어써야 합니다. moratoriumTTL은 부고가 알려진 시점부터 실제 상속 이전이 가능해질 때까지 기다려야 하는 시간으로, 이전 전에 개입할 수 있게 하는 안전 완충 장치입니다. getWill은 소유자 주소를 받아 집행인 목록과 moratoriumTTL을 돌려주며, 소유자가 유언장을 올바르게 설정했는지 확인하는 용도입니다.
announceObit과 cancelObit: 절차 시작과 취소
announceObit은 소유자 주소와 상속인(inheritor) 주소를 받아 부고 절차를 시작하고, 원래 소유자와 상속인을 담은 ObituaryStarted 이벤트를 발생시킵니다. cancelObit은 진행 중인 부고를 취소하는 함수로, 집행인 누구나 호출할 수 있고 소유자가 살아 있다면 소유자 본인도 호출할 수 있습니다. 취소 시 ObituaryCancelled 이벤트가 발생하며 누가 취소했는지(cancelledBy)가 기록됩니다. Rationale에 따르면 집행인 누구든 취소할 수 있게 한 것은 분쟁 처리를 위한 설계입니다. 다툼이 생기면 법정에서 가리고, 문제가 정리된 뒤 부고 절차를 다시 시작하면 됩니다.
getObit과 bequeath: 상태 조회와 이전 실행
getObit은 소유자 주소를 받아 부고 때 지정된 상속인과 moratoriumTTL까지 남은 시간을 돌려줍니다. 반환되는 남은 시간은 int256 형식이며, 음수이면 대기 시간이 이미 지나 토큰을 물려줄 수 있다는 뜻입니다. bequeath는 토큰을 상속인에게 실제로 이전하는 함수로, 이전은 announceObit이 호출될 때 지정된 상속인 주소로 이루어져야 합니다. Rationale에 따르면 인터페이스를 단순하게 유지하기 위해 모든 토큰을 하나의 주소로 이전하며 이후 추가 분배는 그 주소를 받은 사람의 책임입니다.
현실의 유언 집행 절차를 본뜬 설계
이 표준은 현실에서 유언장이 준비되고 집행되는 과정을 따릅니다. 소유자가 유언장을 쓰면서 집행인을 지명하고, 사망하면 집행인이 부고를 알리고, 유언장이 읽혀 상속인이 확인되고, 유언의 뜻에 따라 소유권 이전이 집행되는 순서입니다. 다만 현실은 늘 순탄하지 않고 분쟁이 자주 생기므로, 인터페이스를 단순하게 유지하면서도 집행인 누구나 부고를 취소할 수 있는 장치를 넣었습니다.
기존 토큰 표준과의 호환
이 표준은 ERC-20, ERC-721, ERC-1155 같은 기존 토큰 표준과 호환됩니다. 이들 표준의 핵심 기능에 영향을 주지 않으면서 함께 구현할 수 있습니다. 즉 이미 쓰이는 토큰 형식 위에 상속 기능을 더하는 방식입니다. 테스트 케이스(Bequeath.test.js)와 참조 구현(Bequeathable.sol)이 원문 자산으로 제공됩니다. 이 제안의 상태는 Final로 확정된 표준입니다.
쓸 때 주의할 점
- 접근 제어를 신중하게 설계해야 합니다: 유언장 관련 함수는 권한 있는 당사자만 실행할 수 있도록 접근 제어 장치를 신중하게 설계해야 합니다.
- 대기 시간은 충분히 길게 잡아야 합니다: moratoriumTTL은 분쟁이나 정정이 가능하도록 합리적인 길이로 설정해야 합니다. 특히 고가치 토큰이라면 최소 30일을 권장합니다. 집행인 지갑을 탈취한 공격자가 부고 절차를 함부로 시작하는 경우에도 피해를 줄일 수 있습니다.