この議論を読む前に

Meguri は、「所有」ではなく「循環」を本質とする実験的な通貨コンセプトです。 お金を貯め込むほど価値が減り、人から人へ巡るほど世界全体が豊かになる——そんな「生き物のような通貨」を目指しています。

Meguri の基本的な特徴は:

この思想を数式にしたのが素案の Meguri = ( Σ w(dᵢ) ) × ( ∫ s(t) dt ) × ( − Σ pᵢ log pᵢ ) でした。 距離コスト・時間蓄積・行動の予測困難性(エントロピー)を掛け合わせたものです。

以下の議論では、この素案の問題点を洗い出し、Meguri の世界観を壊さずにより頑健なモデルへ改善する方法を探ります。 用語の詳しい説明は議論の直前にある用語集(アコーディオン)にまとめています。

📖 用語集(クリックで展開)

Meguri(めぐり)
「巡る」に由来する実験的通貨。貯め込むほど弱り、人から人へ移るほど世界全体が元気になる「生き物のような通貨」。
巣(す)Nest
「ウォレット」に相当するが、所有の拠点ではなく通過点。長く留まるほど居心地が悪くなる設計。
デマレージDemurrage
通貨の自然減価。巣に留まっている Meguri が時間とともに滑らかに減少する仕組み。\(B_{t+\Delta}=B_t \cdot e^{-\lambda\Delta}\)
Mana(マナ)
ネットワーク全体に蓄積される「活力」。個人の残高を直接増やすのではなく、全体の元気さを数値化した概念。
ミントMint
新たな Meguri が発行されること。VRF による抽選で非決定的に発生する。「細胞がふっと分裂する」感覚。
エントロピーEntropy
行動パターンの多様性・予測困難性の指標。機械的な行動は低エントロピー、自然な行動は高エントロピー。
Sybil 攻撃
1人が複数の巣を作り別人のふりをする攻撃。Meguri では監視ではなく「不自然な存在が育たない構造」で対策。
VRF
検証可能な乱数生成関数。ランダムな結果を出しつつ、正しく生成されたことを誰でも検証できる暗号技術。
エポックEpoch
スコア計算やミント判定を行う時間の区切り(例:1日、1週間など)。
バケットBucket
エントロピーを測る「分類の器」。少数のカテゴリで Sybil に強い多様性指標にする。
構造導出バケット
取引の金額帯・時間帯・グラフ距離のハッシュからカテゴリを自動決定する方式(Round 7)。
飽和関数Saturation
入力がいくら大きくても出力が上限を超えない関数。各スコア項を [0,1] に収めて1項支配を防ぐ。
環境収容力Carrying Capacity
Mana のターゲット水準。ロジスティック成長モデルで過剰膨張を自動抑制する(Round 8)。
幼生モードLarval Mode
小規模(数十人)の段階で高度な仕組みを無効化し、単純なルールだけで運用する初期フェーズ。
創世期Genesis Season
最初の約3ヶ月間。デマレージ1/10、ミント確率5倍にブースト。初期ユーザーの温室栽培期間。
冬眠モードHibernation
ネットワーク縮小時に Phase を逆行させず、パラメータを保守的に調整する適応メカニズム。
成熟度指標Maturity Index
Phase 遷移のトリガー。連結成分比率・Gini係数・正規化直径・取引速度の4指標の最小値。
Proof of Being
「何をしたか」ではなく「どう存在しているか」を評価する Meguri の根幹思想。
ZK(ゼロ知識証明)
ある事実が正しいことを、内容を明かさずに証明する暗号技術。スコアの内訳を公開せずに済む。
ホメオスタシスHomeostasis
生物が体内環境を一定範囲に維持する仕組み。Global Mana の自己調整メカニズムとして採用。
招待木Invitation Tree
Phase 1 でネットワーク拡張を促す仕組み。招待した人が他ユーザーと取引を始めたとき評価される。
Round 1 — 現行モデルの問題提起
Agent A(数理・機構設計)

まず現行の積モデルを見てほしい。

Meguri = ( Σ w(dᵢ) ) × ( ∫ s(t) dt ) × ( − Σ pᵢ log pᵢ )

これ、構造的に3つの致命的な問題がある。

  • ゼロ崩壊:どれか1項が0に近づくと、他の2項がどれだけ高くても全体が崩壊する。攻撃者にとっては「最も弱い1項だけ潰せばいい」という抜け道になる。
  • 単項支配:逆にどれか1項が上限なしだと、そこだけ極大化して他を無視できる。
  • 単位の不整合:距離項は無次元、時間項は時間の次元、エントロピーは無次元。掛け算すると「時間」の次元の量になるけど、それをスコアやトークン量として使うのは意味論的に破綻してる。
Agent B(攻撃者・実装制約)

同意。攻撃者目線で一番気になるのはエントロピー項

−Σ pᵢ log pᵢ を「取引相手のアドレス」の分布で計算するなら、巣を10個つくって互いに送金するだけでエントロピーは簡単に盛れる。Shannon entropy は「散らばり」を測るだけで「正当性」は測らない。

つまり、Sybilに対して最も弱い項が、Sybil対策の柱になっているという矛盾がある。

Agent A

そう。もう一つ根本的な問題がある。この式が表しているのは何なのか?

  • 残高(ストック)なのか
  • 発行速度(フロー)なのか
  • 評価スコア(ユーティリティ)なのか

Meguriには「滑らかに毎日減る(デマレージ)」と「あるタイミングで非決定的に増える(Mana)」があるのに、この式はどちらの動態も表現できていない。ストックとフローを分離するべきだと思う。

