dApp에서 겪었던 부동소수점 문제

mechaniccoder·2022년 2월 1일
0

dApp에서 겪었던 부동소수점 문제

이번에 진행한 NFT 프로젝트에서 부동소수점으로 인해 smart contract에서 transaction을 처리하지 못했던 이슈를 겪어서 이를 회고해보려 한다.

문제

유저가 NFT를 민팅할때 우리쪽에서 정한 민팅 가격과 함께 metamask를 활용하여 transaction을 요청한다.

dApp에서는 최대 3개까지 민팅할 수 있는 양을 정할 수 있는 기능이 있었다. 따라서 만약, 1개 민팅 가격이 0.08 ether이고 3개를 민팅한다고 하면 0.08 ether * 3 = 0.24 ether를 유저에게 청구해야 한다.

바로, 여기서 문제가 발생했다. 언어들이 가지고 있는 부동소수점 문제를 인지하지 않은 상태에서 코드를 짜니 이를 처리하지 않아서 요청을 할때 0.24 ether가 아닌, 0.24000000003이 청구되기 때문에 smart contract에서 이를 처리하지 못하고 실패했다.

다행히 금방 math.floor를 활용하여 수정한 뒤에 배포를 해서 큰 문제로 이어지지는 않았지만, 그 시간동안 유저는 처리 실패로 인한 불편함을 겪었다는 생각에 내 스스로 아쉽게 느껴졌다.

해결방법

이 경우 해결방법은 매우 간단했다. floor api를 활용해서 price를 특정해줌으로써 해결하였다.

소감

가격을 다루거나 소숫점을 다룰때 항상 부동소수점 오차문제가 있다는 것을 인식하자!

profile
세계 최고 수준을 향해 달려가는 개발자입니다.

0개의 댓글