ನಿಖರತೆಯ ನಷ್ಟ ಮತ್ತು ರೌಂಡಿಂಗ್ ವಂಚನೆಗಳು (Precision Loss and Rounding Exploits)
ಹಣವನ್ನು ಕಳೆದುಕೊಳ್ಳಲು ಸ್ಮಾರ್ಟ್ ಕಾಂಟ್ರಾಕ್ಟ್ಗಳಿಗೆ ಅಕ್ಸೆಸ್ ಕಂಟ್ರೋಲ್ನಲ್ಲಿ (access control) ದೋಷವಿರಬೇಕೆಂದಿಲ್ಲ.
ಕೆಲವೊಮ್ಮೆ ವಂಚನೆಯು ಒಂದು ಸರಳ ಭಾಗಾಕಾರದಲ್ಲಿ ಅಡಗಿರುತ್ತದೆ.
ಹಣಕಾಸಿನ ಸ್ಮಾರ್ಟ್ ಕಾಂಟ್ರಾಕ್ಟ್ಗಳು ಇಂಟೆಜರ್ ಅರಿಥ್ಮೆಟಿಕ್ (integer arithmetic) ಅನ್ನು ಬಳಸುತ್ತವೆ. ಇಲ್ಲಿ ಭಿನ್ನರಾಶಿಗಳನ್ನು (fractions) ಕೈಬಿಡಲಾಗುತ್ತದೆ. ಈ ರೌಂಡಿಂಗ್ ದಿಕ್ಕು ಯಾರು ಮೌಲ್ಯವನ್ನು ಪಡೆಯುತ್ತಾರೆ ಎಂಬುದನ್ನು ಬದಲಾಯಿಸುತ್ತದೆ. ಒಂದು ಘಟಕದ ತಪ್ಪು ಸಾವಿರಾರು ವಹಿವಾಟುಗಳಲ್ಲಿ ಪುನರಾವರ್ತನೆಯಾಗಬಹುದು.
ಹಣಕಾಸಿನ ಪ್ರೋಟೋಕಾಲ್ನಲ್ಲಿ, ರೌಂಡಿಂಗ್ ಎಂಬುದು ಮೌಲ್ಯ ವರ್ಗಾವಣೆ ನೀತಿಯಾಗಿದೆ (value-transfer policy).
ಪ್ರತಿಯೊಂದು ಭಾಗಾಕಾರವು ಈ ಮೂರು ಪ್ರಶ್ನೆಗಳಿಗೆ ಉತ್ತರಿಸಬೇಕು:
- ಲೆಕ್ಕಾಚಾರವು ಯಾವ ದಿಕ್ಕಿನಲ್ಲಿ ರೌಂಡ್ ಆಗುತ್ತದೆ?
- ಆ ದಿಕ್ಕಿನಿಂದ ಯಾವ ಪಾರ್ಟಿಗೆ ಲಾಭವಾಗುತ್ತದೆ?
- ದಾಳಿಕೋರನು (attacker) ಆ ಪ್ರಯೋಜನವನ್ನು ಪುನರಾವರ್ತಿಸಲು ಅಥವಾ ಹೆಚ್ಚಿಸಲು ಸಾಧ್ಯವೇ?
ಸಾಮಾನ್ಯ ಗಣಿತದ ದೋಷಗಳು ಇವುಗಳನ್ನು ಒಳಗೊಂಡಿವೆ:
ಅತಿ ಬೇಗ ಭಾಗಾಕಾರ ಮಾಡುವುದು ನೀವು ಗುಣಾಕಾರ ಮಾಡುವ ಮೊದಲು ಭಾಗಾಕಾರ ಮಾಡಿದರೆ, ನಿಖರತೆಯನ್ನು ಕಳೆದುಕೊಳ್ಳುತ್ತೀರಿ. ಉದಾಹರಣೆ:
(amount / 1e18) * rate. ಮಧ್ಯಂತರ ಭಾಗಾಕಾರವು ಗುಣಾಕಾರವಾಗುವ ಮೊದಲು ಡೇಟಾವನ್ನು ಕೈಬಿಡುತ್ತದೆ. ನಿಯಮ: ಯಾವಾಗಲೂ ಭಾಗಾಕಾರ ಮಾಡುವ ಮೊದಲು ಗುಣಾಕಾರ ಮಾಡಿ.ಮಧ್ಯಂತರ ಓವರ್ಫ್ಲೋಗಳು (Intermediate overflows) ಅಂತಿಮ ಫಲಿತಾಂಶವು
uint256ನಲ್ಲಿ ಹೊಂದಿಕೆಯಾಗಿದ್ದರೂ ಸಹ, ಮೊದಲು ಗುಣಾಕಾರ ಮಾಡುವುದು ಓವರ್ಫ್ಲೋಗೆ ಕಾರಣವಾಗಬಹುದು. ಪೂರ್ಣ ನಿಖರತೆಯ ಗುಣಾಕಾರ ಮತ್ತು ಭಾಗಾಕಾರವನ್ನು ಒಂದೇ ಹಂತದಲ್ಲಿ ಮಾಡಲು OpenZeppelin Math ನಂತಹ ಲೈಬ್ರರಿಯನ್ನು ಬಳಸಿ.ತಪ್ಪು ದಿಕ್ಕಿನಲ್ಲಿ ರೌಂಡಿಂಗ್ ಮಾಡುವುದು ರೌಂಡಿಂಗ್ ಎಂಬುದು ಕೇವಲ ಸಲಹೆಯಲ್ಲ, ಅದು ಭದ್ರತಾ ನಿಯಮವಾಗಿದೆ. ಒಂದು ಸಂರಕ್ಷಣಾತ್ಮಕ ಪ್ರೋಟೋಕಾಲ್ ಈ ತತ್ವಗಳನ್ನು ಅನುಸರಿಸುತ್ತದೆ:
- ಸಾಲವನ್ನು (debt) ಮೇಲಕ್ಕೆ ರೌಂಡ್ ಮಾಡಿ.
- ಅಗತ್ಯ ಪಾವತಿಗಳನ್ನು ಮೇಲಕ್ಕೆ ರೌಂಡ್ ಮಾಡಿ.
- ಅಡಮಾನದ ಮೌಲ್ಯವನ್ನು (collateral value) ಕೆಳಕ್ಕೆ ರೌಂಡ್ ಮಾಡಿ.
- ಬಳಕೆದಾರರಿಗೆ ಪಾವತಿಸುವ ಆಸ್ತಿಗಳನ್ನು ಕೆಳಕ್ಕೆ ರೌಂಡ್ ಮಾಡಿ.
- ಬಳಕೆದಾರರಿಗೆ ವಿಧಿಸುವ ಶೇರ್ಗಳನ್ನು (shares) ಮೇಲಕ್ಕೆ ರೌಂಡ್ ಮಾಡಿ.
ನಿಖರವಾದ ಫಲಿತಾಂಶ ಅಸಾಧ್ಯವಾದಾಗ, ಮೌಲ್ಯವನ್ನು ಹೊರತೆಗೆಯಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರುವ ಪಾರ್ಟಿಯ ವಿರುದ್ಧವಾಗಿ ರೌಂಡ್ ಮಾಡಿ.
ಹಣದುಬ್ಬರ ದಾಳಿಗಳು (Inflation attacks) ಕಡಿಮೆ ದ್ರವ್ಯತೆ (liquidity) ಹೊಂದಿರುವ ವಾಲ್ಟ್ಗಳಲ್ಲಿ, ದಾಳಿಕೋರರು ವಿನಿಮಯ ದರಗಳನ್ನು (exchange rates) ಕುಶಲತೆಯಿಂದ ಬಳಸಲು ದಾನಗಳನ್ನು (donations) ಬಳಸಬಹುದು. ಅವರು ಶೇರ್ ಸಂಖ್ಯೆಯನ್ನು ಹೆಚ್ಚಿಸದೆ ಒಟ್ಟು ಆಸ್ತಿಯ ಸಂಖ್ಯೆಯನ್ನು ಹೆಚ್ಚಿಸಲು ಆಸ್ತಿಗಳನ್ನು ದಾನ ಮಾಡುತ್ತಾರೆ. ಇದು ಹೊಸ ಠೇವಣಿಗಳು ಶೂನ್ಯ ಶೇರ್ಗಳಿಗೆ ರೌಂಡ್ ಡೌನ್ ಆಗುವಂತೆ ಮಾಡುತ್ತದೆ. ಪರಿಹಾರ: ಸ್ಥಿರವಾದ ಆರಂಭಿಕ ದರವನ್ನು ಸ್ಥಾಪಿಸಲು ವರ್ಚುವಲ್ ಆಸ್ತಿಗಳು ಅಥವಾ ಶೇರ್ಗಳನ್ನು ಬಳಸಿ.
ಫ್ರೀಕ್ವೆನ್ಸಿ ದಾಳಿಗಳು (Frequency attacks) ಬಡ್ಡಿಯು ಪ್ರತಿ ಬ್ಲಾಕ್ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗುತ್ತಾ (accrues) ಕೆಳಕ್ಕೆ ರೌಂಡ್ ಆಗುತ್ತಿದ್ದರೆ, ದಾಳಿಕೋರನು ಬಡ್ಡಿಯನ್ನು ಶೂನ್ಯದಲ್ಲಿಡಲು ನಿರಂತರವಾಗಿ ಅಕ್ರೂಯಲ್ ಅನ್ನು ಪ್ರಚೋದಿಸಬಹುದು. ಪರಿಹಾರ: ಹೆಚ್ಚಿನ ನಿಖರತೆಯ ಇಂಡೆಕ್ಸ್ ಬಳಸಿ ಅಥವಾ ಉಳಿದ ಶೇಷವನ್ನು (remainder) ಮುಂದಕ್ಕೆ ಕೊಂಡೊಯ್ಯಿರಿ.
ಸುರಕ್ಷಿತ ಹಣಕಾಸು ಎಂಜಿನಿಯರಿಂಗ್ಗೆ ಇವು ಅಗತ್ಯವಾಗಿವೆ:
- ಸ್ಪಷ್ಟವಾದ ಘಟಕಗಳು ಮತ್ತು ದಶಮಾಂಶ ಸ್ಕೇಲ್ಗಳು.
- ಪೂರ್ಣ ನಿಖರತೆಯ ಗುಣಾಕಾರ ಮತ್ತು ಭಾಗಾಕಾರ.
- ಕಾರ್ಯಾಚರಣೆ-ನಿರ್ದಿಷ್ಟ ರೌಂಡಿಂಗ್.
- ಶೇಷದ ಟ್ರ್ಯಾಕಿಂಗ್ (Remainder tracking).
- ಇನ್ವೇರಿಯಂಟ್ (Invariant) ಮತ್ತು ಫಸ್ ಟೆಸ್ಟಿಂಗ್ (fuzz testing).
ಲೆಕ್ಕಾಚಾರವು ಸಾಕಷ್ಟು ಹತ್ತಿರದಲ್ಲಿದೆಯೇ ಎಂದು ಕೇಳಬೇಡಿ. ಕೈಬಿಡಲಾದ ಮೌಲ್ಯವು ಎಲ್ಲಿಗೆ ಹೋಗುತ್ತದೆ ಮತ್ತು ಅದನ್ನು ಯಾರು ಪಡೆಯುತ್ತಾರೆ ಎಂದು ಕೇಳಿ.
ಮೂಲ: https://dev.to/stablenaira/precision-loss-and-rounding-exploits-in-financial-smart-contracts-4c93