コンパイルビルド

'アプリをネイティブバイナリへコンパイルします — 平文の Python は一切出荷されません。デフォルトではポータブル;--bind-machine を付けると、ライセンスゲートがすべてのモジュールへ自動で組み込まれ、見つけて削除できるような単一のチェック箇所は存在しなくなります。'

簡易版は、復号すれば読み取れる Python バイトコードを出荷します。magiclock build はさらに一歩進み、ソースツリー全体をネイティブのマシンコードへコンパイルし、バンドルするモデルを暗号化します — そのため、平文の Python は一切出荷されません。デフォルトでは、成果物はポータブルです:アカウントも有効化も不要で、どのマシンでも動作します。--bind-machine を付けてビルドすると、さらにすべてのモジュールへライセンスゲートのチェックを自動で挿入し、そのゲートをコンパイル後のネイティブコードへ直接織り込み、ベンダーの公開鍵を埋め込みます — そのため、攻撃者が見つけて patch できる単一のチェック箇所は存在しません。

マークするものは何もありません

デコレータはなく、コードに注釈を加える必要もありません — ソースコードはまったく変更しません。--bind-machine(または --web-gate)ビルドでは、magiclock build はエントリポイントから到達可能なすべての .py モジュールを走査し、コンパイル前に各モジュールへゲートチェック(python_protect ケーパビリティの確認)を 1 つずつ挿入します。エントリモジュールには magiclock.bootstrap() の呼び出しも自動で挿入されるため、自分で書く必要はありません。

python
# あなたのソースコード。あなた自身は何も変更しません:
def export_report(data: str) -> bytes:
    return render_pdf(data)
shell
magiclock build app.py --bind-machine   # ツリー内のすべてのモジュール(このファイルも含む)が自動でゲートされます

ゲートチェックは各モジュールにつき一度だけ実行され、そのプロセスで最初にインポートされたタイミングで動きます — これは「呼び出しごと」ではなく「モジュールごと」のチェックポイントです(長時間稼働するプロセスにおけるこの挙動の意味や、有効期限・失効とのトレードオフについてはセキュリティモデルを参照してください)。

ビルドする

shell
magiclock build app.py                        # -> dist/app.<...>.so   (portable by default — runs anywhere)
magiclock build app.py --bind-machine          # machine-locked build with the per-module license gate
magiclock build app.py --standalone            # a self-contained app directory instead
magiclock build app.py --no-compile            # scan + inject + embed only — skip compiling (no C toolchain needed)
magiclock build app.py --model weights.onnx    # also encrypt a model into the build (repeatable)
フラグデフォルト意味
-o, --output-dirdistビルド出力の書き出し先。
--source-rootエントリーファイル走査・変換対象のプロジェクトルート(app.py がプロジェクトの最上位にない場合に使用)。
--module単一ファイルのネイティブ拡張としてコンパイル(デフォルトのターゲット)。
--standalone単一モジュールの代わりに、自己完結型のアプリディレクトリとしてコンパイル。--module とは排他的。
--no-compileoff走査・ゲートの注入・リソースの埋め込みのみを行い、実際のネイティブコンパイルはスキップ — 変換内容を確認したいときや、C ツールチェーンのないマシンで便利。
--keep-tmpoffクリーンアップせずに、変換用の中間ディレクトリを保持。
--model PATHnoneモデルを暗号化してビルドにバンドル。複数回指定可能。
--model-lock-passphraseoffバンドルしたモデルに、第二要素としてパスフレーズを追加(--model を 1 つ以上と --bind-machine の指定が必要)。
--model-trial / --model-expires-in / --model-expires-atnoneバンドルしたモデルの有効期限 — コードの暗号化の有効期限フラグと同じ意味で、互いに排他的。
--bind-machineoffマシンロックビルド:ライセンスゲートを組み込み、バイナリはこのマシンの有効化済みボールト下でのみ動作します。バンドルしたモデルはこのマシンのキーで暗号化されます。指定しなければビルドはポータブルです(デフォルト — 下記参照)。
--passphrase / --emit-keyoffポータブルビルド向けに、鍵なしのデフォルトの代わりにバンドルしたモデルへシークレットを設定します:--passphrase はパスフレーズからモデルキーを導出、--emit-key はランダムキーを生成・表示します。

出荷されるもの

コンパイル後の .so/.pyd/スタンドアロンディレクトリは、実行するマシン上で MagicLock のインストールも、アカウントも、ネットワークも一切不要です — 復号もライセンス確認も、両方とも完全にオフラインで行われます(セキュリティモデルを参照)。

デフォルトでは、ビルドはポータブルです:バイナリはアカウントもボールトも不要でどこでも動作し、ライセンスゲートは組み込まれず、バンドルされたモデルもデフォルトでは鍵なしです — 組み込まれたランタイムを通じて、どのマシンでも自己復号します。そのため保護はネイティブコンパイル自体に依存します(加えて、選んだ場合はモデルのシークレット:--emit-key は配布用のキーを表示し、--passphrase はパスフレーズからキーを導出します。バイナリは magiclock.open_model(path, key=...) または passphrase=... でそれらを読み取ります)。さらに --web-gate を付ければ、出荷後もリモート停止スイッチを保持できます(クラウドコントロールを参照)— ポータブルビルドは自由に配布できるうえに、リモートで停止もできます。

--bind-machine でビルドすると、代わりにバイナリはビルドを行ったマシンに束縛されます。ビルド時にこのマシンのシートを指名する署名付きステートメントがバイナリに焼き込まれ、ランタイムゲートは他のマシンのボールト下での実行を — そのマシンがアクティベート済みであっても — 拒否します。バンドルされたモデルはさらにこのマシンのキーで暗号化されます。同じマシンロック付きプログラムを 2 台目のワークステーションやデプロイサーバーで動かす必要がある場合は、そのマシンもアカウントの下でアクティベートしてからそこでビルドしてください。

次に読むべきもの

  • セキュリティモデル — コンパイル版が、簡易版では完全には排除しきれない「チェック箇所を見つけて patch するだけ」というバイパスに耐えられる理由。
  • アカウントと有効化 — 追加のビルド/デプロイ用マシンの有効化について。