فا نیکسی

10.2.1. مشخصات مسیر انبار

این مشخصات کامل نحوه محاسبه مسیر انبارها است.

فرمت این مشخصات به فرم بنکوس-نائور توسعه‌یافته نزدیک است، اما باید در برخی موارد مانند توابع هش که برای اهداف مشخصات آن‌ها را دودوجهی در نظر می‌گیریم، از آن منحرف شود.

کاربران عادی نیازی به دانستن این اطلاعات ندارند --- مسیرهای انبار را می‌توان به عنوان جعبه‌های سیاهی در نظر گرفت که از ویژگی‌های اشیاء انبار ار ارجاع‌داده‌شده به آن‌ها محاسبه می‌شوند. اما برای کسانی که علاقه‌مندند دقیقاً بدانند Nix چگونه کار می‌کند (مثلاً اگر در حال پیاده‌سازی مجدد آن هستند)، این اطلاعات می‌تواند مفید باشد.

خود مسیر انبار

store-path = store-dir "/" digest "-" name

که در آن

  • name = نام شیء انبار.

  • store-dir = مسیر پوشه انبار

  • digest = نمایش Nix32 از هش [SHA-256] فشرده‌شده به ۱۶۰ بیت از fingerprint.

    برای تعریف الگوریتم فشرده‌سازی هش، لطفاً به بخش ۵.۱ از پایان‌نامه نیکس مراجعه کنید.

اثر انگشت (Fingerprint)

  fingerprint = type ":sha256:" inner-digest ":" store ":" name

