全面掌握Solidity智能合约开发

2024年11月25日更新 208 人订阅
原价: ¥ 26 限时优惠
专栏简介 比特币区块结构Merkle树及简单支付验证分析 非对称加密技术- RSA算法数学原理分析 智能合约语言 Solidity 教程系列2 - 地址类型介绍 剖析非同质化代币ERC721-全面解析ERC721标准 搞懂 Solidity 事件Event - 如何在DApp中使用 以太坊扩容 之 分片(Sharding) 智能合约语言 Solidity 教程系列12 - 库的使用 深入理解Plasma(四)Plasma Cash 技术工坊42期 - 区块链子链技术及墨客链的实现方案 脱颖而出 | 成都链安入选『腾讯区块链加速器全球32强』 参与Eth2 Staking系列(2) - 激励篇 应用案例之黄金资产证券化Digix白皮书和DGD解读 全面理解智能合约升级 测试文章123456 简析主流匿名币:Dash、门罗币、Zcash、SERO 以太坊ERC1155协议分析及代码测试 Hyperledger Fabric 1.4 Kafka分布式环境搭建 跟我学 Solidity :开发环境 跟我学 Solidity:关于变量 跟我学 Solidity : 变量的存储 跟我学 Solidity :引用变量 跟我学 Solidity :函数 跟我学 Solidity :合约的创建和继承 跟我学 Solidity :工厂模式 用Web3.js构建第一个Dapp 跟我学Solidity:事件 Solidity 中 immutable (不可变量)与constant(常量) [译] Solidity 0.6.x更新:继承 解析 Solidity 0.6 新引入的 try/catch 特性 探究新的 Solidity 0.8 版本 探索以太坊合约委托调用(DelegateCall) 停止使用Solidity的transfer() 使用工厂提高智能合约安全性 Solidity 怎样写出最节省Gas的智能合约[译] Solidity 优化 - 编写 O(1) 复杂度的可迭代映射 Solidity 优化 - 控制 gas 成本 Solidity 优化 - 减少智能合约的 gas 消耗的8种方法 Solidity 优化 - 如何维护排序列表 Solidity 优化:打包变量优化 gas 在 Solidity中使用值数组以降低 gas 消耗 Solidity 技巧:如何减少字节码大小及节省 gas 计算Solidity 函数的Gas 消耗 "Stack Too Deep(堆栈太深)" 解决方案 合约实践:避免区块Gas限制导致问题 如何缩减合约以规避合约大小限制 Solidity 类特性 安全的处理 ERC20 转账(解决非标准 ERC20 问题) Solidity 十大常见安全问题 [译]更好Solidity合约调试工具: console.log 智能合约开发的最佳实践 - 强烈推荐

如何缩减合约以规避合约大小限制

你能做些什么来防止合约变得太大?

为什么合约有一个大小限制?

为什么

2016年11月22日,Spurious Dragon硬分叉引入了EIP-170,增加了智能合约的大小限制为24.576kb。对于作为Solidity开发者的你来说,这意味着当你向你的合约添加越来越多的功能时,在某些时候你会达到限制,当部署时你会看到错误:

Warning: Contract code size exceeds 24576 bytes (a limit introduced in Spurious Dragon). This contract may not be deployable on mainnet. Consider enabling the optimizer (with a low "runs" value!), turning off revert strings, or using libraries.

警告:合约代码大小超过24576字节(Spurious Dragon分叉中引入的限制),这个合约可能无法在主网上部署。考虑启用优化器,关闭revert字符串,或使用库。

引入这一限制是为了防止拒绝服务(DOS)攻击。任何对合约的调用从Gas上来说都是相对便宜的。然而,由于调用的合约代码的大小(从磁盘读取代码,预处理代码,添加数据到Merkle证明)的原因,合约调用对以太坊节点的影响并不是成比例地增加。每当你出现这样的情况,攻击者只需要很少的资源就能给别人造成大量的工作,这会增加DOS攻击的可能性。

最初,这不是一个问题,因为一个合约大小限制是区块块Gas限制。很明显,一个合约需要被部署在一个交易中,这个交易持有合约的所有字节码。如果你把大合约的部署交易纳入一个区块,你可以用完所有的Gas。但这种情况下的问题是,区块Gas限制随时间变化,理论上是无限制的。在EIP-170的时候,区块Gas的限制只有470万。现在,区块Gas限制是1500万。

那就战斗吧

不幸的是,没有简单的方法来获得你的合约的字节码大小,如果你使用Truffle,一个很好的工具可以帮助你,那就是truffle-contract-size插件。

  1. npm install truffle-contract-size
  2. truffle-config.js中添加该插件:插件。[truffle-contract-size]
  3. 运行truffle run contract-size

这将帮助你弄清楚怎么的变化及如何影响总的合约打下规模。

在下文中,我们将根据其潜在的影响来研究一些方法。从缩减角度来考虑。对于一个人来说,要达到他们的目标体重(在我们的例子中是24kb),最好的策略是首先关注影响大的方法。在大多数情况下,仅仅固定你的饮食就能达到目标,但有时你需要更多一点。如可能会增加一些运动(中等影响)或甚至补充剂(小影响)。

体重减轻

需要重点关注(较大影响)

把你的合约分开

这应该永远是你的首要方法。如何把合约分成多个小合约?一般来说,这迫使你为你的合约想出一个好的架...

剩余50%的内容订阅专栏后可查看

点赞 0
收藏 0
分享

0 条评论

请先 登录 后评论