值得信赖的区块链资讯!
深入理解以太坊二层方案 Arbitrum 技术架构
Arbitrum是Layer2 Rollup的一种方案。和Optimism类似,状态的终局性采用“挑战”(challenge)机制进行保证。Optimism的挑战方法是将某个交易完全在Layer1模拟执行,判断交易执行后的状态是否正确。这种方法需要在Layer1模拟EVM的执行环境,相对复杂。Arbitrum的挑战相对轻便一些,在Layer1执行某个操作(AVM),确定该操作执行是否正确。Arbitrum介绍文档中提到,整个挑战需要大概500字节的数据和9w左右的gas。为了这种轻便的挑战机制,Arbitrum实现了AVM虚拟机,并在AVM虚拟机中实现了EVM的执行。AVM虚拟机的优势在于底层结构方便状态证明。
Arbitrum的开发者文档详细介绍了Arbitrum架构和设计。对AVM以及L1/L2交互细节感兴趣的小伙伴可以耐心地查看"Inside Arbitrum"章节:
https://developer.offchainlabs.com/docs/developer_quickstart
整体框架
Arbitrum的开发者文档给出了各个模块关系:
Arbitrum的系统主要由三部分组成(图中的右部分,从下到上):EthBridge,AVM执行环境和ArbOS。EthBridge主要实现了inbox/outbox管理以及Rollup协议。EthBridge实现在Layer1。ArbOS在AVM虚拟机上执行EVM。简单的说,Arbitrum在Layer2实现了AVM虚拟机,在虚拟机上再模拟EVM执行环境。用AVM再模拟EVM的原因是AVM的状态更好表达,便于Layer1进行挑战。
EthBridge和AVM执行环境对应的源代码:
https://github.com/OffchainLabs/arbitrum.git
ArbOS对应的源代码:
https://github.com/OffchainLabs/arb-os.git
这个模块关系图太过笼统,再细分一下:
EthBridge主要实现了三部分功能:inbox,outbox以及Rollup协议。inbox中“存放”交易信息,这些交易信息会“同步”到ArbOS并执行。outbox中“存放”从L2到L1的交易,主要是withdrawl交易。Rollup协议主要是L2的状态保存以及挑战。特别注意的是,Arbitrum的所有的交易都是先提交到L1,再到ArbOS执行。ArbOS除了对外的一些接口外,主要实现了EVM模拟器。整个模拟器实现在AVM之上。整个EVM模拟器采用mini语言实现,Arbitrum实现了AVM上的mini语言编译器。简单的说,Arbitrum定义了新的硬件(machine)和指令集,并实现了一种上层语言mini。通过mini语言,Arbitrum实现了EVM模拟器,可以执行相应交易。
AVM State
因为所有的交易都是在AVM执行,交易的执行状态可以用AVM状态表示。AVM相关实现的代码在arbitrum/packages/arb-avm-cpp中。
AVM的状态由PC,Stack,Register等状态组成。AVM的状态是这些状态的hash值拼接后的hash结果。
AVM使用c++实现,AVM表示的逻辑实现在MachineStateKeys类的machineHash函数(machinestate.cpp)中。AVM的特别之处就是除了执行外,还能较方便的表达(证明)执行状态。深入理解AVM的基本数据结构,AVM的基本的数据类型包括:
using value =
std::variant<Tuple, uint256_t, CodePointStub, HashPreImage, Buffer>;
enum ValueTypes { NUM, CODEPT, HASH_PRE_IMAGE, TUPLE, BUFFER = 12, CODE_POINT_STUB = 13 };
uint256_t – 整数类型
CodePoint – 当前代码指令表示
Tuple – 元组,由8个Value组成。元组中的某个元素依然可以是元组
Buffer – 数组,最长为2^64
HashPreImage – 固定的hash类型,hashValue = hash(value, prevHashValue)
每种数据类型除了数据表示外,还能非常方便地计算其hash值作为状态。详细看看CodePoint和Tuple基本数据类型。
CodePoint
CodePoint类型将多个操作“捆绑”在一起,每个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<OpCode>(0)};
}
};
Tuple
Tuple类型由RawTuple实现。RawTuple是由一组value组成。Tuple限制最多8个value。
struct RawTuple {
HashPreImage cachedPreImage;
std::vector<value> 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之前提交的状态是否正确。
initializeChallenge
function initializeChallenge(
IOneStepProof[] calldata _executors,
address _resultReceiver,
bytes32 _executionHash,
uint256 _maxMessageCount,
address _asserter,
address _challenger,
uint256 _asserterTimeLeft,
uint256 _challengerTimeLeft,
IBridge _bridge
) external override {
…
asserter = _asserter;
challenger = _challenger;
…
turn = Turn.Challenger;
challengeState = _executionHash;
…
}
initializeChallenge确定挑战者和应战者,并确定需要挑战的状态(存储在challengeState)。challengeState是由一个和多个bisectionChunk状态hash组成的merkle树树根:
整个执行过程可以分割成多个小过程,每个小过程(bisection)由起始和结束的gas和状态来表示。
turn用来记录交互顺序。turn = Turn.Challenger表明在初始化挑战后,首先由Challenger发起分歧点分割。
bisectExecution
bisectExecution挑选之前分割片段,并如可能将片段进行再次分割:
bisectExecution的函数定义如下:
function bisectExecution(
bytes32[] calldata _merkleNodes,
uint256 _merkleRoute,
uint256 _challengedSegmentStart,
uint256 _challengedSegmentLength,
bytes32 _oldEndHash,
uint256 _gasUsedBefore,
bytes32 _assertionRest,
bytes32[] calldata _chainHashes
) external onlyOnTurn {
_chainHashes是再次分割点的状态。如果需要再次分割,需要满足分割点的个数规定:
uint256 private constant EXECUTION_BISECTION_DEGREE = 400;
require(
_chainHashes.length ==
bisectionDegree(_challengedSegmentLength, EXECUTION_BISECTION_DEGREE) + 1,
"CUT_COUNT"
);
简单的说,每次分割,必须分割成400份。
_oldEndHash是用来验证状态这次分割的分割片段是上一次分割中的某个。需要检查分割的有效性:
require(_chainHashes[_chainHashes.length - 1] != _oldEndHash, "SAME_END");
require(
_chainHashes[0] == ChallengeLib.assertionHash(_gasUsedBefore, _assertionRest),
"segment pre-fields"
);
require(_chainHashes[0] != UNREACHABLE_ASSERTION, "UNREACHABLE_START");
require(
_gasUsedBefore < _challengedSegmentStart.add(_challengedSegmentLength),
"invalid segment length"
);
起始状态正确。这次分割不能超出上次分割范围,并且最后一个状态和上一个分割的结束状态不一样。
bytes32 bisectionHash =
ChallengeLib.bisectionChunkHash(
_challengedSegmentStart,
_challengedSegmentLength,
_chainHashes[0],
_oldEndHash
);
verifySegmentProof(bisectionHash, _merkleNodes, _merkleRoute);
通过merkle树的路径检查确定起始状态和结束状态是上一次某个分割。
updateBisectionRoot(_chainHashes, _challengedSegmentStart, _challengedSegmentLength);
更新细分分割对应的challengeState。
oneStepProveExecution
当不能分割后,挑战者提供初始状态(证明),并由L1进行相应的计算。计算的结果应该和提供的_oldEndHash不一致。不一致说明挑战者成功证明了之前的计算结果不对。
(uint64 gasUsed, uint256 totalMessagesRead, bytes32[4] memory proofFields) =
executors[prover].executeStep(
bridge,
_initialMessagesRead,
[_initialSendAcc, _initialLogAcc],
_executionProof,
_bufferProof
);
通过executeStep计算出正确的结束状态。executeStep实现在packages/arb-bridge-eth/contracts/arch/OneStepProofCommon.sol中。核心是executeOp函数,针对当前的context读取op,执行并更新状态。感兴趣的小伙伴可以自行查看。
rootHash = ChallengeLib.bisectionChunkHash(
_challengedSegmentStart,
_challengedSegmentLength,
oneStepProofExecutionBefore(
_initialMessagesRead,
_initialSendAcc,
_initialLogAcc,
_initialState,
proofFields
),
_oldEndHash
);
}
verifySegmentProof(rootHash, _merkleNodes, _merkleRoute);
确定初始状态和结束状态是上一次挑战状态中的某个分割。初始状态由提供的证明(proof)计算获得。
require(
_oldEndHash !=
oneStepProofExecutionAfter(
_initialSendAcc,
_initialLogAcc,
_initialState,
gasUsed,
totalMessagesRead,
proofFields
),
"WRONG_END"
);
确认_oldEndHash和计算获得结束状态不一样。不一样才说明之前提交的结束状态是错误的。
_currentWin();
计算完成后,确定胜利方。
总结:
Arbitrum是Layer2 Rollup的一种方案。采用挑战机制确定Rollup状态的终局性。为了引入轻便挑战机制,Arbitrum定义了AVM,一种可以方便证明执行状态的虚拟机,并设计了mini语言和编译器。在AVM上模拟了EVM的执行环境,兼容EVM。挑战时将执行过程进行400分分割,由L1执行少量指令确定状态是否正确。
比推快讯
更多 >>- 数据:435.91 枚 BTC 从 Wintermute 转出,价值约 2071 万美元
- 数据:过去 24h Binance 净流出 3.03 亿 USDT
- 美CFTC主席任命前加密监管官员Amir Zaidi为幕僚长,曾主导比特币期货上市
- 数据:3723.26 万枚 TON 从 Fragment 转入 Telegram,价值约 6031 万美元
- 易理华:基于逼空逻辑和看好 2026 年大牛市,将坚决持续加仓 ETH
- Flow:某交易所 AML/KYC 流程缺陷导致 500 万美元资金被提取
- 参议员 Lummis:2026 年《负责任金融创新法案》允许大型银行提供数字资产托管、质押及支付服务
- BTC 在新年夜的历史收盘价
- 花旗:预计 12 月非农就业人数将增加 7.5 万人,失业率将升至 4.7%
- 美国众议员戴维森:比特币承诺是“无许可、点对点支付系统”
- 彭博分析师:加密资产经风险调整后表现不佳,或预示本轮风险资产快速上涨周期已接近尾声
- Galaxy Digital:比特币将在 2027 年底达到 25 万美元
- Coinbase 投研主管:监管清晰化正推动加密行业转变为全球金融基础设施新兴支柱
- 两名美国人承认使用勒索软件攻击多个美国受害者,涉案金额约 120 万美元
- 哈塞特成为下一任美联储主席概率降至 44%,沃什当选概率升至 33%
- 麻吉减仓 25 倍 ETH 多单以止盈,目前浮盈 27.5 万美元
- 以太坊历史 1 月平均回报率为 20.63%,比特币 1 月平均回报率为 3.81%
- Jump Crypto 收到 928 万枚 LIT 空投,价值 2420 万美元
- 特朗普媒体科技集团:计划通过 Cronos 网络向本集团持有者分发数字代币
- 美国至 12 月 27 日当周初请失业金人数 19.9 万人,预期 22 万人
- 某地址花费 286 万美元买入 3000 枚 BTC 看涨期权,行权价 10 万美元,到期日为 26 年 1 月 30 日
- Kyle Samani:Manus 或首次让通用 Agent 具备落地可行性
- 福布斯:美联储降息预期或引发 2026 年比特币价格上涨
- 某巨鲸 10 倍杠杆做空 TRUMP,持仓价值达 50 万美元
- CertiK:12 月加密领域因漏洞攻击损失约 1.178 亿美元
- Binance 发布 Flow(FLOW)网络安全事件进展:已冻结黑客在平台剩余资金,敦促项目方披露事后报告
- 印度央行,支持各国优先发展 CBDC 以维护金融秩序
- Lighter 空投价值位列加密史上第十,总价值 6.75 亿美元
- 数据:Coinbase Prime 流入 2.71 万枚 ETH,价值约 8860 万美元
- Neo 基金会:财务报告计划 2026 年 Q1 发布,联创争议不影响日常运营
- 数据:2025 年 NFT 供应量增至约 13.4 亿枚,全年销售额下降 37%
- 数据:2025 年收益型稳定币产生超 2.5 亿美元回报
- 三菱日联:美元恐将创下 2017 年以来最差年度表现
- 芝加哥期权交易所拟修改 Mini 比特币指数期权报价增量
- Bubblemaps:TGE 后 2.5 亿美元资金自 Lighter 平台撤出
- 韩国 FIU 对 Korbit 处以约 188 万美元罚款,并处以“机构警告”处分
- Matrixport:加密货币的结构性增长趋势依然完好
- 某交易员在 Polymarket 通过预测下注单日获利 92.8 万美元
- 数据:4000 枚 ETH 从 Chun Wang (F2Pool) 转出,价值约 1189 万美元
- 美国会计准则委员会计划 2026 年探索将部分稳定币列为“现金等价物”
- 数据:ETH 全网合约持仓量 24h 减少 5.48%
- 分析师:BTC 大资金换手积极性下降,链上单笔交易金额较月中跌近 47%
- Shaw:量子计算对比特币的威胁是无稽之谈,炒作者一无所知
- 数据:过去 24 小时全网爆仓 1.08 亿美元,多单爆仓 5,756.54 万美元,空单爆仓 4,994.82 万美元
- 月之暗面完成 5 亿美元 C 轮融资,IDG 领投
- Coinbase 高管警告美国稳定币政策或让中国在全球支付竞争中占优
- 慢雾:警惕浏览器历史记录污染攻击,恶意软件攻击再次抬头
- 慢雾:钓鱼攻击仍是 Q4 资金被盗首因,共收到 300 起被盗案件追回 100 万美元
- Neo 创始人决裂:达鸿飞被指未履行财务披露承诺,Erik 被控独揽基金会财权
- 交易所 XRP 供应量降至 7 年低点,由 37.6 亿枚降至 16 亿枚
比推专栏
更多 >>观点
比推热门文章
- 数据:435.91 枚 BTC 从 Wintermute 转出,价值约 2071 万美元
- 数据:过去 24h Binance 净流出 3.03 亿 USDT
- 美CFTC主席任命前加密监管官员Amir Zaidi为幕僚长,曾主导比特币期货上市
- 数据:3723.26 万枚 TON 从 Fragment 转入 Telegram,价值约 6031 万美元
- 2025 年终复盘|为什么说我今年最牛的操作是什么都没做?
- 易理华:基于逼空逻辑和看好 2026 年大牛市,将坚决持续加仓 ETH
- Flow:某交易所 AML/KYC 流程缺陷导致 500 万美元资金被提取
- 参议员 Lummis:2026 年《负责任金融创新法案》允许大型银行提供数字资产托管、质押及支付服务
- BTC 在新年夜的历史收盘价
- 花旗:预计 12 月非农就业人数将增加 7.5 万人,失业率将升至 4.7%
比推 APP



