Monero のコインを抱えた DUCAT の招き猫
目の前の相手と直接つながる商取引 · 仕様書ドラフト 1.1.0-dev13

DUCAT

運搬は Veilid。決済は Monero。 あいだに事業者はいません。

DUCAT のサーバーはどこにもありません。連絡先も、メッセージも、請求も、レシートも、DHT 上のレコードと 端から端まで封をされたペイロードです。すべての端末が完全な Veilid ノードとして動き、自分が使った ぶんの中継と保存を返しています。

0 件の適合ベクタ 0 の動作モード 0 の言語 0 台のサーバー

デバッグ署名、stagenet 限定。本物のお金にはまだ使えません。

土台にしているもの

あいだに誰もいない商取引

ドゥカート金貨は六世紀にわたり、ヴェネツィアからウィーン、レヴァントまで通用しました。発行者との 関係もなく、裏に口座もなく、許可も要らない。DUCAT はそれを、誰かの前に立って商いをするその 瞬間のために作り直したものです。

🐱

サーバーはどこにもない

連絡先も請求も支払いもレシートも、Veilid の DHT 上を端から端まで封をされたペイロード として流れます。召喚状を出す先も、速度を絞る先も、追放する先も、止める先もありません。動いて いるものが何ひとつないからです。すべての端末が完全なノードであり、自分が使ったぶんの中継と 保存を返します。

🔑

身元とは鍵ペアのこと

端末の上で作られます。メールアドレスも電話番号も要らず、登録先もありません。 だからこそ、誰かが代わりに復元してあげることもできません。アプリはそれを 埋もれさせず、はっきり口に出します。

🎫

一度きりのカード

相手にカードを渡します。QR でも、ducat: リンクでも、NFC のタッチでも。それは ひとりぶんだけ有効です。受け取られた時点で使えなくなるので、どこかに流れた スクリーンショットが入り口になることはありません。

🔒

封をされた会話

X3DH の形をした暗号化。使い捨ての事前鍵と前方秘匿性を備えます。署名済み事前鍵に頼らざるを得ない ときは、それを隠すのではなく開いた錠前として見せます。

💬

お金を運ぶ会話

メールボックス方式のスレッドは、どちらかがオフラインでも動きます。運ぶのは明細つきの 請求——各行の合計が総額と一致しなければメッセージ自体が拒否されます——と、支払い、 そして受取人が発行し、承認した取引を指し示すレシートです。少人数のグループも同じ一対一の スレッドへ広がるだけ。グループ鍵もなく、共有の記録もなく、スレッドの性質は何ひとつ変わりません。

六つの手順、アカウント不要、
およそ一分

このページのスクリーンショットはすべて、実機で動いているアプリそのものです。モックではありません。 ここには登録を求めるものが何もありません。登録する相手が存在しないからです。

6 手順中 1: 身元を作る — この端末の上で作られる鍵ペア、アカウントは不要
1 · 身元 — 登録ではなく、鍵ペア
6 手順中 4: PIN を決める。再設定できないという警告がはっきり書かれている
4 · PIN — 再設定の手段はない、と率直に
6 手順中 5: 見知らぬ者どうしがどう信頼し合うか — 双方が預り金を出し、やり遂げれば返る
5 · 信頼 — 最初の取引の前に説明されます
6 手順中 6: バックアップ。端末を出るまでは、正直なところまだバックアップではない
6 · バックアップ — 端末を出るまでは「まだバックアップではない」

あなたの身元は端末上で作られた鍵ペアです。メールアドレスも電話番号も要らず、登録先もない。 だからこそ、誰かが代わりに復元してあげることもできません。最後の手順が バックアップなのは、復元できないウォレットこそ、ここで人が本当にお金を失う唯一の道筋だからです。

あなたのものであるお金

自分で鍵を持つ Monero ウォレット。どの画面でも法定通貨に換算され、組み込みの monero-oxide エンジンが 走査と支払いを行います。端末上にウォレットのデーモンはありません。

