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之前提交的状态是否正确。
|