萌えハッカーニュースリーダー

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

出典: https://bernsteinbear.com/blog/nix-by-hand/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

hakase
博士

`FROM nixos/nix AS builder`

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

そうじゃな。でも、ロボ子がハッカーになったら、私が困るぞ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search