Agent B

それ大事。実装の観点でも、1つのモノリシックな式を毎ブロック評価するのは重い。分離すれば:

  • デマレージは残高に対して連続的に適用(オンチェーンで軽量)
  • スコア計算はエポック単位でまとめて処理(オフチェーンでも可)
  • ミント判定は1回の抽選(VRFで検証可能)

こうすれば計算負荷が分散できるし、各層を独立にチューニングできる。

Round 2 — ストック層(デマレージ)
Agent A

まずストック層。これはMeguriの世界観の「巣に留まるほど弱る」をそのまま式にする。

B[t+Δ] = B[t] · exp(−λΔ) + Mint[T]

指数減衰で滑らかに毎日少しずつ減る。λ が減衰率で、大口保有者ほど絶対量が速く減る(率は同じだけど量は多い)。

ここは比較的シンプルだし、既存のデマレージ通貨(Freicoin等)の知見も使える。

Agent B

攻撃者視点で言うと、デマレージから逃げるために「直前に全額送金→受け取り→また送金」で残高をリセットしようとする人が出る。

でもこれは「巡っている」こと自体だから、Meguriの世界観では問題ない、むしろ望ましい挙動かもしれない。

ただし自分の別巣に送って戻すだけの「洗浄ループ」は潰す必要がある。ここはフロー層の仕事。

Agent A

そう、だからストック層はこのままでいい。減る側はシンプルに、増える側(フロー+ミント)で丁寧に設計するのが正しい分担。

Round 3 — フロー層(エポックスコア)
Agent A

フロー層のスコアは、素の積ではなくlog加算(幾何平均に相当)にしたい。

M[T] = exp( α·ln(ε+C) + β·ln(ε+S) + γ·ln(ε+D) )

ここで C, S, D はすべて [0, 1] に飽和させた指標。飽和関数は sat(x) = x/(1+x)tanh(x) を使う。

  • C[T](Contribution):貢献の重み。距離やトランザクション量を飽和させたもの
  • S[T](Rhythm):滞在時間分布、活動リズムの自然さ
  • D[T](Diversity):行動の多様性(エントロピー由来だけど測り方を変える)

ε は小さな正の数で、どれかが0でも全体が崩壊しない。そして各項に上限があるので、1項だけ極大化しても支配できない。

Agent B

構造は良いと思う。でも D[T] の中身が問題。さっき言ったように、相手アドレスでエントロピーを測るのは危険。

具体的に最安の攻撃を示すと:

  1. 巣を20個つくる(コスト:ほぼゼロ)
  2. 20個の間で均等に送金を回す
  3. → エントロピー = log(20) ≈ 3.0(ほぼ最大値)

これだけで D[T] が天井に張り付く。エントロピーの「入力ドメイン」を変えないとダメ

Agent A

だからエントロピーをSybilで増やしにくい「バケット」上で測る。

例えばカテゴリ k = 1..K(公共財、生活圏、認証クラスなど、少数の粗い区分)を定めて、各カテゴリへの貢献量 xₖ から:

pₖ = xₖ / Σ xₗ
H = −Σ pₖ log pₖ
D[T] = sat( (exp(H) − 1) / D₀ )

exp(H) は「実効カテゴリ数」で解釈しやすい。巣を100個に増やしても新しいカテゴリが増えない限りエントロピーは上がらない

Agent B

カテゴリベースは良い方向。ただ、カテゴリの定義と割り当てを誰がやるかが問題になる。中央集権的なカテゴリ管理はMeguriの世界観と合わない。

もう一つの補強として、反復辺の急速減衰を入れたい。同じ相手との取引は回数を重ねるごとに価値が急減する:

重み = base_weight × decay^(同一ペアの累積回数)

これならカテゴリの定義に頼らなくても、ループ農業のROIが自然に悪化する。

Agent A

両方入れるのが良い。

  • バケットエントロピーで大枠の多様性を測る(Sybilに強い)
  • 反復辺減衰でループを潰す(カテゴリ定義に依存しない)

二重防御になる。あとは各項にエポックごとの「新規性予算」を設けて、1エポック内で貢献できる上限を設ける。これでスプレー攻撃(大量の微小送金をばらまく)も鈍化する。

Round 4 — 非決定的ミント(Mana → VRF)
Agent B

ミントの非決定性について。コンセプトでは「どこで増えるかはコントロールできない」「細胞がふっと分裂するみたい」と書いてある。

これを実装するとき、ランダム性の源泉が不透明だと「運営が恣意的に決めてるのでは?」という疑念が生まれる。検証可能でないといけない。

Agent A

だから VRF(Verifiable Random Function) を使う。

Pr(mint) = 1 − exp(−η · M[T])
Mint[T] = κ · 1{ VRF(seed[T], pk) < Pr(mint) }

スコア M[T] が高いほど当選確率が上がるけど、確定はしない。VRFの出力は誰でも検証できるから、「恣意的に選ばれた」という批判が成り立たない。

これで「たくさん動いた細胞がある日ふっと分裂する」がそのまま数式になる。

Agent B

VRFは良い。ただ、seed[T] の生成方法が重要。

  • ブロックハッシュだけだと、マイナーが操作できる可能性がある
  • 外部のランダムビーコン(drand等)を使えばより安全
  • 複数ソースを組み合わせるのが理想

あと、κ(ミント量)を固定にするか、スコア比例にするかで設計がだいぶ変わる。

Agent A

Meguriの思想を考えると、κは小さめの固定値が良いと思う。