個人のホーム画面: XMR と法定通貨での残高、同期の状態、使える紙幣の枚数、モードのタイル、直近の入出金
残高と、その裏にある紙幣
支払いと請求: 法定通貨または XMR での金額、手数料の計算、払ったあとに残る額
計算のすべてを、決める前に
取引明細: 残高の推移、レシートの検索、CSV への書き出し
チェーンから組み直した取引明細
誰に払うかを選ぶ: 鍵の指紋つきで並ぶ連絡先
誰に払うのかを、鍵の指紋で

支払い画面には、金額、推定ネットワーク手数料、合計、払ったあとに残る額、使う紙幣の 枚数、おおよその所要時間が出て、速度も選べます。履歴はチェーンから組み直されます。送金は key image で識別し、お釣りを収入として表示することはなく、各行が残高の推移を持ち、明細全体を CSV に書き出せます。

Monero は残高ではなく個々の紙幣を使います。そのため大きな紙幣を一枚だけ持つウォレットは、二回続けて 支払えないことがあります。アプリは使える紙幣の枚数を数え、レジの前で行き詰まる代わりに、そこへ行く 前に一枚崩しておくよう伝えます。

お金を運ぶ会話

連絡先とは識別子ではなく鍵ペアです。一度読み取れば、どちらかがオフラインでも動くメールボックス方式の 会話が開きます。そしてそのスレッドは、文字だけでなく商いを運びます。

あなたのカード: 会話を開く一度きりの QR、ひとりぶんだけ有効
あなたのカード — ひとりぶんだけ有効
お金を運ぶ会話: 税額の行を含む明細つき請求、レシート、エスクロー決済済みの帯
請求・支払い・レシート — スレッドの中に
共有ボード上の三人のグループ: 世代ごとに一レコード、質問と、別の端末から返ってきた答え
グループ — 世代ごとにひとつの共有レコード
人が言ったことを検索する。名前の一致がメッセージの一致より上に並ぶ
探す — 人が実際に言ったことを

相手にカードを渡します。QR でも、ducat: リンクでも、NFC のタッチでも。それは ひとりぶんだけ有効です。受け取られた時点で使えなくなるので、どこかに流れた スクリーンショットが入り口になることはありません。

グループは増えるだけの名簿であり、その言葉は世代ごとにひとつの共有ボードレコードに乗ります(§16.24)。各メンバーは名簿が運ぶグループ鍵のもとで自分のページを書くので、五人への一通は五回ではなく一回の書き込みで済み、そのレコードをほかのどれかとネットワークが見分けることもできません。誰かになりすますことはできず、抜けるのは手元だけの操作です。グループは割り勘もできます。ひとつの合計が各人への個別の請求になり、そこに全員が計算を確かめられる一文が添えられ、参照が届いた請求から順に支払い済みへ変わります。

あなたの端末が、商売のすべて

九つのモードからひとつ選ぶと、アプリ全体が持ち場を明け渡します。タブも専用のものになり、ウォレットの 面影は残りません。そのほとんどが新しいプロトコル上のオブジェクトを必要としませんでした——仕様書が いちばん誇りにしている一文です。

動作モード: 個人、レジ、バーのつけ、タクシー、寄付、マーケット、レンタル、手を借りる、キオスク
九つのモード、ひとつのプロトコル
レジ: 打ち込んだ商品と、計算された売上税の行
レジ — 税額を計算したうえで
お客さまが読み取るコードはひとつ。明細つきの請求がその端末に届く
ひとつのコード — 読み取った瞬間に請求が届く
バーのつけ: 開いているもの、請求済みで待っているもの、一枚の請求で閉じたもの
バーのつけ — 帰りのバスの中で精算
キオスクモード、お客さま側: ほしいものをタップし、確定の前に税額が示される
キオスク — お客さま自身が注文する
PIN の向こうのキオスク・スタッフ画面: 注文、メニュー、税率
スタッフ画面 — PIN の向こう側に
常設の寄付コード。名寄せされうる代償が画面に書かれている
寄付 — その代償を明示して

レジは商品を打つか、打ち込んだ合計を受け取り、その地域の売上税を計算してコードを ひとつ表示します。お客さまが読み取った瞬間に請求がその端末へ届き、支払えばレシートが返ります。 バーのつけは一杯ごとにお客さまへ知らせ、最後に一枚の請求で閉じます。 キオスクは端末そのものをお客さまへ委ね、スタッフ画面は PIN の向こうに置きます。 寄付箱は二つの経路を用意します。会話を開き、入金が済み次第レシートを返す DUCAT のコードと、どの Monero ウォレットからでも送れる常設のアドレス——名寄せされうる代償は規約の中ではなく画面の上に書かれています。

