EXTCODESIZE, EXTCODECOPY:主要的作用是让合约依据模板检查其他合约的代码,甚至是在与其他合约交互前,模拟它们。见:https://lesswrong.com/lw/aq9/decision_theories_a_less_wrong_primer/ JUMPDEST:当跳转(jump)目的地限制在几个索引时(尤其是,动态目的跳转的计算复杂度是 O(log(有效挑战目的数量)),而静态跳转总是恒定的),JIT 虚拟机实现起来更简单。于是,我们需要:1)对有效变量跳转目的地做限制;2)激励使用静态而不是动态跳转。为了达到这两个目标,我们定下了以下规则:1)紧接着 push 后的跳转可以跳到任何地方,而不仅是另一个 jump;2)其他的 jump 只能跳转到 JUMPDEST。对跳转的限制是必须的,这样就可通过查看代码中的前一个操作来确定当前是一个静态跳转还是动态跳转。缺乏对静态跳转的需求是激励使用它们的原因。禁止跳转进入 push 数据也会加快 JIT 虚拟机的编译和执行。 LOG:LOG是事件的日志。 CALLCODE:该操作码允许合约使用自己的存储项,在单独的栈空间和 memory 中调用其他合约的 “函数” 。这样可以在区块链上灵活实现标准库代码。 SELFDESTRUCT:允许合约删除它自己,前提是它已经不需要存在了。SELFDESTRUCT 并非立即执行,而是在交易执行完之后执行。这是因为如果允许 SELFDESTRUCT 在执行之后回滚,将会极大地提高缓存的复杂度,不利于高效的 VM 实现。 PC:尽管理论上不需要 PC 操作码,因为所有 PC 操作码的实例都可以根据将 push 操作的索引加入实际程序计数器来代替实现,但使用 PC 可以创建独立代码的位置(可复制粘贴到其他合约的编译函数,如果它们以不同索引结束,不会被打断)。 来源:Blocklike (责任编辑:admin) |