折腾着开启电脑,翻阅了几十篇教程,疲惫之感油然而生。查看了相当数量的源码,眼睛都快要视物不清了,内心泛起些许迷茫。
今儿没打算去罗列那类教程合集,那些经由随便搜索一下就都能找到。我想要去讲讲所踩过的坑,是真实发生过的。
边写边崩溃就是日常
初学的那一周,反复不断地仅仅写出了一个以及一个,写完之后自认为相当厉害,然而一经部署就被那Gas费给猛然惊醒,虽说测试网不用实实在在的钱,可是那种挫败的感觉却是真切实在的。
我在做写合约这件事的时候,心态常常呈现出这样的状态:就是觉得这一段代码只要能够运行得起来就可以了,至于审计那是属于别人要去做的事情。而就是这样的一种想法,在后来差一点导致出现问题。
源码看了也没用?你可能盯着徽章在数
我曾尝试过一种笨拙的方法,将上受欢迎的合约使用专用方法fork出来,逐行地去阅读其内注释。这般尝试执行的效果表现较为平常,然而却极大地打击了自身内里的信心。究其缘由,是因为那些涉猎的项目实在太过复杂,稍微变动一下子就有着数十个文件,致使简直根本无法看进去,理解参透。
随后有人跟我讲,不用全部都理解明白,只要弄明白关键的函数就行,像ERC20的以及,的该如何去用,得确保能够理解清楚生命周期。
重入攻击:一个一辈子忘不了的例子
我于教程之中翻找重入攻击的案例,经反复确认方才明白究竟是怎么一回事。查看代码之时似乎已然理解,然而更换一个场景便又陷入懵懂状态。去中心化金融之所以频繁出现问题,根本不是黑客有多厉害,而是编写合约的人员逻辑存在缺陷。
有个经典场景很好理解:
(uint ) {
([msg.] >= );
(bool , ) = msg..call{value: }("");
();
[msg.] -= ;
}
看上去蛮正常的是不是?先行转账再去进行记账。然而要是转账所针对的合约存在一个回退函数,于余额扣除之前再度调用取款操作,资金便会被反复地转出去。这可是审计之时常常会踩到的坑。解决的办法是将状态更新置于转账之前。
我真的在多人项目中见过类似写法,当时差点就上线了。
怎么判断一个合约靠不靠谱?
我一个在币圈的朋友教过我三招,实用:
1. 望着提交记录,一个人的那种提交频率比每周3次还要低,项目眼看着都快要凉凉了,千万别去碰它。存在一些项目半年才更新一回,你还能期望它具备很大的潜力吗?
2. 代码复制比率——要是一个项目之中,高达百分之九十五的代码均是从复制找来的情况状况下,而且就连注释都未曾进行修改变动,那么大概率在三个月之后就会走向归零的结果局面。
3. 白皮书与源码相比,究竟谁更为诚实呢?通过区块链浏览器去查询合约地址,其结果比白皮书要远远优越得多。
智能合约的核心就是经济模型
那篇关于通证经济设计的文章,我耗费了一个下午才将其读完,而后试图撰写类似的合约。其中的难点在于分配逻辑与燃烧机制的组合情况,一旦参数配置出现错误,那么整个激励体系便会崩塌。
我自行尝试着撰写了一个DAO激励代币,仅仅是逻辑,便重新编写了三次。问题存在于与%的匹配方面,特别是当涉及到多个用户同时进行claim时的总量控制这一情况。
测试:你以为写上断言就完事了?
我和一位从事审计工作的哥们儿交谈,他讲好多团队进行测试时仅仅涵盖快乐路径,将边界情况全部忽视了,这可是绝不能犯的错误。例如:
别人在闪电贷期间频繁调用怎么办?代码逻辑能扛住吗?
重入场景测试写过吗?
溢出、整数下溢都考虑过吗?
我曾亲身经历过吃亏的情况,产品管理合约当中存在一段逻辑,这段逻辑没有编写修饰器,以至于任何人都能够进行调用,险些遭遇被人薅羊毛的状况,所幸发现的时间比较早,才未造成严重后果。
开发框架选到头秃
关于框架选择这件事情,真的是特别让人感到头疼不已。我曾经尝试过使用来开启入门之旅,当时感觉它还算得上是比较友好的。然而,后来却被给彻底碾压了。这个被称作工具新贵的编译速度能够快上5至10倍,测试执行提升了8倍,内存占用还减少了70%。
倘若怀揣对于项目具备稳定性以及团队能够轻易上手这样的追求,那么同样是可以纳入考量范围之内的。而则是建议新手千万不要轻易去做尝试之举,除非你属于硬核玩家这一类型。
部署失败那些破事
声称不心疼那是假的,进行这一整个晚上都在开展调试工作,一开始认为乃是合约出现问题,然而随后发觉竟然是编译器版本存在错误。
某次进行部署时,脚本出现错误,变量未曾赋值,靠查看日志才察觉到nonce链上的条件并不匹配,于是直接实施回滚操作,心疼那一笔GAS费,更心疼就这么白白耗费掉的一整天时间。
别只看教程,试试先看源码注释
有不少人读了数目繁多的教程,然而合上电脑之后却什么都写不出来。我曾改进过学习法子:先寻觅一个诸如ERC20标准实现这般的简单项目源码,逐行进行查看并且尝试去修改,而后再瞧瞧其他人的pull 。
Web3技能树:别从一棵树找所有答案
当下Web3的技能图谱,我予以了关注,进而发现了这样的问题:每一位开发者都处于各自的“单独区域”,智能合约、前端DApp、扩容,这些领域之间的分割程度极为严重,以至于很难寻觅到具备系统性的学习途径。
目前效率最高的做法是:
在短期内,去啃取一份具备高质量的免费课程,就像 这般,要切实对着实操去实施。
长期来看,每周都要去阅读那种处于生产级别的真实的合约代码,并且要结合着那些常见的漏洞,不断地进行反思。
最后一句话:别高估教程的作用
代码是经由书写而产生的,并非通过观看得以形成的。当下在市面上存在着数量众多的智能合约教程,然而真正能够促使你能力实现蜕变的,始终是那些你从起始至末尾亲自撰写完成的合约——即便它仅有几百行代码,也远比佯装阅读了几百篇教程要更为强大得多。
写完这篇,我也该去写下一个合约了,你呢?