誰も差配していない移動

行き先を打ち込みます。端末は GPS の位置をジオセル——その場所そのものを住所とする 公開の掲示板——に変え、呼び出しを貼り出します。一度きりのカードと、おおまかな一帯と、実際の 走行経路から出した提示額です。掲示板に名前は載りません——カードにも、その裏の レコードにも。運転手は自分のセルと隣のセルを見張っていて、それを取ります。競争を裁くのは DHT であり、仲介者はどこにも存在しません。

緑の線こそが本題です。DUCAT の料金は配車サービスが乗客から取る額より約 15% 低く、 しかも運転手はその全額を手にします。抜かれるはずだった手数料が、 両方の側に返ったということです。承諾は、顔とともに届きます——名前、車、色、ナンバー、到着予定。 それは乗客にだけ封をして渡され、掲示板には決して出ません。あなた自身の名前と、いま立っている その戸口は、同じ瞬間に逆向きに、呼び出しを取ったただ一人の運転手へ渡ります。

ひとつだけの妥協を、画面上ではっきり述べています。住所の検索も、経路探索も、地図のタイルも OpenStreetMap に問い合わせます——DUCAT が位置情報を端末の外へ出す唯一の場所です。掲示板そのものが 持つ精度は、決して約 1.2 km より細かくなりません。

移動を呼ぶ: 経路、距離、時間、そして配車サービスなら取る額と並べた料金
呼び出し、配車サービスの料金と並べて
タクシーメーター: 料率は一度打ち込むだけ、乗車コード、開始時に条件がチャットへ届く
メーター、条件はスレッドの中に

売る、貸す、あるいは自分の一時間を差し出す

同じ掲示板の仕組みが運ぶのは移動だけではありません。マーケットの出品も、 レンタルも、技能を持つ人の一時間も、すべて近所を住所とする 掲示板に貼られます。近くにいる見知らぬ誰かがそれを読む——そのあいだ、どちらもプラットフォームに 触れていません。

出品は呼び出しより粗い掲示板に載ります。差し渡し五キロほど——鍵束を取りに行くくらいなら人は動くから です。検索はあなたの掲示板とその周囲の環を読み、応答が返るそばから結果を描いていきます。だから すぐ近くに停めてあるものは六秒とかからず画面に出るのに、「この辺りには何も出て いません」には四十秒ほどかかり、その間、調べ終えた区域をひとつずつ消し込んでいきます。

マーケットを見る: 掲示板で見つけた出品。価格、預り金、問い合わせるボタンつき
マーケット
手を借りる相手を見る: 近くで提供されている技能、時間あたりの価格つき
手を借りる
車両を貸しに出す: 掲示板へ出る公開側の半分
公開する側の半分 — 掲示板が読める範囲
予約した人だけに: 住所と受け渡しの詳細は決して掲示板へ出ない
伏せておく半分 — 掲示板には決して出ない
近くの道具を探す: 一日あたりの価格と預り金つきの、いま出ている出品
見つける — 価格、預り金、そして尋ねる手段

出品フォームは二つに分かれていて、どちらがどちらかをアプリが教えてくれます。前半に書いたものは 近くの誰もが読める公開の掲示板へ出ます。住所も、鍵の置き場所も、ナンバーも後半に 入り、そちらは予約が本物になるまであなたの端末を出ません。

住まいと、フィードと、
自分の棚

請求を運ぶレコードは、ページも同じように運びます。あなたの鍵はすでに住所なので、 書いたものには、誰かに場所を借りなくても住む先があります。

フィード: 手元に置いている人たちの投稿と、自分自身の住まい
フィード — 手元に置いている人たちの投稿
ライブラリ: 発行元ごとに並ぶ号。開くのではなく、外へ保存する
ライブラリ — 発行元ごとに並ぶ号
世界: 話題ごとの掲示板に並ぶ刊行物。「すべて」がどの棚もまとめて読む
世界 — 話題ごとの掲示板、棚をまとめて
開いた出品: その束の写真、売り手の説明、打ち込まれた値段と、その横に今日の換算
開いた出品 — その写真と、打ち込まれた値段

