如何部署大型智能合约?我在科万和罗普斯滕身上试过,两者都有问题。我有 250 行代码 + 导入的所有 ERCBasic 和标准文件。
编译后的 bin 文件的大小为23kB。有没有人在这种规模的合同中遇到过类似的问题?
更新:
可以通过按如下方式进行编译来减小编译的合约大小:
solc filename.sol --optimize
在我的情况下,它在大约23kB 中变成了 10kB
与以太坊中的其他所有内容一样,限制是由交易消耗的气体施加的。虽然没有确切的大小限制,但有一个块状气体限制,您提供的气体量必须在该限制范围内。
部署合约时,存在固有的 gas 成本、构造函数执行的成本以及存储字节码的成本。固有气体成本是静态的,但其他两个不是。构造函数中消耗的 gas 越多,可用于存储的气体就越少。通常,构造函数中没有很多逻辑,消耗的绝大多数 gas 将基于合约的大小。我只是在这里添加这一点,以说明这不是一个确切的合约大小限制。
很容易,大部分gas消耗来自将您的合约字节码存储在区块链上。以太坊黄皮书(见第9页(规定存储合约的成本是
成本 = Gcodedeposit * o
其中o
是优化合约字节码的大小(以字节为单位(,Gcodedeposit
是 200 gas/字节。
如果你的字节码是23kB,那么你的成本将是~4.6M的gas。再加上固有气体成本和构造函数执行成本,您可能正在接近块气体大小限制。
为了避免这个问题,你需要将合约分解为库/拆分合约,删除重复逻辑,删除非关键函数等。
有关部署成本的一些更低级别的示例,请参阅此答案并查看这篇关于 Hackernoon 的有用文章。
可以通过实施透明合约标准来绕过最大合约大小限制: https://github.com/ethereum/EIPs/issues/1538