本文将介绍?SELFDESTRUCT?对以太坊生态弊大于利的一些理由,正是因为这些理由,我们应该以某种方式移除?SELFDESTRUCT?。鉴于有些合约已经使用了?SELFDESTRUCT?,我提出了一些只需要付出最小的代价就能消除?SELFDESTRUCT?危害的方法。
一段历史:?SELFDESTRUCT?已经没有必要了
SELFDESTRUCT?早在以太坊的极早期便已引入。实际上,它在2013年12月发布的以太坊协议“规范”预告中就已经出现了。那时候,几乎没人仔细考虑过状态规模管理的长远问题。但是,有个想法我大概还有些印象,为了防止没用的垃圾状态不受限制地膨胀,我们需要让任何创建出来的对象都可以被销毁。具体的思路是,当外部账户的余额为零时触发自毁,而合约在没用后可以调用代码里的一行自毁语句触发自毁。还有一个gas退款机制用于激励大家销毁没用的状态。
2014年1月,AndrewMiller指出了一个非常严重的问题:在2013年12月的规范设计中,EOA很容易被重放攻击。如果我有100个币,我通过一笔交易发给你10个币,你可以简单地在链上重放这笔交易十次,从而转走我的全部余额。这个问题很快就修复了,为此我们增加了nonce字段。然而,nonce字段的引入让删除EOA的愿望彻底破灭了:nonce是不能被重置为零的一旦该账户被再次使用,nonce又要从零开始,就会被重放攻击)。
观点:当前衍生品持仓数据表明市场看涨情绪明显:1月3日消息,Deribit首席商务官Luuk Strijers表示,2023年6月的期权持仓数据显示,整体看跌/看涨比率为0.24,意味着看涨期权是看跌期权持仓量的三倍,这通常代表看涨情绪。此外,比特币最大痛点价格为19,000美元,相比于当前现货价格16,700美元附近,也显示出上涨潜力。[2023/1/3 22:22:37]
2015年,有人提出了一些方案试图绕过这个问题,使余额为零的账户可以被安全地删除。然而,当时很明显,几乎没有合约开发者真正使用自毁功能:因为要弄清楚什么时候自毁太难了,而奖励也太少了。
到2019-21年,事情已经变得很明显了,我们需要的是其他形式的状态管理,比如租金机制或者是长期未动的状态“到期作废””)。而如果我们采用这两个方案中的任何一个,只要它是有效的,那么合约是否有能力主动删除自己就一点儿也不重要了。
SELFDESTRUCT?是唯一一个破坏重要恒常性质的操作码
观点:加密货币最初以隐私为导向的精神必须被传播:9月4日消息,加密市场数据提供商Coin Metrics的报告显示,专注于隐私的加密货币zcash (ZEC)、monero (XMR)和grin的交易总额仅占比特币交易总额的6%。Zcash的隐私保护功能没有得到充分利用,只有不到2%的交易得到完全保护。并且隐私币的受欢迎程度仍然不高。报告作者认为,这些统计数据标志着对匿名的背离,匿名是虚拟资产最初设计的基本原则。随着加密货币继续被更广泛的公众所采用,加密货币最初的以隐私为导向的精神必须被传播,以便其能够生存下去。如果做不到这一点,就会导致最初的创建匿名交易系统的想法逐渐消失,并被有关加密货币用途的其他概念所取代。(news.bitcoin)[2020/9/4]
SELFDESTRUCT?不仅没什么用,还会产生危害。它破坏了一些重要的恒常性质,这些性质本来是很好的,但是仅仅因为这一个操作码,我们就失去了这些性质。
SELFDESTRUCT?是唯一一个能在单个区块中变更无限个状态对象的操作码
观点:专票电子化将促使财务组织从区块链等工具集选择实施路径优化业务流程:7月2日,增值税专用发票电子化研究课题小组专家陈玉刚表示,专票电子化势必会给企业带来爆炸式增长的数据量、业务和财务高度融合、非结构化数据池、数字化流程闭环等需求和挑战。他表示,这些数据资源和业务需求将倒逼财务组织,从云计算、流程机器人、可视化、商业分析、区块链等工具集选择一个适合公司发展的实施路径,充分利用发票数据资源、优化业务流程,为企业数字化转型带来基础优势。(中国会计报)[2020/7/2]
其他所有的操作码都只能操作账户中的单个值或者存储树上的单个key,所以它们能变更多少固定大小的对象是有限制的。但是,SELFDESTRUCT可以删除整棵存储树。
在目前的状态树结构中,这是可以容忍的。但是,考虑一种特殊的情况:当调用SELFDESTRUCT删除许多存储插槽后,下一个事务又在同一个地址上创建一个合约并访问同一些存储槽。为了处理这种情况,需要额外设计复杂的缓存机制。此外,SELFDESTRUCT还阻碍了我们变更状态存储格式。
观点:挖矿难度即将调整 BTC本周将再次跌破9000美元:6月15日消息,加密货币分析师Joseph Young表示本周比特币价格将下跌,并列举了几点导致下跌的主要因素。他称,首先是比特币网络挖矿难度即将进行调整,而这次调整和可能是比特币自2018年1月以来经历的最大幅度的调整。其次,在10,500美元水平阻力位强劲,最后在8900美元位置有强烈的购买需求。与此同时,BuffettsBooks.com创始人Preston Pysh,以及Blockware Mining首席执行官Matt D'Souza均预计比特币将跌至9,000美元以下,而下跌主要原因是即将到来的比特币网络挖矿难度调整。(U.Today)[2020/6/15]
以SELFDESTRUCT会阻碍的两类状态存储格式为例:
任意的“单层”方案
存储槽可以存储在一些地址“附近”,而不是存储在合约里的方案有用,比如在ERC20转账或Uniswap交易的场景下)
请注意,这不是在空想,从根本上变更状态存储格式的讨论已经开始了,如果状态存储的数据结构能够接近单一的的键/值存储结构,并且单个区块中可以变更的状态数量有一个较低的上限,那将大大扩展我们的选择空间。
动态 | 观点:运用区块链等技术将数据作为发现价格、评估风险、配置资源的重要平台:1月14日消息,中国社会科学院西部发展研究中心副研究员俞林、北京交通大学经管学院教授傅少川今日联合发文表示,推动金融机构加快研究和创新,运用区块链、大数据等技术,加强对企业各类经营数据、交易数据、管理数据的分析、整合和挖掘,通过确立数字化的中小微企业金融服务变革,打造完备的数据基础,将数据作为发现价格、评估风险、配置资源的重要平台。(光明日报)[2020/1/14]
SELFDESTRUCT?是唯一一个会导致合约代码变动的操作码
如果在一个特定的地址上存储了一段代码,那么这段代码就会永远保留在链上。这样的恒常性质是有用的,因为在构建应用时不需要担心这些代码会出现变动。
账户抽象化非常依赖该恒常性质用以支持库调用。因为代码存在变动的可能,还会导致应用的安全性变得复杂很多:2017年Parity的多签钱包就曾因为其引用的库代码合约被偶然删除而彻底瘫痪。
而唯一破坏代码不变性的操作码就是?SELFDESTRUCT?。
SELFDESTRUCT?是唯一一个可以未经账户同意就能修改账户余额的操作码
SELFDESTRUCT?有一个内置的“转账”的功能,其并不走正常的转账流程,因而可以绕过避免合约地址接收Ether的守护功能,以及对转账事件的日志记录。这为智能合约钱包埋下了隐患,让一些潜在有用的技巧没法使用,加重了开发者和审计者的心智负担。
SELFDESTRUCT?当前的用例
如今?SELFDESTRUCT?有两类重要的应用:
GasToken:当gas价格低时通过创建合约用掉gas,当gas价格高时通过调用?SELFDESTRUCT?获得gas退款。
利用SELFDESTRUCT实现代码的动态变更:这可用于dApp或DAO及其他类似用例的“升级”。
可以被安全地销毁。GasToken的开发者已经发出了警告“虽然对以太坊网络的变更会导致GasToken无法使用、不可赎回、不能互换以及/或毫无价值,但是GasToken的开发者极可能会拥护该变更”。移除selfdestruct退款只会导致有些操作的费用变得更贵。
从长远来看,是没必要的,还有其他一些被广泛使用的范式可用于支持动态代码变更。最容易实现的是?DELEGATECALL?转发器,合约从一个存储插槽中获取一个代码地址,然后调用对应地址的代码;修改这个存储插槽就能更新代码。不过,从短期来看,有少数应用已经使用了。
提案1:完全移除?SELFDESTRUCT
从某个区块开始,完全停用?SELFDESTRUCT?。在这个及之后的区块里,如果EVM在执行时遇到?0xff?操作码,只要抛出异常直接退出即可,就像EVM执行时遇到不存在的操作码一样。
在完全停用前,为了警示用户避免使用?SELFDESTRUCT?,我们可以渐进式地增加其gas费用:如果?block.number10**6>=FLAG_BLOCK?,则?SELFDESTRUCT?的gas费用增加到?10**10//(FLAG_BLOCK-block.number)?。
提案2:阉割?SELFDESTRUCT
我们也可以保留这个操作码,但是改变其行为,一方面消除其对状态树的破坏,另一方面增加一个新特性,让合约可以标识为不可自毁,从而确保代码不可变。
暂时提议新增的行为包括:
当一个合约调用?SELFDESTRUCT?时,并不会删除合约账户,而是清空代码,并且将nonce值增加?2**40?。没有退款。
通过调用将合约中的ETH转移到目标地址。
可以在代码为空的地址上创建合约。
在合约里调用?SSTORE?和?SLOAD?操作地址?A?时,实际操作的是?A_offset=(AA.nonce//2**40)%2**160?的存储树。
注意,从EIP-2929的角度来看,?A_offset?需要“可达”。如果该账户不在可达账户集合中,则需要额外支付2600gas以加入可达集合。
另一种选择是调整将storagekey转换为treekey的哈希函数,用?sha3(storage_keycontract_nonce//2**40)?代替?sha3(storage_key)?。需要注意的是,无论如何都需要做一些类似的调整,以方便合约级别的无状态key空间扩展。
合约可以在代码中指定?0xA8?作为第一个字节,EVM会将其识别为无操作,但使用它来开启一个标志,在执行过程中完全禁用?SELFDESTRUCT?的功能。
这两种解决方案也可以结合起来:当前立即阉割,将来完全移除。或者,这个操作码也可以永远不被完全移除,但是最终只保留一个功能,即向目标地址发送合约当前的全部ETH余额,我们可以将这个操作码重命名为?CLEAR?。
原文链接:
https://hackmd.io/@HWeNw8hNRimMm2m2GH56Cw/selfdestruct
作者:??Vitalik
翻译&校对:戡乱&?阿剑
在过去的几天里,币安智能链以惊人的速度增长,这得益于高昂的Gas费,使得小散户无法使用基于以太坊的AMM-DEX,他们转移了关注点,开始追逐BSC网络中的价值.
1900/1/1 0:00:00编者按:本文来自?风火轮社区,作者:佩佩,Odaily星球日报经授权转载。大家好,我是佩佩,之前有朋友说想了解算法稳定币,今天就来聊下它.
1900/1/1 0:00:00RTX3060上市半个月,就经历了在“被破解谣传”和“辟谣”中几起几落,价格也随之跌宕起伏。为什么3060可破解的网传都默默地没有后续了呢?当然是因为,根本就没有被破解!大多数技术大牛都认为30.
1900/1/1 0:00:00亲爱的库币用户,为丰富杠杆交易区交易种类,库币杠杆平台已上线MANA、ENJ和FTM资产与交易对.
1900/1/1 0:00:00YFI技术团队全程参与了MJL的代码搭建,并在其智能合约代码结构上表明了YFI的技术印记,核心技术团队一共构建了MJL模型.
1900/1/1 0:00:00币圈的每一次交易,都是多空的博弈,踏空最多抱头懊恼,踏错则会直接导致资产的缩水甚至亏损,市场交易造就猜顶猜底不断上演,对于币圈用户而言,最为关注的问题无异于什么时候可以买入.
1900/1/1 0:00:00