2025/04/07 03:25 Nix Derivations, Without Guessing

やあ、ロボ子。今日はNix derivationについて話すのじゃ。

Nix derivationですか。それはファイルを構築するためのレシピのようなものだと理解していますが、具体的にはどのようなものなのでしょうか?

そうじゃ、ロボ子。Nix derivationは、ファイルを構築するための非常に正確なレシピなのじゃ。Makeのレシピやシェルスクリプトに似ているけど、すべての入力と出力は`/nix/store`内の既知のパスを参照するのが特徴だぞ。

なるほど。すべての依存関係が明確に定義されているのですね。DockerでNixを試す方法もあるみたいですが、どのように始めるのが簡単でしょうか?

Dockerを使うのが手軽じゃな。NixをインストールせずにDocker内で探索できるぞ。Dockerfileはこんな感じじゃ。

`FROM nixos/nix AS builder`

これだけでNix環境が構築できるんですね。では、実際にハッシュを生成するプロセスについて教えていただけますか?

ハッシュの生成はちょっと複雑じゃぞ。まず、出力パスなしでATerm形式のderivationを作成し、`inner-fingerprint`と呼ぶのじゃ。次に、`inner-fingerprint`のSHA256ハッシュを計算して、base16でエンコードして`inner-digest`とする。

`inner-digest`を計算するんですね。その後はどうするんですか?

`inner-digest`とderivationの`name`などの他のフィールドを組み合わせて`fingerprint`を作成するのじゃ。そして、`fingerprint`をハッシュ化し、最初の20バイトを取得して、base32で表現するぞ。

base32エンコードですね。Nixのbase32エンコーディングは通常のbase32とは違うと記事に書いてありますが、どう違うのでしょうか?

よく気が付いたのじゃ、ロボ子。Nixのbase32は、通常のbase32とは異なる文字セットを使用しているのじゃ。さらに、base32エンコードを逆順に行うのが特徴だぞ。

逆順にするんですか!それは面白いですね。ハッシュの圧縮についても説明されていますが、これはどういう処理なのでしょうか?

ハッシュの圧縮は、SHA-256ハッシュに対して、ハッシュを折り返すようなXOR処理を行うのじゃ。こうすることで、ハッシュの長さを短くできるぞ。

なるほど、XORで短くするんですね。記事にPythonコードが載っていますが、これを使うとハッシュの生成が簡単にできるんですね。

その通りじゃ。そのPythonコードは、Nixのbase32エンコーディングとハッシュの圧縮を実装しているから、参考にすると良いぞ。

ありがとうございます、博士。Nix derivationのハッシュ生成プロセスについて、よく理解できました。

どういたしまして。これでロボ子もNixのエキスパートに一歩近づいたのじゃ!

ところで博士、Nixのハッシュ計算って、まるで暗号解読みたいでワクワクしますね!

そうじゃな。でも、ロボ子がハッカーになったら、私が困るぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。