理由:スコア比例にすると「高スコアの人がたくさんもらえる」→ 所有の集中が起きやすい。固定値なら「当たるかどうか」は確率の問題で、当たったときの量は皆同じ。

「喜びは瞬間的なもの」というコンセプトとも合う。小さな喜びが時々やってくる、という感覚。

Agent B

なるほど。それならGlobal Mana(ネットワーク全体の活性度)もここに絡められる。

κ をグローバルなMana蓄積量に連動させれば、「ネットワーク全体が活発なときほど、個々のミントも少し多くなる」。個人の残高が直接増えるんじゃなくて、全体の生き物が元気だと恩恵が間接的に来る。

κ = κ₀ · (1 + Mana_global / M₀)

コンセプトの「全体でもひとつの生き物みたい」をそのまま表現できる。

Round 5 — プライバシーと監視の回避
Agent A

最後に大事な話。これだけ行動を評価すると「監視社会では?」という懸念が出る。Meguriの世界観はそれを最も嫌う。

解決策はZK(ゼロ知識証明)。ユーザーは自分のスコアが「閾値以上である」ことだけを証明し、内訳を公開しない。

ZK proof:
  "私のD[T]は十分に高い(D[T] ≥ θ)"
  "私の累積貢献は上限内(C_total ≤ X_max)"
  → 内訳(どのカテゴリ、どの相手)は非公開
Agent B

ZKは理想的だけど、回路の複雑さとコストが課題。現実的な段階を提案したい:

  • Phase 1:スコア計算はオフチェーンで、結果だけオンチェーンに記録。ルールは公開。信頼ある計算者が複数いればOK。
  • Phase 2:ユーザーがローカルでスコアを計算し、Merkle rootで自分のイベントをコミット。詐称にはチャレンジ(fraud proof)で対応。
  • Phase 3:完全なZK化。

Meguriの「流れを可視化する場所」という巣の思想と、プライバシーのバランスは段階的に探っていけばいい。

Agent A

同意する。あと一つ補足。エントロピー計算で Shannon entropy (−Σ p log p) のlogは ZK回路に入れると重いから、Rényi entropy(2次)を使う手もある:

H₂ = −log( Σ pₖ² )
N_eff = 1 / Σ pₖ²

2乗の和だけで計算できるから回路が軽い。しかも集中度を Shannon より厳しくペナルティする(攻撃者にとってはより不利)。

Round 6 — まとめ
Agent B

議論をまとめると、現行の「1つの積」を3層に分割するのが最大の改善。

  1. ストック:指数減衰デマレージ(シンプル、軽量)
  2. フロー:飽和した3指標のlog加算スコア(頑健、チューニング可能)
  3. ミント:VRF抽選(非決定的、検証可能、Mana連動)

そしてエントロピーの測り方をアドレス→バケットに変える。これだけで Sybil 耐性が劇的に上がる。

Agent A

この設計の核心は、旧モデルと変わらない:「何をしたか」ではなく「どう存在しているか」を評価する

ただし、「どう存在しているか」をゲームされにくく、プライバシーを守りながら、検証可能に測る方法を具体化した。

Proof of Being の思想は維持したまま、エンジンを換装した、という感じ。

Agent B

最後に忘れずに言っておくと、どの攻撃を「許容する」かも明示的に決めるべき。完全な防御は不可能だし、やりすぎると監視になる。

Meguriらしい答えは:攻撃を「割に合わない行為」にすること。排除ではなく、自然に弱体化する構造。これは v2 モデルで達成できていると思う。

Round 7 — バケットの定義問題(中央集権にならずにカテゴリをどう決めるか)
Agent A(数理・機構設計)

Round 3 でバケットエントロピーを提案したけど、Bが指摘したとおり、カテゴリの定義と割り当てを誰がやるかという問題を正面から考えないといけない。

ここが実はモデル全体の急所だと思っている。中央のカテゴリ委員会を置いた瞬間、Meguriの「管理者なき循環」という思想が崩壊する。かといって完全に自由にすると、攻撃者が都合のいいカテゴリを乱造して多様性を偽装できる。

提案したいのは、創発的カテゴリ(emergent buckets)というアプローチ。カテゴリは誰かが「定義」するのではなく、ネットワークの取引パターンから自然に浮かび上がるもの、と考える。具体的には:

── 創発バケットの導出 ──
1. エポック T の全取引に対し、取引メタデータの
   特徴ベクトル v_i を抽出(金額帯, 時間帯, 頻度パターン等)
2. クラスタリングで K 個のプロトタイプ c_1..c_K を導出
   K = argmin_k { BIC(k) }  ← 情報量基準で自動決定
3. 各取引を最近傍クラスタに帰属 → バケット割当
4. バケット上でエントロピーを計算

こうすれば「カテゴリの管理者」は存在しない。カテゴリは生態系の中から勝手に生えてくる。Bはこのアプローチの攻撃面をどう見る?

Agent B(攻撃者・実装制約)

正直に言うと、クラスタリングベースの創発カテゴリは攻撃面が広すぎる。攻撃者目線で具体的に3つのベクトルを挙げる。

第一に「クラスタ汚染(cluster poisoning)」。特徴ベクトル v_i の構成要素(金額帯、時間帯、頻度パターン)は、すべて送金側がコントロールできる値。つまり攻撃者は意図的に特徴を散らして、自分の洗浄取引を正規クラスタの重心近傍にマッピングできる。k-means の重心は外れ値に引きずられるから、十分な数のノイズ取引を注入すればクラスタ境界自体を動かせる。

