引子:“真行者珞珈山诉苦,假猴王水帘洞誊文。”?——《西游记·第五十八回》
在《西游记》中,六耳猕猴冒充猴王孙悟空,以假乱真,过了唐僧,过了众神,纵使是照妖镜也分不出真假。
现在,智能合约遇上了“六耳猕猴”,又会擦出怎样的火花?
在智能合约中,构造函数负责一些数据的初始化工作,owner值一般也会放在构造函数中进行初始化。
owner是智能合约拥有者的称呼,也常被用来作为该合约的超级管理员。对代币合约来说,owner可能被分配的权限有:铸造/销毁代币、冻结代币等。
如果开发者以错误的语法创建“构造函数”,造成构造函数缺失,致使“六耳猕猴”以假乱真,瞒过了开发者,最后使得攻击者成为合约的拥有者,那么攻击者便可依赖owner的权限,对代币进行增发或销毁等操作,进而可能造成整个代币的崩盘。
中国银行率先推出数字人民币智能合约预付资金管理产品:金色财经报道,近期,中国银行四川省分行在人民银行成都分行及成都市金融局的指导下,联合成都市龙泉驿区教育局与成都天府通金融服务股份有限公司,以数币试点为契机推出“龙泉教培”智能合约预付资金管理产品。
本次“龙泉教培”智能合约项目,在家长购课时新增数字人民币支付方式,并在数字货币研究所最新发布的智能合约框架下,实现购买预付卡、生成智能合约、预付卡核销、退卡、查询等功能,实现“一课一销,未用退费”等功能,家长还可通过数字人民币APP查询预付卡详情。(封面新闻)[2022/8/16 12:28:15]
一、构造函数简介
在Solidity语言中,当函数名和合约名相同时,此函数就是合约的构造函数,在合约对象创建时,会先调用构造函数对相关的数据进行初始化。
以太坊Solidity0.4.22版本中引入了关键字constructor,新的构造函数声明形式:constructor()public{},引入的目的是用以替代低版本中将合约名作为构造函数名的语法形式,从而避免开发者笔误造成构造函数命名错误的问题。
Charles Hoskinson:认证软件可以大幅降低智能合约遭受黑客攻击的概率:IOHK首席执行官Charles Hoskinson在最近的AMA中表示,智能合约并非不受潜在黑客攻击的影响,因为任何编写和构建的东西都可能被破坏。他进一步阐述了“认证软件”的概念,该概念使此类黑天鹅事件发生的几率指数级降低。“如果你有一个规范和一个特定的开发方法和工具,你或外部审计员可以做的就是证明其实现遵循该规范,并且该规范可以得到很好的测试和理解,如果你这样做,你遭受黑客攻击的机会将呈指数级下降。”Hoskinson进一步解释说,Cardano和其区块链智能合约平台Plutus旨在实现高保障。(U.Today)[2021/8/14 1:55:34]
引入的这个关键字看似平淡无奇,实则意蕴深刻,且听我慢慢道来。
声音 | eToro首席执行官:加密市场已走出冬天 智能合约将推动金融服务领域的创新:据Crypto Potato消息,eToro联合创始人兼首席执行官Yoni Assia在接受采访时认为,加密市场已经走出冬天。关于比特币价格走势,Assia表示看好。他称,我相信,在中期会看到比特币以更高的价格出现。在谈及银行转账结算时间与区块链资产显著加快的时间之间的差异时,其表示在未来10年内,将看到数万亿美元从传统资产转移到区块链资产。同时,Assia对智能合约领域表示乐观,称其将大大推动金融服务领域的创新。[2019/5/26]
二、Fallout“以假乱真?”
–漏洞分析
下面以ethernaut靶场的Fallout题目为例进行分析。
一眼看去,这似乎是一个正常没有漏洞的合约代码,但经过仔细观察发现,该合约存在一个致命错误——构造函数名称与合约名称不一致,Fallout合约的构造函数被写错成了Fal1out。
声音 | 法学教授:智能合约不一定会扰乱传统合同法:据cointelegraph报道,德国弗里德里希席勒大学法学教授Giesela Ruhl近日发文称,智能合约不一定会扰乱传统合同法,她认为智能合约与既定法律先例之间的摩擦可能被过分夸大了。智能合约将使商品和服务的交换不受国家法律的约束,但这一预期似乎没有实现。事实上,合同法的经典问题也出现在当事人签订智能合约的时候。就像所有其他合约一样,它需要法律来解决。因此,重要的不是智能合约是否应受法律约束,而是应受哪些法律的约束。[2019/1/24]
这样的错误使其成为了一个被public修饰的普通函数,失去了构造函数仅在合约部署时被调用的特性,使得任何人都可以调用。该题目源码如下图所示:
因部署新智能合约 OKEx6月8日0点关闭PST充值和提现:OKEx发布公告,PST智能合约即将升级,OKex将于2018年6月8日0点关闭PST充值和提现,在2018年6月8日开始为用户部署新的智能合约。在更新合约期间PST交易不受影响,在部署完成后,所有的PST代币资产将被自动切换到新的合约之上,完成后将开启新合约代币的充值提现服务。[2018/6/7]
图1
在Fal1out函数中直接指定了函数调用者的地址即为owner,所以只需要调用Fal1out函数即可实现对合约owner的更改。
如下图所示:
图2
“假猴王”Fal1out想借着一些字体类型的相似字符的视觉差异混淆视听,可最终还是没能逃过我们的“火眼金睛”。
三、前车之覆
MorphToken事件分析
在过去也曾发生过类似的安全事件,包含着假构造函数的合约被成功发布到主链上,其中比较出名的是“MorphToken事件”,其因为一个看似很小的问题而造成了数千万市值的代币被增发。
合约代码地址:https://etherscan.io/address/0x2ef27bf41236bd859a95209e17a43fbd26851f92#code
在Owned合约中,由于首字母大小写的错误,导致本该成为构造函数的Owned成为了普通函数owned,且被public修饰,可供任何人调用。
如下图所示:
图3
MorphToken合约继承了Owned合约,并在自己的构造函数内进行了owner的初始化,但是父合约Owned的owned函数是可供任何人调用的,攻击者便可通过调用owned函数更改合约的所有者owner。
owner的初始化代码如下图所示:
图4
由上述可知,任何人都可以通过调用合约的owned函数,成为合约的拥有者(owner)。
如下图所示:
图5
失之毫厘,差之千里,一个小小的字母错误,却导致了合约的代币的崩盘。代币也被恶意增发。
如下图所示:
图6
四、后车之鉴
开发者应如何正确使用构造函数
建议更换Solidity0.4.22及以上版本,并使用正确的constructor()语法。
如下图所示:
图7
切记:constructor()前并无function,functionconstructor()public{}为错误的构造函数形式。
如果要使用低于0.4.22的版本,则一定要着重检查函数名是否和合约名一致。
如下图所示:
图8
五、安全建议
在智能合约中因开发者粗心,而造成安全漏洞的事件层出不穷,“千里之堤,溃于蚁穴”,成都链安-安全实验室在此给出如下建议:
1、开发者在编写智能合约敏感函数时,应严格
按照官方要求的代码书写规范,注意不要出现字符错误等情况。
2、在某些情况下,编译器会对constructor的错误使用发出警告,开发者应予以正确对待,不可认为其只是警告信息而忽略不处理。
3、在合约正式上线前一定要找专业可信的机构做好合约代码的审计工作。
标签:OWNNERTORFALETHDOWNEnergy Ledgertoro币局Waterfall Governance Token
据Decrypt报道,基于以太坊的加密借贷平台CelsiusNetwork于6月23日宣布,公司在新一轮融资中获得1000万美元资金,稳定币Tether领投.
原文标题:ExploringDAOsasaNewKindofInstitution作者:JoshuaTan 译者:Mako 翻译机构:DAOSquareDAO即去中心化自治组织.
上期回顾 BTC:BTC成交额不足成为上涨最大阻力,预计将在此下探$8,500,确认支撑力度。6月24日BTC从$9,800产生一定程度回调,最低下跌至$9,000.
来源:BlockVC “二次探底”只是迟到还是彻底缺席自5月初比特币减半落地以后,比特币保持低波动横盘已经接近7周,在近一段时间烈火烹油的全球资本市场中显得异常落寞.
6月26日,矿机制造大厂、矿圈内公认的行业“老四”的亿邦国际成功在美股纳斯达克交易所挂牌,股票代码:EBON.
怀揣着无比激动的心情,我们要宣布一则新消息:以COMP代币为标的资产的七日二元期权上线啦! 二元期权很好理解,而且容易上手,因此对于那些想要投机资产未来价格的用户来说,是非常好的金融产品.