BTCV高分资讯 > 数字货币 > 开发者如何正确使用构造函数?_btcv-高分资讯

开发者如何正确使用构造函数?_btcv-高分资讯

作者:高分资讯来源:高分资讯 数字货币 2020年07月11日

构造函数负责初始化数据,如智能契约的所有者,构造函数的正确使用对于智能契约的安全性非常重要。

原标题:《成都链安智能合约安全实践(二)| 练就「火眼金睛」,真假构造函数一眼看清》

作者:成都连安

《西游记》,刘二的猕猴扮成孙悟空,向唐僧和神仙撒谎。即使你看着魔镜,你也分不清真假。现在,当智能合同遇到“六二猕猴”时,它会引发什么样的火花?

智能合约安全实践:开发者如何正确使用构造函数?

在智能契约中,构造函数负责初始化一些数据,所有者值通常放在构造函数中进行初始化。所有者是智能合同所有者的头衔,通常被用作合同的超级管理员。对于代币合同,所有者可以被分配以下权利:铸造/销毁代币、冻结代币等。如果开发人员用错误的语法创建了“构造函数”,导致构造函数缺失,导致“刘二猕猴”用真实性欺骗开发人员,最终使攻击者成为合同的所有者,那么攻击者就可以依靠所有者的权限来签发或销毁令牌,这可能导致整个令牌的崩溃。

构造函数介绍在实语言中,当函数名和契约名相同时,这个函数就是契约的构造函数。创建协定对象时,将调用构造函数来初始化相关数据。

在Etherium Studity 0 . 4 . 22版本中,引入了关键字构造函数,构造函数的新声明形式是构造函数()公共{}。介绍的目的是为了取代低版本中使用合同名称作为构造函数名称的语法形式,以避免由于开发人员的笔误而导致的构造函数命名错误的问题。引入的关键词似乎不起眼,但事实上它有着深刻的含义,所以请慢慢听我说。

“用真实的东西吗?”漏洞分析以太网射击场的辐射问题作为一个例子进行了分析。乍一看,这似乎是一个没有漏洞的正常合同代码。但是,经过仔细观察,发现合同中有一个致命的错误。辐射合同的构造者被错误地写成了字母1(字母1和数字1之间的区别)。这个错误使它成为公共修饰的公共函数,失去了构造函数只能在部署协定时调用的特性,因此任何人都可以调用它。下图显示了该主题的源代码:

智能合约安全实践:开发者如何正确使用构造函数?

图1

在fall out函数中,函数调用方的地址被直接指定为所有者,因此只能通过调用fall out函数来更改合同所有者。如下图所示:

智能合约安全实践:开发者如何正确使用构造函数?

图2

“假孙悟空”法鲁试图用某些字体的相似字符的视觉差异来迷惑人们,但最终他没能逃过我们的“火眼”。

过去的事件:MorphoToken事件分析在过去也有过类似的安全事件,包含假构造函数的合同被成功地发布到了主链,其中比较著名的一个是“MorphoToken事件”(Morphotoken Event),由于一个看似小的问题,导致了数千万个具有市场价值的令牌被发布。(合同代码地址)

在owned合同中,由于首字母大写错误,Owned(应该是一个构造函数)变成了一个普通的Owned函数,它可以被公众修改,任何人都可以调用。如下图所示:

智能合约安全实践:开发者如何正确使用构造函数?

图3

MorphToken协定继承了owned协定,并在它自己的构造函数中初始化所有者,但是父协定owned的Owned函数可以被任何人调用,因此攻击者可以通过调用Owned函数来更改协定的所有者。下图显示了所有者的初始化代码:

智能合约安全实践:开发者如何正确使用构造函数?

图4

从上面可以看出,任何人都可以通过调用合同的所有者函数来成为合同的所有者。如下图所示:

智能合约安全实践:开发者如何正确使用构造函数?

图5

微小的差距、一千英里和一个小小的字母错误导致了合同代币的崩溃。代币也被恶意发行。如下图所示:

智能合约安全实践:开发者如何正确使用构造函数?

图6

过去的教训:开发人员应该如何正确使用构造函数?建议替换实度0.4.22和更高版本,并使用正确的构造函数()语法。如下图所示:

智能合约安全实践:开发者如何正确使用构造函数?

图7

请记住:在构造函数()之前没有函数,函数构造函数()公共{}是错误的构造函数形式。

如果要使用低于0.4.22的版本,必须检查函数名是否与合同名一致。如下图所示:

智能合约安全实践:开发者如何正确使用构造函数?

图8

安全建议在智能合同中,由于开发人员的粗心大意,有许多事件会导致安全漏洞。"一千英里的堤坝坍塌成一个蚁巢."成都联安安全实验室给出以下建议:

在编写智能合同敏感函数(如构造函数和回退函数)时,开发人员应严格遵循政府要求的代码编写规范,并注意避免字符错误。在某些情况下,编译器会警告构造函数的错误使用,开发人员应该正确对待它。它不应被视为警告信息并被忽略。在合同正式推出之前,有必要找一个专业可信的机构来审核合同代码。

标签: bitcoin vault