Smart contracts are self-executing computer programs that are designed to automate the execution of contracts. They are stored on a blockchain network and are executed automatically when certain conditions are met. Smart contracts are used in various applications such as decentralized finance (DeFi), supply chain management, and digital identity.
One of the common errors that occur in smart contracts is the integer division error. In programming, integer division occurs when one integer is divided by another integer, and the result is truncated to an integer. For example, if you divide 5 by 2, the result will be 2 instead of 2.5.
In smart contracts, integer division can result in errors that can cause the contract to fail or behave unexpectedly. For example, if you have a smart contract that calculates the percentage of a value, integer division can result in the wrong percentage being calculated.
How Solidity Performs Transactions without Floating Point Numbers
Instead, if you’ve written any code in Solidity, you’d be using numbers of either the signed or unsigned integer type.
So, if you want to perform the same computation – five divided by two – as shown in the previous section, here’s how it will look, as part of a smart contract:
However, the result that you obtain will not be the same, since Solidity does not support the float data type. At least, not just yet.
Specifically, Solidity will round the result towards zero. Which, in this case, and as shown above, will result in a value of two. Think of this as the modulo operation on both numbers.
While in normal circumstances, this shouldn’t matter much, there are times when the result can lead to an error in computation. Which is why it is recommended to avoid or postpone the division operation as much as possible.
Ways to Prevent the Integer Division Error
To bypass the integer division error in smart contracts, there are several approaches that can be used. Some of these approaches are:
- Use Decimal Math Libraries
One of the ways to bypass integer division errors in smart contracts is to use decimal math libraries. These libraries are designed to perform decimal arithmetic, which avoids the truncation errors that occur with integer division. Some popular decimal math libraries used in smart contracts include OpenZeppelin’s SafeMath library, and the Solidity library.
- Use Fixed-Point Arithmetic
Another way to bypass integer division errors is to use fixed-point arithmetic. Fixed-point arithmetic is a mathematical representation that uses a fixed number of digits to represent a number. In smart contracts, fixed-point arithmetic can be used to represent decimal numbers, which avoids the truncation errors that occur with integer division.
- Use Multiplication Instead of Division
Another approach to bypass integer division errors is to use multiplication instead of division. This approach involves multiplying the numerator by the reciprocal of the denominator, which gives the same result as division. For example, instead of dividing 5 by 2, you can multiply 5 by 0.5, which gives the result of 2.5.
- Use External Services
Finally, you can bypass integer division errors by using external services that perform the calculations for you. These services can be off-chain or on-chain and can perform complex calculations that are not possible with smart contracts. However, using external services can introduce new risks, such as relying on a centralized service, which can compromise the decentralization of the smart contract.
- Other Integer Division Libraries to Consider
Of course, the ABDKMath64x64 library isn’t the only one that can be used to improve accuracy apart from preventing the integer division error. There are several others with a few examples being Fixidity, DSMath and the BANKEX libraries that use different number formats. Number formats that are different from the 64.64-bit fixed point number format used in the example above. So, while these libraries might seem useful to explore, please remember that their number formats will not work with any of the other libraries available.
The integer division error is a common error that occurs in smart contracts. To bypass this error, you can use decimal math libraries, fixed-point arithmetic, multiplication instead of division, or external services. Each approach has its own advantages and disadvantages, and you should choose the one that best fits your use case.