|
必要的向后不兼容的改变(例如,BLOCKHASH 操作码不再是一个好的随机性来源)已经发生了。 这篇文章将介绍一些可以考虑删除的功能的例子。 功能列表2300 gas 津贴这是什么? 当一个合约调用另一个合约时,被调用的合约会得到 2300 gas 用于执行非常有限的操作(足够做一点计算和生成一条日志,但不够写满一个存储槽) 为何引入? 最初是为了让智能合约钱包在收钱时能自动生成一条日志。后来还被用于实现 「守卫」 功能以防止合约收到 ETH。 有何问题? 由于它设置的是固定的 gas 数量,因此只要 gas 价格可以调整,人们就没有办法确定这些 gas 到底能支持什么类型的计算。 它并没有很好地满足设计意图,有两个原因。首先,很多用户仍然在使用外部账户,而外部账户并不会生成日志。其次,SELFDESTRUCT 操作码绕过了津贴机制。从长远来看,通过账户抽象化,外部账户的作用将被弱化,并且 SELFDESTRUCT 操作码可能将被移除,但是在这两件事完成之前,它都只是一个不充分的解决方式。
如何移除? 有两种可能 —— 要么将 2300 改成 0 (不支持子执行(child execution))要么不限制数量(子执行可以从父执行中获得全部的 gas 可用额度) 移除有何副作用? 如果我们移除子执行,那么这将需要在合约调用中添加一个笨拙的二分处置(two-clause mechanic),即 0 gas 解释为 0,任何其他数字解释为 「发送所有的 gas」。它还会破坏反接收守卫功能和日志记录。 如果我们在执行中允许子执行获得全部的 gas,那么通过调用发送 ETH 会变成一个需要信任的操作,恶意合约可能会借此扰乱一些应用。不过,Solidity 文档已经建议大家用 withdrawal 模式代替 transfer,这样就不会有任何风险了。
如何消除顾虑? 剩余 Gas 额度可见性这是什么? GAS 操作码允许合约查看当前的执行环境中还剩多少 gas 可用。CALL 允许调用者为子上下文提供固定数量的 gas。
为何引入? 反对让 CALL 将父环境中剩余的全部 gas 都交给子环境的最主要原因是避免 「不可信任的调用」:即发送者不信任接受者的调用。一个简单的例子是发送 ETH 给参与方的金融机制。另一个例子是 M-of-N 外部价格信息的输入机制(oracle),通过调用一些合约,在获得所有合约回复后取中位数作为输出。
(责任编辑:admin) |