Million Small Deposits
NEAR에서 컨트랙트는 사용하는 스토리지에 대한 비용을 지불합니다. 즉, 저장하는 데이터가 많을수록 스토리지를 위해 더 많은 잔고를 유지해야 합니다. 이러한 비용을 올바르게 처리하지 않으면(예: 사용자에게 스토리지 사용량을 충당하도록 요청하는 경우) 수백만 개의 작은 예금 행위들이 컨트랙트 자금을 고갈시킬 수 있습니다.
예를 들어 보겠습니다.
- 방명록 앱을 시작하고, 앱의 스마트 컨트랙트를
example.near
계정에 배포합니다. - 앱 방문자는 방명록에 메시지를 추가할 수 있습니다. 이는 사용자가 컨트랙트에 메시지를 저장하기 위해 약간의 가스비를 지불한다는 것을 의미합니다.
- 새 메시지가 들어오면 NEAR는
example.near
가 새 스토리지 요구 사항을 충족하는 충분한 잔고가 있는지 확인합니다. 만약 그렇지 않다면, 트랜잭션은 실패합니다.
이로 인해 공격 벡터가 생성될 수 있습니다. 방명록에 데이터를 보내는 것이 사용자에게는 비용이 적게 들고 컨트랙트 소유자에게는 훨씬 더 많은 비용이 든다면, 악의적인 사용자가 이 불균형을 악용하여 컨트랙트 유지 비용이 엄청나게 많이 들게 할 수 있습니다.
이 문제를 해결하는 한 가지 가능한 방법은, 사용자에게 메시지에 사용된 저장 공간을 충당하기 위해 호출에 돈을 첨부하도록 요청하는 것입니다.
팁
컨트랙트에서 데이터를 삭제하기만 하면, _스토리지 용으로 잠긴 잔고_를 해제할 수 있습니다.