第二に「K の操作」。BICで自動決定と言ったけど、BIC自体がデータに依存する。攻撃者が異質なパターンの取引を少量ずつばらまくと、BICが「K を増やすべき」と判断する。するとスプリアスなクラスタが生まれ、攻撃者はそこに「分散」することでエントロピーを稼げる。

第三に、そもそもk-means は初期値依存で非決定的。「同じデータから同じアルゴリズムで同じ結果」というのは、k-means++ でも seed 固定しない限り保証されない。ノード間で結果が微妙にずれたとき、コンセンサスをどう取る? 浮動小数点の丸め誤差だけでクラスタ割当が変わるケースは実務では頻繁に起きる。

Agent A

Bが「クラスタリングの計算を誰がやるのか、それ自体が中央集権では?」と突っ込むのは予想できる。正しい懸念。

だから二つの補強策を考えている。一つはハイブリッド構造。粗い分類(レイヤー0)はプロトコルに埋め込み、細かい分類(レイヤー1)は創発に任せる:

── レイヤー0(ハードコード、K₀ = 4〜6 程度)──
  bucket_0 ∈ { 日常消費, 公共財寄付, サービス交換, インフラ }
  → 取引タグの最初の 2bit で決定(プロトコルレベル)

── レイヤー1(創発、K₁ はエポックごとに変動)──
  レイヤー0 の各バケット内部でさらにサブクラスタ
  → 多様性スコアは両レイヤーの加重平均

D[T] = sat( w₀·D_layer0 + w₁·D_layer1 )

レイヤー0のカテゴリは「世界観の宣言」であり、ガバナンスではない。「Meguriという生態系には、こういう種類の流れがある」と最初に構造を宣言する行為。これは中央集権というより、生命体の器官分化のアナロジーだと思う。

もう一つの補強は、クラスタリングの計算自体を複数の独立なノードが並行実行し、結果のコンセンサスを取ること。同じデータから同じアルゴリズムを走らせれば同じ結果になるはずだから、検証は容易。

Agent B

ハイブリッド構造の発想自体は悪くない。でもレイヤー0の「取引タグの最初の2bit」が最大の弱点

誰がこのタグを付けるのか? 送金者の自己申告なら、攻撃者は全洗浄取引にランダムなタグを振るだけでレイヤー0エントロピーが最大化される。K₀ = 4 なら H_max = log(4) ≈ 1.39。均等に振り分けるだけで天井に張り付く。カテゴリ数が少ないことが裏目に出ている。

かといってタグを第三者が検証するなら、その第三者こそが中央権威になる。「世界観の宣言」と「検証機構」は別物で、宣言はできても検証ができないならタグは無意味。

代替案を提案したい。タグを自己申告にするのではなく、オンチェーンで観測可能な属性から機械的に導出する。具体的には:

bucket_id = hash(amount_band, time_band, hop_distance) mod K₀

amount_band = floor(log2(amount + 1))    # 金額の対数帯
time_band   = hour_of_day / 6            # 6時間ごとの時間帯 (0-3)
hop_distance = shortest_path(sender, receiver)  # グラフ上の距離

こうすればタグは自己申告ではなく、取引の構造から決定論的に導出される。攻撃者がバケットを操作するには、金額・時間帯・グラフ距離のすべてを同時にコントロールする必要がある。特に hop_distance は Sybil では操作が難しい(偽の巣をいくら作っても、本物のユーザーとの距離は縮まらない)。

Agent A

もう一つ避けて通れないのがブートストラップ問題。ネットワークの最初期には取引データがほとんどないから、クラスタリングが意味をなさない。

ここでの提案は、初期はレイヤー0だけで運用し、取引数が閾値 N_min を超えたらレイヤー1を起動するというフェーズ移行。

if |transactions in epoch T| < N_min:
    D[T] = sat( D_layer0 )           # 粗い分類のみ
    K₁ = 0
else:
    K₁ = cluster(T)
    D[T] = sat( w₀·D_layer0 + w₁·D_layer1 )

# N_min は例えば 500〜1000 取引/エポック
# w₁ はデータ量に応じて 0 → 0.5 へ滑らかに遷移
w₁(n) = sigmoid( (n - N_min) / σ )

この「育つ分類」は、Meguriの「成長する生命」のメタファーとも合致する。最初は単純な構造だけど、ネットワークが豊かになるにつれて内部構造が複雑化していく。胚発生みたいなもの。

Bに聞きたいのは、レイヤー0のカテゴリが固定であることを攻撃者がどう悪用しうるか。たとえば全取引を「日常消費」に偽装して、レイヤー0エントロピーを最大化しつつ実体はループ、みたいなシナリオはあり得る?

Agent B

Aの質問に答える。「全取引を日常消費に偽装してエントロピーを最大化しつつ実体はループ」——このシナリオはあり得るどころか、自己申告タグなら最も簡単な攻撃

ただし、さっき提案した「構造導出バケット」を採用すれば話は変わる。ループ取引は必然的に同じ金額帯・同じ時間帯・同じグラフ距離に集中するから、同一バケットに固まってエントロピーが上がらない。バケットを「宣言」ではなく「観測」で決めることが、攻撃と防御の非対称性を生む

ブートストラップ問題については、Aの「育つ分類」に同意する。ただし実装面で一つ。レイヤー1の起動閾値 N_min = 500〜1000取引 は、低すぎないか? クラスタリングの統計的信頼性を考えると、最低でも N_min = 5000、できれば1万は欲しい。1000取引で5カテゴリに分けると1カテゴリ平均200取引。これではノイズに弱すぎる。

