autorenew
Advent of Bugs #4:Solana AMM スワップにおけるバナナとオレンジの取り違え — u64 型の混同から学ぶ教訓

Advent of Bugs #4:Solana AMM スワップにおけるバナナとオレンジの取り違え — u64 型の混同から学ぶ教訓

ブロックチェーン開発のワイルドな世界では、ミームと何百万ドルものトレードが交差する場面で、ほんの小さなコーディングのミスがスムーズなスワップを滑りやすい地獄へと変えてしまいます。Advent of Bugs #4 へようこそ。これは Accretion team からのホリデーシーズンのリマインダーで、バナナをオレンジのように扱ってはいけない――つまり Solana のスマートコントラクトで base 通貨を quote 資産のように扱ってはいけないという話です。

もし分散型取引所(DEX)をいじったことがあるなら、Automated Market Maker (AMM) が Solana 上での高速なトークンスワップの原動力であることは知っているはずです。しかしこのツイートが示すように、スワップロジックの中に潜むずるいバグが、slippage をチェックせずにトレードを通してしまい、トレーダーが期待より少ないトークンを受け取る結果になる可能性があります。では、バナナ流に分解してみましょう。

バグの中身:u64 がフルーツサラダを隠すとき

問題のコードは一般的な AMM スワップの 4 つのシナリオを扱っています:

  • Buy ExactIn:quote トークン(例:SOL)の入力量を正確に指定し、base トークン(推しのミームコイン)の出力が変動する。
  • Buy ExactOut:特定の出力量を得るために必要な入力を支払う。
  • Sell ExactIn:base の入力で quote の出力が変動する。
  • Sell ExactOut:quote の出力が固定で、base の入力が変動する。

一見すると buy パスは堅牢に見えます — 計算はクリーンで、残高不足や無効なデータに対するエラーハンドリングも適切です。しかし Sell ExactIn のパスを拡大してみると腐敗が見えます:slippage チェックが base 量​quote 量​ を比較していたのです。

こう考えてみてください:レシピがバナナ 5 本を要求しているのに、なぜかオレンジが 5 個あるかどうかをチェックしている。どちらも単なる果物(またはコード上ではどちらも u64 整数)だから、比較はエラーを出しません。本来失敗すべきチェックが通ってしまい、本来より遥かに大きな slippage を許したままスワップが実行されてしまいます。痛い — トレーダーの後悔を招くレシピです。

ツイートの最初の画像にある問題の抜粋はこんな感じです:

slippage チェックで型の不一致がある buy/sell スワップロジックを示す Rust のコードスニペット

二枚目の画像は売り側の影響をさらに深掘りしています:

残高不足や slippage エラーを強調した sell exact in/out パスの詳細な Rust コード

コンパイル時の警告もランタイムのクラッシュも無し――ただ静かに失敗するだけ。しかもこのグレムリンは 3 回​ の監査を潜り抜けました。なぜでしょう?Rust の型エイリアスは u64 を異なる単位として見せかけても何の問題もないかのように振る舞わせるからです。

ミームトークンの世界でなぜ重要か

ミームトークンは Solana の高速性と低手数料に支えられ、バイラルなポンプやコミュニティ主導の DEX(RaydiumOrca のような)を動かしています。しかしこうしたスワップバグが潜んでいると信頼が損なわれます。例えば犬モチーフの新トークンがホットにローンチしたと想像してみてください:トレーダーが大規模な売りを先回りし、slippage がチェックされず、たちまちミームのムーンショットがラグプルっぽく見えてしまう。次の PEPE や WIF を作るブロックチェーン開発者にとって、単位の安全性を無視することは単なる雑さではなく、流動性が漏れる導火線です。

修正:newtypes でラップしてしまおう

Accretion のプロのおすすめはこれです:平凡な u64 エイリアスをやめて、Rust の newtype structs を使いましょう。これはコンパイル時に型の安全性を強制するシンプルなラッパーです。例えば:

rust
#[derive(Debug, PartialEq)]
struct BaseAmount(u64);

#[derive(Debug, PartialEq)]
struct QuoteAmount(u64);

impl BaseAmount {
fn to_u64(&self) -> u64 { self.0 }
// Add ops like add, mul for safe arithmetic
}

これで BaseAmount(5)QuoteAmount(5) を比較しようとすると?コンパイラが「型が不一致です」と言って止めてくれます。バナナはバナナのまま、オレンジはオレンジのまま。小さなリファクタが監査耐性のあるコードに大きな効果をもたらします。

これは単なる理論ではなく、Solana セキュリティのプロたちが現場で実践しているアドバイスです。AMM を監査したりローンチする予定があるなら、Accretion のサービス をチェックしてみてください ― 彼らはトップクラスの監査人を採用しており、バグが噛みつく前に発見します。

まとめ:Solana 開発者への実りある教訓

Advent of Bugs は年に一度の儀式で、祝祭気分と恐怖がいい具合に混ざり合い、プロですら単位を取り違えることがあると教えてくれます。ミームトークンがジョークから巨頭へ進化する中で、堅牢なコードこそコミュニティを繁栄させます。似たような戦場の話があればコメントでシェアしてください — 一緒に未来を監査しましょう。

外では気をつけて、degens。スマートコントラクトでは精密さは任意ではなく、利益とパルプを分ける皮であることを忘れずに。

おすすめ記事

AI Cryptoのマインドシェアは2025年に38%減少、それでもOpentensor・ロボティクス・x402などのサブセクターは爆発的成長 — 次は何が来る?

AI Cryptoのマインドシェアは2025年に38%減少、それでもOpentensor・ロボティクス・x402などのサブセクターは爆発的成長 — 次は何が来る?

2024年12月から2025年にかけてAIの総合マインドシェアは38%減少したものの、x402が81倍、ロボティクスが317%といったように暗号分野のAIサブセクターは急成長中。Opentensorのサブネット、agentic payments、そしてなぜAIが暗号の主要ナラティブであり続けるのかを深掘りします。