- 다오 가입 온체인 로직을 호출할 때, 트랜잭션 전송을 서버에서 하고, 이 때 상용되는 어드민 지갑은 기존에 하나였다. 트랜잭션 전송 주체가 되는 지갑이 하나이면 동시에 다오 가입 api를 호출 했을 때, nonce too low 이슈가 발생하게 된다. 이를 해결하기 위해 어드민 지갑을 5개로 운용하고, 해당 5개 어드민 지갑의 사용 여부 값을 메모리(레디스)의 set 데이터 스트럭쳐를 활용하여 로직을 구현하였다. 따라서 유저는 5개의 어드민 지갑 중 사용되지 않는 지갑을 메모리에서 찾아와 온체인로직을 호출하게되며, 유저가 호출하는 시점에 5개 어드민 지갑이 모두 사용되고 있으면 유저는 리트라이를 해야한다.
- 이 때, 유저가 동시에 호출하게되면 결국 메모리에 어드민 지갑 사용여부를 조회하는 시점도 거의 동시에 이뤄지며 따라서 두 유저가 동일한 어드민 지갑을 사용하여 호출하게 되어 nonce too low이슈가 발생한다.
- 우선은 메모리에서 사용되고 있지 않은 어드민 지갑들을 찾아서 그 중 랜덤하게 하나를 사용하도록 했지만, 결국 두 유저가 동시에 동일한 지갑으로 호출할 가능성은 존재한다.
- 5개의 어드민 지갑을 적절히 분산해서 유저에게 할당을 어떻게 할 수 있을까?
- 메모리에 lock ?
2024.03.24의 궁금증
· 3 min read