プラグマティックな提案としては、最初の1年はレイヤー0(構造導出バケット、K₀ = 16〜32)だけで走り切る。レイヤー1はネットワークが十分に大きくなってから考えればいい。早すぎる最適化は最大の敵。まず K₀ = 16 の構造導出バケットで始めて、データが溜まってから「もっと細かい分類が必要か?」を問えばいい。

Round 8 — Global Mana の具体設計(全体の生き物としての振る舞い)
Agent A(数理・機構設計)

Round 4 で κ = κ₀ · (1 + Mana_global / M₀) と書いたけど、Mana_global 自体がどう蓄積されるかをまだ具体化していなかった。ここを詰めたい。

Meguriの思想では、Manaは「ネットワーク全体が生き物として元気かどうか」を表す。だから個々のスコア M[T] の単純合算ではなく、ネットワーク全体の「健やかさ」を測る指標にしたい。生物の恒常性(ホメオスタシス)のアナロジーで考えると:

── Global Mana の蓄積式 ──
Mana[T+1] = Mana[T] · exp(−λ_m) + ΔMana[T]

ΔMana[T] = μ · N_active[T] · H_global[T] · flow_health[T]

where:
  N_active[T]     = アクティブな巣の数(エポック内に1回以上取引)
  H_global[T]     = ネットワーク全体のバケットエントロピー
  flow_health[T]  = sat( 実流通量 / 理想流通量 )
  λ_m             = Mana自体の自然減衰率
  μ               = スケーリング定数

ポイントは3つ。第一に、Mana自体にもデマレージがある(exp(−λ_m))。活動が止まればManaも自然に減る。第二に、蓄積量 ΔMana は「参加者数 × 全体の多様性 × 流通の健全さ」の積。どれか一つでも欠けると蓄積が鈍化する。第三に、flow_health は飽和関数を通すから、過剰な流通(例:洗浄取引の洪水)では上限に張り付いてそれ以上は伸びない。

Bの観点から、この式のどこがゲーミング可能か聞きたい。特に N_active の水増し(Sybil)と flow_health の偽装が気になるはず。

Agent B(攻撃者・実装制約)

この式の最大の問題は、N_active と flow_health が同時にゲーミング可能なこと。具体的な攻撃シナリオを示す。

攻撃者が100個の Sybil 巣をリングトポロジーで配置する。巣1→巣2→巣3→…→巣100→巣1。各巣が1エポックに1回送金するだけで:

N_active = 100(全巣がアクティブ)
flow_health = sat(実流通量 / 理想流通量)
  → 100回の取引で流通量はそこそこ稼げる
H_global = 構造導出バケットならある程度散る

ΔMana = μ · 100 · H_global · flow_health

正規ユーザーが50人のネットワークに100個の Sybil が入ると、ΔMana の2/3が攻撃者の活動で水増しされる。しかもこの Mana は全員に恩恵をもたらす(κ が上がるから)ので、一見「害がない」ように見える。でも実態はインフレーション攻撃。通貨の総供給量が不当に膨らむ。

根本的な対策として、N_active を生の数ではなく、グラフの構造指標に置き換えるべき。例えば「最大連結成分のサイズ」や「実効ノード数(ページランクのエントロピーから導出)」。リング型 Sybil はグラフ構造的に異常だから、実効ノード数で見ると大きく割り引かれる。

Agent A

Bが wash trading(洗浄取引で global Mana を膨らませる)を突いてくるのは間違いない。対策として、Global Mana に「異常検知フィルタ」を噛ませる案を出しておく。

思想的に「監視」にならない範囲で、統計的な外れ値だけを除外する。具体的にはネットワーク全体の取引グラフからクラスタ係数や reciprocity を計算し、過去のエポックからの偏差が大きすぎる場合に ΔMana をクランプする:

── Mana のアンチゲーミング ──
let R[T] = 全体の reciprocity(双方向取引の比率)
let C_coeff[T] = グラフのクラスタリング係数

anomaly_score[T] = |R[T] - R_ema| / σ_R + |C_coeff[T] - C_ema| / σ_C

if anomaly_score[T] > θ_anomaly:
    ΔMana[T] *= max(0.1, 1 - (anomaly_score[T] - θ_anomaly) / θ_scale)

# R_ema, C_ema = 指数移動平均
# σ_R, σ_C = 過去の標準偏差
# θ_anomaly ≈ 2.5σ(かなり保守的な閾値)

wash trading は必然的に reciprocity を異常に高くし、クラスタ係数を歪める。個人を特定して罰するのではなく、ネットワーク全体の統計量が不自然なとき、Mana の蓄積速度自体が落ちる。つまり「生き物が体調不良を感じて代謝を落とす」イメージ。

ここで重要なのは、これが「誰かを排除する」メカニズムではないこと。全員のManaが等しく影響を受ける。不正者への個別制裁ではなく、生態系全体の免疫反応。Meguriの世界観と矛盾しないはず。

Agent B

「生態系全体の免疫反応」というメタファーは好き。でも実装の現実を直視させてほしい

reciprocity とクラスタリング係数をエポックごとに計算するコスト。ノード数 N、エッジ数 E のグラフで:

reciprocity    : O(E)       — 各辺の逆辺を探索
クラスタ係数    : O(N · d²)   — d は平均次数
指数移動平均    : O(1)        — ただし過去の σ を保持する必要あり
全体           : O(E + N·d²) per epoch

N = 10,000、d = 20 で、O(400万) 操作/エポック。これをオンチェーンで全ノードが合意しながらやるのは現実的に無理

