智能合约和dapp的开发属于新的范式,开发的方式与以前会有所不同。
“敏捷开发”的格言在这个新范式中好像不起任何作用了,这类项目的开发会有一定的风险,这要求我们采用缓慢而有条理的方法来开发我们的应用程序,在设计和编码时尽量谨慎和考虑周全。
开发时也不能让自己承受过多的压力,比如制定严格的期限等。
如果把大多数传统的apps类比于社区诊所,那么区块链可以说是急诊室。有些很小的问题,一旦上链的话,就会变得很难解决,你必须考虑到所有可能的负面结果,如果没有这么做,你可能会面临非常可怕的后果。
所以在我开始具体的内容之前,我必须要重申一下区块链开发方面的特点,这些迫使我们开发时要非常小心。
所有代码都是公开的
首先,区块链的代码是开源的,任何人都可以看到你写的代码,所以很明显,智能合约中不应记录敏感的个人信息。不然,你就可以进行用户的链上行为分析,这对于小白用户来说可能听起来不太好,因为他的历史行为暴露在了全世界面前。
这就导致智能合约及其相关存储功能只能存储合同正常运行所必需的信息。
其次,最最重要的是,所有源代码都公开可见,这意味着在地下工作的明星黑客有充足的时间和自由,来梳理你的每一行代码,寻找其中的漏洞,代码将无处可藏。
Gas 限制
我相信大多数人都知道,以太坊的是有Gas费的,Gas费些许的昂贵,并且还有一定的限制!如果智能合约中的逻辑可以导致大量Gas消耗,则会出现严重的问题。循环调用是这种情况的常见原因。
最后也是最重要的一点是:
不可篡改特性
智能合约代码都是完全根据最初的逻辑执行,都不想重蹈The DAO级别的硬分叉悲剧。
区块链开发的特点是,合约一旦部署,一切都将不可篡改。不可篡改的优点是让我们可以高枕无忧地相信智能合约。我们首次将信任编程到代码中。陌生人之间可以信任代码,而不是彼此建立信任。我们慢慢的开始相信智能合约,它不会骗人,也不会在任何时候做出格的事情。
对我来说,我会以非常开放的心态拥抱全球的区块链霸主。并且作为工程师,我也会努力去实现这个信任社会,但是这个信任社会也有致命的问题。
设想一下,如果我们家的技术文盲奶奶不小心把她的google搜索痔疮膏的信息发布到了Facebook上,这不会是大问题,可以删掉。但如果她在某个有漏洞的智能合约上暴露了自己的私钥,那我们就无能为力了,她精通技术的侄子也没有任何办法,区块链浏览器中历史记录将无法删除!
在写代码的时候,我们必须假设每个用户都是技术文盲,并百分百地确保函数的正确调用,执行能够操作无误,你永远都不会知道,有多少人盯着你钱包地址上的数百万美金。
接下来我将介绍一些准备好的漏洞示例,并且进行一些练习,让每个人都参与进来。以便我们在今后在写代码时能够避免Dapp和智能合约的漏洞。
实际案例推荐