安全,区块链领域举足轻重的话题。本期咱们聊聊,由于浮点和精度处理不当等细节问题引起的巨大安全隐患。
「区块链大本营」携手「成都链安科技」团队重磅推出「合约安全漏洞解析连载」,以讲故事的方式,带你回顾区块链安全走过的历程;分析漏洞背后的玄机。让开发者在趣味中学习,写出更加牢固的合约,且防患于未然。
当然,这些文章并不是专为开发者而作的,即使你不是开发者,当你读完本连载,相信再有安全问题爆出时,你会有全新的理解。
“言治骨角者,既切之而复磋之;治玉石者,既琢之而复磨之,治之已精,而益求其精也。”——宋·朱熹
上回讲到:
继承变量名同实不同
构造函数名异失其义
在书写智能合约的过程中,采用正确的构造函数声明以及保持合约名与构造函数名一致是保证构造函数特殊性、唯一性的先决条件,也是构建合约安全基础的重中之重。
构造函数中的owner权限既不可过于强大也不可落入他人之手。继承中的父类函数变量和新声明的子类函数变量有微妙的差别,名字相同的情况下,调用父类函数操作的会是父类的变量。
辨析和理解这些细枝末节才能防止在开发中出现失误,同时防范蜜罐的类似手段套取资金。正确规范的使用名称也体现了开发者对项目和安全的尊重。
本期话题
除法运算四舍五亦舍,浮点精度数小事不小
经过十一期的讲解和学习,我们渐渐由常见的严重漏洞延申到了合约开发的细节和不易察觉的安全隐患,旨在倡导更加细致的安全开发过程和专注安全防范的“工匠精神”。
在连载开启伊始,我们提及了臭名昭著的整型溢出漏洞,并强调使用SafeMath库对溢出进行检查来防范严重后果。深度阅读请移步:溢出漏洞类型全面分析。
然而,在合约的数学运算中,其实不仅仅只有溢出的问题,还有与精度密切相关的除法运算以及浮点。说起浮点和精度,这是计算机最为基础也是最有争议的一个话题,曾经听说过再简陋的计算器也比超级计算器的精度高的说法。
举一个很实际的例子,你使用主流编程语言计算0.2+0.4,测试可以用Chrome,FireFox浏览器,按F12键进入控制台(console),然后输入计算结果,出来的结果竟然是: