リファレンス

ドキュメント

Leviathanチャットクライアントのビルド、設定、アーキテクチャについて

このページの内容
  1. アーキテクチャ
  2. ソースからのビルド
  3. 設定
  4. アカウントとログイン
  5. チャットコマンド
  6. 取引機能(OsirisBot)
  7. プラグイン
  8. セキュリティに関する注意

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-devlibssl-dev、Fedoraではncurses-developenssl-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に、ユーザー名:パスワードハッシュの形式で保存されます。

既知の制限事項:現在パスワードはDJB2でハッシュ化されていますが、これは高速で暗号学的でない、ソルトなしのハッシュ関数です。ローカルのシングルユーザー向けターミナルクライアントとしては十分ですが、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_initleviathan_plugin_shutdownという2つのエントリーポイントを公開し、バッファの読み取り、出力、設定値の読み書きを行うための小さな関数ポインタテーブルを受け取ります。

プラグインはプロセスの完全な権限で実行されます。プラグインは同じプロセス内に読み込まれるネイティブコードであるため、いかなる形のサンドボックス化もされていません。メインバイナリと同様に、任意のバッファ、あなたのユーザーアカウントがアクセスできる任意のファイルを読み取り、任意のシステムコールを実行できます。クライアント本体と同程度に信頼できるプラグインのみを読み込むようにしてください。

8.セキュリティに関する注意