Skip to content

feat(week-03): complete week-03 assignment#38

Open
ghwo336 wants to merge 1 commit intoBay-17th:mainfrom
ghwo336:ghwo336/week-03
Open

feat(week-03): complete week-03 assignment#38
ghwo336 wants to merge 1 commit intoBay-17th:mainfrom
ghwo336:ghwo336/week-03

Conversation

@ghwo336
Copy link

@ghwo336 ghwo336 commented Feb 25, 2026

과제 제출 정보

주차: Week 03

과제 유형:

  • 이론 (Theory Quiz)
  • 개발 (Dev Assignment)

구현 내용

  • CEI 패턴을 만족시키는 VaultSecure의 withdraw 한수 구현

배운 점 (What I Learned)

CEI를 만족시키지 않고 컨트랙트를 짠다면, 보안상 큰 문제가 발생할 수도 있다는 것을 배웠습니다.

이번 주에 배운 것 (2-3가지)

  1. CEI 를 지켜야하는 이유를 알았습니다. 반드시 잔액을 감소시키고 외부함수를 호출해야합니다.
  2. 로직이 복잡하거나 절대 실수하면 안되는 경우에는 openzeppelin을 import하여 ReentrancyGuard를 사용해주는 것이 좋습니다.
  3. tx.origin은 트랜잭션을 시작한 주소입니다. 따라서 EOA->CA->CA를 호출하는 경우가 있을 때, 취약점이 발생할 수도 있었습니다.

어려웠던 점과 해결 방법

어려웠던 점:

  1. 처음에 CEI 로 코드를 작성했다가, 테스트가 실패했습니다.
  2. 이를 고치고 다시해도 test_ReentrancyAttack_CannotDrainVault() 테스트에 실패했습니다.

해결 방법:

1번 문제 해결방법:
테스트코드를 살펴보니,
// Vault에는 Bob의 5 ETH가 그대로 있어야 함
// (Attacker가 입금한 1 ETH는 정상 출금되어 빠짐)
공격이 실패했을 때 원하시는 동작이 transaction의 revert가 아니고
정상 동작후 정상 종료임을 깨닫고 locked 변수를 추가하여 rever가 안나게 만들어 해결했습니다.

2번 문제 해결 방법:
테스트 코드가 틀렸음을 발견했습니다. attackerBalanceBefore 는 10 ETH이고,
attack 함수를 실행시켰으니 1 ETH만 출금되어야 합니다. 그러면 Attacker의 Ballance는 11ETH가 나오는게 맞는 테스 트 입니다. 따라서 제대로 된 로직이라면 테스트를 실패하는게 당연합니다.

질문 사항


체크리스트

테스트

  • forge build 성공
  • forge test 모든 테스트 통과

제출 규칙

  • 브랜치명이 {username}/week-{XX} 형식
  • .env 파일이 커밋에 포함되지 않음
  • 커밋 메시지가 규칙을 따름

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant