재진입 공격
교차 컨트랙트 호출과 콜백 사이에서 컨트랙트의 모든 메서드를 실행할 수 있습니다. 이것을 고려하지 않는 것은 해킹의 주요 소스 중 하나입니다. 재진입 공격이라는 자체 이름이 있을 정도로, 이는 매우 기본적인 해킹 방식입니다.
메서드 실행이 완료된 후에는 항상 상태를 일관된 상태로 유지해야 합니다. Assume that:
- 메서드 실행과 해당 콜백 사이에서 모든 메서드를 실행할 수 있습니다.
- 콜백이 시작되기 전에 동일한 메서드를 다시 실행할 수 있습니다.
예시
다음과 같은 상황을 가정해 봅시다. 다음과 같은 잘못된 로직으로 deposit_and_stake
를 개발한다고 상상해 봅시다. (1) 사용자가 우리에게 돈을 보냅니다. (2) 우리는 그것을 잔고에 추가합니다. 그러면, 사용자는 (2)와 (4) 사이에 호출을 철회하도록 예약할 수 있으며, 스테이킹에 실패하면 사용자는 두 번 돈을 받게 됩니다.
교차 컨트랙트 호출과 콜백 사이에 무슨 일이든 일어날 수 있습니다
다행스럽게도 솔루션은 다소 간단합니다. 사용자의 잔고에 돈을 즉시 추가하는 대신, 콜백이 올 때까지 기다립니다. There we check, and if the staking went well, then we add it to their balance.
교차 컨트랙트 호출 사이에 금액을 다루는 올바른 방법