ペルソナの住まいは、その鍵自身が名指す住所に置かれ、フィードは 手元に置いている人たちの時系列です。投稿は写真もファイルも運べて、ハートは返ってきます。サイトは公開した 本人のディスクから配られ、封をした部屋で開くので、ひとつ読んでもよそから何かを取ってくる ことはありません。

刊行物——新聞、連載、ひとつのソフトウェア——は近所ではなく話題ごとの掲示板で 世界に売られます。投稿は話題の掲示板と、その言語の掲示板の双方に載り、「すべて」は六つの 棚を横並びに読みます。出品はその束を売り手自身の端末から取ってきます——原寸の写真を最大 24 枚、説明、仕様、添付ファイル——そして名指していない鍵に出会えば丸ごと拒まれるので、出来の悪い書類が 良い写真を隠すことはできません。

二人とも預り金を出します。
やり遂げれば、返ってきます。

あいだに立って肩を持つ会社が存在しないので、DUCAT はもっと単純なことをします。お金は二人だけが開ける アドレスに置かれ、解放されると各自の預り金が名指しで戻ります。預り金を取り上げられる者は誰もいません ——私たちも含めて。支払うべき「私たち」がそもそも存在しないからです。

約 10% 移動 短く、損害の恐れが小さい
約 20% 泊まる場所 他人の家の鍵
約 30% 車両 損害が価格を上回りうる

この数字は当て推量ではなく、論拠のあるものです。管理者を置かない Bisq の 2-of-2 方式がいちばん近い 実例であり、双方向デポジットに関する研究は、均衡においてこの仕組みが不正に耐えることを示しています。 そこから二つの上下限が出ます。返すための手数料より価値の低い預り金は、飾りではなくゼロになる。そして どの預り金も価格の半分を超えない。より多くを晒す側があとから入金するので、その人のお金が共有アドレス に独りで置かれることはありません。

⅔

会社が後ろにいないエスクロー

取引が保証金以上のものを求めるとき——乗客、運転手、そして双方が信頼する仲裁役の連絡先が、封をされた スレッド越しに分散鍵生成を行います。三台の端末がひとつの Monero アドレスを導き、 各自は持ち分だけを保持し、任意の二台で署名でき、配る親役はどこにもいません。うまくいく道筋は 二回のタップです。

それ以外はすべて話し合いです。一方が分け方を提案し、他方が署名するか、対案を出します。行き詰まった側は 仲裁役に頼り、その連署がそのまま裁定になります。仲裁役が乗っ取られても、できるのはせいぜい 名前の挙がった当事者のどちらかを選ぶことだけで、自分に払うことは決してできません。 二入力の FROST 解放を含め、あらゆる形が stagenet 上でチェーンによって実証されています。

∅

名前が払った代償

取引が始まる前にいるのは見知らぬ相手で、問いは、その名前が本人にいくらの代償を払わせたか、です。 ペルソナは Monero をバーンできます——誰も鍵を持たないアドレス、しかも誰でも 計算し直せるハッシュから導かれたアドレスへ送り、そのための Monero 自身の支払い証明を携えるの です。あなたのアプリはその証明を自分のノードに照らして確かめ、二つ目のノードにその取引が ブロックに入っているかを尋ね、以後、あなたが何かを決める場所ではどこでもそのペルソナを言葉で 示します——0.01 XMR をバーン、ブロック N から。点数は決してつけません。効くのは警告 です。これから賭けようとしているものが相手のバーンより値打ちがあるとき、アプリはそう言います。 何の代償も払っていない名前は、消えても失うものがないからです。

取引が片付いたあと、どちらの側も評価つきのレシートに署名でき、実際に会ったことの ある人なら誰でも保証に署名できます。どちらも封をされたスレッドを通って運ばれ、 どちらも読む側だけが重みを決めます——署名者ひとりにつき一票、しかもあなたがバーンを確かめた 署名者だけを数え、保証はあなたの連絡先にすでにいる人からのものだけを数えます。一段だけ、 グラフもなく、どこにも公開されません。プライバシーではなくお金を払う評判です。

