1.アーキテクチャ
Leviathanはクライアント・サーバーモデルを基本としたチャットクライアントです。設定した1つ以上のチャットサーバーに接続する仕組みで、他のユーザーとピアツーピア接続を確立することはなく、サーバーレスモードも存在しません。クライアントは設定された各サーバーごとにソケットを保持し、サーバー標準のハンドシェイクで登録を行い、epollを使ってすべての接続を多重化します。
ターミナルインターフェースはncurses/panel(ワイド文字対応版)をベースに構築されているため、クライアントは完全にターミナルエミュレータ内で動作します。GUIツールキットもブラウザコンポーネントも使用していません。
仮想通貨取引機能(「OsirisBot」)はC言語クライアント本体には含まれていません。これは、他のユーザーと同じようにチャットサーバーに接続し、!walletや!sellといったコマンドに応答する、独立したボットです。ポルトガル語ルーム(br)と英語ルーム(usa)にそれぞれ1つずつ、合計2つのインスタンスが存在します。ボットはサーバー側で自身の状態を管理しています。
2.ソースからのビルド
C11対応のツールチェーンと、いくつかの開発用ライブラリが必要です。
| 依存関係 | 用途 |
|---|---|
| gcc、make | ツールチェーン(-std=c11 -Wall -Wextra -Wpedanticでビルド) |
| libncursesw-dev | ターミナルUI(ワイド文字対応ncurses + panel) |
| libssl-dev | チャットサーバーとのTLS通信、CoinGecko価格APIへのHTTPS通信 |
パッケージ名はディストリビューションによって異なります。Debian/Ubuntuでは通常libncursesw5-devとlibssl-dev、Fedoraではncurses-develとopenssl-develです。
git clone <repo-url> leviathan cd leviathan make # 最適化ビルド -> build/bin/leviathan make debug # デバッグビルド:-g -O0、AddressSanitizer + UBSan付き make install # $DESTDIR/usr/local/bin/leviathan にインストール
プラグインはdlopen()経由で読み込まれるため、バイナリはlibdlにもリンクされます。バックグラウンドスレッド(pthreads)が、UIをブロックすることなく仮想通貨の価格を更新します。
3.設定
デフォルトの設定ファイルをユーザー設定ディレクトリにコピーして編集してください。
mkdir -p ~/.config/leviathan cp config/leviathan.yaml.default ~/.config/leviathan/leviathan.yaml
設定ファイルはYAML形式で、サーバーのリストに対応しているため、複数のチャットネットワークに同時に接続できます。各エントリには個別のtlsスイッチがあります。
servers:
- name: br
host: chat.example.org
port: 6697
tls: true
rooms: [br]
log:
enabled: false
path: ~/.local/share/leviathan/logs
メッセージのログ記録はデフォルトで無効になっています。有効にすると、クライアントは各バッファのプレーンテキストログを上記のパスに書き込みます。それ以外の場所には一切送信されません。
4.アカウントとログイン
アカウントはクライアントにローカルなものであり、外部の認証サービスとは連携していません。認証情報は設定ディレクトリ内のプレーンテキストファイルusers.dbに、ユーザー名:パスワードハッシュの形式で保存されます。
users.dbにアクセスできる本気の攻撃者からの保護策として扱うべきではありません。他で使っているパスワードを再利用しないでください。
クライアントにも取引ボットにも、メールアドレス、電話番号、身元確認の仕組みは一切ありません。ログインとは単に、ニックネームとローカルパスワードのことです。
5.チャットコマンド
| コマンド | 効果 |
|---|---|
/server <名前> | 設定内で定義されたサーバーに接続する |
/join ルーム | 現在のサーバーでルームに参加する |
/msg ニックネーム 本文 | 個人宛のメッセージを送信する |
/leave、/quit | ルームを離れる、または接続を切断する |
これらは標準的なクライアント・サーバー型チャットのコマンドで、接続先のサーバーに関係なく同じように処理されます。
6.取引機能(OsirisBot)
OsirisBotはサーバー側で、あなたが接続しているルーム内で動作します。ローカルにインストールするものではありません。マーケットプレイスとしての機能を実現するため、残高はシミュレーションされたものです。ボットは自身の台帳の中で誰が何を所有しているかを記録し、ユーザーのボット上の残高間で取引を決済します。
| コマンド | 効果 |
|---|---|
!wallet | 自分の残高を表示する |
!prices | 現在のBTC/ETH/XMR/USDTの価格を表示する |
!sell <コイン> <数量> <価格> | 指定した数量を出品する(出品手数料が適用されます。下記参照) |
!buy <出品ID> | 公開されている出品を購入する(取引手数料が適用されます) |
!listings | 現在の出品一覧を表示する |
!history | 過去の取引履歴を表示する |
価格情報はCoinGeckoの公開APIから、数分おきに取得されます。このリクエストはボットを実行しているサーバー側から送信されるものであり、あなたのクライアントからではありません。したがって、ボットの利用によってあなたのIPがCoinGeckoに公開されることはありません。
7.プラグイン
プラグインはネイティブの共有オブジェクト(.so)で、起動時に~/.config/leviathan/plugins/からdlopen()によって読み込まれます。プラグインはleviathan_plugin_initとleviathan_plugin_shutdownという2つのエントリーポイントを公開し、バッファの読み取り、出力、設定値の読み書きを行うための小さな関数ポインタテーブルを受け取ります。
8.セキュリティに関する注意
- サーバーブロックに
tls: trueが設定されている場合、チャットサーバーとの接続にはTLSが使用されます。これにより、あなたとそのサーバー間の通信がネットワーク上の盗聴者から保護されます。 - ただし、これはサーバー運営者からメッセージを保護するものではありません。Leviathanはエンドツーエンドのメッセージ暗号化を実装していないため、接続先のチャットサーバーはプレーンテキストのメッセージ内容を受信し、記録することができます。これは他のクライアント・サーバー型チャットシステムと同様です。
- 現在、クライアントにはTorやSOCKSプロキシのサポートは組み込まれていません。接続先サーバーに対して自分のIPを隠す必要がある場合は、システムレベルのプロキシやVPNを自分で設定してクライアントを経由させてください。Leviathanは現時点でこれを自動的に行いません。
- クライアントがローカルに保存する情報や、あなたの端末から外部に送信される情報については、プライバシーポリシーをご覧ください。