On Thu, Nov 16, 2023, at 10:14 AM, Ludovic Courtès wrote:
> My take is that the daemon rewrite in Guix will aim for 100%
> compatibility at the protocol level (in fact part of what’s needed is
> already available as (guix …) modules), probably with just the same
> feature set.  Christopher Baines may have clearer ideas.

Excellent!

I am glad that Florian already emailed about this, I had similar thoughts.

I have long been a proponent of ensuring interoperability in the "store layer" 
between Nix, Guix, Tvix, and anyone else that wants to have an implementation. 
(To me, the daemon is just one possible implementation, an RPC bridge to 
another implementation.) There are some good developments on the Nix side in 
this space I've been meaning to email this mailing list about. Glad the recent 
guix-daemon work and ensuing discussion are finally getting me to do so! Here 
they are:
 • RFC 134 
https://github.com/NixOS/rfcs/blob/master/rfcs/0134-nix-store-layer.md: this is 
the linchpin holding a few things together on the Nix side. Nix gone back and 
forth over the years emphasizing the degree to which the store layer beneath 
the Nix language is self-contained and can be used/understood on its own. With 
that RFC we're finally committing to "show off the store layer" as official 
policy.
 • https://nixos.org/manual/nix/unstable/store/ there is a new top-level 
section of the Nix manual that is commentating the store-layer. Expect it to 
grow rapidly in the coming months as new information is written, and existing 
information that belongs here but is tagging along elsewhere is moved here.
 • Unit tests with external data "golden masters" for serializes for the daemon 
protocol 
https://github.com/NixOS/nix/tree/master/unit-test-data/libstore/worker-protocol,
 and derivation ATerm format 
https://github.com/NixOS/nix/tree/master/unit-test-data/libstore/derivation. 
(Since the Guix fork I've tried to systematize the daemon protocol with 
bidirectional serializers for explicit data types, which the RPC layer uses.) 
The test data is separate files with the explicit intention of making them easy 
to reuse in other implementations :), as opposed to just in-code string/binary 
literals which would be very inconvenient for them.
 • 
https://nixos.org/manual/nix/unstable/command-ref/new-cli/nix3-derivation-add 
making sure the JSON derivation format is round-tripable with a new command, 
for ease of use and in hopes that we might someday ditch "ATerm" for the 
on-disk format for everyone's benefit.
 • https://github.com/NixOS/nix/pull/8699 C bindings for the Nix store. Perhaps 
this isn't so important now that you all are going for the full rewrite, but I 
saw Maxim's early email about creating guile bindings for a gradual rewrite. 
The C bindings are explicitly made with the idea of making other langauge 
bindings easier (e.g. https://github.com/NixOS/nix/pull/7735, 
https://hackage.haskell.org/package/hercules-ci-cnix-store). Still mentioning 
this in case it is useful as a "Plan B".
Furthermore, I hope that beyond merely ensuring some interop with what we have 
already, we work to further keep things in sync and hopefully converging (where 
was have diverging new features like Blake hashing in Guix and 
content-addressed derivations in Nix) going forward. To that end, I would love 
to set up an implementation-agnostic standard, maybe even an IETF standard (!).

I think while we all have different ideas (and should continue to have 
different ideas!) on what the user-facing package language looks like, we do 
essential agree on what this store interface looks like. It is a "narrow waist" 
which can be implemented numerous different ways, and used in numerous 
different high level packaging paradigms. It is this quality that makes it so 
worthy of standardization.

> I’m interested in hearing how you view content-addressing and its use.
> In Guix there’s one proposal based on ERIS:
> 
>   https://issues.guix.gnu.org/52555#8
> 
> Previously there was an experiment to implement what you described at
> “partial substitution”:
> 
>   https://lists.gnu.org/archive/html/guix-devel/2021-01/msg00080.html

I have been talking a lot to Florian about these things too. Long ago I emailed 
Ludo and some others about the IPFS & Nix work. Since then RFC 133 was 
accepted, https://github.com/NixOS/rfcs/blob/master/rfcs/0133-git-hashing.md, 
which prepares the way for a lot of that, and more recently 
https://github.com/NixOS/nix/pull/9294 (merged) has begun the implementation.

It sounds like this ERIS plan and Tvix's content addressing are fairly similar 
--- use improved content addressing "underneath the hood". The thing I have 
been working on is trying to expose content-addressing all the way into the 
store path for end-to-end trustlessless.

I think for build artifacts, either way is fine. But for source code the 
end-to-end trustlessness is nice for treating things like Software Heritage as 
a substituter of last resort. (I made 
https://docs.softwareheritage.org/devel/swh-web/uri-scheme-api.html#get--api-1-raw-(swhid)-
 forto spit out raw git objects for 
https://blog.obsidian.systems/software-heritage-bridge/, but the pipelining 
latency issues mean something like SWH's "Vault API" is probably better.)

----------

That's a big wall of text, but glad it's all out there. Stuff is really cooking 
in all our ecosystems these days, and I'm very excited for where things are 
going!

John

Reply via email to