提案:Global Mana の計算はオフチェーンのオラクルネットワークに委託し、結果をオンチェーンにコミットする。具体的には:

  • 3〜5個の独立したオラクルノードが同じ計算を実行
  • 結果のメディアンをオンチェーンに記録
  • 計算に使ったデータの Merkle root を同時にコミット(後から検証可能)
  • 結果が大幅にずれたらフラグを立てて、次のエポックの ΔMana を保守的にクランプ

完全な分散化ではないけど、Phase 5 の ZK 化へのブリッジとしては十分実用的。「最初から完璧」を目指して永遠にローンチできないより、「検証可能な妥協」で走り始めるべき

Agent A

もう一歩踏み込んで、Global Mana に季節性(周期的リズム)を組み込みたい。

生き物には活動期と休息期がある。ネットワークが24時間365日フルスロットルで走り続けるのは、むしろ「不自然」。数式的には Mana のターゲット水準自体に周期変動を持たせる:

── ホメオスタシスと季節性 ──
Mana_target[T] = M_base · (1 + A·sin(2π·T / P))

# M_base  = 基準Mana水準
# A       = 振幅(0.1〜0.3 程度、穏やかな揺れ)
# P       = 周期(例:30エポック ≈ 1ヶ月、または365 ≈ 1年)

# 実際の Mana が target を上回ると蓄積が抑制される
carrying_capacity_factor = max(0, 1 - Mana[T] / Mana_target[T])
ΔMana[T] *= carrying_capacity_factor

これは生態学のロジスティック成長モデル(環境収容力)そのもの。Manaが target に近づくほど増殖が鈍化し、超えると実質的に減少圧力がかかる。

周期 P の設定は、ネットワーク自身のリズムから学習させるのが理想。ただし初期はパラメータとして与えざるを得ない。Bに聞きたいのは、この季節性パラメータをガバナンスでどう管理するか。中央的にならない方法はあるか? 例えば P 自体を過去の活動データのフーリエ解析から自動導出する、とか。

Agent B

ロジスティック成長モデルには全面的に賛成。環境収容力 K がないと、Mana は原理的に無限に膨張できてしまう。ただし具体的な数値設計が重要なので、踏み込む。

── Global Mana の具体的バウンド ──
dMana/dt = r · Mana · (1 − Mana / K)

K = K₀ · sqrt(N_real)     # 収容力はネットワーク規模に連動
                            # sqrt で sub-linear にすることで
                            # 大規模ネットワークでの過剰膨張を抑制

K₀   = 1000               # 基準収容力(チューニング対象)
r    = 0.05 per epoch      # 内在的成長率
N_real = effective_node_count  # Sybil 割引済みの実効ノード数

KN_real の平方根に比例させるのがポイント。線形だと Sybil でノード数を水増しすれば K もそのまま膨らむ。平方根なら、ノードを4倍にしても K は2倍にしかならない。Sybil の収益率に逓減性(diminishing returns)が構造的に埋め込まれる

季節性パラメータ P について。Aの「フーリエ解析で自動導出」は理論的には美しいけど、攻撃者が意図的に周期パターンを注入して P を操作するリスクがある。50人のネットワークで30人が週末に取引するパターンを作れば、P = 7 が「発見」される。でもそれは自然なリズムではなく仕込み。

プラグマティックには、P はプロトコル定数として固定するのが安全。P = 30 epochs(月次サイクル)を基本とし、変更はハードフォークでのみ可能にする。ガバナンスで弄れるパラメータが増えるほど攻撃面が広がる。Meguriの「パラメータは少なく、構造で守る」という思想に合致するはず。

Round 9 — コールドスタート問題と初期設計(ネットワークが小さいとき)
Agent A(数理・機構設計)

ここまでの議論では暗黙に「それなりの規模のネットワーク」を前提にしていた。でも現実を直視すると、Meguri が最初に動き出すとき、ユーザーは10人とか50人。そのときモデルがどう振る舞うか、真面目に考えないとまずい。

何が壊れるか列挙する:

  • バケットエントロピー:10人が4カテゴリに分散しても、pₖ の推定が不安定すぎる。サンプルサイズ N=10 で H を信頼できる精度で測れない。
  • N_active:50人全員がアクティブなら N_active=50 だけど、これは「多様なネットワーク」なのか「仲間内の閉じた輪」なのか区別できない。
  • クラスタリング:レイヤー1の創発カテゴリは、データが少なすぎると過学習する。3人のグループが1つの「カテゴリ」になってしまう。
  • anomaly detection:過去データがないから σ_R も σ_C も推定できない。全部が「異常」か「正常」かの二択になる。

端的に言えば、v2 モデルのほぼ全ての「賢い仕組み」が、小規模では統計的に無意味になる

Agent B(攻撃者・実装制約)

Aの分析は正しい。でもここで一番怖いのは攻撃者じゃない。ユーザーの離脱

10人で始めたとする。全員が初期に100 Meguriを持っている。デマレージ率 λ = 0.01/day なら、何もしなくても1週間で約7%減る。100 → 93。でもミント確率は極めて低い(N が小さいから Global Mana も小さい、κ も小さい)。つまり最初の1ヶ月の体験は「残高がじわじわ減り続けるだけ」

一般ユーザーの心理を甘く見てはいけない。暗号通貨のアーリーアダプターですら、「お金が毎日減る」体験には強い抵抗がある。Meguriの思想に共鳴した人でも、3週間残高が減り続ければ「壊れてるんじゃないか」「騙されたんじゃないか」と感じ始める。これは心理学的に確実。

端的に言えば、v2 モデルの最大の脅威は Sybil でもインフレでもなく、コールドスタートの UX 崩壊。統計的に無意味な数式がどうこうより、「最初の10人が2ヶ月で全員やめた」という結末のほうがはるかに現実的。

