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