트론 테더 금고 안내서 공개…출금 오류 처리법 담아
오픈제플린은 트론 기반 테더 금고 개발 절차와 이체가 성공해도 실패값을 돌려주는 토큰의 출금 처리법을 안내서에 담았다.
토포AI로 이 기사 더 깊이 읽기
오픈제플린(OpenZeppelin)이 트론(TRON)에서 테더(USDT)를 예치받는 금고 개발 안내서를 공개했다. 안내서는 테더 이체가 성공해도 false가 반환되는 특성을 출금 과정에서 처리하는 방법을 설명한다.
안내서에는 계약 작성부터 로컬 테스트, 나일(Nile) 테스트넷 배포까지의 절차가 담겼다. 실제 운용 중인 금고 출시 소식이 아니라 개발자가 따라 해 볼 수 있는 예제다.
예제는 트론의 토큰화 금고 표준인 TRC-4626을 사용한다. 이용자가 테더를 예치하면 금고는 지분을 나타내는 vUSDT를 발행하고, 지분을 환매하면 테더를 돌려준다.
이번 예제의 기초 자산은 테더 한 종류다. 안내서는 여러 자산을 운용하거나 별도의 수익 창출 전략을 제시하지 않는다.
출금 과정에서 문제가 되는 것은 트론 기반 테더의 transfer 함수다. 이체가 성공해도 함수가 false를 반환해, 반환값만으로 성공 여부를 판단하면 정상적인 출금이 실패로 처리될 수 있다.
반면 예치에 쓰는 transferFrom과 승인을 위한 approve는 true를 반환한다. 안내서는 함수에 따라 반환 동작이 다른 점을 고려해 입금과 출금에 서로 다른 전송 처리를 적용한다.
일반적인 안전 전송 함수는 false를 실패로 읽어 거래를 되돌릴 수 있다. 따라서 출금에서는 반환값을 그대로 성공 여부의 기준으로 삼기 어렵다.
안내서는 출금에 SafeTRC20.safeTransferChecked를 사용한다. 이 함수는 반환값 대신 금고의 테더 잔액이 요청한 수량만큼 줄었는지 확인한다.
같은 잔액 확인 방식은 수수료를 지급할 때도 쓰인다. 다만 안내서는 잔액 변화 확인을 모든 토큰에 적용할 수 있는 방식으로 설명하지 않는다.
실습에서는 로컬 트론 노드에서 테더의 반환값 동작을 흉내 낸 토큰으로 예치와 출금을 시험한다. 개발 도구로 하드햇 2(Hardhat 2)와 오픈제플린의 트론용 플러그인을 사용한다.
이후 같은 흐름을 나일 테스트넷에 배포해 확인한다. 금액 계산에는 테더의 소수점 여섯 자리를 적용한다.
이체 반환값 문제는 앞선 보안 검토에서도 다뤄졌다. 오픈제플린의 9월 17일 감사 보고서는 당시 TRC-4626 금고의 출금·환매와 VestingWallet의 지급이 성공한 테더 이체를 실패로 오인해 되돌아갈 수 있다고 지적했다.
보고서의 후속 업데이트는 PR #131에서 잔액 변화를 확인하는 방식으로 문제를 해결했다고 밝혔다. 이번 안내서의 출금 처리도 같은 방식을 사용한다.
예제에는 예치와 환매 수수료를 재무 주소로 보내는 기능이 포함됐다. 테스트와 배포 스크립트에 설정된 진입·환매 수수료율은 각각 0.5%로, 실제 금고의 수수료율이 아니라 예제 설정값이다.
오픈제플린은 수수료 계약 예제가 감사를 받지 않았으며 운영 환경에 적용하기 전 자체 검토가 필요하다고 명시했다. 테스트넷에서 예제가 작동했다는 사실만으로 실제 서비스의 안전성이나 수익성이 입증되는 것은 아니다.

서도윤 기자 




Comment 0
불러오는 중…