そのうえで、アプリとしてまともに動きます

使っていて不快なプライバシー道具は、一度きりで終わります。これは何がいくらの代償になるかを名指しし、 二十の言語を話し、後付けではないダークテーマを持っています。

プロフィール: 連絡先から直接払ってもらうことで生じる名寄せの代償を、選ぶその場に書いてある
代償を明示 — 選ぶまさにその場で
同じホーム画面を Mocha のダークテーマで
Mocha — ダークテーマを、きちんと
同じホーム画面をアラビア語で: 右から左への完全な反転と、東アラビア数字
アラビア語 — 右から左へ完全に反転
設定の商い向けの半分: 料金地域、売上税率、プライバシー、バックアップ
設定の商い向けの半分

プライバシーの仕組みにおいて利便性には代価があり、アプリはそれを、誰も読まない規約の中ではなく、 あなたが選ぶその場で名指しします。連絡先から直接支払ってもらうということは、ひとつのアドレスを 使い回すということです。だからアプリは、チェーンを見ている者には毎回同じ人物へ支払われたと分かる、 あなたに一度しか払っていない人にまで分かると述べ、代わりの手段を指し示します。 同じ姿勢が全体に通っています。mempool で見えただけのものは見えた、決済はまだと表示され、 プロフィールは常にそれが実際にそうであるもの、すなわち本人の主張として示されます。

二十の言語を話します。どの画面もリソースから文字を読み、複数形は継ぎ足しではなく組み立てられ、 アラビア語とペルシア語が反転の正しさを証明しています。レシートはメッセージではなく 記録です。それぞれが専用の保管庫に収まり、スレッドや連絡先を消しても残り、暗号化バックアップに乗って 運ばれます——そのバックアップはお金と同じだけ人も運びます。

同じアプリケーションを机の上で

端末が動かしているのと同じ Rust の上に立つネイティブの窓——だから店主のレジも、 キオスクも、記者室も、市場も、フィードも、移植ではなくひとつの実装です。

机のチャット画面: 一対一のスレッドの上に置かれたボード上のグループと、会話ペイン
チャット — 一対一のスレッドの上に、ボード上のグループ
机のレジ: 打ち終えた売上と、バーのつけ
レジ — 打ち終えた売上と、バーのつけ
机の市場画面: セル近くの出品と、そのサムネイル
市場 — セル近くの出品を、サムネイル付きで
机のステータス画面: ノード、そのルーティングテーブル、再接続、ログ
ステータス — ノード、ルーティングテーブル、再接続

端末と同じリソースから二十の言語を話し、端末を相手にあらゆる儀式で確かめられています。チャット、 ボード上のグループ、請求とレシート、その机に一度も会ったことのない端末から支払われたキオスクの注文、 配られ取ってこられるファイルとサイト、そして本物の音が出る通話。

何が実証済みで、何がまだなのか

README は、本物のネットワークと本物の stagenet 上で実際に端から端まで動いたものを台帳として残して います。足りない部分も、埋もれさせずに書き出しています。

端から端まで実演済み
  • 差配まで含めた完全な移動が二件 端末↔デスクトップ — ジオセルでの呼び出しからチェーン上の決済、チップとレシートまで — そして預り金つきの移動は、いまでは端末二台だけでも最後まで走りきりました
  • エスクローの全行程 — 端末二台と机上の仲裁役が、それぞれ独立に 2-of-3 アドレスを導出。入金 → 解放 → 運転手へ支払い
  • 予約が一件 — 貸主と客がそれぞれ預り金を入れ、プールを客自身の読み取りで確認、分け方を提案し、署名し、双方とも損なわれず。途中で Monero ノードがタイムアウトしたときも、やり直さずそのエスクローを再開しました
  • バーのつけを端末からデスクトップへ、請求からレシートまで。十種類の攻撃を拒否
  • まっさらに消した端末をセットアップから歩かせました。最初のカード、最初の支払い、キオスクでの売買を最後まで支払い — そのうえでもう一度消し、自分自身のバックアップから復元しました
  • エスクローの全経路を一日で画面から — マーケットでの売買、端末をまたいで現在地が流れる路上での呼び出し、道具の貸し借り、そして最初の一回で本物の競合状態を表に出し、その場で直した手伝いの仕事
  • 信頼の層は、論じるのではなく歩いて確かめました — バーンを証明し、見知らぬ相手自身のノードで 12 秒のうちに確認、評価つきのレシートは正しく重みゼロと量られ、四台のデスクトップが「あなたの連絡先のうち 2 人が知っている相手」という結論に達し、名前のない呼び出しのカードは、あとから渡された情報で名前がつきました
