0xcaae92c6ec8db8992ced4af61a4d6687453ffd6d contract의 fallback은 비어있지 않으며, 두번의 SLOAD를 수행하고 있음 (ADMIN_SLOT, IMPLEMENTATION_SLOT 데이터 읽기 목적)
해당 contract는 OpenZepplin의 BaseAdminUpgradeabilityProxy.sol 와 BaseUpgradeabilityProxy.sol 를 상속받아 구현된 것으로 추정되며, Proxy.sol fallbcak 함수 동작과 동일하게 fallback 호출 시 _fallback() 함수를 수행하는 것으로 파악됨
즉, 모든 Proxy 패턴의 contract에 문제가 생기는 것이 아니며 예시로 전달 주신 contract의 fallback 함수에 이미 2300에 가까운 gas cost를 사용하도록 구현되어 있었다고 판단됩니다.
그리고, 다음과 같은 이유로 기존의 CallStipend gas cost의 변경없이 예정된 변경 (SLOAD gas cost) 상승을 그대로 진행하려 합니다. 오늘 공지 예정이던 Klaytn v1.8.0 Release note에 이와 관련된 내용만 다시 한번 언급하려하는데, 혹시 다른 의견 있으시면 댓글 또는 DM으로 공유해주시면 감사하겠습니다.
SLOAD의 gas cost 상승은 이미 5개월 전 Klaytn v1.7.0 Release note 공지되었으며, Baobab에는 4개월전 적용되어 수정할 시간이 충분히 제공되었다고 생각됨
이더리움 진영에서 2019년에 동일한 문제를 겪고난 뒤, fallback 함수에서는 gas cost의 변경에 대비하여 많은 gas cost를 사용하지 않는 것은 잘 알려진 solidity 개발 practice라고 생각됨
변경 후, fallback 함수에 2300 이상 gas cost를 사용하는 것은 모든 Proxy contract의 공통적인 문제가 아니기에 Klaytn 생태계 파급력이 과도하다고 파악하기 어려움 (Open source 하지 않은 프로젝트들이 많아 파급력 파악이 어려움)
이와 관련하여 KIP 제안주신 내용은 검토해보겠지만, 현재 이슈에 대한 근본적인 답은 아니라고 생각됩니다. fallback에서 사용하는 Opcode 종류에 따라서 이번 변경으로 인해 증가될 gas cost는 다를 것입니다. 또한, gas cost는 지속적으로 변경되는 값이기에 이번에 CallStipend을 향상 시키더라도 다음 하드포크 때 동일한 문제가 발생하리라 생각됩니다.
죄송한데 제가 이해가 부족하여 이 상황이 왜 벌어지는지 궁금해서 답글을 달게 되었습니다.
Proxy contract 로 인해 일반 contract 에서보다 gas 를 더 많이 사용하고 따라서 total gas fee 가 더 많이 사용된다는 것은 이해를 합니다.
그리고 1 gas에 대한 fee 상향이 돼서 기존 보다 더 많은 gas 가 나간다는 점도 이해가 됩니다.
revert 가 된 이유는, transfer() 함수는 2300 gas 가 고정인데, gas price 가 올라서 transaction이 필요한 gas 가 2300이 넘어서 block 에 기록이 되지 않았다는 것으로 이해했습니다.
근데 contract에 transfer() 함수를 사용할때 gas 가 2300 limit 이 있는 이유가 reentry attack 을 방어하기 위함인것으로 아는데 이게 고정이면 gasPrice 가 오르면 transfer() 를 proxy pattern 으로 사용하는 모든 코드가 영향을 받는것은 사실 아닌가요? (대부분 openzep 을 상속받아 구현할테니)
=> 5개월전 공지 됐던 거라 그전에 알아서 gas 를 더 넉넉하게 쓰는 call() 함수로 수정했었어야 한다. 가 klaytn 쪽의 설명인건가요? 그리고 앞으로도 transfer() 함수를 쓰지 말고 call() 위주로 구현해야한다가 결론이 될까요?