AVM 使用 c++实现,AVM 表示的逻辑实现在 MachineStateKeys 类的 machineHash 函数(machinestate.cpp)中。AVM 的特别之处就是除了执行外,还能较方便的表达(证明)执行状态。深入理解 AVM 的基本数据结构,AVM 的基本的数据类型包括: using value = std::variant; enum ValueTypes { NUM, CODEPT, HASH_PRE_IMAGE, TUPLE, BUFFER = 12, CODE_POINT_STUB = 13 };
每种数据类型除了数据表示外,还能非常方便地计算其 hash 值作为状态。详细看看 CodePoint 和 Tuple 基本数据类型。 CodePointCodePoint 类型将多个操作「捆绑」在一起,每个 CodePoint 除了记录当前的 Operation 外,还包括前一个 CodePoint 的 hash 信息。这样所有的 Operation 可以串连起来,当前的 CodePoint 除了能表达当前的 Operation 外,还能明确 Operation 的依赖关系。CodePoint 的类型定义在:packages/arb-avm-cpp/avm_values/include/avm_values/codepoint.hpp。 struct CodePoint { Operation op; uint256_t nextHash; CodePoint(Operation op_, uint256_t nextHash_) : op(op_), nextHash(nextHash_) {} bool isError() const { return nextHash == 0 && op == Operation{static_cast(0)}; } };Tuple Tuple 类型由 RawTuple 实现。RawTuple 是由一组 value 组成。Tuple 限制最多 8 个 value。 struct RawTuple { HashPreImage cachedPreImage; std::vector data; bool deferredHashing = true; RawTuple() : cachedPreImage({}, 0), deferredHashing(true) {} }; Tuple 的类型定义在:packages/arb-avm-cpp/avm_values/include/avm_values/tuple.hpp。 在理解了基础类型的基础上,DataStack 可以由一系列 Tuple 实现: 总结一下,AVM 中的 PC,Stack,Register 等等的状态都能通过 hash 结果表示。AVM 整个状态由这些 hash 值的拼接数据的 hash 表示。 Rollup Challenge在提交到 L1 的状态有分歧时,挑战双方(Asserter 和 Challenger)先将状态分割,找出「分歧点」。明确分歧点后,挑战双方都可提供执行环境,L1 执行相关操作确定之前提交的状态是否正确。L1 的挑战处理逻辑实现在 arb-bridge-eth/contracts/challenge/Challenge.sol。整个挑战机制有超时机制保证,为了突出核心流程,简化流程如下图所示: 挑战者通过 initializeChallenge 函数发起挑战。接下来挑战者 (Challenger) 和应战者 (Asserter) 通过 bisectExecution 确定不可再分割的「分歧点」。在确定分歧点后,挑战者通过 oneStepProveExecution 函数确定 Assert 之前提交的状态是否正确。 (责任编辑:admin) |