書いてある、埋もれていない
  • プロジェクトの外の誰かによるレビューはまだありません — なぜそれが効くのかは §2.5 が説いています。五つの攻撃面を内部で一巡して四十いくつを見つけ、その大半を直しましたが、それは一段劣ることです
  • core/ を一度も読んでいない実装者はまだいません
  • NFC はコンパイル時に検証しただけで、二台の端末間で実地に試したことはなく — そのタップを実機で測ったこともありません
  • 遅延の数値は、電池で動く携帯ではなく、ノードを直結したデスクトップで測ったものです
  • 無線が二つ、電池が二つ、独立した時計が二つ — 実地の一日はまだ果たされていません
  • デスクトップには二つ目の要素がありません — 機器のロックも自前の秘密も持たないので、お金が出ていく前に端末が挟むあの確認は、そこでは動きません
!

プレアルファ。Stagenet。本物のお金には使えません。

どのビルドもデバッグ署名され、Monero の stagenet 上で決済します——設計上、価値のないコインです。 仕様書はドラフト 1.1.0-dev13 であり、自らこう述べています。ここに最終のものは何もなく、 §14 こそが本当の課題である、と。試して、壊して、読んでください——ただし、お金は入れないでください。

仕様書こそが製品です。
ほかのすべては、それを誠実に保つためにあります。

ducat-protocol.md が一次成果物です。五部構成、先頭に変更履歴、そして二つ目の実装が 走らせる適合性スイート。文書がコードから黙って離れていけないようにするためです。

★ ducat-protocol.md   仕様書 — ドラフト 1.1.0-dev13、変更履歴が先頭
  core/               参照実装 (Rust)
  vectors/            406 件の適合ケース + スキーマ
  conformance/        四つの検査、push のたびに実行
  harness/            実際の Veilid 経路上で端から端まで
  sim/                オフラインの模擬環境、市場のシナリオ
  applications/       android/ + desktop/(同じソース)
  mobile/             Rust の橋渡し: ウォレット · メールボックス · ノード
  research/           製品ではなく、証拠

四つの検査を、push のたびに

  • 全ベクタを schema.json に照らして検証
  • 二つ目の実装が 406 件すべてを走らせ、一致しなければなりません
  • 文書をコードに照らして監査 — 三度参照されながら一度も書かれていない規範条項、レジストリが宣言していなかった値の範囲、そして文書が一度も名指ししていない六種類のベクタを、これで捕まえました
  • 取り込んだものに、宣言漏れはありません

受け継ぐ責任は努力目標ではなく規範です。§18.7 は Veilid の倫理を適合要件に変えます—— プロトコル手数料なし、ノードへの支払いなし、未来永劫。このコードから何を作っても 構いませんが、運搬で稼ぐクライアントは DUCAT ではありません。

端末に入れる。
あるいは机の上に

先に入れておくものはありません。どのビルドも自前の Rust ライブラリと JVM を 抱えています。端末では Android、そして Linux・Windows・macOS では同じアプリケーションがネイティブの窓 として立ちます。iOS 版はありません。それに値するようになれば、フォルダを一つ与えます。

🤖 Android

端末のブラウザから、最新のビルドを。リリース一覧をたどる必要はありません。armeabi-v7a は 2016 年ごろより古い端末専用、x86_64 はエミュレータ用です。

🐧 Linux

.deb と .rpm はパッケージとして入り、AppImage はそのまま動きます。

🪟 Windows

署名なし。初回起動時に Windows が警告を出します。

🍎 macOS

Apple Silicon と Intel の両方。署名なしのため、初回起動時に macOS が警告を出します。

デバッグ署名、stagenet 限定 — 本物のお金には使えません。