Circle Arc 技術内核 v2 — 詳細レポート
レポート日付:2026-05-13
視点:Circle Arc ブロックチェーンの技術内核に焦点を当てたリサーチ
範囲:Malachite コンセンサスエンジン、arc-node 実行層、5 つのカスタム precompiles、リモート署名、耐量子統合、tokenomics、セキュリティ監査
v1 (overview.md) との非重複:v1 は商業ポジショニング + 表層アーキテクチャに焦点を当てる。v2 はすべてコードレベル + 学術レベルの深度に踏み込む
0. レポート読解ガイド
本レポートは、実地 clone した 8 つの GitHub リポジトリのコード + 35 回以上の web 検索 + 40+ の引用源に基づいて完成しており、目標は Arc ブロックチェーンの「技術内核」をバイトレベルまで解剖することである:Tendermint アルゴリズムの Rust における具体的なステートマシン実装から、5 つのカスタム precompile の gas 課金曲線、さらに SLH-DSA-SHA2-128s 耐量子署名の 7,856 バイト署名がなぜ 230,000 gas を要するのかまで、一つずつ説明する。
v1 では Arc の経緯、商業モデル、stablecoin gas など表層的なポジショニングをカバー済みであり、v2 では完全にエンジニアリング内核に切り替える:
- 第 1 章 — Malachite コンセンサスエンジンの 18 個の crate を全解剖、Tendermint アルゴリズム基礎の復習、CometBFT との比較、Informal Systems チームの歴史、形式検証(Quint + TLA+ + MBT)、独立 mempool リポジトリを含む
- 第 2 章 — arc-node の 25 個の Rust crate の全列挙、Reth v1.11.3 との具体的な統合方法
- 第 3 章 — malaketh-turbo / malaketh-layered という 2 つの初期 PoC の分解分析
- 第 4 章 — arc-remote-signer (Go) の AWS Nitro Enclaves 統合 + 四層エンベロープ暗号化
- 第 5 章 — arc-stablecoin-fx の現状(重要な発見:README のみ)
- 第 6 章 — arc-nanopayments の x402 + Circle Gateway マイクロペイメント
- 第 7 章 — 5 つの precompiles 個別詳解(各 1000+ 字)
- 第 8 章 — EVM 互換性の深度(OP Stack / Arbitrum との比較)
- 第 9 章 — データ可用性
- 第 10 章 — 耐量子の工業的意義(FIPS 205 vs FIPS 204 vs FIPS 203)
- 第 11 章 — ARC tokenomics のコード実装
- 第 12 章 — セキュリティ監査と bug bounty
1. Malachite コンセンサスエンジン完全解剖
1.1 Tendermint BFT アルゴリズム基礎の復習(簡潔のみ)
Tendermint は Jae Kwon により 2014 年に提案され、「academic BFT」と「ブロックチェーン PoS」を結合した初のビザンチン障害耐性コンセンサスアルゴリズムである。その基礎論文は Buchman / Kwon / Milosevic が 2018 年に発表した The latest gossip on BFT consensus(arXiv:1807.04938)である。
Tendermint の動作三相サイクルは propose → prevote → precommit である:
- PROPOSE フェーズ:ラウンド r、高さ h での proposer(round-robin もしくは stake-weighted で選出)が block proposal をブロードキャストする;
- PREVOTE フェーズ:各 validator は proposal を受信後、自身のタイマー内でその proposal(もしくは nil)に対して prevote を発する;あるノードが ≥ 2f+1 prevotes for the same value(polka)を受信すると、その値を lock し precommit に入る;
- PRECOMMIT フェーズ:lock 後、validator は precommit をブロードキャストする;≥ 2f+1 precommits を受信 → commit、ブロックは最終化(finalized)される。
Tendermint の鍵となる保証は:
- Safety(一貫性):悪意のある validator < f = ⌊(n-1)/3⌋ である限り、2 つの commit が衝突することはない;
- Liveness(活性):partial synchrony モデルの下、グローバル安定時刻 GST 以降に進展が保証される;
- Instant finality:各高さで 1 回 finalize する(fork choice rule なし)、Nakamoto コンセンサスとは本質的に異なる;
- Optimistically responsive:ネットワーク状況が良いとき、ブロック時間はタイムアウトではなく実際のネットワーク往復遅延に近づく;
学術的基盤については Buchman らの 2018 年論文および EPFL infoscience の Revisiting Tendermint: Design Tradeoffs, Accountability, and Practical Use(https://infoscience.epfl.ch/bitstreams/bb494e9a-22aa-43a2-b995-69c7a2cc893e/download)を参照。
1.2 Malachite と CometBFT の具体的差異
CometBFT は 2023 年に行われた Tendermint Core の fork(Informal Systems が維持)で、Go で書かれている。Malachite は 2024 年に Informal Systems が開始した Rust リライトであり、もたらすのは言語移行だけでなく、アーキテクチャレベルでの Re-design である:
| 次元 | CometBFT (Go) | Malachite (Rust) |
|---|---|---|
| 言語 | Go 1.21+ | Rust 1.82+ (実際 arc-node は 1.91 でロック) |
| ステートマシン表現 | 関数 + チャネル + goroutine | 純粋関数 apply + Transition 型代数 |
| API スタイル | ABCI(アプリとコンセンサスを分離する socket) | 三層抽象:Low-level / Actors / Channels |
| Mempool | バイナリ内に内蔵 | 独立リポジトリ malachite-mempool + 抽象インターフェース |
| データ到達可能性 | rocksdb(goleveldb は旧版) | ユーザーカスタム;engine crate は WAL のみ提供 |
| 形式検証 | 後期補完(Apalache TLA+) | 設計期同期開発(Quint co-design) |
| モジュール化 | 全体モノリス | 18 個の独立 crate、個別に import 可 |
| 性能(100 vals 1MB blocks) | ~3-5 blocks/s | 780ms finality, ~2.5 blocks/s, 13.5 MB/s スループット |
| Block streaming | parts シリアル | parts 並列 + 優先度キュー(block-streaming spec) |
Malachite のドキュメントは明確に述べている:”Key design decisions in Malachite are heavily inspired by lessons and experiences of maintaining CometBFT throughout the years. Malachite addresses numerous points of technical debt”(https://github.com/circlefin/malachite README を参照)。
最も顕著な差異点:
a) ステートマシンの純粋関数表現
CometBFT のステートマシンは Go の receiver method + goroutine パターンを使い、状態変異は元の struct 上で行う。Malachite は全ステートマシンを純粋関数として実装する:
// /repos/malachite/code/crates/core-state-machine/src/state_machine.rs:71-79 を参照
pub fn apply<Ctx>(
ctx: &Ctx,
mut state: State<Ctx>,
info: &Info<Ctx>,
input: Input<Ctx>,
) -> Transition<Ctx>
where
Ctx: Context,
シグネチャに注意:state: State<Ctx> は値渡し(move)、info: &Info<Ctx> は参照、戻り値は Transition<Ctx> であって &mut State ではない。これは Rust の ownership 思想がコンセンサス層に直接落とし込まれたものである:一度の状態遷移で新しい状態オブジェクトを生成し、旧状態は drop される。
これには 2 つの大きなエンジニアリング上の利益がある:
- 並行変異なし:ステートマシン内部で data race が存在し得ない;
- モデル検査可能:state_machine.apply は Quint 仕様
consensus.qntのconsensusモジュールの状態遷移関数と構造的に同型であり、model-based testing による自動カバレッジが可能;
b) 三層 API 抽象
Malachite の README は 3 つの import パスを明確に公開しており、抽象は低から高の順:
- core-consensus / core-driver / core-state-machine / core-types / core-votekeeper — 5 つの “core” crate はアルゴリズム層、純粋ロジック;
- engine + app + actors — 中層、Ractor actor モデルのスケジューリングを導入;
- app-channel — 最上位の Channels API、AppMsg::GetValue / AppMsg::Decided などのメッセージで外部とやり取り;
Arc はどの層を使っているか?arc-node の Cargo deps を見ると:
# /repos/arc-node/Cargo.toml:68
arc-node-consensus = { version = "0.0.1", path = "crates/malachite-app" }
crates/malachite-app は Arc が自前で書いた actor 層アダプター(Channel API の下にある actors 層に基づく)であり、core を直接 import するわけでも、Channels に留まるわけでもない — 中層の柔軟性を選択している。
c) Mempool が独立リポジトリ化
CometBFT の mempool は内蔵された mempool/ サブディレクトリである。Malachite は mempool を完全に独立して https://github.com/circlefin/malachite-mempool リポジトリにした。理由は、BFT エンジンは「どうやってブロックを生成するか」について完全に agnostic であるべきだからである:
malachite-mempool/
├── fifo-mempool/ # 最もシンプルな FIFO 実装
├── libp2p-network/ # libp2p gossip
└── host-integration/ # Malachite engine とのグルー層
そして Cargo.toml を見ると、mempool は現在 Malachite の anca/actor_with_fifo_mempool branch に pin されている(/repos/malachite-mempool/Cargo.toml:34-46 を参照)、これは mempool と engine がまだ co-evolve していることを示している;しかしリポジトリの分離により、将来 Arc / Snapchain / Linera がそれぞれ異なる mempool 戦略を同じ engine に接続できることが保証される。
1.3 Informal Systems の歴史(2017-2025)
Informal Systems はカナダ・トロントを拠点とするプロトコルエンジニアリング会社である。その歴史は Cosmos / Tendermint と密接に絡み合っている:
- 2014 — Jae Kwon がコーネル大学で Tendermint ホワイトペーパーを発表;同年 Tendermint Inc. を設立;
- 2017 — Cosmos ICO ($17M)、Tendermint Inc. が Interchain Foundation (ICF) の資金援助を獲得;
- 2019 — ICF 内部に R&D チーム(10+ 名)を設立、Ethan Buchman、Zarko Milosevic らが率いる。主な任務は:
1. Tendermint と IBC プロトコルを形式化する(TLA+ / Apalache を使用)
2. Go 実装を改善する
3. コアコンポーネントを Rust でリライトする - 2020 — R&D チームが Informal Systems 社として独立、Ethan Buchman が CTO 就任;
- 2021-2022 — Informal Systems は Cosmos エコシステム内での役割:CometBFT(Go fork of Tendermint)メンテナー、IBC-rs 実装、Hermes IBC relayer チーム;同時に Apalache(symbolic TLA+ model checker)をインキュベート;
- 2023 — Tendermint Core プロジェクトが正式に CometBFT に fork され、Informal Systems が維持;同年 Starknet/StarkWare が Tendermint を Rust でリライトし Starknet decentralized sequencer のコンセンサスコアとすることを提案;
- 2024 上半期 — Malachite プロジェクト開始、Starknet 財団から資金を獲得、Farcaster(Snapchain)、Shielded Labs(Zcash Crosslink)と同時に協業;同時に Quint(TLA ベースのエンジニアフレンドリーな仕様記述言語)をインキュベート;
- 2025-08-12 — Informal Systems は Malachite が Circle に買収されたことを発表、9 名のコア Malachite エンジニアが Circle に加わり Arc 開発を推進;Informal Systems 本体は引き続き運営し、非 Arc の Malachite ユースケースをサポート;
- 2025-10-28 — Circle が Arc 公開テストネットを開始;
- 2026 Q1 — Circle が ARC token ホワイトペーパーを公表:100 億の初期供給、60% エコシステム、25% Circle、15% 長期備蓄、初期インフレ 2-3% per annum;
Informal Systems のコア知識資産は「形式化手法で証明可能に正しいコンセンサスシステムを構築する」ことであり、Circle に買収された後、この方法論はそのまま Arc に移行された。詳細は Informal Systems 公式ブログ Past, Present, and Future of R&D at the ICF(https://interchain-io.medium.com/past-present-future-icf-r-and-d-introducing-informal-systems-e50d14383f05)を参照。
1.4 Malachite はどのプロジェクトで使われているか
2026-05 時点で、Malachite の実際の production / pre-production ユーザー:
- Circle Arc — 現在最大のユーザー、testnet はすでに稼働、2026 年夏にメインネット稼働予定;
- Starknet Madara — Starknet の Rust 実装クライアント、Malachite を decentralized sequencer のコンセンサスコアとして採用(https://github.com/keep-starknet-strange/madara/discussions/899 を参照);
- Farcaster Snapchain — 分散型ソーシャルプロトコル Farcaster のバックエンド L1 データ層。2024-Q4 から、Farcaster は元々 CRDT ベースだった Hub システムを Malachite BFT に置き換えた(https://github.com/farcasterxyz/snapchain を参照)。Snapchain が公表する性能:10,000+ TPS、780ms 平均 finality、11 個の validator、5,000 cast/年で約 $7 のストレージ料;
- Shielded Labs Crosslink — Zcash の PoW + PoS hybrid アップグレード提案。Crosslink の PoS 部分は Malachite が BFT を提供しており、2025 年にプロトタイプ段階に入った(https://x.com/informalinc/status/1898129620761034900 を参照);
- Linera Protocol — マイクロチェーンアーキテクチャ、ユーザーごとに 1 つの micro-chain、クロスチェーンメッセージは非同期配信。Linera は Malachite を root chain コンセンサスとして使う予定(公開 Twitter 議論あり、production code はまだ);
重要な観察:Arc 以外で、Malachite を金融グレード L1 で使っているプロジェクトはない — Snapchain はソーシャル、Crosslink はプライバシー、Madara は L2 sequencer、Linera は R&D 段階。Arc は Malachite の「初の金融 L1 production ユースケース」であり、Arc の実際のオンチェーン圧力は逆に金融シナリオ下での Malachite のボトルネック(確定的 finality と高スループットの tradeoff、mempool fairness、validator slashing 経済学など)を露呈させるだろう。
1.5 18 個の crate 完全列挙
公式 README + Cargo workspace に従って列挙する(/repos/malachite/code/Cargo.toml を参照)、すべて crates.io 接頭辞は informalsystems-malachitebft- で、対応する docs.rs ドキュメントがある:
Core アルゴリズム層(5 crate):
| crate | 役割 | 主要ファイル |
| — | — | — |
| core-types | Context、Height、Round、Validator、Vote、Proposal、TimeoutKind などの trait/struct 定義 | lib.rs |
| core-state-machine | 単一ノードの propose/prevote/precommit ステートマシン(前述の apply 関数) | state.rs, state_machine.rs, transition.rs |
| core-driver | ステートマシンループの駆動、Round スケジューリング、Proposal 管理 | driver.rs, mux.rs, proposal_keeper.rs |
| core-votekeeper | 投票カウンター、quorum 検出 (+2/3, +1/3)、accountable evidence | keeper.rs, count.rs, value_weights.rs, evidence.rs |
| core-consensus | 上記 4 つを完全なコンセンサスエンジンに集約、effect-based API を外部に公開 | (主インターフェースモジュール) |
Engine 層(13 crate):
| crate | 役割 |
| — | — |
| app-channel | 最上位 Channels API(AppMsg::*) |
| app | actor-based App エンジンラッパー |
| codec | コンセンサスメッセージエンコーディング(protobuf + カスタム) |
| config | ノード設定(toml/yaml) |
| discovery | peer 発見 |
| engine | actor メインエンジン(Ractor ベース) |
| metrics | Prometheus メトリクス |
| network | libp2p ネットワーク層ラッパー |
| peer | peer 状態管理 |
| proto | protobuf 定義 |
| signing / signing-ecdsa / signing-ed25519 | 署名抽象 + 2 つの curve 実装 |
| sync | ブロック同期(ブロック追跡) |
| wal | Write-Ahead Log(クラッシュリカバリ) |
| engine-byzantine | ビザンチンテスト fuzz スイート |
| test | 共通テストツール |
各 crate は独立して crates.io に publish されており、最小依存で独立している — これは Malachite と CometBFT のエンジニアリングパッケージング上の本質的差異である。開発者は core-consensus + signing-ed25519 のみを import し、network 層と engine 層全体を避けることができる。
1.6 実コード引用(≥15 箇所)
コード引用 1 — コンセンサスステートマシン apply メインエントリ:
// /repos/malachite/code/crates/core-state-machine/src/state_machine.rs:71-79
pub fn apply<Ctx>(
ctx: &Ctx,
mut state: State<Ctx>,
info: &Info<Ctx>,
input: Input<Ctx>,
) -> Transition<Ctx>
where
Ctx: Context,
コード引用 2 — Propose → Prevote 遷移(algorithm L22):
// /repos/malachite/code/crates/core-state-machine/src/state_machine.rs:118-125
// L22 with valid proposal
(Step::Propose, Input::Proposal(proposal))
if this_round && proposal.pol_round.is_nil =>
{
debug_trace!(state, Line::L22);
prevote(ctx, state, info.address, &proposal)
}
各 match arm に Tendermint 論文の line 番号(L11, L18, L22, L28, L32, L36, L57…)が注釈されていることに注意。これは Buchman/Kwon/Milosevic アルゴリズムの pseudo-code を直接 Rust に翻訳したものである。
コード引用 3 — Step 列挙:
// /repos/malachite/code/crates/core-state-machine/src/state.rs:78-95
pub enum Step {
Unstarted, // 未開始
Propose, // 提案を待つ
Prevote, // prevote +2/3 を待つ
Precommit, // precommit +2/3 を待つ
Commit, // 決定済み
}
コード引用 4 — State 構造体(locked / valid / decision を含む):
// /repos/malachite/code/crates/core-state-machine/src/state.rs:98-132
pub struct State<Ctx> where Ctx: Context {
pub height: Ctx::Height,
pub round: Round,
pub step: Step,
pub locked: Option<RoundValue<Ctx::Value>>, // L23-26 locking rule
pub valid: Option<RoundValue<Ctx::Value>>, // L36-43 valid value
pub decision: Option<RoundValue<Ctx::Value>>,
pub scheduled_timeouts: ScheduledTimeouts,
...
}
コード引用 5 — Scheduled Timeouts のビット演算最適化(重複スケジューリング回避):
// /repos/malachite/code/crates/core-state-machine/src/state.rs:36-63
impl ScheduledTimeouts {
const PROPOSE_BIT: u8 = 1 << 0;
const PREVOTE_BIT: u8 = 1 << 1;
const PRECOMMIT_BIT: u8 = 1 << 2;
pub fn check(&mut self, timeout: TimeoutKind) -> bool {
if let Some(mask) = Self::mask(timeout) {
let was_scheduled = (self.bits & mask) != 0;
self.bits |= mask;
!was_scheduled
} else {
debug_assert!(false, "Only Propose, Prevote, and Precommit timeouts should be checked here. Got: {timeout:?}");
false
}
}
}
これは Malachite の細部最適化である:HashSet
コード引用 6 — Quint 仕様の ConsensusState 型(Rust State と同型):
// /repos/malachite/specs/consensus/quint/consensus.qnt:11-20
type ConsensusState = {
p: Address,
height: Height,
round: Round,
step: Step,
lockedRound: Round,
lockedValue: ValueId,
validRound: Round,
validValue: ValueId,
}
Quint と Rust のフィールドは一対一対応している — これは Informal Systems の “co-design” 方法論の具体的表現である:Rust 実装と Quint 仕様は同じ PR 内で同期して進化する。
コード引用 7 — Quint 仕様の ConsensusInput sum type:
// /repos/malachite/specs/consensus/quint/consensus.qnt:40-76
type ConsensusInput =
| NoConsensusInput
| NewRoundCInput(Round)
| NewRoundProposerCInput(Round)
| ProposeValueCInput(NonNilValue)
| ProposalCInput((Round, Value))
| ProposalAndPolkaPreviousAndValidCInput((Value, Round))
| ProposalInvalidCInput
| PolkaNilCInput
| PolkaAnyCInput
| ProposalAndPolkaAndValidCInput(Value)
| ProposalAndPolkaAndInvalidCInput(Value)
| PrecommitAnyCInput
| ProposalAndCommitAndValidCInput((Round, NonNilValue))
| RoundSkipCInput(Round)
| TimeoutProposeCInput((Height, Round))
| TimeoutPrevoteCInput((Height, Round))
| TimeoutPrecommitCInput((Height, Round))
// found after Montebello に注意 — これは Informal Systems が内部でコードネームを付けている Quint 仕様のバージョンであり、Montebello 以降に ProposalAndPolkaAndInvalidCInput が追加された。TODO コメントは「処理方法は議論待ち」と記しており、形式化仕様自体が living document であることを示している。
コード引用 8 — block-streaming の Quint 仕様(part_stream.qnt など 3 つの .qnt ファイル):
/repos/malachite/specs/block-streaming/binary_heap.qnt
/repos/malachite/specs/block-streaming/part_stream.qnt
/repos/malachite/specs/block-streaming/spells.qnt
block-streaming は Malachite 独自の特性である:1 つの大きな block(例えば 1MB)を複数の part に分割し、proposer が libp2p 経由で parts を validators にストリーミングし、validators は受信しながら再構成し、part ハッシュを検証しながら最終 block ハッシュに投票する。これは「伝播 + コンセンサス」のパイプラインを実現し、100 vals + 1MB blocks での 780ms finality の鍵となる。
コード引用 9 — Mempool の actor エントリ:
// /repos/malachite-mempool/fifo-mempool/src/mempool.rs:101-122
pub struct Mempool {
mempool_network: MempoolNetworkActorRef,
span: Span,
config: MempoolConfig,
}
impl Mempool {
pub async fn spawn(
mempool_network: MempoolNetworkActorRef,
config: MempoolConfig,
span: Span,
) -> Result<MempoolActorRef, ractor::SpawnErr> {
let node = Self { mempool_network, span, config };
let (actor_ref, _) = Actor::spawn(None, node, ).await?;
Ok(actor_ref)
}
}
コード引用 10 — Mempool 設定デフォルト値:
// /repos/malachite-mempool/fifo-mempool/src/mempool.rs:42-50
impl Default for MempoolConfig {
fn default -> Self {
Self {
max_txs_bytes: 4 * 1024 * 1024, // 4MB
max_txs_per_block: 100,
max_pool_size: 100000,
}
}
}
ブロック上限 4 MB、ブロックあたり最大 100 tx — Malachite エンジンが自己申告する「1 MB blocks at 780ms」と対応するが、mempool 側は 4 倍のスペースを予約している。コメントには // 100KB とあるが、コード値は 100(個の txs)— これはコメントのバグに見える、ブロックあたり 100 transactions であるべき。
コード引用 11 — Mempool Event / Msg 型代数:
// /repos/malachite-mempool/fifo-mempool/src/mempool.rs:72-93
pub enum Event {
CheckTx { tx: RawTx, reply: CheckTxReply },
}
pub enum Msg {
Subscribe(Box<OutputPortSubscriber<Arc<MempoolEvent>>>),
NetworkEvent(Arc<GossipNetworkEvent>),
Add { tx: RawTx, reply: RpcReplyPort<...> },
CheckTxResult { tx: RawTx, result: Result<...>, reply: CheckTxReply },
Take { reply: RpcReplyPort<Vec<RawTx>> },
Remove(Vec<TxHash>),
}
完全に message-passing actor パラダイム — 共有状態なし;これは ractor (Rust actor framework) の標準インターフェースである。
コード引用 12 — Mempool libp2p ネットワーク層 deps:
# /repos/malachite-mempool/Cargo.toml:15
libp2p = { version = "0.56.0", features = ["macros", "identify", "tokio", "ed25519", "ecdsa", "tcp", "quic", "noise", "yamux", "gossipsub", "dns", "ping", "metrics", "request-response", "cbor", "serde", "kad"] }
注意:tcp + quic + noise + yamux + gossipsub + kad — つまり、従来の TCP ではなく QUIC over UDP を mempool トランスポート層として使用している。これは 2024+ libp2p のトレンドであり、レイテンシ感応型 mempool により適合する。
コード引用 13 — Quint 仕様テストは GitHub Actions で強制:
# /repos/malachite/README.md:14-18
[![Build Status][build-image]]
[![Quint tests][quint-image]] # ← Quint test CI ステータスバッジ
[![MBT tests][mbt-test-image]] # ← モデルベーステスト ステータスバッジ
MBT = モデルベーステスト:Quint 仕様を oracle として、自動的にテストケースを生成し Rust 実装で実行、期待出力と実際の出力を比較する。これは Informal Systems の独自技術である(Cosmos / IBC のために彼らが pioneered)。
コード引用 14 — Apalache と Quint の関係:
// /repos/malachite/specs/consensus/quint/README.md(検索結果)
The Quint language provides an engineer-friendly syntax for writing specifications
and uses Apalache as a backend model checker.
Apalache は Informal Systems が維持する symbolic TLA+ model checker である。Quint → TLA+ に翻訳 → Apalache に投入 → z3 SMT solver で検証する。
コード引用 15 — Engine-byzantine crate(fuzz adversarial behavior):
/repos/malachite/code/crates/engine-byzantine/
この crate 名そのものが証拠である:これは悪意のある行動(二重署名、equivocation、wedge attack)を注入して、f < n/3 仮定の下でのコンセンサスの堅牢性をテストするために専用に存在する。CometBFT 内部にも類似のテストはあるが、独立した crate はない。
コード引用 16 — Signing curve 抽象 trait:
/repos/malachite/code/crates/signing/src/lib.rs (Trait)
/repos/malachite/code/crates/signing-ecdsa/src/lib.rs (ECDSA secp256k1 impl)
/repos/malachite/code/crates/signing-ed25519/src/lib.rs (Ed25519 impl)
Arc が実際に使うのは Ed25519 である(/repos/arc-node/crates/remote-signer/src/client.rs:64-68 の 2 つの const ED25519_*_SIZE_BYTES を参照)。Tendermint/CometBFT は歴史的に Ed25519 を使用してきており、これは慣例である。署名サイズが小さい(64 バイト)、検証が速い、定時間でサイドチャネルがないという理由による。
コード引用 17 — WAL(write-ahead log)crate が独立して存在:
/repos/malachite/code/crates/wal/
クラッシュリカバリの鍵となる:validator は vote する前に必ず vote を WAL にディスク書き込みしてからブロードキャストする必要がある、さもなければクラッシュ後に再生して equivocation(二重署名)を引き起こす可能性がある — これは Tendermint のハード要件であり、Malachite では crate として独立しており、これが first-class concern であることを示している。
1.7 Mempool 設計の深読み
malachite-mempool リポジトリの設計哲学は「BFT エンジンは tx が何であるかを全く気にしない」である。3 つのサブ crate:
- fifo-mempool:最もシンプルな FIFO、tx がプールに入った順番でブロックを生成;
- libp2p-network:gossipsub ベースのネットワーク層;
- host-integration:mempool と Malachite engine のグルー、
AppMsg::GetValue実装時に mempool から tx を取得;
mempool フロー(/repos/malachite-mempool/README.md の sequence diagram を参照):
Endpoint → Mempool: Add { tx, reply }
Mempool プールサイズチェック → 満杯なら MempoolFull を返す
Mempool → AppActor: CheckTx { tx, reply } // 上位 app に tx 検証させる
AppActor デシリアライズ + 検証 → CheckTxOutcome を返す
outcome.is_valid == true の場合:
Mempool 重複排除(tx_hash で)→ 重複なら TxAlreadyExists を返す
そうでなければ VecDeque に追加 → libp2p gossip でブロードキャスト
outcome.is_valid == false の場合:tx はプールに入らないが、caller には Success を返す
主要な設計ポイント:
- CheckTx は callback:mempool は EVM 検証を内蔵せず、tx を app 層に投げ返す(Arc では = arc-node)。RLP デコード + signature recovery + nonce チェックを行う;
- ネットワーク経由で受信した tx は re-gossip しない:ブロードキャスト嵐を避ける;
- 各 tx を個別ブロードキャスト(バッチなし):コメントには明確に「currently gossiped individually without batching optimization」と記載、既知の最適化ポイント;
- エラー粒度が細かい:3 種類の MempoolError バリアント、上位スケジューリングが容易;
mempool の制約:FIFO + 4MB max — MEV と priority fee market を全く意識していない。Arc が高頻度の金融シナリオを目指すなら、将来的に priority queue + reorg-safe ordering の実装に置き換える必要がある。
1.8 形式検証(TLA+ / Quint / Apalache / MBT)
Malachite の形式検証スタックは co-design パラダイムの模範である:
Quint — Informal Systems が 2023 年にオープンソース化、TLA+ ベースだが構文は TypeScript に近い:
- 型:sum types、records、tuples、sets、maps;
- 操作:actions、temporal operators([], <>, ~>);
- バックエンド:TLA+ にコンパイル、Apalache に投入して symbolic model checking を行う;
Malachite の Quint 仕様分布:
| パス | 内容 |
|---|---|
specs/consensus/quint/types.qnt |
コンセンサス型定義 |
specs/consensus/quint/consensus.qnt |
単一ノードコンセンサスステートマシン(≈ Rust core-state-machine) |
specs/consensus/quint/votekeeper.qnt |
投票カウンター(≈ Rust core-votekeeper) |
specs/consensus/quint/statemachineAsync.qnt |
マルチノード非同期合成 |
specs/consensus/quint/TendermintDSL.qnt |
Tendermint 特有の DSL helper |
specs/consensus/accountable-tm/accTypes.qnt |
accountable Tendermint 型 |
specs/consensus/accountable-tm/misbehavior.qnt |
悪意のある動作の列挙 |
specs/block-streaming/*.qnt |
block streaming 仕様 |
モデルベーステスト (MBT):Informal Systems が自ら創始した方法、Apalache の反例トレースをテスト入力として扱い、Rust 実装上で実行し、「実装の出力 == Quint の期待出力」をアサートする。これは Malachite に「カバレッジは定義できないが、パスを体系的に探索する」テストパラダイムを提供する — 従来の unit test を大きく超える。
形式検証全体の利益:Malachite は alpha 段階(README には明確に「独立監査未実施」と記載)で Arc production に投入する勇気がある。その理由の一部は、この co-design 検証にある — CometBFT は後付けで TLA+ 仕様を補完したもので、コード進化に遅れている。
2. arc-node 完全コードウォークスルー
2.1 25 個の Rust crate 完全列挙
/repos/arc-node/crates/ ディレクトリ + Cargo.toml workspace members で列挙する:
| # | crate | 役割 | crates.io 名 |
|---|---|---|---|
| 1 | consensus-db | コンセンサス層永続化(ブロック、validator state) | arc-consensus-db |
| 2 | engine-bench | engine 性能 benchmark | (publish なし) |
| 3 | eth-engine | Engine API 互換ラッパー | arc-eth-engine |
| 4 | evm | EVM ファクトリ、handler、log、subcall リライト | arc-evm |
| 5 | evm-node | EVM ノード上位アセンブリ | arc-evm-node |
| 6 | evm-specs-tests | Ethereum execution-spec-tests を実行 | (publish なし) |
| 7 | execution-config | hardfork enum、chainspec、denylist、gas fee、protocol config | arc-execution-config |
| 8 | execution-e2e | エンドツーエンド EVM テスト | (publish なし) |
| 9 | execution-payload | ブロック構築 + payload | arc-execution-payload |
| 10 | execution-txpool | tx pool(Reth txpool 適応) | arc-execution-txpool |
| 11 | execution-validation | ブロック/tx 検証 | arc-execution-validation |
| 12 | malachite-app | Malachite actor app 適応層 | arc-node-consensus |
| 13 | malachite-cli | Malachite CLI | arc-node-consensus-cli |
| 14 | mesh-analysis | mesh ネットワーク分析(libp2p) | arc-mesh-analysis |
| 15 | node | 実行ノードメイン binary | arc-node-execution |
| 16 | precompiles | 5 つのカスタム precompiles + helpers | arc-precompiles |
| 17 | quake | 内部コードネームツール | (publish なし) |
| 18 | remote-signer | gRPC リモート署名 client | arc-remote-signer |
| 19 | shared | 共有ツール | arc-shared |
| 20 | signer | ローカル署名 + リモート署名抽象 | arc-signer |
| 21 | signing | (Malachite signing ブリッジ) | (workspace 未登録) |
| 22 | snapshots | スナップショット(archive node) | arc-snapshots |
| 23 | spammer | テスト tx spam ツール | (publish なし) |
| 24 | test | テストツール(checks + framework の 2 つの sub-crate) | arc-test-framework |
| 25 | types | コンセンサス + 実行のコア型 | arc-consensus-types |
| 26 | version | バージョン情報 | arc-version |
注:v1 レポートでは「~25 個の crate」とあったが、実測でディレクトリ数は 26 個(spammer + test/checks + test/framework を含む)。ただし一部はテスト専用 / 内部ツールで publish しない。外部利用可能な crate ≈ 19 個 が crates.io に publish されている。
2.2 Reth との具体的統合方法
Arc は Reth v1.11.3 を EVM 実行クライアントとして使用する(/repos/arc-node/Cargo.toml:164-187 を参照、約 40+ 個の reth-* 依存はすべて git pin の tag = "v1.11.3")。Reth v1.11.0 は 2026 年初頭にリリースされ、2 つの大きな改善を含む:
- 新しい sparse trie cache:newPayload P50 レイテンシ 42.9ms → 32.4ms、スループット 700M → 1G gas/s;
- --storage.v2 flag:hot/cold storage アーキテクチャ、history インデックス + tx hash lookup を RocksDB にルーティング;
Arc は Reth を fork するのではなく、Reth SDK + カスタムコンポーネント モードを使う(https://reth.rs/sdk/ 参照):
- 実行層:Reth の
revm(Rust EVM)、reth-chainspec、reth-evm、reth-engine-primitivesを再利用; - カスタム precompile provider:
/repos/arc-node/crates/precompiles/src/precompile_provider.rs:43-76を参照、PrecompilesMap::set_precompile_lookup経由で 5 つのカスタム precompile アドレス → DynPrecompile 関数ポインタを登録; - カスタム chain spec:
arc-execution-config::chainspec::ArcChainSpecは Reth のChainSpecをラップし、ArcHardfork enum (Zero3..Zero6) を追加; - カスタム payload builder:
/repos/arc-node/crates/execution-payload/src/builder.rsは Reth のPayloadBuildertrait を実装し、builder 内に denylist と USDC gas ロジックを統合; - カスタム txpool validator:
/repos/arc-node/crates/execution-txpool/は Reth のTransactionValidatortrait を実装し、denylist アドレスからの/への tx を拒否; - コンセンサス層:完全に自前で書く(
crates/malachite-app/+crates/types/)— Malachite が propose/vote/commit を担い、Reth は「ブロック実行マシン」として Malachite にスケジュールされる(malaketh-layered の同じパターンを参照); - Engine API 代替:Arc は malaketh-layered のように Ethereum Engine API(forkchoiceUpdated / getPayload / newPayload)でプロセス間通信するのではなく、Reth を lib として同じ binary に直接 link する —
crates/eth-engine/とcrates/evm-node/を参照。これにより Engine API JWT auth + JSON-RPC シリアライゼーションのオーバーヘッドを回避する。
2.3 カスタム EVM の注入点
/repos/arc-node/crates/evm/src/ には 10 個のファイルがある:
| ファイル | 役割 |
|---|---|
evm.rs |
ArcEvm 構造体、Reth EthEvmContext + カスタム precompiles map をラップ |
executor.rs |
block executor(各 tx 処理 + native coin authority 呼び出し) |
assembler.rs |
block assembler(コンセンサスに提出する前の最終ラップ) |
handler.rs |
revm handler のリライト(subcall にフック) |
frame_result.rs |
フレーム戻り値処理 |
log.rs |
EVM Log と native coin Transfer イベントのブリッジ |
opcode.rs |
opcode 動作のリライト(CALL/CREATE 時に denylist をチェック) |
subcall.rs + subcall_test.rs |
CallFrom precompile の sub-call フレームワーク |
lib.rs |
モジュールエクスポート |
ArcEvmFactory は Arc 自前の EVM インスタンスファクトリで、各 transact_raw は Reth の EvmEnv から開始し、Arc が PrecompilesMap を注入してから revm を通してバイトコードを実行する。この「Reth SDK + Plugin モード」は、Reth 1.0 以降公式が推奨する chain customization パスである。
2.4 実コード引用 (≥20 箇所)
arc-node コード引用 1 — Reth バージョン pin:
# /repos/arc-node/Cargo.toml:164-180
reth-basic-payload-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" }
reth-chainspec = { git = "...", tag = "v1.11.3", default-features = false }
reth-evm = { git = "...", tag = "v1.11.3", default-features = false }
reth-ethereum = { git = "...", tag = "v1.11.3" }
# ... 約 40 個の reth-* 依存はすべて v1.11.3 に pin
arc-node コード引用 2 — Workspace lint の厳格度:
# /repos/arc-node/Cargo.toml:20-24
[workspace.lints.clippy]
arithmetic_side_effects = "deny" # 算術オーバーフロー/トランケートは明示的に処理する必要がある
cast_possible_truncation = "deny" # デフォルトの as cast は許可しない
collapsible_if = "allow"
unwrap_used = "deny" # unwrap を禁止
この 4 行の設定は Arc プロジェクトの厳粛さを物語る:すべての算術オーバーフローは checked_add / saturating_* を使う必要があり、すべての cast は try_into を使う必要があり、unwrap を禁止する — これは通常の Rust プロジェクトの lint 厳格度を遥かに超える。
arc-node コード引用 3 — PrecompileProvider が 5 つの precompiles を登録:
// /repos/arc-node/crates/precompiles/src/precompile_provider.rs:43-75
pub fn create_precompiles_map(spec: SpecId, hardfork_flags: ArcHardforkFlags) -> PrecompilesMap {
let base_precompiles = Precompiles::new(PrecompileSpecId::from_spec_id(spec));
let mut precompile_map = PrecompilesMap::from_static(base_precompiles);
precompile_map.ensure_dynamic_precompiles;
precompile_map.set_precompile_lookup(move |address: &Address| match *address {
NATIVE_COIN_AUTHORITY_ADDRESS => Some(DynPrecompile::new_stateful(
PrecompileId::Custom("NATIVE_COIN_AUTHORITY".into),
move |input| run_native_coin_authority(input, hardfork_flags),
)),
NATIVE_COIN_CONTROL_ADDRESS => Some(DynPrecompile::new_stateful(
PrecompileId::Custom("NATIVE_COIN_CONTROL".into),
move |input| run_native_coin_control(input, hardfork_flags),
)),
SYSTEM_ACCOUNTING_ADDRESS => Some(DynPrecompile::new_stateful(...)),
PQ_ADDRESS => {
if !hardfork_flags.is_active(ArcHardfork::Zero6) { return None; }
Some(DynPrecompile::new_stateful(
PrecompileId::Custom("PQ".into),
move |input| run_pq(input, hardfork_flags),
))
}
_ => handle_unknown_precompile(address),
});
precompile_map
}
注意 PQ precompile は Zero6 hardfork ゲートを受ける — テストネット開始時は未有効、後期のハードフォークで有効化される。
arc-node コード引用 4 — 5 つの precompile アドレス(Solidity 視点):
// /repos/arc-node/contracts/src/Precompiles.sol:21-27
library Precompiles {
address internal constant NATIVE_COIN_AUTHORITY = 0x1800000000000000000000000000000000000000;
address internal constant NATIVE_COIN_CONTROL = 0x1800000000000000000000000000000000000001;
address internal constant SYSTEM_ACCOUNTING = 0x1800000000000000000000000000000000000002;
address internal constant CALL_FROM = 0x1800000000000000000000000000000000000003;
address internal constant PQ = 0x1800000000000000000000000000000000000004;
}
5 つの precompile は共通の 0x1800…00XX 接頭辞を持ち、Ethereum メインネット precompiles (0x01-0x09 + 0x0A + 0x100 + 0x101) とも、OP Stack (0x4200...) とも衝突しない。
arc-node コード引用 5 — Native Fiat Token (USDC) アドレス:
// /repos/arc-node/crates/precompiles/src/helpers.rs:31-32
pub const NATIVE_FIAT_TOKEN_ADDRESS: Address =
address!("0x3600000000000000000000000000000000000000");
USDC(native gas token として)の特別なアドレス 0x3600...0000。このアドレスは ERC-20 コントラクトではなく、Arc ノードプロトコル層で「ネイティブコイン」として認識される。USDC と native coin の「linked interface」設計は Celo から借用したものである(/repos/arc-node/README.md:207-208 acknowledgements を参照)。
arc-node コード引用 6 — Hardfork 列挙:
// /repos/arc-node/crates/execution-config/src/hardforks.rs:27-36
hardfork!(
#[derive(serde::Serialize, serde::Deserialize, Default)]
ArcHardfork {
Zero3, // v0.3 hardfork, align to Ethereum Prague
Zero4, // v0.4 hardfork, align to Ethereum Prague
Zero5, // v0.5 hardfork, align to Ethereum Prague
#[default]
Zero6, // v0.6 hardfork
}
);
2026-05 時点で、Arc が公開する hardforks は Zero3 / Zero4 / Zero5 / Zero6(v0.3 - v0.6)であり、すべて Ethereum Prague hardfork 以上にアライメントされている(つまり EIP-7702 EOA プロキシ、EIP-2935 historical block hashes などはデフォルトで有効)。Zero6 が default で、テストネットで現在有効な hardfork である。
arc-node コード引用 7 — ArcHardforkFlags feature-flag モード:
// /repos/arc-node/crates/execution-config/src/hardforks.rs:83-93
/// Feature-flag style hardfork information for EVM level.
///
/// Each hardfork can be independently enabled without implying other hardforks.
/// This allows different networks to have different hardfork activation orders.
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct ArcHardforkFlags {
zero3: bool,
zero4: bool,
zero5: bool,
zero6: bool,
}
コメントには「different networks to have different hardfork activation orders」とある — これは testnet / mainnet / devnet がそれぞれ異なる hardfork 順序を持てるエンジニアリング上の柔軟性を予約するものである。Arc Zero6 は Ethereum Prague と SpecId を強制バインドしない。
arc-node コード引用 8 — EIP-1559 base fee の Arc 改造:
// /repos/arc-node/crates/execution-config/src/gas_fee.rs:22-48
/// Computes the parent gas used value using Exponential Moving Average (EMA) smoothing.
/// This is fed into an EIP-1559 style base fee calculation.
pub fn determine_ema_parent_gas_used(
smoothed_parent_gas_used: u64,
raw_block_gas_used: u64,
alpha: u64,
) -> Option<u64> {
// (1-α) * G[t-1] + α * G[t]
// α is expressed as an integer value [0, 100]
let a = alpha as u128;
let raw = raw_block_gas_used as u128;
let smoothed = smoothed_parent_gas_used as u128;
let complement = ALPHA_MAX - a;
let left = complement.checked_mul(smoothed)?;
let right = a.checked_mul(raw)?;
let together = left.checked_add(right)?;
u64::try_from(together / ALPHA_MAX).ok
}
重要な発見:Arc は Ethereum の EIP-1559 base fee 計算式(前ブロックの gas used 単一値で調整)を直接使うのではなく、EMA (Exponential Moving Average) スムージングを導入している。α=100 のとき Ethereum と等価;α<100 のときは長期的にスムーズになり、1559 が突発スパイク後に base fee が激しく振れることを避ける。これは金融 stablecoin ユースケースに合理的な改造である — gas 価格の変動が大きすぎると少額支払いの予測可能性に影響する。
arc-node コード引用 9 — Arc base fee 計算関数:
// /repos/arc-node/crates/execution-config/src/gas_fee.rs:65-80
const ARC_BASE_FEE_FIXED_POINT_SCALE: u128 = 10_000;
pub fn arc_calc_next_block_base_fee(
gas_used: u64,
gas_limit: u64,
base_fee: u64,
k_rate: u64, // 2500 => 25%
inverse_elasticity_multiplier: u64, // 7500 => 75%
) -> u64 {
let gas_target_u128 =
gas_limit as u128 * inverse_elasticity_multiplier as u128 / ARC_BASE_FEE_FIXED_POINT_SCALE;
let gas_target = u64::try_from(gas_target_u128).unwrap_or(u64::MAX);
// ...
}
Arc は EIP-1559 の 1/8 adjustment factor を設定可能な k_rate / inverse_elasticity_multiplier に変更している、固定小数点比率は 10000。これは、Arc が 1559 のような全網アップグレードを必要とせずに hardfork で base fee 応答感度を調整できることを意味する。
arc-node コード引用 10 — SLH-DSA PQ precompile アドレス + 基本 gas:
// /repos/arc-node/crates/precompiles/src/pq.rs:34-48
pub const PQ_ADDRESS: Address = address!("1800000000000000000000000000000000000004");
const VERIFY_BASE_GAS: u64 = 230_000;
const GAS_PER_MSG_WORD: u64 = KECCAK256WORD; // 6 gas
230_000 基本 gas — 第 7 章の詳解を参照。
arc-node コード引用 11 — SLH-DSA-SHA2-128s FIPS 205 定数:
// /repos/arc-node/crates/precompiles/src/pq.rs:81-83
// SLH-DSA-SHA2-128s constants from FIPS 205
const VK_LEN: usize = 32;
const SIG_LEN: usize = 7856;
FIPS 205 標準定義を直接引用。SLH-DSA-SHA2-128s パラメータセット:security level 1 (~128 ビット)、small signatures variant;公開鍵 32 バイト、署名 7,856 バイト(ECDSA secp256k1 の 65 バイトと比べて 120 倍)。
arc-node コード引用 12 — SLH-DSA Rust crate 引用:
// /repos/arc-node/crates/precompiles/src/pq.rs:32
use slh_dsa::{signature::Verifier, Sha2_128s, Signature, VerifyingKey as SlhDsaVerifyingKey};
# /repos/arc-node/crates/precompiles/Cargo.toml:39
slh-dsa = "0.2.0-rc.4"
Arc は RustCrypto の slh-dsa 0.2.0-rc.4 を使う — この crate は独立監査されていない(https://github.com/RustCrypto/signatures/tree/master/slh-dsa の README:”This implementation has not been independently audited” を参照)が、FIPS 205 テストベクターに厳密に従ってテストされている。Arc 自身も pq_test_vectors.rs でテストベクターを維持している。
arc-node コード引用 13 — Native coin precompile の Solidity interface 定義:
// /repos/arc-node/crates/precompiles/src/native_coin_authority.rs:127-156
sol! {
interface INativeCoinAuthority {
function mint(address to, uint256 amount) external returns (bool);
function burn(address from, uint256 amount) external returns (bool);
function transfer(address from, address to, uint256 amount) external returns (bool);
function totalSupply external view returns (uint256 supply);
}
event NativeCoinMinted(address indexed recipient, uint256 amount);
event NativeCoinBurned(address indexed from, uint256 amount);
event NativeCoinTransferred(address indexed from, address indexed to, uint256 amount);
/// ERC-20 Transfer event (EIP-7708), used under Zero5 for native coin transfers
event Transfer(address indexed from, address indexed to, uint256 value);
}
注意 EIP-7708 — Arc が導入した ERC-20 Transfer event 互換性提案である。Zero5 hardfork 以降、ネイティブ USDC mint/burn は NativeCoinMinted カスタムイベントではなく標準 ERC-20 Transfer(from=0x0, to=...) を発行し、すべての EVM インデクサ(Etherscan、Dune、TheGraph など)が USDC 転送を直接認識できるようにする。
arc-node コード引用 14 — Mint precompile の Zero5 ゲーティングとゼロアドレスチェック:
// /repos/arc-node/crates/precompiles/src/native_coin_authority.rs:218-262
if hardfork_flags.is_active(ArcHardfork::Zero5) {
// Zero5+: Skip early gas check - warm/cold pricing makes upfront calculation unreliable
if precompile_input.caller != ALLOWED_CALLER_ADDRESS {
return Err(PrecompileErrorOrRevert::new_reverted(gas_counter, ERR_CANNOT_MINT));
}
} else {
check_gas_remaining(&gas_counter, MINT_GAS_COST)?;
if !is_authorized(...)? {
return Err(PrecompileErrorOrRevert::new_reverted(gas_counter, ERR_CANNOT_MINT));
}
}
check_delegatecall(NATIVE_COIN_AUTHORITY_ADDRESS, &precompile_input, &gas_counter)?;
if hardfork_flags.is_active(ArcHardfork::Zero5) && args.to == Address::ZERO {
return Err(PrecompileErrorOrRevert::new_reverted(gas_counter, ERR_ZERO_ADDRESS));
}
if is_blocklisted(&mut precompile_input.internals, args.to, &mut gas_counter, hardfork_flags)? {
return Err(PrecompileErrorOrRevert::new_reverted(gas_counter, ERR_BLOCKED_ADDRESS));
}
ALLOWED_CALLER_ADDRESS = NATIVE_FIAT_TOKEN_ADDRESS = 0x3600...0000 — つまり、USDC コントラクト自身しか mint を呼び出せない。Zero5 以前は storage slot 経由で allowed_caller を読んでいたが、Zero5 以降は直接アドレスをハードコードしている。
arc-node コード引用 15 — Mint のオーバーフローチェック:
// /repos/arc-node/crates/precompiles/src/native_coin_authority.rs:274-278
let new_total_supply = match current_total_supply.checked_add(args.amount) {
Some(new_total_supply) => new_total_supply,
None => return Err(PrecompileErrorOrRevert::new_reverted(gas_counter, ERR_OVERFLOW)),
};
checked_add で U256 オーバーフローを防ぐ — U256 ≈ 1.16e77 で実際にオーバーフローする可能性は低いが、Arc lint arithmetic_side_effects = "deny" ですべての算術を明示的にチェックすることを強制する。
arc-node コード引用 16 — System Accounting の EMA リングバッファ:
// /repos/arc-node/crates/precompiles/src/system_accounting.rs:50-59
const GAS_VALUES_STORAGE_KEY: StorageKey = StorageKey::new([0,0,...,1]);
/// Ring buffer capacity for historical gas values.
const GAS_VALUES_RING_BUFFER_SIZE: u64 = 64;
64 ブロックのリングバッファに過去 gas データを保存し、EMA base fee 計算に使う。各ブロックの storage slot は keccak256(blockNumber % 64 || GAS_VALUES_STORAGE_KEY) で算出する。
arc-node コード引用 17 — System Accounting は SYSTEM_CALLER のみ呼び出し可:
// /repos/arc-node/crates/precompiles/src/system_accounting.rs:61-62, 158
const SYSTEM_CALLER: Address = address!("0x0000000000000000000000000000000000000000");
if precompile_input.caller != SYSTEM_CALLER {
return Err(PrecompileErrorOrRevert::new_reverted(gas_counter, ERR_INVALID_CALLER));
}
0x0 アドレス(ブロック実行時の block executor の system call)のみが gas values を書き込める。通常の tx ではトリガーできない。
arc-node コード引用 18 — Native coin control blocklist storage slot 計算:
// /repos/arc-node/crates/precompiles/src/native_coin_control.rs:127-132
pub fn compute_is_blocklisted_storage_slot(key: Address) -> StorageKey {
StorageKey::new(native_coin_control_config::compute_is_blocklisted_storage_slot(key).0)
}
Solidity mapping(address => bool) のストレージスロット計算式 keccak256(address || slot_position)。
arc-node コード引用 19 — CallFrom の精密な sub-call gas 計算(EIP-150 63/64 規則):
// /repos/arc-node/crates/precompiles/src/call_from.rs:106-112
let available = inputs.gas_limit.checked_sub(overhead).ok_or_else(|| {
SubcallError::InsufficientGas("gas limit below ABI decode overhead".into)
})?;
// EIP-150: forward 63/64ths of available gas to child.
#[allow(clippy::arithmetic_side_effects)]
let child_gas_limit = available - (available / 64);
EIP-150 を厳格に遵守、子コールは親 gas の 63/64 までしか受け取れない — これは Ethereum がリエントランシーとスタック深度爆発を防ぐための設計である。
arc-node コード引用 20 — Validator manager 三層権限:
// /repos/arc-node/contracts/src/validator-manager/PermissionedValidatorManager.sol:33-47
contract PermissionedValidatorManager is IPermissionedValidatorManager, Controller, ValidatorRegisterer, Pausable {
IValidatorRegistry public immutable REGISTRY;
uint64 public constant DEFAULT_VOTING_POWER = 0;
Owner → Controllers → ValidatorRegisterers → Validators 四層権限チェーン:Owner が Controllers を設定し、Controllers が Validator activation を管理し、ValidatorRegisterers が新規 validator の register を担い、DEFAULT_VOTING_POWER = 0 は新規登録された validator がデフォルトでコンセンサスに参加しないことを意味する。これは典型的な Proof-of-Authority (PoA) 設計である — ARC token ホワイトペーパーの「将来 PoA から PoS に切り替える」というロードマップと一致する。
arc-node コード引用 21 — Denylist コントラクトの ERC-7201 storage location:
// /repos/arc-node/contracts/src/Denylist.sol:43-45
bytes32 public constant DENYLIST_STORAGE_LOCATION =
0x1d7e1388d3ae56f3d9c18b1ce8d2b3b1a238a0edf682d2053af5d8a1d2f12f00;
// /repos/arc-node/contracts/src/Denylist.sol:67-70
constructor {
_disableInitializers;
assert(
DENYLIST_STORAGE_LOCATION
== keccak256(abi.encode(uint256(keccak256("arc.storage.Denylist.前期")) - 1))
& ~bytes32(uint256(0xff))
);
}
ERC-7201 namespaced storage — 新しい OpenZeppelin upgradeable proxy パターン(2024 年に標準化)、storage slot 衝突を回避、ERC-1967 (transparent proxy) に比べて多重継承 / diamond パターンに適合する。Arc は Denylist / Pausable / Controller / ValidatorRegisterer のすべてを ERC-7201 で実装している。
arc-node コード引用 22 — Denylist 操作で owner と denylister 役割を分離:
// /repos/arc-node/contracts/src/Denylist.sol:88-101
function denylist(address[] calldata accounts) external onlyDenylister {
address _owner = owner;
DenylistStorage storage $ = _getDenylistStorage;
uint256 _accounts_length = accounts.length;
for (uint256 i = 0; i < _accounts_length; ++i) {
address account = accounts[i];
if (account == _owner) revert CannotDenylistOwner; // governance が自己を封禁することを防ぐ
if (!$.denylisted[account]) {
$.denylisted[account] = true;
emit Denylisted(account);
}
}
}
注意 if (account == _owner) revert CannotDenylistOwner — denylister が owner 自身を封禁してコントラクト制御を失わないようにする。これは細やかなセキュリティ上の配慮である。
2.5 ブロック構造 + シリアライゼーション(SSZ)
Arc のコンセンサスブロック構造 (ConsensusBlock):
// /repos/arc-node/crates/types/src/block.rs:34-43
pub struct ConsensusBlock {
pub height: Height,
pub round: Round,
pub valid_round: Round,
pub proposer: Address,
pub validity: Validity,
pub execution_payload: ExecutionPayloadV3,
pub signature: Option<Signature>,
}
注意:execution_payload 型は alloy_rpc_types_engine::ExecutionPayloadV3 である — つまり標準 Ethereum Engine API v3 payload(EIP-4844 blob support 含む)。
SSZ エンコーディング:Arc は RLP を使わず、SSZ (Simple Serialize) でコンセンサスブロックをシリアライズする。これは Ethereum コンセンサス層(Geth の実行層 RLP ではない)と一致する。証拠:
// /repos/arc-node/crates/types/src/block.rs:90-100
pub fn block_as_ssz_data(block: &ConsensusBlock) -> SszBlock<&'_ ExecutionPayloadV3> {
(
block.height.as_u64,
block.round.as_u32,
block.valid_round.as_u32,
block.proposer.to_alloy_address,
block.validity.is_valid,
&block.execution_payload,
block.signature.map(SszSignature),
)
}
use ssz::Encode; が client.rs:19 に、crate::ssz::{SszBlock, SszSignature} が client.rs:24 にある — つまり Arc のコンセンサス層は SSZ を使い、実行層 payload 内部は具体的な tx に応じて RLP/SSZ を使い分ける。SSZ の利点:Merkleization friendly(各フィールドを独立して hash できる)、light client / state proof に適合する。
3. malaketh-turbo / malaketh-layered
3.1 命名の由来
Malaketh = Malachite + Eth(malach + eth)である。2 つのリポジトリは両方とも Informal Systems 内部の PoC であり、Malachite がどう Reth/Ethereum と統合するかを検証する。2 つの PoC は 2025 年初頭に完成し、Circle に Malachite を Arc に使うエンジニアリング上の確信を与えた。
3.2 turbo と layered の違い
| 次元 | malaketh-turbo | malaketh-layered |
|---|---|---|
| Reth 統合方法 | 直接 link Reth ライブラリを Rust dep として | Engine API JSON-RPC(Reth とプロセス間) |
| 性能 | 10 MB/s(42,000 tx/s シンプル transfer、ローカル 3 vals) | 6 blocks/s(1000 tx/s 入力)、ただし多くは空ブロック |
| ブロック構成 | ディスクから pre-generated tx シーケンスを読む | Reth mempool から取得 |
| 検証モデル | “lazy ledger”(validators は tx を実行せず、順序にのみ投票) | validator は Engine API 経由で Reth に実行検証させる |
| デプロイモデル | 単一 binary(consensus + execution 同プロセス) | 二重 binary(Malachite プロセス + Reth プロセス) |
| docker-compose | なし | 3 Reth + 3 Malachite + Prometheus + Grafana |
turbo モードの重要な洞察:
- コンセンサス層は tx シーケンスのハッシュにのみ投票し、tx execution の結果を検証しない;
- クライアント(RPC node)は finalized ブロックを受け取った後、自分で実行して state を得る;
- 利点:スループット上限が validator の実行速度に制限されない;
- 欠点:異なるクライアントが同じシーケンスを異なる解釈で異なる state を得る可能性がある(execution semantics を標準化する必要がある);
layered モードの重要な洞察:
- 標準 Ethereum スタイル:CL (Malachite) ↔ EL (Reth) via Engine API;
- 利点:Geth / Nethermind など任意の Engine API 互換クライアントと連携可;
- 欠点:性能ボトルネックが Engine API 通信 + Reth mempool→block 変換に出る — README は明確に「Reth does not take all available pending transactions when constructing blocks」と報告、1000 tx/s 入力時に mempool が満杯になる;
Arc が選択するのはどれか? Arc の実際のアーキテクチャは両者の中間:
- turbo と一致:Reth を lib として直接 link(arc-node の Cargo.toml で reth-* がすべて dep として import されている);
- layered と一致:validators は tx を実行(lazy ledger は使わない、金融シナリオは state validity が必要);
したがって Arc は “turbo の物理的レイアウト + layered の意味モデル” のハイブリッドである — 単一 binary で Malachite + Reth を実行するが、validators は ordering vote のみではなく完全な execution を行う。
3.3 性能最適化
malaketh-turbo の 10 MB/s = 1 個の 10 MB ブロック/秒 × 42,000 個の transfer = 単一 transfer ≈ 238 バイト(妥当:21000 gas transfer は RLP エンコードで約 100 バイト、signature + receipt を加えて 200+ バイト)。
しかしこれは simple transfer シナリオである。malaketh-turbo README は自ら認めている:
“if we were using normal EVM traffic with contract calls, the client might fall behind consensus”
つまり EVM contract call こそがボトルネックであり、コンセンサス自体のスループットは問題ではない。
malaketh-layered は 1000 tx/s を安定して処理できないと報告(mempool が満杯になる)。両者の性能差は 40 倍 — 主因はコンセンサスではなく、mempool / payload builder の統合度である。
Arc の実測値、2026-05-13 testnet で公開声明されたスループットは精確な数値がまだ公表されていない(ホワイトペーパーでは「高スループット」とのみ)、v1 レポート overview.md と一致する。
4. arc-remote-signer の深度
4.1 AWS Nitro Enclaves 統合方法
arc-remote-signer は Go 1.25 で書かれた独立マイクロサービスであり、arc-node binary と gRPC で通信する。二重プロセスアーキテクチャを持つ:
Validator (arc-node) ──gRPC:10340──> Proxy ──vsock──> Enclave (Nitro)
│
├── KMS provider
└── Secrets Manager provider
Proxy プロセス(ホスト上で実行):
- SignerService gRPC を公開、ポート 10340;
- リクエストを enclave に転送(vsock virtual socket 経由);
- AWS KMS で鍵を復号、Secrets Manager で設定をプル、attestation ドキュメントをキャッシュ;
- 平文の key material を一切保持しない;
Enclave プロセス(Nitro 内で実行):
- EnclaveService gRPC を公開、ポート 10350(vsock 内のみ到達可能);
- 復号済み秘密鍵を保持(enclave RAM 内のみ);
- Ed25519 署名を実行(BLS support もある);
- NSM (Nitro Security Module) 経由で attestation document を生成、enclave イメージのハッシュを証明;
AWS Nitro Enclaves が提供するもの:
- 完全に隔離された仮想マシン(ネットワーク、永続ストレージ、外部 sysfs なし);
- vsock のみホストと通信;
- ハードウェアレベル attestation(起動イメージを測定);
- KMS との統合:KMS key policy で「Only decrypt for enclave with measurement = X」と設定可能;
詳細は AWS 公式ドキュメント https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave.html を参照。
4.2 四層エンベロープ暗号化
README には:”Four-layer key protection (validator key → data key → KMS key → enclave key)” とある。
具体的意味の解釈(AWS Web3 blog https://aws.amazon.com/blogs/web3/aws-nitro-enclaves-for-running-ethereum-validators-part-1/ に基づく):
- L1 - validator key:実際の Ed25519 秘密鍵(32 バイト)、Malachite コンセンサス投票の署名に使う;
- L2 - data key:AES-256 対称鍵、DynamoDB 内の L1 を暗号化;
- L3 - KMS key:AWS KMS マスター鍵、L2 を暗号化;KMS key policy で enclave attestation measurement とバインドされ、特定の enclave イメージのみが L2 を復号できる;
- L4 - enclave key:enclave 起動時に NSM が生成する一時鍵、attestation document にバインドされる;
暗号化チェーン:L1 (validator key) ← L2 (AES data key) ← L3 (KMS master key) ← L4 (enclave attestation)
L1 を復号するには:
1. Proxy が DynamoDB から暗号文 + L2 暗号文をプル;
2. Proxy が KMS に decrypt リクエストを送信、attestation document(enclave PCR measurements 含む)を添付;
3. KMS が measurements を policy と照合 → L4 enclave key で L2 平文を暗号化して返す;
4. Enclave が受信、自身の L4 で L2 を復号、さらに L2 で L1 を復号;
5. L1 は enclave メモリ内のみに存在し、署名後すぐに使われ、enclave から決して出ない;
4.3 Validator 秘密鍵保護
Arc validator は 2 種類の攻撃に直面する:
- リモート攻撃:ハッカーが SSH / アプリの脆弱性で root を取得 → disk を読む → memory を読む;
- insider 攻撃:AWS 社員 / validator 会社の社員 → root 権限 → enclave 外のすべてを読む;
Nitro Enclave は insider 攻撃を防ぐために専用に設計されている:
- Enclave プロセスの RAM はホストの root では読めない(Nitro ハードウェア隔離);
- sysfs、proc、/dev がない — enclave 内プロセスは外部から trace できない;
- Attestation は AWS Nitro Root Cert で署名 → validator 会社 / Circle ともに偽造不可;
従来の HSM(Hardware Security Module、例えば YubiHSM や Thales nShield)との比較:
- HSM の利点:物理デバイス、FIPS 140-2 Level 3+ 認証、オフラインで制御可能;
- HSM の欠点:単一障害点、スケーラビリティが悪い、調達期間が長い、運用が複雑;
- Nitro の利点:クラウドネイティブ、オンデマンドでインスタンス作成、attestation をプログラマブルに検証、KMS とシームレス統合;
- Nitro の欠点:AWS エコシステム依存、Level 1 sec boundary(HSM Level 3 よりやや弱い);
Circle が Nitro を選ぶエンジニアリング上の意図:任意の Circle 顧客が 1-click で validator ノードを立てられて HSM を購入しなくて済むようにする。validator 参入障壁が下がる → Arc validator セットの分散化が現実的になる。
4.4 リモート署名プロトコル
Proto 定義(/repos/arc-remote-signer/proto/):
SignerService(外部 API、ポート 10340):
- PublicKey → bytes32 — 32 バイト Ed25519 公開鍵を返す;
- Sign(message bytes) → bytes64 — 64 バイト Ed25519 署名を返す;
EnclaveService(内部 API、vsock のみ):
- GenerateKey → KeyId, Ciphertext — 新しい鍵ペアを作成、暗号文を返す(KMS でラップ);
- GetPublicKey(KeyId) → bytes32
- SignMessage(KeyId, message) → bytes64
- GetAttestation → AttestationDoc — CBOR エンコードの NSM attestation を返す;
arc-node 側の client(/repos/arc-node/crates/remote-signer/src/client.rs:55-100 を参照):
pub struct RemoteSignerClient {
client: SignerServiceClient<Channel>, // tonic gRPC
config: RemoteSigningConfig,
metrics: RemoteSigningMetrics,
}
const ED25519_PUBLIC_KEY_SIZE_BYTES: usize = 32;
const ED25519_SIGNATURE_SIZE_BYTES: usize = 64;
TLS:オプションで有効化可能、pem 証明書パスは RemoteSigningConfig で設定、tonic::transport::ClientTlsConfig::new.ca_certificate(...) を使う。Backon crate を retry/backoff に使用(config retry policy)。
4.5 従来 HSM との差異
| 次元 | 従来 HSM (YubiHSM 2 / Thales nShield) | AWS Nitro Enclaves |
|---|---|---|
| 物理形態 | ハードウェアデバイス(USB/PCIe/ネットワーク) | 仮想マシン隔離(クラウドネイティブ) |
| 認証 | FIPS 140-2 Level 3+ | “ハードウェアレベル隔離”、単一の FIPS 等級なし |
| リモート attestation | 一部サポート(PKCS#11) | CBOR 形式、ネイティブサポート |
| 弾性スケール | 困難(調達期間、固定容量) | EC2 をオンデマンド起動、分単位 |
| 単価 | $650-$30,000+ | EC2 インスタンス + 少量の enclave オーバーヘッド |
| プログラミングモデル | PKCS#11 API(C 標準) | gRPC + vsock(アプリケーション層フレンドリー) |
| 耐量子準備 | 部分的サポート(ファームウェア依存) | ソフトウェアアップグレード可能、Arc はすでに SLH-DSA precompile を統合 |
| 適用シナリオ | 高コンプライアンス、政府金融 | 公開チェーン validator、Web3 大規模デプロイ |
Arc が HSM ではなく Nitro を選ぶ = スケーラビリティと運用柔軟性を優先、わずかな物理セキュリティ等級を犠牲にする。stablecoin チェーン validator にとってこれは妥当な tradeoff である。
5. arc-stablecoin-fx
5.1 重要な発見:リポジトリはほぼ空
ls を見ると、このリポジトリにはREADME.md しかない、README は計 1 行:
”# arc-stablecoin-fx — This sample app demonstrates stablecoin FX swaps between USDC and EURC using the App Kit Swap SDK on Arc.”
これが意味するのは:
1. arc-stablecoin-fx は Arc 自体のプロトコルコンポーネントではない、sample app デモンストレーションである;
2. 実際のコードはまだ公開されていない(2026-05-13 時点、リポジトリは placeholder ステータス);
3. FX swap ロジックは Circle App Kit Swap SDK が提供し、オンチェーンネイティブプロトコルではない;
5.2 推測されるオンチェーン FX swap 設計
Arc ホワイトペーパー + 上記 placeholder に基づくと:
- 資産:USDC(すでに native)+ EURC(Circle のユーロ stablecoin)+ 未来の JPYC(潜在的);
- 取引モデル:sample app レベルでは SDK 呼び出し、オンチェーンでは order book ではなく AMM (Automated Market Maker) の可能性が高い —— Arc が sub-second finality と deterministic execution を強調するため、AMM パスがより適合する;
- KYB-only アクセス:Arc 商業ホワイトペーパーでは FX module アクセスは KYB(Know-Your-Business)と述べている、つまりコンプライアンス審査を通過した企業アドレスのみが FX swap 関数を呼び出せる → 実装パスは denylist + permissioned caller 検証;
5.3 従来外国為替市場との対接
従来の FX 市場(EBS、Refinitiv、CME FX など)の特徴:
- 24/5 営業(週末閉場);
- 主な参加者:BIS 中央銀行、Tier-1 銀行、ヘッジファンド、prime broker;
- 価格:spot + forward + swap + option;
- 決済:T+2(spot)、CLS Bank ネット決済;
Arc stablecoin FX が置き換えようとするもの:
- T+2 → 即時:オンチェーン finality は 1s 以内;
- CLS ネット → atomic swap:原子的 USDC↔EURC 交換;
- 銀行間専属 → 任意の KYB 企業:参入障壁の大幅な低下;
しかし短期的に Arc は伝統的 FX を完全に置き換えることはできない —— オンチェーン流動性は依然として EBS などの主流オンサイト市場(日次 $5+ trillion)と比べて大幅に少ない。Arc の本当のポジショニングは「クロスボーダー企業 stablecoin 支払いの FX leg のためのオンチェーン settlement 層」である。
5.4 AMM vs Order Book
AMM の場合、考えられるのは:
- Uniswap V3 集中流動性曲線(stablecoin-stablecoin の低スリッページペアに適合);
- Curve StableSwap invariant(同価値資産専用設計);
Order Book の場合、必要なのは:
- オンチェーン order book コントラクト(gas が重い、Arc の sub-second finality が一部緩和するが gas では依然制限される);
- もしくはオフチェーン order book + オンチェーン settlement(0x V4 / dYdX V3 のようなモデル);
最も可能性の高い設計:オフチェーン RFQ (Request-For-Quote) を Circle App Kit がマッチング → オンチェーン atomic settlement。これは Circle 既存の Cross-Chain Transfer Protocol (CCTP) + Gateway の中央集権アーキテクチャ哲学と一致する。
6. arc-nanopayments
6.1 マイクロペイメントシナリオ
arc-nanopayments は Next.js のデモアプリで、AI agent + ストリーミング支払いをデモする。フロー:
- Seller:HTTP API を提供するサービス側、エンドポイントは x402 プロトコルで保護(
HTTP 402 Payment Requiredを返す); - Buyer:LangChain agent(deepagents npm package ベース)、自動的にいつどこで pay するかを決定;
- Gateway:Circle の Gateway サービス、buyer のオフライン署名権限を一括収集、定期的にオンチェーンで集約 settlement(sub-cent 支払いを経済的に実現可能にする);
- 支払い token:USDC、Arc testnet 上;
サンプルエンドポイント価格(README 表):
| エンドポイント | 価格(USDC) | 説明 |
|---|---|---|
/api/premium/quote |
$0.001 | 1 つの引用 |
/api/premium/dataset |
$0.01 | JSON データセット |
/api/premium/compute |
$0.0003 | テキスト分析 |
/api/premium/agent-task |
$0.03 | 宝探しタスク |
$0.0003 という千分の三セントレベル — 従来の支払い(Stripe、クレジットカード)の 1 件あたり最低料金よりも 100 倍以上低い → 完全に実現不可能。ストリーミング集約後、Gateway 経由で一括 settlement することで初めて経済的になる。
6.2 プロトコル設計:x402
x402 プロトコル(Coinbase と Cloudflare が共同推進、2025 年の提案):
- HTTP/1.1 RFC 7231 で予約されている
402 Payment Requiredステータスコード(1997 年から予約され今日まで未使用)を再利用; - Server は未払いリクエストに対して 402 + 支払い要求ヘッダ(chain id、token、amount、recipient を指定)を返す;
- Client は 402 を見て → USDC transfer 権限に署名 → リトライリクエストのヘッダに署名を添付;
- Server が署名を検証 → コンテンツを返す;即時決済、もしくはバッファリング後 batch も可;
なぜ USDC + ERC-2612 Permit / Permit2 を使うか?
- ERC-2612 Permit:USDC がオフチェーン署名権限をサポート(1 度の署名で N 件の権限);
- Permit2 (Uniswap):アップグレード版 universal token approval;
- Buyer は approve トランザクションを先に送信する必要がない(gas + レイテンシ節約);
2026-03 時点で、x402 プロトコルのデータ:
- 119M+ transactions on Base;
- 35M+ on Solana;
- ~$600M 年率換算ボリューム;
- $0 プロトコル料金;
- 連盟メンバー:Coinbase + Cloudflare + Google + Visa(x402 Foundation);
詳細は https://docs.cdp.coinbase.com/x402/welcome と https://www.x402.org/ を参照。
6.3 Lightning Network との比較
Bitcoin Lightning Network はもうひとつのストリーミング支払いソリューション:
| 次元 | x402 (Arc + Gateway) | Lightning Network |
|---|---|---|
| 基盤 | EVM stablecoin (USDC on Arc/Base/etc) | Bitcoin Layer 2 |
| 支払い単位 | USDC(fiat-stable) | sat (Bitcoin) |
| チャネル開設 | 不要、各権限独立署名 | チャネル開設要(オンチェーン tx + 資金ロック) |
| ルーティング | 中央集権 facilitator(Gateway または Coinbase) | 分散型 onion routing |
| ストリーミング | batch settlement 経由 | HTLC タイムロックで原子化 |
| 統合 | 標準 HTTP ヘッダ → 任意の Web スタック | Lightning node + LND/CLN ライブラリが必要 |
| AI agent フレンドリー度 | 高(HTTP-native) | 中(Lightning wallet 統合が必要) |
| リアルタイム性 | サーバー検証後に即座配信 | 数秒(ルートホップ遅延) |
| オンチェーン finality | 最終的に Gateway settlement で 1-N tx をオンチェーン | チャネルクローズ時にオンチェーン |
Lightning は P2P 暗号ネイティブシナリオ(Strike、Bitwise、Cash App)により適合し、x402 は AI agent + Web API により適合する。両者の哲学的差異:Lightning = 分散型ルーティング + マイクロ資金ロック;x402 = 中央集権 facilitator + HTTP-native 体験。
6.4 Buyer agent の設計
arc-nanopayments の buyer 側は LangChain agent である(README に deepagents npm パッケージを使用すると記載):
npm run agent -- --limit 0.5 # USDC 消費上限を設定
npm run agent -- "Buy me a quote at http://localhost:3000/api/premium/quote"
サポート:
- 自然言語指示の解析(LLM がどのエンドポイントを使うか決定);
- USDC 残高 + Gateway 残高の自動チェック + deposit;
- エンドポイント x402 サポート検出;
- 自動支払い + リトライ;
- 消費上限(limit に達したら一時停止 + 人間に allowance 補充を要求);
これは 2026 年の AI agent commerce の典型的パターンである:人間が budget + intent を設定し、agent が自律的にマルチステップ取引(支払いを含む)を完了する。Arc はこのパターンを first-class use case として推進している。
7. 5 つの Precompiles 個別詳解
重要パート。各 precompile 1000+ 字の deep dive。
7.1 NATIVE_COIN_AUTHORITY (0x1800…0000)
Solidity Interface(/repos/arc-node/crates/precompiles/src/native_coin_authority.rs:127-141 を参照):
interface INativeCoinAuthority {
function mint(address to, uint256 amount) external returns (bool);
function burn(address from, uint256 amount) external returns (bool);
function transfer(address from, address to, uint256 amount) external returns (bool);
function totalSupply external view returns (uint256 supply);
}
役割:native USDC の供給を管理する。USDC は ERC-20 コントラクトでデプロイされた token ではなく — Arc チェーンレベルの「ネイティブコイン」(Ethereum 上の ETH に類似する地位)であるが、その mint/burn 権限は精密に制限されている:USDC コントラクト(0x3600…0000)のみがこの precompile を呼び出せる。
Storage layout:
- Slot 1:
ALLOWED_CALLER_STORAGE_KEY— 許可された caller アドレスを保存(Zero5 以前で使用、Zero5 以降はハードコード); - Slot 2:
TOTAL_SUPPLY_STORAGE_KEY— 現在の native USDC 総供給を保存; - 各アドレスの balance は EVM account state に保存(precompile storage 内ではない);
Gas cost 設計:
Pre-Zero5:
// native_coin_authority.rs:65-74 を参照
const MINT_GAS_COST: u64 = 4 * 2100 // 4 個の SLOAD (allowed caller, blocked to, total supply, balance)
+ 2 * 2900 // 2 個の SSTORE (total supply, balance)
+ 1381; // Mint event (2 topics + 32 byte data)
// = 15,581 gas
const BURN_GAS_COST: u64 = ... = 15,581 gas;
const TRANSFER_GAS_COST: u64 = 5*2100 + 2*2900 + 1756 = 18,056 gas;
Zero5+:allowed caller SLOAD をキャンセル(直接アドレスマッチング)、EIP-2929 warm/cold SLOAD 価格を使用(100 / 2100)。実際の gas は access list の状態次第。
呼び出し方法:
- EOA / スマートコントラクトが USDC ERC-20 インターフェース(
transfer(to, amount)など)を呼び出す; - USDC ERC-20 コントラクトが内部で native_coin_authority precompile に delegatecall;
- precompile が
caller == ALLOWED_CALLER (0x3600…0000)を検証 → 通過すれば native balance を更新 + ERC-20 Transfer event を発行;
Wait — 実際は delegatecall ではなく(precompile 内で check_delegatecall が明示的に拒否)、native_fiat_token コントラクトの内部 CALL である。USDC スマートコントラクト自体が ERC-20 インターフェース(balanceOf, approve, allowance)を処理するが、transfer は native_coin_authority precompile の transfer をトリガーする。
セキュリティモデル:
check_staticcall:staticcall での mint/burn/transfer 呼び出しを禁止(view 関数の state-changing 操作の誤呼び出しを防ぐ);check_delegatecall:delegatecall を禁止(caller context のハイジャックを防ぐ);caller != ALLOWED_CALLERで即 revert(authorization);is_blocklisted(to) → ERR_BLOCKED_ADDRESS:native_coin_control と連動;amount == 0 → ERR_ZERO_AMOUNT:ゼロ金額を拒否(Zero5+);to == ZERO → ERR_ZERO_ADDRESS:ゼロアドレスへの mint を拒否(Zero5+);checked_add overflow → ERR_OVERFLOW:U256 加算オーバーフロー保護;
既知の呼び出し履歴:
2026-05-13 testnet 稼働 6+ ヶ月、すべての USDC mint/burn/transfer はこの precompile を経由している。具体的な explorer URL:https://testnet.arcscan.app(arc-nanopayments README に記載)。各 testnet USDC 操作は Transfer(from, to, value) event(Zero5+)もしくは NativeCoinTransferred event(pre-Zero5)を生成する。
7.2 NATIVE_COIN_CONTROL (0x1800…0001)
Solidity Interface:
interface INativeCoinControl {
function blocklist(address account) external returns (bool success);
function isBlocklisted(address account) external view returns (bool);
function unBlocklist(address account) external returns (bool success);
}
役割:チェーンレベルのアドレス封禁リスト。これは Arc と多くの L1 との最も顕著な差異の一つである — OFAC sanction、AML compliance をプロトコル層に組み込んでいる。
Storage:mapping (address => uint256 status)、各 address が 1 slot を占有。Status:
// /repos/arc-node/crates/precompiles/src/native_coin_control.rs:77-78
pub const BLOCKLISTED_STATUS: U256 = U256::from_limbs([1, 0, 0, 0]); // 0x01
pub const UNBLOCKLISTED_STATUS: U256 = U256::ZERO; // 0x00
Storage slot 計算:
// /repos/arc-node/crates/precompiles/src/native_coin_control.rs:128-131
pub fn compute_is_blocklisted_storage_slot(key: Address) -> StorageKey {
StorageKey::new(native_coin_control_config::compute_is_blocklisted_storage_slot(key).0)
}
実装は Solidity mapping(address => bool) の標準 storage slot:keccak256(address_padded_to_32 || slot_position)。
Gas cost:
// native_coin_control.rs:62-74
const BLOCKLIST_GAS_COST: u64 =
PRECOMPILE_SLOAD_GAS_COST // 2100 - read allowed caller
+ PRECOMPILE_SSTORE_GAS_COST // 2900 - write blocklist status
+ BLOCKLISTED_EVENT_GAS_COST; // 1125 - emit Blocklisted event
// = 6,125 gas
pub const IS_BLOCKLISTED_GAS_COST: u64 = PRECOMPILE_SLOAD_GAS_COST; // 2,100 gas (view only)
const UNBLOCKLIST_GAS_COST: u64 = ... = 6,125 gas;
isBlocklisted は極めて安い(2100 gas)— このクエリはすべての native USDC 操作で内部呼び出しされる(各 transfer で from と to が封禁されているか確認する必要がある)ため、gas は低く抑える必要がある。
Solidity コントラクト層(ガバナンス層):
オフチェーンのガバナンスは /repos/arc-node/contracts/src/Denylist.sol 経由で denylist を管理し、以下を含む:
- ERC-7201 namespaced storage;
- onlyDenylister modifier:denylister 役割のみが denylist を変更可;
- addDenylister / removeDenylister:owner のみが管理可;
- CannotDenylistOwner error:owner 自身を封禁不可;
Denylist コントラクトは precompile 経由で EVM 状態に反射:オンチェーンガバナンスコントラクト → blocklist 精密 precompile → BLOCKLISTED_STATUS storage が変化 → 後続のすべての transfer で自動チェック。
呼び出し方法:
- プロトコル自動:各 USDC transfer 内で
isBlocklisted(from)とisBlocklisted(to)を呼び出す; - ガバナンス操作:Denylist コントラクト(チェーン上の特定アドレスにデプロイ)の owner が
denylist(addresses[])で一括追加; - EOA クエリ:誰でも view 呼び出しで
isBlocklisted(addr)可能;
セキュリティモデル:
- チェーンレベル封禁 ≠ 全網トランザクション拒否 — native USDC 操作のみを阻止し、ETH など他の token やコントラクト呼び出しは阻止しない;
- ただし USDC は native gas であるため → denylisted アドレスが gas を支払えない場合、事実上いかなる tx も送信できない → チェーンレベル censorship;
- これは Arc 設計哲学:コンプライアンスのために完全な censorship-resistance を犠牲にする;
- Ethereum メインネットとの比較:チェーンレベル OFAC リストなし、ただし Tornado Cash リスクの下、builder/relayer が自己審査;
- Ethereum 上の USDC との比較:コントラクト層の blacklist は ERC-20 内部ロジック、Arc はプロトコル層まで引き上げ;
呼び出し履歴:testnet 稼働後、ガバナンス操作で Denylist コントラクトがデプロイされた(アドレスは未公開)が、実際の封禁記録は公開されていない。production 段階では OFAC SDN list / FinCEN と協調することが予想される。
7.3 SYSTEM_ACCOUNTING (0x1800…0002)
Solidity Interface:
struct GasValues {
uint64 gasUsed;
uint64 gasUsedSmoothed;
uint64 nextBaseFee;
}
interface ISystemAccounting {
function storeGasValues(uint64 blockNumber, GasValues calldata gasValues) external returns (bool);
function getGasValues(uint64 blockNumber) external view returns (GasValues calldata gasValue);
}
役割:各ブロックの gas 統計をオンチェーンリングバッファに書き込み、base fee スムージング EMA アルゴリズムに過去データを提供する。これは Arc が EIP-1559 を改造する配套基礎施設である。
Storage:
// /repos/arc-node/crates/precompiles/src/system_accounting.rs:50-59
const GAS_VALUES_STORAGE_KEY: StorageKey = StorageKey::new([0,0,...,1]);
const GAS_VALUES_RING_BUFFER_SIZE: u64 = 64;
64 ブロックのリングバッファ:各 slot は keccak256(blockNumber % 64 || GAS_VALUES_STORAGE_KEY) で算出、packed (gasUsed, smoothed, nextBaseFee) を保存、計 24 バイト(3 個の uint64 = 24 バイト、padded して 1 slot 32 バイト)。
各ブロックで 1 回書き込み、各ブロックでリングバッファから 1 回読み込み(EMA smoothing のための parent slot)。
Gas cost:
// system_accounting.rs:155-156
record_cost_or_out_of_gas(&mut gas_counter, PRECOMPILE_SLOAD_GAS_COST)?; // 2100 gas
storeGasValues は約 2100 + 2900 (SSTORE) + 200 (decoder penalty) = ~5,200 gas;getGasValues = 2,100 gas (SLOAD)。
呼び出し方法:
- storeGasValues:
SYSTEM_CALLER (0x0)のみ呼び出し可、つまりブロック処理終了時の block executor の system call; - getGasValues:誰でも view 呼び出し可;通常は base fee 計算ロジック(ブロック実行開始時)と外部モニタリングが呼び出す;
// system_accounting.rs:158-160
if precompile_input.caller != SYSTEM_CALLER {
return Err(PrecompileErrorOrRevert::new_reverted(gas_counter, ERR_INVALID_CALLER));
}
リングバッファ設計のコーナーケース:
コメントには明確に書かれている(system_accounting.rs:81-95):
“Returns ring-buffer slot blockNumber % 64 as-is, without any freshness check. If blockNumber has been rotated out (more than 63 behind the latest written block) or is in the future, the slot holds the last block that mapped to it — i.e. a different block’s values.”
つまり、呼び出し側が blockNumber の鮮度を自分で保証する必要がある。コンセンサス層が EMA を使うときは parent slot(ブロックがちょうど書き込んだもの)のみを読むため、stale データに当たらない。ただし RPC クライアントが直接呼び出す場合は、自身で cross-check する必要がある。これはエンジニアリングレベルの設計トレードオフである:極簡ストレージ + 呼び出し側が正確性を担う。
セキュリティモデル:
SYSTEM_CALLER唯一呼び出し → 通常 tx で gas history を変更されることを防ぐ;check_delegatecall→ delegatecall context のハイジャックを防ぐ;check_staticcall→ storeGasValues は staticcall を拒否;- リングバッファ書き込み時に blockNumber の正当性を検証しない → 呼び出し側(つまり block executor)を信頼;
呼び出し履歴:各ブロック終了時に 1 回 storeGasValues を呼び出す。testnet ジェネシスブロックから 2026-05 まで、約 N×24時間×3600秒 / blocktime 回の呼び出し。testnet explorer で tx type = System Call の internal tx を確認可能。
7.4 CALL_FROM (0x1800…0003)
Solidity Interface:
interface ICallFrom {
function callFrom(address sender, address target, bytes calldata data)
external returns (bool success, bytes memory returnData);
}
役割:allowlisted caller コントラクトが他のアドレスを「偽装」して target に呼び出しを開始することを許可する — つまり msg.sender を上書きする。これは Memo と Multicall3From などの高度なコントラクトの基礎ビルディングブロックである。
Use case:
- Memo:第三者が gas を代払いして message をオンチェーンに書き、メッセージの帰属は relayer ではなく元のユーザーに見える;
- Multicall3From:複数ユーザーの操作をバッチ化 + 各内部 call が依然として元ユーザーの msg.sender;
- これは ERC-4337 Account Abstraction の別の実装パスである — ただし EntryPoint コントラクトではなく precompile を使う;
実装詳細(/repos/arc-node/crates/precompiles/src/call_from.rs:81-128 を参照):
fn decode_child_call(inputs: &CallInputs) -> Result<(CallInputs, u64), SubcallError> {
let decoded = ICallFrom::callFromCall::abi_decode(input_bytes)?;
let sender = decoded.sender;
let target = decoded.target;
let calldata = decoded.data;
// init_subcall overhead: fixed base + per-word charge for the dynamic `bytes data`.
let overhead = abi_decode_gas(calldata.len);
let available = inputs.gas_limit.checked_sub(overhead)?;
let child_gas_limit = available - (available / 64); // EIP-150
let child_inputs = CallInputs {
scheme: CallScheme::Call,
target_address: target,
bytecode_address: target,
known_bytecode: None,
value: CallValue::Transfer(U256::ZERO),
input: CallInput::Bytes(calldata),
gas_limit: child_gas_limit,
is_static: false,
caller: sender, // ← KEY: caller を decoded.sender に上書き
return_memory_offset: 0..0,
};
Ok((child_inputs, overhead))
}
Gas cost:
// call_from.rs:53-59
pub const ABI_DECODE_BASE_GAS: u64 = 100;
pub fn abi_decode_gas(data_len: usize) -> u64 {
let words = (data_len as u64).div_ceil(32);
ABI_DECODE_BASE_GAS.saturating_add(words.saturating_mul(gas::COPY))
}
固定 100 gas ベース + 3 gas per 32-byte word (COPY)。例えば 1 KB calldata → 100 + 32 * 3 = 196 gas overhead、その後 63/64 を子呼び出しに転送。
セキュリティモデル:
- Allowlist gating:コメントには明確に “Access is restricted via the subcall registry’s allowlist — only allowlisted contracts may invoke CallFrom” とある。allowlisted caller になるには、ガバナンスを通過する必要がある;
- Sender trust:sender パラメータは trusted —— allowlisted caller は自身で渡す sender が正しいことを保証する必要がある(通常は受け取った msg.sender);
- Two-phase subcall:SubcallPrecompile trait を実装、init_subcall(子コールフレーム作成)と complete_subcall(子コールリターン後の ABI エンコード)を区別;
Use case 詳例:
Memo コントラクト(/repos/arc-node/contracts/src/memo/Memo.sol を参照):ユーザーが memo をオンチェーンに書く、gas は Relayer が払う。Relayer が Memo.writeMemoFor(user, message, signature) を呼び出し、Memo がユーザー署名を検証 → CallFrom 精密 precompile で emit イベント時 msg.sender = user。
Multicall3From コントラクト(/repos/arc-node/contracts/src/batch/Multicall3From.sol を参照):Uniswap の Multicall3 を拡張、各バッチ項目で異なる from アドレスを指定可能、CallFrom で実装。
呼び出し履歴:testnet 上の Memo と Multicall3From コントラクトがデプロイされた後、この precompile を呼び出す。具体的な explorer URL:https://testnet.arcscan.app — testnet 内で precompile address 0x1800…0003 の incoming calls を確認可能。
7.5 PQ (0x1800…0004) — SLH-DSA-SHA2-128s 耐量子署名
Solidity Interface:
interface IPQ {
/// Verify an SLH-DSA-SHA2-128s signature
/// Gas cost: 230,000 base + 6 per 32-byte word of message (same as KECCAK256)
function verifySlhDsaSha2128s(bytes calldata vk, bytes calldata msg, bytes calldata sig) external returns (bool isValid);
}
役割:オンチェーンで SLH-DSA-SHA2-128s(FIPS 205 標準の耐量子ハッシュ署名)を検証する。
有効化条件:Zero6 hardfork が有効化された後のみ使用可能。pre-Zero6 でこのアドレスを呼び出すと → precompile なしと見なされる(default 0 を返す)。
アルゴリズム背景:
- SLH-DSA = Stateless Hash-Based Digital Signature Algorithm、FIPS 205(2024 年 8 月 NIST 正式リリース);
- SPHINCS+ に基づく、NIST PQC 標準化の「保守的選択」—— セキュリティは下層 hash function の preimage/collision resistance のみに依存(未検証の格密号仮定に依存しない);
- 12 個のパラメータセット、3 つの security level(128 / 192 / 256 ビット);各レベルに SHA2 と SHAKE の 2 種類の hash;各ペアに small (
s) と fast (f) の 2 種類のバリアント; - Arc が選ぶのは SLH-DSA-SHA2-128s:security level 1 + SHA-2 + small signatures variant;
パラメータ(FIPS 205 Table 1):
- 公開鍵:32 バイト
- 署名:7,856 バイト(衝撃的に大きい — ECDSA は 65 バイト、120 倍);
- 署名時間:遅い(多数の hash 呼び出し);
- 検証時間:中程度;
- Stateless:はい(LMS/XMSS hash-based stateful 署名とは異なる);
実装引用:
// /repos/arc-node/crates/precompiles/src/pq.rs:32
use slh_dsa::{signature::Verifier, Sha2_128s, Signature, VerifyingKey as SlhDsaVerifyingKey};
slh-dsa = "0.2.0-rc.4" RustCrypto 実装、独立監査未実施だが FIPS 205 テストベクターで厳密に検証されている。
完全な実行フロー:
// /repos/arc-node/crates/precompiles/src/pq.rs:59-109
precompile!(run_pq, precompile_input, hardfork_flags; {
IPQ::verifySlhDsaSha2128sCall => |input| {
let mut gas_counter = Gas::new(precompile_input.gas);
let args = IPQ::verifySlhDsaSha2128sCall::abi_decode_raw(input)?;
// Step 1: Charge base gas
record_cost_or_out_of_gas(&mut gas_counter, VERIFY_BASE_GAS)?; // 230,000
// Step 2: Charge per-word message gas
let msg_word_gas = (args.msg.len as u64).div_ceil(32) * GAS_PER_MSG_WORD; // 6 per word
record_cost_or_out_of_gas(&mut gas_counter, msg_word_gas)?;
// Step 3: Validate input lengths
const VK_LEN: usize = 32;
const SIG_LEN: usize = 7856;
if args.vk.len != VK_LEN { return Err(...); }
if args.sig.len != SIG_LEN { return Err(...); }
// Step 4: Parse vk and sig
let verifying_key = SlhDsaVerifyingKey::<Sha2_128s>::try_from(args.vk.as_ref)?;
let signature = Signature::<Sha2_128s>::try_from(args.sig.as_ref)?;
// Step 5: Verify
let is_valid = verifying_key.verify(args.msg.as_ref, &signature).is_ok;
Ok(PrecompileOutput::new(gas_counter.used, is_valid.abi_encode.into))
},
});
Gas cost 設計の rationale:
// /repos/arc-node/crates/precompiles/src/pq.rs:42-48
const VERIFY_BASE_GAS: u64 = 230_000;
const GAS_PER_MSG_WORD: u64 = KECCAK256WORD; // 6
230,000 gas の rationale(benchmark crates/precompiles/benches/pq.rs 由来):
- SLH-DSA-SHA2-128s 検証の主な作業量は ~5,000 個の SHA-256 呼び出し(Merkle tree + WOTS+ + FORS 検証の構築);
- SHA-256 precompile の gas は 60 base + 12 per word;
- SLH-DSA 7856-byte 署名検証 ≈ 5000 個の 64-byte SHA-256 計算等価 → 60 + 12×2 ≈ 84 gas per SHA-256;
- 合計:5000 × ~46 = 230,000 gas(保守的見積もり);
- コメントは明確に:”Conservative relative to the SHA-256 precompile’s per-word work anchor”;
実測(pq.rs:266-307 のテストを参照):32-byte message の合計 gas は約 380K — 内訳は 230,006 precompile cost + 7856-byte signature calldata cost(各非ゼロバイト 16 gas、ゼロバイト 4 gas、巨大署名 calldata が主な要因)。
完全な 7856 バイト署名のコスト構造:
| 項目 | gas |
|---|---|
基本 base gas (VERIFY_BASE_GAS) |
230,000 |
32-byte msg word gas (6 × 1) |
6 |
| 32-byte VK calldata(約 32 × 16) | ~512 |
| 7856-byte signature calldata(約 7856 × 16 worst case) | ~125,696 |
| 合計(最悪ケース) | ~356,000 |
| 合計(一部ゼロバイト) | ~370-390K |
署名/検証フロー内部(FIPS 205):
- WOTS+ (Winternitz One-Time Signature):OTS 鍵ペアを構築、message digest に署名;
- FORS (Forest of Random Subsets):few-time hash signature、WOTS+ key のハッシュに署名;
- Hyper-tree of Merkle:H = 63 層 Merkle tree of WOTS+ public keys、各層に 9 個の WOTS+;
- 署名 = WOTS+ sig + FORS sig + 9 × Merkle authentication paths × 63;
- 検証:同じ Merkle tree root を rebuild、pk と比較;
各 hash は SHA-256(128s バリアント)。全体の verify 時間は約 millisecond レベル(CPU)— ただし EVM 内で gas 課金により 230k gas として表現される。
セキュリティモデル:
- 量子安全:SHA-256 の preimage resistance に基づく(量子 Grover アルゴリズムは √N 加速のみ可能、128-bit セキュリティレベルには 256-bit hash が必要);
- NIST 標準化:FIPS 205 最終リリース(2024-08-13)、米国政府が必須使用する耐量子署名の一つ;
- 保守的選択:ML-DSA(FIPS 204 lattice)と比較して、SLH-DSA は将来破られる可能性のある格仮定に依存しない;
- 署名サイズのコスト:7856 バイトは SLH-DSA-SHA2-128s の既に最小バリアント(fast variant
f署名はさらに大きい ~17 KB); - 遅い署名:署名は ~100 万回の hash 呼び出しが必要 → 遅い、高頻度署名シナリオには不向き;
Arc の day-1 統合の運用上の含意:
- 200K+ gas は安くない — 1 個の SLH-DSA verify は 10 回の ECDSA verify の gas コストに相当(ECDSA
ecrecover≈ 3000 gas); - 7856 バイトの署名が calldata の大部分を占める — EIP-4844 blob データでも、1 つの署名のために専用 blob が必要;
- 使用シナリオの位置づけ:通常 tx 署名で ECDSA を置き換えるためではなく(gas が高すぎ)、特定の高価値シナリオ向け:
- 長期保存のオフライン署名(trust setup、protocol upgrade auth など);
- クロスチェーン bridge のマルチシグ(量子到来前の forward-secrecy);
- タイムスタンプ証明(50+ 年でも検証可能であることが要件);
- Arc は day-1 で耐量子署名 verify を統合する極めて少数の公開チェーンの一つ —— 他のチェーンは追加にハードフォークが必要;
7.6 耐量子の工業的意義比較
他の公開チェーンの耐量子ロードマップ:
| 公開チェーン | ステータス | アルゴリズム | 時期 |
|---|---|---|---|
| Arc | day-1 precompile (Zero6) | SLH-DSA-SHA2-128s (FIPS 205) | testnet 2025-10 で既に含む |
| Solana | 提案議論段階 | Winternitz + Lamport | 2024-2025 proposed |
| Ethereum | EIP 探索中 (EIP-7503 quantum recovery) | TBD(ML-DSA または Falcon の可能性) | 2027+ 予測 |
| Bitcoin | BIP-360 quantum address 提案 | SLH-DSA / ML-DSA / FALCON | 2026 SegWit-style soft fork 議論 |
| QANplatform | mainnet 実装済み | CRYSTALS-Dilithium (FIPS 204) | 2024 |
Arc の優位性:耐量子をオプション precompile として提供、アプリケーション開発者が署名アップグレードのタイミングを選べる、全網移行を強制しない。
8. EVM 互換性の深度
8.1 Ethereum mainnet との opcode 差異
Arc EVM の Reth/revm 上での主な差異:
- 5 個の新規 precompile:0x1800…00 から 0x1800…04(前述参照);
- Ethereum すべての標準 opcode を保持:PUSH/POP/ADD/MUL/JUMP/CALL/CREATE/SSTORE/SLOAD などすべて unchanged;
- Ethereum precompiles を保持:0x01 (ECRECOVER) ~ 0x0A (KZG_POINT_EVAL) + 0x100 (P256VERIFY, EIP-7212) すべて保持;
- opcode 動作の微調整(
/repos/arc-node/crates/evm/src/opcode.rs参照):
-CALL/CREATEで value transfer 時に from/to が denylisted かチェック → ERR_BLOCKED_ADDRESS で revert;
- これは native USDC 転送(Ethereum 視点のvalueフィールド)が denylist の影響を受ける;
- 通常の contract call(value なし)は影響を受けない;
8.2 Pre-compile セット
Arc の総 precompile 数:
| アドレス | 名前 | 由来 | gas |
|---|---|---|---|
| 0x01 | ECRECOVER | Ethereum | 3000 |
| 0x02 | SHA256 | Ethereum | 60 + 12/word |
| 0x03 | RIPEMD160 | Ethereum | 600 + 120/word |
| 0x04 | IDENTITY | Ethereum | 15 + 3/word |
| 0x05 | MODEXP | Ethereum | EIP-198 |
| 0x06 | BN256_ADD | Ethereum | 150 |
| 0x07 | BN256_MUL | Ethereum | 6000 |
| 0x08 | BN256_PAIRING | Ethereum | 45000 + 34000/pair |
| 0x09 | BLAKE2F | Ethereum | EIP-152 |
| 0x0A | KZG_POINT_EVAL | Ethereum (EIP-4844) | 50000 |
| 0x100 | P256VERIFY (EIP-7212) | Ethereum (Osaka) | 3450 |
| 0x1800…0000 | NATIVE_COIN_AUTHORITY | Arc | 15,581 |
| 0x1800…0001 | NATIVE_COIN_CONTROL | Arc | 6,125 |
| 0x1800…0002 | SYSTEM_ACCOUNTING | Arc | 5,200 |
| 0x1800…0003 | CALL_FROM | Arc | 100 + COPY |
| 0x1800…0004 | PQ (SLH-DSA) | Arc (Zero6) | 230,000 + 6/word |
P256VERIFY は Arc で SpecId::OSAKA が有効化された後のみ利用可能(precompile_provider.rs の test_p256_precompile_available_with_osaka テストを参照)。
8.3 Gas schedule 差異
| 次元 | Ethereum mainnet (Prague) | Arc |
|---|---|---|
| Base fee 調整 | EIP-1559 単一ブロック 1/8 因子 | EMA smoothing + 設定可能 k_rate |
| Gas target | gas_limit / 2 | gas_limit × inverse_elasticity / 10000(設定可能) |
| Cold/warm SLOAD | EIP-2929 (2100 / 100) | 同 |
| Cold/warm account access | EIP-2929 (2600 / 100) | 同 (Zero6+) |
| EIP-7708 ERC-20 Transfer event | 未有効 | Zero5+ 有効 |
| EIP-7702 EOA delegation | Prague | 同 |
Arc と Ethereum の主要な差異は base fee smoothing — 詳細は 7.2 章の EMA コード引用を参照。
8.4 OP Stack / Arbitrum との EVM 互換性比較
| 次元 | Arc | OP Stack (Optimism / Base) | Arbitrum Nitro |
|---|---|---|---|
| EVM 等価性 | 高(Reth + 5 カスタム precompile) | “EVM 等価”(mainnet bytecode と等価) | “EVM 互換”(少量の opcode 差異) |
| コンセンサス | Malachite BFT (L1) | 単一 sequencer + DA 提出(L2) | 単一 sequencer + 1-block challenge(L2) |
| Finality | 1s (BFT) | ~6 分 (op-batcher submit) | 1 週間 (fraud proof challenge) |
| Native gas token | USDC | ETH | ETH |
| Precompile セット | Ethereum + 5 カスタム | 同 Ethereum + 4200…XX 系列 (L1Block など) | Ethereum + ArbSys + ArbOwner |
| Denylist | プロトコル層 native | アプリケーション層(OFAC list は sequencer がソフトに自己審査) | 同 |
| 耐量子 | day-1 SLH-DSA precompile | なし | なし |
| 実行クライアント | Reth v1.11.3 | op-geth / op-reth | Arbitrum geth (fork) |
Arc の差別化ポイントは EVM-compatible L1 + チェーンレベル compliance + day-1 quantum-ready であり、OP Stack/Arbitrum とは完全に異なる位置づけ(後者は Ethereum 拡張、Arc は独立 L1)。
9. データ可用性 (DA)
9.1 L1 か独立 DA か?
Arc は L1 である:データストレージは完全に Arc 自身の validator 上に存在し、外部 DA 層に依存しない(OP Stack / Arbitrum が calldata を Ethereum L1 に提出するのとは異なる)。
- ブロックデータ:ローカル RocksDB(Reth デフォルト)+ Static Files(Reth 2.0 hot/cold アーキテクチャ);
- WAL:Malachite engine の wal crate;
- コンセンサスブロック(SSZ):consensus-db;
- Tx 履歴:execution-payload;
- State trie:Reth の MDBX → 2.0 以降は RocksDB インデックス + Static Files に変更;
9.2 データストレージコスト
Reth 2.0 性能データ(https://www.paradigm.xyz/2026/04/releasing-reth-2-0)参照:
- Ethereum メインネット full node:240 GB;
- Archive node:static files をマウント可;
- スループット:1.7 Gigagas/s;
Arc の実サイズは testnet のトラフィック次第。初期 testnet ではデータは小さいが、production 後は Ethereum メインネットレベルが予想される。
9.3 Celestia / EigenDA / Avail との関係
2026-05-13 時点で、Arc は外部 DA 層を一切統合していない。
- Celestia:Cosmos SDK + Tendermint ベースの DA-only blockchain;
- EigenDA:EigenLayer restaking ベースの DA サービス;
- Avail:旧 Polygon SDV、2024 メインネット DA L1;
Arc の設計哲学は integrated L1:コンセンサス + データ + 実行が同じ validator セット上にある。これは modular blockchain(Celestia 派)と完全に逆である。
なぜ Arc は外部 DA を使わないのか?
- 金融セマンティック要件:USDC 転送は即時 finality + 完全可監査性を必要とする — 外部 DA は追加の信頼仮定を導入(DA ノードがオフライン化、データが審査されうる);
- コンプライアンス要件:チェーンレベル denylist はすべての取引データが Circle の信頼する validator 上にあることを要件とする、外部 DA 層に渡せない;
- 性能:Malachite は既に 13.5 MB/s を扱える、Celestia の上限と比べて見劣りしない;
- 運用簡素化:単一信頼ドメインは modular スタックよりも監査しやすい;
将来の可能性:Arc を settlement 層として + OP Stack / Arbitrum L2 からの USDC settlement を受け取る — このとき L2 は Ethereum または他の DA を使い、Arc は settlement のみを担う。これは Circle 商業ホワイトペーパーが暗示する方向性である。
10. 耐量子の工業的意義
10.1 NIST 後量子標準化プロセスのタイムライン
- 2016-12 — NIST が PQC 標準化コンペを開始、82 個の候補;
- 2017-12 — Round 1、69 個の algorithm が進出;
- 2019-01 — Round 2、26 個の algorithm;
- 2020-07 — Round 3、7 個の finalists + 8 alternates;
- 2022-07 — 第一弾 4 個 winners 公表:CRYSTALS-Kyber (KEM)、CRYSTALS-Dilithium (signature)、Falcon (signature)、SPHINCS+ (signature);
- 2023-08 — Draft FIPS 203/204/205 リリース;
- 2024-08-13 — Final FIPS 203 / 204 / 205 正式リリース:
- FIPS 203 (ML-KEM) = Kyber、鍵カプセル化;
- FIPS 204 (ML-DSA) = Dilithium、主推奨デジタル署名;
- FIPS 205 (SLH-DSA) = SPHINCS+、保守的代替署名;
- 2025+ — FIPS 206 (Falcon → FN-DSA) は標準化中;
詳細は NIST 公式 https://www.nist.gov/news-events/news/2024/08/nist-releases-first-3-finalized-post-quantum-encryption-standards を参照。
10.2 FIPS 205 / FIPS 204 / FIPS 203 の差異
| 標準 | アルゴリズム | 用途 | 数学的基礎 | 公開鍵サイズ | 署名サイズ | KEM ciphertext |
|---|---|---|---|---|---|---|
| FIPS 203 (ML-KEM) | Kyber | KEM (鍵カプセル化) | Module-LWE | 800-1568 バイト | N/A | 768-1568 バイト |
| FIPS 204 (ML-DSA) | Dilithium | デジタル署名 | Module-LWE + Module-SIS | 1312-2592 バイト | 2420-4595 バイト | N/A |
| FIPS 205 (SLH-DSA) | SPHINCS+ | デジタル署名 | Hash function security | 32-64 バイト | 7856-49856 バイト | N/A |
10.3 SLH-DSA-SHA2-128s と ML-DSA / FALCON の比較
| 次元 | SLH-DSA-SHA2-128s | ML-DSA-44 | Falcon-512(将来 FIPS 206) |
|---|---|---|---|
| Security level | 1 (~128-bit) | 2 (~128-bit) | 1 (~128-bit) |
| 数学的仮定 | Hash function preimage | Module-LWE / Module-SIS | NTRU lattice |
| 公開鍵 | 32 バイト | 1312 バイト | 897 バイト |
| 署名 | 7856 バイト | 2420 バイト | 666 バイト |
| 署名時間 | 遅い (~ms) | 中 (~µs) | 中 (~µs) |
| 検証時間 | 中 (~ms) | 速い (~µs) | 速い (~µs) |
| 量子保守性 | 極めて保守的(SHA-256 のみに依存) | 中(lattice 仮定に依存) | 中(NTRU に依存) |
| FIPS ステータス | final 完了 (FIPS 205) | final 完了 (FIPS 204) | Draft (FIPS 206) |
| 適合シナリオ | 長期保存の署名 / 監査対象 | 通用 ECDSA 代替 | 署名サイズ制約のあるシナリオ |
| 実装複雑度 | 高(Merkle tree + WOTS+ + FORS) | 中(多項式演算) | 高(FFT + Gaussian sampling) |
Arc が SLH-DSA-SHA2-128s を選んだ理由:
- 保守的安全性:SHA-256 のセキュリティのみに依存 — 暗号学界で 20+ 年研究されている;
- 格密号に依存しない:将来ある lattice 問題が破られても(例えばある algebraic structured lattice 攻撃)、SLH-DSA は依然として安全;
- 署名標準化最早:SPHINCS+ は 2017 年には NIST finalist であり、Dilithium よりも 1 年多く実戦検証されている;
- 金融シナリオは長期的な検証可能性が必要:今日署名した USDC FX 取引は、30 年後も検証可能である必要がある;保守的選択がより適合する;
なぜ ML-DSA を選ばないか?
将来追加される可能性がある。SLH-DSA が優先なのは conservativeness のため — ただし 7856 バイトの署名は通常 tx には実用的でない。Arc 後続の hardfork で ML-DSA precompile(gas は ~30,000 と推定)を一般的な耐量子署名として追加する可能性が高い。
10.4 Arc day-1 統合の運用上の含意
署名サイズ:7856 バイト — calldata コスト ~125k gas(最悪 16/byte 非ゼロ);
性能:CPU verify は約 1ms、オンチェーン等価 230k gas。1 USDC = 1 USD、gas 価格 0.01-0.1 USDC → 1 回の verify は約 $0.00023-0.0023;
適合シナリオ:
- ✅ Bridge マルチシグ署名(release 時のみ verify、頻度低い);
- ✅ Protocol upgrade マルチシグ承認;
- ✅ 長期保存の法的文書署名(dual-chain compliance 証明など);
- ❌ 各 tx 署名(gas が倍 + calldata が 100 倍に);
アップグレードパス:Arc は将来の hardfork で以下を追加可能:
- SLH-DSA-SHA2-128f(fast variant、署名はさらに大きいが速い);
- SLH-DSA-SHAKE-128s(SHA-3 ベース);
- ML-DSA-44 / -65 / -87(lattice、通用);
- Falcon-512 / 1024(lattice、コンパクト);
それぞれ新しい precompile アドレス + hardfork gate で追加、Zero6 と同じパターン。
11. Tokenomics コード実装
11.1 ARC token スマートコントラクト
2026-05-13 時点で、arc-node リポジトリ内に ARC token スマートコントラクトのソースコードは公開されていない。ARC token ホワイトペーパー(2026 Q1 リリース)で確認されているもの:
- 初期 supply:10,000,000,000 ARC (100 億);
- インフレ:年率 2-3%(初期、”early diminishing”);
- 60% エコシステム / 25% Circle / 15% 長期備蓄;
- 現在のコンセンサスメカニズム:PoA (Proof-of-Authority) — permissioned validator manager で制御;
- 将来 PoS (Proof-of-Stake) に転換 — ARC token holders のステーキングで制御;
ARC token コントラクトのソースコードは別のプライベートリポジトリにあるか、Arc メインネットと同時にリリースされる可能性が高い。
11.2 インフレメカニズムの実装(推測)
Cosmos / Tendermint 派系チェーンの慣例 + Malachite + Reth 統合の工学的現実に基づき、Arc インフレ実装パスを推測する:
- 各ブロックで固定 mint:block executor の finalize 段階で、reward pool コントラクトに向けて ARC token を mint;
- 年率換算:
tokens_per_block = (initial_supply × annual_inflation_rate) / blocks_per_year; - 逓減曲線:Cosmos 派系がよく使う「年次線形逓減」もしくは「固定 supply に到達したら mint 停止」;
- 実装位置:
crates/execution-payload/src/builder.rsの build_block 段階に高い可能性、Ethereum PoW のblock_reward類似;
11.3 Validator reward 分配
PoA 段階:validator rewards は一時的に Circle がオフチェーンで分配(運用コスト補助)、オンチェーン staking メカニズムなし。
PoS 段階(将来):
- ARC holders が ARC をステーキング → validator に委任を選ぶ;
- 各ブロック reward は stake 比率で active validator + その delegators に分配;
- Validator は commission を収取(通常 5-10%);
- Slashing:double-sign / liveness 失敗 → 一部の stake を焼却;
これは標準 Cosmos / Tendermint PoS モデルである。
11.4 Staking / unstaking フロー
2026-05-13 時点で未実装。PoS 切替時の staking コントラクト設計の予測:
interface IStaking {
function delegate(address validator, uint256 amount) external;
function undelegate(address validator, uint256 amount) external;
function claimRewards(address validator) external returns (uint256);
}
Unbonding period は 14-28 日と推定(Cosmos Hub 類似)、短期 long-range attack を防ぐため。
11.5 ProtocolConfig コントラクト
オンチェーンプロトコルパラメータ管理は /repos/arc-node/contracts/src/protocol-config/ProtocolConfig.sol を参照:
- オンチェーンで owner が設定可能なパラメータ:base fee EMA alpha、k_rate、inverse_elasticity、gas limit など;
ProtocolConfigコントラクトで変更 → ノードプロトコル層で読み取り → 次ブロックの動作に影響;- これによりパラメータ調整のためのハードフォークを回避;
PermissionedValidatorManager も一部 ProtocolConfig 経由で設定(最大 voting power 上限など)、PermissionedValidatorManager.sol:38-46 の VotingPowerExceedsLimit error を参照。
12. セキュリティ監査と Bug Bounty
12.1 監査ステータス
2026-05-13 時点で、Arc リポジトリの README に明記されている:
“Arc is currently in testnet, and this is alpha software currently undergoing audits.”(/repos/arc-node/README.md:17)
Malachite リポジトリも同様:
“Malachite is alpha software and under heavy development. The software is provided ‘as is’ and has not been externally audited; use at your own risk.”(/repos/malachite/README.md:38-40)
2026-05 時点で、Arc / Malachite の最終監査レポートは公開されていない。
12.2 推測される監査ベンダー
業界慣例 + Circle 既往の協業履歴に基づく:
- Halborn:Circle 歴史的協業先(USDC、CCTP 監査);同時に Halborn は OP Stack マルチチェーン監査を発表済み;
- Sigma Prime:Ethereum コンセンサス層の専門家(Lighthouse クライアント開発元)、Malachite 監査に適合;
- OpenZeppelin:スマートコントラクト(Denylist、PermissionedValidatorManager、ProtocolConfig);
- Trail of Bits:基礎 EVM + Reth integration + precompile gas/性能監査;
- Cure53 / Quarkslab:AWS Nitro Enclave + リモート署名監査;
- Informal Systems 自身:内部形式検証 + adversarial testing;
Circle 商業ホワイトペーパーには「複数のトップ監査機関が同時進行」と述べられているが、名指しはない。
12.3 Immunefi bounty pool
Arc と Malachite の Immunefi プロジェクトページは2026-05-13 時点で未稼働。
Circle 既往の bug bounty を参考に:
- USDC:Immunefi の Circle USDC bounty pool ≈ $10M;
- CCTP:bounty pool ≈ $1M;
Arc メインネット稼働前に Immunefi での稼働が予想され、pool 規模は $5-20M(同期メインネット L1 と同等)の可能性。
12.4 脆弱性開示ポリシー
- Malachite:
/repos/malachite/SECURITY.mdを参照; - arc-node:
/repos/arc-node/SECURITY.mdを参照; - arc-remote-signer:
/repos/arc-remote-signer/SECURITY.mdを参照;
すべてのリポジトリで、脆弱性は security@circle.com に報告するよう要件、GitHub 公開 issue で開示してはならない。
12.5 既知の risks
コードレビューに基づく、いくつかの潜在的リスクポイント:
- slh-dsa 0.2.0-rc.4 未監査:RustCrypto 自身が PQ crates すべてが独立監査未実施と宣言 → Arc がそれを precompile としてチェーン層に置く、リスク伝達;
- Malachite alpha + heavy development:コンセンサス層の bug がチェーン halt を引き起こす可能性;
- ProtocolConfig owner key:オンチェーンパラメータが owner 単一 key で制御 — 単点リスク(ガバナンス改善パス:multi-sig + timelock);
- PermissionedValidatorManager owner:現在 PoA 段階、validator セットは Circle owner が制御、任意に追加/削除可 — 完全に信頼前提;
- Native USDC mint:precompile 内
if caller != ALLOWED_CALLER_ADDRESS—— USDC コントラクト自体に脆弱性があれば、無制限 mint リスク; - Mempool naive FIFO:現在の mempool 実装はシンプル、priority fee market ソートなし → MEV リスク(Arc が deterministic finality を強調するが、mempool ソートには影響される);
- Validator key 単 enclave:リモート署名は Nitro を使うが、各 validator は依然として単一 enclave/key — BLS threshold signature や distributed key generation はない;
付録 A. 完全引用源(≥ 40 件)
A.1 GitHub コードリポジトリ
- https://github.com/circlefin/malachite — Malachite consensus engine
- https://github.com/circlefin/arc-node — Arc node メインリポジトリ
- https://github.com/circlefin/malachite-mempool — 独立 mempool リポジトリ
- https://github.com/circlefin/arc-remote-signer — AWS Nitro リモート署名
- https://github.com/informalsystems/malaketh-turbo — Informal Systems PoC(同 codebase, archived under circle)
- https://github.com/informalsystems/malaketh-layered — Engine API based PoC
- https://github.com/circlefin/arc-stablecoin-fx — sample (placeholder)
- https://github.com/circlefin/arc-nanopayments — x402 demo
- https://github.com/paradigmxyz/reth — Reth execution client
- https://github.com/paradigmxyz/reth/releases/tag/v1.11.0 — Reth v1.11.0 release
- https://github.com/farcasterxyz/snapchain — Farcaster Snapchain (Malachite user)
- https://github.com/keep-starknet-strange/madara — Starknet Madara (Malachite user)
- https://github.com/aws-solutions-library-samples/guidance-for-secure-blockchain-validation-using-aws-nitro-enclaves — AWS reference
- https://github.com/RustCrypto/signatures/tree/master/slh-dsa — RustCrypto SLH-DSA 実装
- https://github.com/RustCrypto/signatures/issues/843 — slh-dsa FIPS 205 update issue
- https://github.com/informalsystems/quint — Quint specification language
- https://github.com/ShieldedLabs — Zcash Crosslink (Malachite user)
- https://github.com/getclave/eip-7212 — EIP-7212 P256 reference impl
- https://github.com/daimo-eth/p256-verifier — daimo P256 verifier
- https://github.com/ethereum/RIPs/blob/master/RIPS/rip-7212.md — RIP-7212 spec
A.2 NIST / IEEE / ACM 標準
- https://csrc.nist.gov/pubs/fips/205/final — FIPS 205 (SLH-DSA) 最終
- https://csrc.nist.gov/pubs/fips/204/final — FIPS 204 (ML-DSA)
- https://csrc.nist.gov/pubs/fips/203/final — FIPS 203 (ML-KEM)
- https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.205.pdf — FIPS 205 PDF
- https://www.nist.gov/news-events/news/2024/08/nist-releases-first-3-finalized-post-quantum-encryption-standards — NIST 公告
- https://www.federalregister.gov/documents/2024/08/14/2024-17956 — Federal Register
A.3 学術論文
- https://arxiv.org/abs/1807.04938 — The latest gossip on BFT consensus(Buchman/Kwon/Milosevic 2018)
- https://arxiv.org/pdf/1807.04938 — 上記 PDF
- https://infoscience.epfl.ch/bitstreams/bb494e9a-22aa-43a2-b995-69c7a2cc893e/download — Revisiting Tendermint(EPFL 2024)
- https://eprint.iacr.org/2018/574.pdf — Correctness and Fairness of Tendermint-core Blockchains
- https://arxiv.org/html/2510.01097 — Universally Composable Termination Analysis of Tendermint(2025)
- https://en.wikipedia.org/wiki/SPHINCS%2B — SPHINCS+ 総説
- https://tendermint.com/static/docs/tendermint.pdf — Kwon 2014 original Tendermint paper
A.4 Circle / Informal Systems 公式ブログ
- https://www.circle.com/pressroom/circle-launches-arc-public-testnet — Arc testnet 稼働公告
- https://www.arc.network/blog/introducing-the-arc-token-whitepaper — ARC token whitepaper
- https://www.arc.network/blog/circle-launches-arc-public-testnet — Arc testnet 詳細
- https://www.prnewswire.com/news-releases/informal-systems-announces-malachite-acquisition-by-circle-to-power-new-arc-blockchain-network-302532317.html — Informal Systems 買収公告
- https://informal.systems/blog/cosmos-protocol-design-formalization — Informal 形式化方法 blog
- https://informal.systems/blog/the-most-flexible-consensus-api-in-the-world — Malachite Channels API blog
- https://informal.systems/blog/malachite-decentralize-whatever — Malachite design 公告
- https://informal.systems/blog/tendermint-responsiveness — Tendermint responsiveness blog
- https://interchain-io.medium.com/past-present-future-icf-r-and-d-introducing-informal-systems-e50d14383f05 — Informal Systems 創設史
A.5 Reth / Paradigm
- https://www.paradigm.xyz/2024/05/reth-exex — Reth Execution Extensions
- https://www.paradigm.xyz/2026/04/releasing-reth-2-0 — Reth 2.0 release(2026-04)
- https://reth.rs/sdk/ — Reth SDK ドキュメント
A.6 AWS Nitro
- https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave.html — Nitro Enclaves ユーザードキュメント
- https://docs.aws.amazon.com/enclaves/latest/user/set-up-attestation.html — Attestation フロー
- https://aws.amazon.com/blogs/web3/aws-nitro-enclaves-for-running-ethereum-validators-part-1/ — Ethereum validator + Nitro
- https://aws.amazon.com/solutions/guidance/secure-blockchain-validation-using-aws-nitro-enclaves/ — AWS guidance
A.7 x402 / Coinbase Gateway
- https://docs.cdp.coinbase.com/x402/welcome — x402 公式ドキュメント
- https://www.x402.org/ — x402 standard メインページ
- https://www.coinbase.com/developer-platform/discover/launches/x402 — Coinbase x402 launch
A.8 EIP / プロトコル仕様
- https://eips.ethereum.org/EIPS/eip-7951 — EIP-7951 (P256, supersedes RIP-7212)
- https://eips.ethereum.org/EIPS/eip-7212 — EIP-7212
A.9 Tendermint / CometBFT
- https://github.com/cometbft/cometbft — CometBFT
- https://docs.cometbft.com/v0.38/introduction/ — CometBFT ドキュメント
付録 B. 主要な発見の総括
- Malachite は Quint 仕様と co-designed:Rust 実装と形式化仕様が同じ PR 内で同期進化、CometBFT にはないエンジニアリングパラダイム;
- 5 つの precompiles はすべて stateful:PrecompilesMap::set_precompile_lookup 経由で登録、Ethereum 標準 stateless precompile とは完全に異なる実行モデル;
- SLH-DSA-SHA2-128s precompile day-1 統合:コスト 230,000 gas + 7,856 バイトの署名、Arc を day-1 quantum-ready 公開チェーンの極めて少数の一つにする;
- Arc は Reth SDK + plugin モードを採用、fork はしない:OP Stack の op-geth fork モードとは明確に区別、Reth 2.0 の 1.7 Gigagas/s 性能改善を自前メンテなしで享受;
- EIP-7708 ERC-20 Transfer event for native USDC:すべての EVM インデクサが USDC をシームレスに認識、Celo “linked interface” 以降の標準化試み;
- base fee EMA smoothing:Ethereum 単一ブロック 1/8 adjustment 式を放棄、EMA + 設定可能 k_rate に変更、金融シナリオでの gas 価格急変を回避;
- リモート署名は独立 Go サービス + Nitro Enclave:arc-node Rust binary と gRPC で通信、四層エンベロープ暗号化;
- arc-stablecoin-fx は依然として空の placeholder:FX swap ビジネスロジックは Circle App Kit Swap SDK が提供、オンチェーンネイティブプロトコルは未公開;
- mempool は極簡 FIFO:4MB block / 100 tx per block / 100K pool — 現時点で priority fee market と MEV 処理を未サポート;
- Validator manager 三層権限 + ERC-7201 storage:Owner → Controllers → ValidatorRegisterers、OpenZeppelin 2024 最新パターン;