안녕하세요 제가 bapp을 제작 중 이였는데 문제가 발생하여 몇가지 질문을 남기려고 합니다.
일단 단순히 설명 드리면 매 초, 변경되어질 수 있는 숫자들을 총합하여 해당 값에 대한 평균을 구하려고 했습니다.
solidity에서 사용 가능한 loop문인 for, do, do while문을 이용하여 해당 계산을 진행하려고 하였으나,
전부다 gas limit에 걸려서 실패하였습니다.
계산 수식의 문제가 아니란걸 확인하고 싶어서 반복문 안에서 어떠한 계산 없이 단순히 loop를 돌리는경우
약 3만회정도의 loop에서 오류가 발생하였으며, gas limit을 줄 수 있는 범위까지 넣었으나 전부 실패하였습니다.
단순 view나 pure함수의 경우 잘 작동하지만 state값을 변경하는 external, public같은 함수들의 경우 실패하는것으로 확인되었습니다.
무한 loop실행시 문제가 발생할 수 있는 부분은
어떤 프로그래밍을 하더라도 주의하여야 하는 부분이기에
해당 네트워크의 공격수단으로 쓰일 수 있는 loop문의 반복은 어느정도 막혀야 한다고 생각합니다.
다만 3만번은 너무 적은것 같아서요…
스케일업같이 용량이나 사양의 증대같은 기능이 있는지 궁금해서 여쭤보았습니다…
제가 제작하고 있는 bapp에서 각 유저별로 서로다른 계산이 되어야 해서 해당 유저가
다른 사람들의 계산을 어느정도 진행한다면 그것또한 많은 가스비와 반복문을 실행하여 같은 오류를 발생할것이기 때문에
차마 방법이 없어서 답답한마음에 글 써봤습니다 ㅠㅠ
매초 랜덤하게 바뀌어질 수 있는 숫자 A가 있고, 이는 매 초 무조건 바뀌는 숫자가 아니기에 A에 대한 값이 변경될때마다
mapping 을 사용하여 해당 숫자를 mapping(시간 => A) 값으로 저장하였습니다.
이때 B라는 참여자들은 각기 다른 시간을 배정받습니다. (B의 인원은 약 1~2만명 사이)
이때 각기다른 B가 자신이 배정받은 시간부터 일정 시간만큼 평균을 계산한다면,
배정받은 시간부터, 매 초 mapping된 값이 변경되었음을 감지하기 위한 수단으로
반복문을 수행하여야 하고, 약 10일에 대한 A의 평균을 구한다고 하면 초단위 연산이기에 864000번 loop를 돌아야 하고, A의 값은 평균적으로 10초마다 한번씩 바뀌었다고 가정하면 약 86400번 계산되어야 할것입니다.
또한 B의 참여 시점이 각기 다르기때문에 서로다른 B’1, B’2, B’3 … B’n 이라는 사람들에 대해
계산을 따로 해줄 수 밖에 없는 상황입니다.
이런 상황에서 cache를 적용한다면 어떤 방법으로 캐싱데이터를 쌓아야할지에 대한 좋은 방향이 있을까요?