본문으로 이동

ERC-20 승인 경쟁 조건

ERC-20 지출자는 대체 승인이 확정되기 전에 기존 허용량을 사용한 뒤 새 허용량도 사용할 수 있습니다. 경쟁 조건의 작동 방식과 승인을 더 안전하게 변경하거나 철회하는 방법을 알아봅니다.

업데이트

교육 참고용이며 투자 조언이 아닙니다. 투자로 인해 손실이 발생할 수 있습니다.

직접 답변

ERC-20 승인 경쟁 조건은 소유자가 approve(spender, newAmount)를 호출해 영이 아닌 허용량을 다른 영이 아닌 허용량으로 대체할 때 발생할 수 있습니다. 지출자는 대기 중인 변경을 보고 먼저 transferFrom으로 기존 허용량을 사용한 뒤, 대체 승인이 확정되면 새 허용량도 사용할 수 있습니다.

따라서 ERC-20 명세는 클라이언트 인터페이스가 동일한 지출자에게 새 값을 설정하기 전에 먼저 허용량을 0으로 설정할 것을 권장합니다. 각 트랜잭션은 순서대로 확정되어야 합니다. 토큰이 지원한다면 원자적인 increaseAllowance 또는 decreaseAllowance 호출을 사용해 영이 아닌 허용량을 직접 대체하는 일을 피할 수 있습니다.

ERC-20 승인 경쟁 조건
0 / 5
0 개 항목 검토; 5 개 항목 미해결

모든 항목을 검토해도 자산, 거래 또는 시스템의 안전이 입증되는 것은 아닙니다.

작동 방식

ERC-20은 approve를 덮어쓰기 방식으로 정의합니다. 즉, 성공한 approve(spender, amount)는 지출자의 허용량을 amount로 설정합니다. 이와 별도로 transferFrom(owner, recipient, amount)은 해당 지출자가 소유자의 토큰을 옮길 수 있게 하며 일반적으로 남은 허용량을 줄입니다. 대기 중인 트랜잭션은 실행 순서를 보장하지 않으므로, 지출자가 소유자의 승인 변경보다 먼저 실행되는 전송을 제출할 수 있습니다.

위험한 전환은 N -> M이며, 여기서 N > 0이고 M > 0입니다. 대체 승인이 실행되기 전에 지출자가 N을 모두 사용하면 이후 승인이 새로운 허용량 M을 설정합니다. 따라서 이 과정에서 지출할 수 있는 최대 금액은 소유자의 토큰 잔액과 토큰 구현을 한도로 N + M이 될 수 있습니다.

예시

Alice는 한 프로토콜에 100개 토큰을 지출하도록 승인했습니다. approve(protocol, 50)을 제출해 남은 허용량을 50으로 낮추려고 합니다. 그 트랜잭션이 확정되기 전에 프로토콜의 지출자가 transferFrom(Alice, recipient, 100)을 제출해 먼저 실행시킵니다. 이어서 Alice의 승인이 허용량을 50으로 설정하고, 지출자는 이를 다른 전송에 사용할 수 있습니다. 두 전송의 합계는 150개 토큰입니다.

더 안전한 대체 절차는 approve(protocol, 0)을 제출하고 확정을 기다린 뒤, 변경된 허용량과 잔액을 확인하고 새 승인이 여전히 적절할 때만 approve(protocol, 50)을 제출하는 것입니다. 지출자가 영으로 만드는 트랜잭션이 확정되기 전에 기존 허용량을 사용하면 Alice는 변경된 잔액을 확인하고 새 50을 승인하기 전에 중단할 수 있습니다.

위험

  • 허용량을 0으로 설정해도 이미 실행된 지출은 철회되지 않으며, 영으로 만드는 트랜잭션이 확정되기 전에 기존 허용량이 사용되는 것도 막지 못합니다.
  • 첫 번째 확정을 기다리지 않고 영으로 만드는 승인과 대체 승인을 함께 보내면 실행 순서 위험이 다시 생깁니다.
  • increaseAllowancedecreaseAllowance는 기본 ERC-20 표준에 포함되지 않습니다. 검증된 토큰 컨트랙트가 지원할 때만 사용하세요.
  • 무제한 허용량이 활성화되어 있는 동안 소유자의 전체 토큰 잔액이 위험에 노출될 수 있습니다. 서명 전에 체인, 토큰 컨트랙트, 지출자, 금액을 확인하세요.
  • 일부 토큰은 표준과 다른 승인 동작을 보입니다. 지갑 시뮬레이션과 트랜잭션 calldata를 검토하고 각 단계 후 온체인 허용량을 확인하세요.

흔한 오해

  • “가장 최근의 승인 트랜잭션이 기존 승인을 즉시 대체한다.” 상태는 해당 트랜잭션이 온체인에서 실행될 때만 변경됩니다.
  • “허용량을 낮추면 앞으로의 총지출이 새 금액으로 제한된다.” 지출자는 변경이 실행되기 전에 기존 허용량을 사용할 수 있습니다.
  • “먼저 영으로 만들면 토큰이 더 이상 빠져나가지 않는다고 보장된다.” 영으로 만드는 트랜잭션이 확정될 때까지 기존 허용량은 계속 사용할 수 있습니다.
  • “모든 ERC-20에는 increaseAllowancedecreaseAllowance가 있다.” 이들은 선택적 확장 기능이며 ERC-20의 요구 사항이 아닙니다.
  • “웹사이트 연결을 해제하면 토큰 승인도 철회된다.” 지갑 연결 상태와 토큰 컨트랙트의 온체인 허용량은 서로 별개입니다.

관련 주제

출처

탐색

위키 검색...