توجه داشته باشید که این مورد شامل مکان انبار و همچنین نام آن می‌شود تا اطمینان حاصل شود که تغییرات در هر یک از آن‌ها در هش منعکس می‌شود (به عنوان مثال، شما /nix/store/<digest>-name1 و /nix/store/<digest>-name2، یا /gnu/store/<digest>-name1 را با بخش‌های هش برابر دریافت نخواهید کرد).

  • type = یکی از موارد زیر:

    | "text" { ":" store-path }
    ```

این برای روش
["Text"](/pages/nix-manual/store/store-object/content-address#method-text)
در آدرس‌دهی محتوایی انبار اشیاء است.
مسیرهای انبار پایانی اختیاری، همان ارجاعات انبار شیء هستند.

  -

```ebnf
    | "source" { ":" store-path } [ ":self" ]
    ```

این برای روش
["آرشیو نیکس"](/pages/nix-manual/store/store-object/content-address#method-nix-archive)
جهت آدرس‌دهی محتوایی انبار اشیاء است،
اگر الگوریتم هش [SHA-256] باشد.
درست مانند حالت «Text»، می‌توانیم انبار اشیاء را با مسیرهایشان ارجاع دهیم.
علاوه بر این، می‌توانیم یک برچسب اختیاری `:self` برای نشان دادن خودارجاعی داشته باشیم.

  -

```ebnf
    | "output:" id
    ```

برای خروجی‌های ساخته‌شده از درایویشن‌ها،
یا اشیاء انبار آدرس‌دهی‌شده بر اساس محتوا که از یکی از دو حالت بالا استفاده نمی‌کنند.
برای شفاف‌سازی در مورد حالت دوم، در حال حاضر این روش‌ها عبارتند از:

- ["ساده" ("Flat")](/pages/nix-manual/store/store-object/content-address#method-flat)
- ["گیت" ("Git")](/pages/nix-manual/store/store-object/content-address#method-git)
- ["آرشیو نیکس" ("Nix Archive")](/pages/nix-manual/store/store-object/content-address#method-nix-archive) اگر الگوریتم هش [SHA-256] نباشد.

مقدار `id` نام خروجی است (معمولاً "out").
برای اشیاء انبار آدرس‌دهی‌شده بر اساس محتوا، `id` همیشه "out" است.

- `inner-digest` = نمایش مبنای ۱۶ از هش SHA-256 برای `inner-fingerprint`.
  کدگذاری مبنای ۱۶ از ارقام هگزادسیمال با حروف کوچک استفاده می‌کند.

## اثر انگشت داخلی (Inner fingerprint)

- `inner-fingerprint` = یکی از موارد زیر بر اساس `type`:

  - اگر `type` = `"text:" ...`:

    رشته نوشته‌شده در مسیر انبار حاصل.

  - اگر `type` = `"source:" ...`:

    سریال‌سازی [Nix Archive (NAR)] از [شیء سیستم‌فایل](/pages/nix-manual/store/file-system-object) مربوط به شیء انبار.

  - اگر `type` = `"output:" id`:

    - برای خروجی‌های درایویشن آدرس‌دهی‌شده بر اساس ورودی:

      سریال‌سازی [ATerm](/pages/nix-manual/protocols/derivation-aterm) مربوط به درایویشن به استثنای درایویشن‌های خروجی ثابت.

    - برای مسیرهای انبار آدرس‌دهی‌شده بر اساس محتوا:

```ebnf
      "fixed:out:" rec algo ":" hash ":"
      ```

که در آن

      - `rec` = یکی از موارد زیر:

        -

```ebnf
          | ""
          ```
(رشته‌ی خالی) برای هش‌های سریال‌سازی تخت (تک‌فایلی)

        -

```ebnf
          | "r:"
          ```
هش‌های مربوط به سریال‌سازی [Nix Archive (NAR)] (شیء سیستم‌فایل دلخواه)

        -

```ebnf
          | "git:"
          ```
هش‌های قالب [بلاک/درخت گیت](https://git-scm.com/book/en/v2/Git-Internals-Git-Objects) [درخت مرکل](https://en.wikipedia.org/wiki/Merkle_tree)

      -

```ebnf
        algo = "md5" | "sha1" | "sha256"
        ```

- `hash` = نمایش مبنای ۱۶ (Hexadecimal) از مسیر یا هش تخت محتویات مسیر (یا محتویات مورد انتظار مسیر برای درایویشن‌های با خروجی ثابت).

توجه داشته باشید که `id` = `"out"` است، صرف‌نظر از بخش نام موجود در مسیر انبار.
همچنین توجه داشته باشید که NAR + SHA-256 نباید از این حالت استفاده کند، و در عوض باید از حالت `type` = `"source:" ...` استفاده کند.

[Nix Archive (NAR)]: /pages/nix-manual/store/file-system-object/content-address#serial-nix-archive
[SHA-256]: https://en.m.wikipedia.org/wiki/SHA-256

### یادداشت تاریخی

گرامرهای `type` = `"source:" ...` و `type` = `"output:out"` از نظر مفهومی و از نظر فنی با یکدیگر همپوشانی دارند،
به این معنا که هر دو می‌توانند داده‌های هش‌شده بر اساس سریال‌سازی NAR و با استفاده از SHA-256 را نمایش دهند.

دلیل اصلی این شیوه از محاسبه‌ی نام‌ها، جلوگیری از تداخل نام‌ها (به دلایل امنیتی) بود.
برای مثال، این‌گونه تصور می‌شد که نباید امکان‌پذیر باشد که درایویشنی ایجاد شود که مسیر خروجی آن با مسیر یک سورس کپی‌شده تداخل داشته باشد.
مورد اول دارای یک `inner-fingerprint` با شروع از `output:out:` خواهد بود، در حالی که مورد دوم دارای یک `inner-fingerprint` با شروع از `source:` خواهد بود.

با این حال، از زمان کامیت `64519cfd657d024ae6e2bb74cb21ad21b886fd2a` (سال ۲۰۰۸)، تصمیم گرفته شد که جداسازی داده‌های آدرس‌پذیر بر اساس محتوا (content-addressed) که توسط درایویشن تولید شده‌اند در برابر مواردی که به صورت دستی هش شده‌اند، به این شکل مفید نیست.
اکنون، داده‌هایی که با SHA-256 + سریال‌سازی NAR بر اساس محتوا آدرس‌دهی می‌شوند، همیشه از ساختار `source:...` استفاده می‌کنند، صرف‌نظر از اینکه چگونه تولید شده‌اند (به صورت دستی یا توسط درایویشن).
این امر امکان جابجایی آزادانه بین استفاده از [درایویشن‌های با خروجی ثابت](/pages/nix-manual/glossary#gloss-fixed-output-derivation) برای دریافت (fetch) و دریافت خارج از باند (out-of-band) و سپس افزودن دستی را فراهم می‌کند.
همچنین این تغییر، ابهام را از گرامر حذف می‌کند.
مشارکت‌کنندگان