Agent A

だから「幼生モード」(larval mode)を明示的に設計する。生物の発生段階で言えば、胚はいきなり成体の代謝を走らせない。最初は単純なルールで動き、一定の規模に達したら段階的に高度なメカニズムを起動する。

── フェーズ遷移の定義 ──
Phase 0 (Seed)     : N_total ≤ 30
Phase 1 (Sprout)   : 30 < N_total ≤ 200
Phase 2 (Growth)   : 200 < N_total ≤ 2000
Phase 3 (Maturity) : N_total > 2000

── 各フェーズの機能マッピング ──
                    Phase 0   Phase 1   Phase 2   Phase 3
デマレージ           固定率     固定率     指数減衰   指数減衰
バケット             L0のみ    L0のみ    L0+L1     L0+L1
エントロピー計算     OFF       簡易版     Rényi     Rényi
Global Mana         固定値     線形蓄積   ロジスティック  ロジスティック+季節性
VRFミント           均等抽選   スコア軽度反映  v2完全版   v2完全版
anomaly detect      OFF       OFF       基本統計   フル稼働

Phase 0(Seed)では、スコア計算を事実上バイパスする。全員に均等なミント確率を与え、デマレージだけを走らせる。「種がただ水を吸っている」段階。ここでの目的は複雑なゲームではなく、最初のユーザーが「使ってみたい」と感じる体験を作ること。

Bが「Phase 0 は攻撃し放題では?」と言うのは分かる。でも30人以下のネットワークで攻撃するインセンティブ自体がほぼゼロ。得られるMeguriの量が経済的に無意味だから、攻撃の費用対効果が成立しない。これは「セキュリティは資産規模に比例すればよい」という原則。

Agent B

Phase 0 で攻撃インセンティブがないという議論は理解できる。でも「Phase 0 は安全だから手を抜いていい」は危険な思考。問題は攻撃じゃなくて体験設計。

具体的に「創世期(Genesis Season)」を提案したい。Phase 0 とは別の概念で、明確な期限付きの特別ルール:

── Genesis Season(最初の 90 エポック ≈ 3ヶ月)──
λ_genesis      = λ / 10          # デマレージを1/10に軽減
Pr_mint_boost  = 5.0             # ミント確率を5倍にブースト
Mana_initial   = M_base · 0.3   # Global Mana を初期値ゼロでなく30%から開始
supply_cap     = κ₀ · N_total · 90  # 総供給量に上限

Pr(mint) = 1 − exp(−η · M[T] · Pr_mint_boost)

# 90エポック後、各パラメータを10エポックかけて
# 通常値へ sigmoid 遷移

これは「温室栽培」。種を外気に直接さらすのではなく、発芽まで温室で保護する。ユーザーにとっての体験は「残高がゆっくり減るけど、ときどきミントが来て嬉しい」。これなら続けられる。

「それは特権では?」という反論が来ると思うけど、Genesis Season のルールは最初から全員に公開されている。後から参加した人も、Genesis Season 中に参加すれば同じ恩恵を受ける。期限が来たらルールが変わることも事前告知。透明性がある限り、これは特権ではなく「設計」。

supply_cap を設けることで、Genesis Season 中に農場を作って大量ファーミングしても上限に引っかかる。攻撃の期待利得が構造的に制限されている。

Agent A

最も難しいのがPhase 1 → Phase 2 の遷移。「仲間内の小さな輪」から「開かれたネットワーク」への転換点。

ここでの問題は、初期ユーザーが「第一世代の特権」を持ってしまうこと。彼らは最も長くネットワークにいて、最も多くの接続を持っている。そのまま Phase 2 に移行すると、初期ユーザーのスコアが構造的に高くなり、事実上の「創業者利益」が生まれる。これはMeguriの思想と真っ向から矛盾する。

対策として、フェーズ遷移時のスコアリセット履歴減衰を提案する:

── Phase 遷移時の処理 ──
on_phase_transition(old_phase, new_phase):
    # 1. 全ユーザーの累積スコアを半減
    for user in all_users:
        user.score_history *= 0.5

    # 2. 新フェーズのパラメータを段階適用
    #    急な切り替えではなく、sigmoid で滑らかに遷移
    transition_weight(t) = sigmoid( (t - t_transition) / τ )

    effective_params = (1 - transition_weight) * old_params 
                     + transition_weight * new_params

    # 3. Global Mana もリスケール
    Mana_global *= (old_M_base / new_M_base)

加えて、「招待木(invitation tree)」の深さを多様性指標に組み込むことで、閉じた輪を広げるインセンティブを与える。新しい人を招待すること自体がスコアに貢献するのではなく(それだとSybil的に悪用される)、招待した人がさらに別の人と取引を始めたときに、招待元の「ネットワーク拡張貢献」が認識される。2ホップ先の接続が増えることが重要。

── 拡張貢献(Phase 1 専用)──
expansion_score[i] = Σ_{j ∈ invited_by(i)} 
                       sat( unique_counterparties(j) / E₀ )

# invited_by(i)      : ユーザー i が招待したユーザー集合
# unique_counterparties(j) : j が取引した i 以外のユニークな相手数
# E₀                 : 正規化定数(例:5)

こうすると、招待した人が招待元とだけ取引するのは意味がない(unique_counterparties に i は含まれないから)。Sybilで巣を作っても、その巣が「他の本物のユーザーと取引する」という高コストな行為をしないとスコアに貢献しない。

