컨트랙트 delete 미작동(답변 절실함)

아래와 같은 상황에서 removeReview 함수를 실행하면 해당 값이 초기화 돼야하는데 여전히 남아있는 버그가 있는 것 같습니다. 거의 유사한 별도의 테스트 코드를 작성해서 테스트해볼 때는 이상하게도 정상작동을 합니다. 테스트코드와 차이가 없어보이는데 왜 이런 현상이 있는건지 도저히 알 길이 없어서 문의를 남깁니다. removeReview의 실행후 트랜잭션 상태는 0x01 성공 상태인데 그렇다면 delete도 실행되었단건데 그렇다면 removeReview함수를 재차 실행했을 때 require(r.status != Type.ReviewStatus.NONE, “Review does not exist”); 이 줄에 의해 revert가 떠야하는데 초기화되지 않았었기 때문에 계속 성공이 뜨고 상태를 조회해보면 여전히 초기화되지 않고 남아있습니다. 상태가 delete 되지 않고 유지 돼있기 때문에 계속 removeReview함수 실행이 성공이 뜨고 있습니다. 동일 컨트랙트의 다른 함수에서의 delete는 정상작동합니다. 이 함수의 delete만 문제가 되는 상황입니다.

원인 분석이 절실합니다… 이 문제가 꼭 해결돼야 합니다. 답변 부탁드립니다.

struct ReviewInfo {
uint8 rating;
ReviewStatus status;
}

enum ReviewStatus {
NONE,
ON,
OFF
}
mapping(address => mapping(string => Type.ReviewInfo)) internal reviews;

image

@ymkim

안녕하세요. 원활한 소통을 위해 문제가 된다고 판단되시는 스마트 컨트랙 코드를 공유 부탁드립니다.
저희 측에서도 원활히 재현을 해볼 수 있게끔 좀 더 상세한 상황설명도 부탁드리겠습니다 :slight_smile:

테스트코드는 어떤 코드이며 어떤 input과 output을 기대하셨는지 등을 공유 부탁드립니다.

안녕하세요.

아래 내용 혹시 확인해보셨는지요?

https://docs.soliditylang.org/en/v0.8.10/types.html?highlight=delete#delete

For structs, it assigns a struct with all members reset. In other words, the value of a after delete a is the same as if a would be declared without assignment, with the following caveat:

delete has no effect on mappings (as the keys of mappings may be arbitrary and are generally unknown). So if you delete a struct, it will reset all members that are not mappings and also recurse into the members unless they are mappings. However, individual keys and what they map to can be deleted: If a is a mapping, then delete a[x] will delete the value stored at x .

문서공유 감사합니다. 컨트랙트 복잡도때문에 우선 보내주신 문서 참고해서 다시 진행해보고 안되면 다시 말씀드리도록 하겠습니다. 답변 감사드립니다.

1개의 좋아요