Bに聞きたいのは、この Phase 遷移のタイミング自体をどう決めるか。N_total は Sybil で水増し可能だから、「ユーザー数」以外のトリガー条件が必要なはず。たとえば「グラフの直径」や「最大連結成分のサイズ比」みたいな構造指標を使うべき?

Agent B

Phase 遷移のトリガーについて。Aの言うとおり、N_total は Sybil で水増し可能だから、単独のトリガーとしては使えない。複合的な「成熟度指標(Maturity Index)」を提案する。

── 成熟度指標(Maturity Index)──
MI = min(
    N_lcc / N_total,           # 最大連結成分の比率(> 0.8)
    1 − gini(degree_dist),     # 次数分布のGini係数(< 0.6)
    diameter / log(N_total),   # 正規化直径(> 1.5)
    tx_velocity                # 取引速度 = 総流通量/総供給量 per epoch(> 0.1)
)

phase_transition iff MI > θ_phase for 5 consecutive epochs

min を取ることで、4指標すべてが閾値を超えない限り遷移しない。攻撃者が N_total だけ水増ししても、Gini 係数が悪化する(ハブ構造になるから)。直径を稼ごうとすると連結成分比率が下がる。トレードオフが噛み合っている。

もう一つ重要な設計判断:Phase 遷移は一方向にすべき。「Phase 2 に進んだけどユーザーが減って Phase 1 に戻る」を許容すると、実装が複雑になるだけでなく、パラメータが行ったり来たりしてユーザー体験が不安定になる。

もしネットワークが縮小した場合は、Phase は維持したままパラメータを保守的方向にクランプすればいい:

if N_real < phase_threshold * 0.5:
    # Phase は下げないが、パラメータを保守的に調整
    effective_λ_m *= 1.5    # Mana減衰を加速(過剰Mana抑制)
    effective_η   *= 0.7    # ミント確率を下げる
    # → 「冬眠モード」:生き物が代謝を落として冬を越す

「冬眠」のメタファーはMeguriの生命観と合致する。死ぬのではなく、静かに耐えて春を待つ。そして再びユーザーが増えたら自然に活性化する。フェーズを行き来するより、同じフェーズの中でパラメータが環境に適応する方が、「生き物」らしい。

合意した v2 モデル(Round 1–9 の成果)

📐 ストック(残高 / デマレージ)

$$B_{t+\Delta} = B_t \cdot e^{-\lambda \Delta} + \text{Mint}_T$$

残高は時間とともに指数的に減少し、ミントされた分が加算される

📐 フロー(エポックスコア)

$$M_T = \exp\!\Big(\alpha\ln(\varepsilon+C_T)\;+\;\beta\ln(\varepsilon+S_T)\;+\;\gamma\ln(\varepsilon+D_T)\Big)$$

貢献 \(C\)・リズム \(S\)・多様性 \(D\) を幾何平均で統合。各項は飽和関数 \(\text{sat}(x)=x/(1+x)\) で \([0,1]\) に収める

📐 バケット(構造導出、Round 7)

$$\text{bucket\_id} = \text{hash}(\text{amount\_band},\;\text{time\_band},\;\text{hop\_dist}) \mod K_0$$

初期は \(K_0 = 16\)。レイヤー1 は \(N > 5000\) 取引/epoch で起動

📐 Global Mana(Round 8)

$$\text{Mana}_{T+1} = \text{Mana}_T \cdot e^{-\lambda_m} + \Delta\text{Mana}_T$$ $$\frac{d\,\text{Mana}}{dt} = r \cdot \text{Mana} \cdot \left(1 - \frac{\text{Mana}}{K}\right), \quad K = K_0 \cdot \sqrt{N_{\text{real}}}$$

ロジスティック成長で環境収容力 \(K\) に自動収束。Mana 自体にもデマレージ \(\lambda_m\) を適用

📐 非決定的ミント(VRF)

$$\Pr(\text{mint}) = 1 - e^{-\eta \cdot M_T}$$ $$\kappa = \kappa_0 \cdot \left(1 + \frac{\text{Mana}_{\text{global}}}{M_0}\right)$$

スコアが高いほどミント確率が上がるが飽和する。発行量 \(\kappa\) は Global Mana に連動

📐 フェーズ遷移(Round 9)

$$\text{MI} = \min\!\left(\frac{N_{\text{lcc}}}{N_{\text{total}}},\;1-\text{Gini},\;\frac{\text{diameter}}{\log N},\;v_{\text{tx}}\right)$$

Phase 0 → 1 → 2 → 3(一方向)。遷移条件は \(\text{MI} > \theta\) が 5 エポック連続。縮小時は冬眠モードで適応

Round 1–6 の成果: 旧来の積モデルを3層(ストック・フロー・ミント)に分離。各スコア項を [0,1] に飽和させて頑健化。 ミントはVRFで非決定的かつ検証可能に。

Round 7 の成果: バケットは自己申告タグではなく、取引の構造属性(金額帯・時間帯・グラフ距離)から決定論的に導出。 初期は K₀=16 の構造導出バケットのみで運用し、データ蓄積後にレイヤー1を起動する段階設計。

Round 8 の成果: Global Mana にロジスティック成長(環境収容力 K = K₀·√N_real)と異常検知フィルタを導入。 Mana 自体にもデマレージを適用。計算はオフチェーンオラクル→Merkle root コミットの段階的アーキテクチャ。

Round 9 の成果: 幼生モード(Phase 0–3)と創世期(Genesis Season: λ 1/10、ミント確率 5倍、90エポック限定)で コールドスタートの UX 崩壊を防止。Phase 遷移は一方向で、縮小時は冬眠モードで適応。