Major integrations and fixes: - Added BACKBEAT SDK integration for P2P operation timing - Implemented beat-aware status tracking for distributed operations - Added Docker secrets support for secure license management - Resolved KACHING license validation via HTTPS/TLS - Updated docker-compose configuration for clean stack deployment - Disabled rollback policies to prevent deployment failures - Added license credential storage (CHORUS-DEV-MULTI-001) Technical improvements: - BACKBEAT P2P operation tracking with phase management - Enhanced configuration system with file-based secrets - Improved error handling for license validation - Clean separation of KACHING and CHORUS deployment stacks 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
237 lines
14 KiB
Markdown
237 lines
14 KiB
Markdown
go-ipld-prime
|
|
=============
|
|
|
|
`go-ipld-prime` is an implementation of the IPLD spec interfaces,
|
|
a batteries-included codec implementations of IPLD for CBOR and JSON,
|
|
and tooling for basic operations on IPLD objects (traversals, etc).
|
|
|
|
|
|
|
|
API
|
|
---
|
|
|
|
The API is split into several packages based on responsibly of the code.
|
|
The most central interfaces are the base package,
|
|
but you'll certainly need to import additional packages to get concrete implementations into action.
|
|
|
|
Roughly speaking, the core package interfaces are all about the IPLD Data Model;
|
|
the `codec/*` packages contain functions for parsing serial data into the IPLD Data Model,
|
|
and converting Data Model content back into serial formats;
|
|
the `traversal` package is an example of higher-order functions on the Data Model;
|
|
concrete `ipld.Node` implementations ready to use can be found in packages in the `node/*` directory;
|
|
and several additional packages contain advanced features such as IPLD Schemas.
|
|
|
|
(Because the codecs, as well as higher-order features like traversals, are
|
|
implemented in a separate package from the core interfaces or any of the Node implementations,
|
|
you can be sure they're not doing any funky "magic" -- all this stuff will work the same
|
|
if you want to write your own extensions, whether for new Node implementations
|
|
or new codecs, or new higher-order order functions!)
|
|
|
|
- `github.com/ipld/go-ipld-prime` -- imported as just `ipld` -- contains the core interfaces for IPLD. The most important interfaces are `Node`, `NodeBuilder`, `Path`, and `Link`.
|
|
- `github.com/ipld/go-ipld-prime/node/basicnode` -- provides concrete implementations of `Node` and `NodeBuilder` which work for any kind of data, using unstructured memory.
|
|
- `github.com/ipld/go-ipld-prime/node/bindnode` -- provides concrete implementations of `Node` and `NodeBuilder` which store data in native golang structures, interacting with it via reflection. Also supports IPLD Schemas!
|
|
- `github.com/ipld/go-ipld-prime/traversal` -- contains higher-order functions for traversing graphs of data easily.
|
|
- `github.com/ipld/go-ipld-prime/traversal/selector` -- contains selectors, which are sort of like regexps, but for trees and graphs of IPLD data!
|
|
- `github.com/ipld/go-ipld-prime/codec` -- parent package of all the codec implementations!
|
|
- `github.com/ipld/go-ipld-prime/codec/dagcbor` -- implementations of marshalling and unmarshalling as CBOR (a fast, binary serialization format).
|
|
- `github.com/ipld/go-ipld-prime/codec/dagjson` -- implementations of marshalling and unmarshalling as JSON (a popular human readable format).
|
|
- `github.com/ipld/go-ipld-prime/linking/cid` -- imported as `cidlink` -- provides concrete implementations of `Link` as a CID. Also, the multicodec registry.
|
|
- `github.com/ipld/go-ipld-prime/schema` -- contains the `schema.Type` and `schema.TypedNode` interface declarations, which represent IPLD Schema type information.
|
|
- `github.com/ipld/go-ipld-prime/node/typed` -- provides concrete implementations of `schema.TypedNode` which decorate a basic `Node` at runtime to have additional features described by IPLD Schemas.
|
|
|
|
|
|
Getting Started
|
|
---------------
|
|
|
|
Let's say you want to create some data programmatically,
|
|
and then serialize it, or save it as [blocks].
|
|
|
|
You've got a ton of different options, depending on what golang convention you want to use:
|
|
|
|
- the `qp` package -- [example](https://pkg.go.dev/github.com/ipld/go-ipld-prime/fluent/qp#example-package)
|
|
- the `bindnode` system, if you want to use golang types -- [example](https://pkg.go.dev/github.com/ipld/go-ipld-prime/node/bindnode#example-Wrap-NoSchema), [example with schema](https://pkg.go.dev/github.com/ipld/go-ipld-prime/node/bindnode#example-Wrap-WithSchema)
|
|
- or the [`NodeBuilder`](https://pkg.go.dev/github.com/ipld/go-ipld-prime/datamodel#NodeBuilder) interfaces, raw (verbose; not recommended)
|
|
- or even some codegen systems!
|
|
|
|
Once you've got a Node full of data,
|
|
you can serialize it:
|
|
|
|
https://pkg.go.dev/github.com/ipld/go-ipld-prime#example-package-CreateDataAndMarshal
|
|
|
|
But probably you want to do more than that;
|
|
probably you want to store this data as a block,
|
|
and get a CID that links back to it.
|
|
For this you use `LinkSystem`:
|
|
|
|
https://pkg.go.dev/github.com/ipld/go-ipld-prime/linking#example-LinkSystem.Store
|
|
|
|
Hopefully these pointers give you some useful getting-started focal points.
|
|
The API docs should help from here on out.
|
|
We also highly recommend scanning the [godocs](https://pkg.go.dev/github.com/ipld/go-ipld-prime) for other pieces of example code, in various packages!
|
|
|
|
Let us know in [issues](https://github.com/ipld/go-ipld-prime/issues), [chat, or other community spaces](https://ipld.io/docs/intro/community/) if you need more help,
|
|
or have suggestions on how we can improve the getting-started experiences!
|
|
|
|
|
|
|
|
Other IPLD Libraries
|
|
--------------------
|
|
|
|
The IPLD specifications are designed to be language-agnostic.
|
|
Many implementations exist in a variety of languages.
|
|
|
|
For overall behaviors and specifications, refer to the IPLD website, or its source, in IPLD meta repo:
|
|
- https://ipld.io/
|
|
- https://github.com/ipld/ipld/
|
|
You should find specs in the `specs/` dir there,
|
|
human-friendly docs in the `docs/` dir,
|
|
and information about _why_ things are designed the way they are mostly in the `design/` directories.
|
|
|
|
There are also pages in the IPLD website specifically about golang IPLD libraries,
|
|
and your alternatives: https://ipld.io/libraries/golang/
|
|
|
|
|
|
### distinctions from go-ipld-interface&go-ipld-cbor
|
|
|
|
This library ("go ipld prime") is the current head of development for golang IPLD,
|
|
and we recommend new developments in golang be done using this library as the basis.
|
|
|
|
However, several other libraries exist in golang for working with IPLD data.
|
|
Most of these predate go-ipld-prime and no longer receive active development,
|
|
but since they do support a lot of other software, you may continue to seem them around for a while.
|
|
go-ipld-prime is generally **serially compatible** with these -- just like it is with IPLD libraries in other languages.
|
|
|
|
In terms of programmatic API and features, go-ipld-prime is a clean take on the IPLD interfaces,
|
|
and chose to address several design decisions very differently than older generation of libraries:
|
|
|
|
- **The Node interfaces map cleanly to the IPLD Data Model**;
|
|
- Many features known to be legacy are dropped;
|
|
- The Link implementations are purely CIDs (no "name" nor "size" properties);
|
|
- The Path implementations are provided in the same box;
|
|
- The JSON and CBOR implementations are provided in the same box;
|
|
- Several odd dependencies on blockstore and other interfaces that were closely coupled with IPFS are replaced by simpler, less-coupled interfaces;
|
|
- New features like IPLD Selectors are only available from go-ipld-prime;
|
|
- New features like ADLs (Advanced Data Layouts), which provide features like transparent sharding and indexing for large data, are only available from go-ipld-prime;
|
|
- Declarative transformations can be applied to IPLD data (defined in terms of the IPLD Data Model) using go-ipld-prime;
|
|
- and many other small refinements.
|
|
|
|
In particular, the clean and direct mapping of "Node" to concepts in the IPLD Data Model
|
|
ensures a much more consistent set of rules when working with go-ipld-prime data, regardless of which codecs are involved.
|
|
(Codec-specific embellishments and edge-cases were common in the previous generation of libraries.)
|
|
This clarity is also what provides the basis for features like Selectors, ADLs, and operations such as declarative transformations.
|
|
|
|
Many of these changes had been discussed for the other IPLD codebases as well,
|
|
but we chose clean break v2 as a more viable project-management path.
|
|
Both go-ipld-prime and these legacy libraries can co-exist on the same import path, and both refer to the same kinds of serial data.
|
|
Projects wishing to migrate can do so smoothly and at their leisure.
|
|
|
|
We now consider many of the earlier golang IPLD libraries to be defacto deprecated,
|
|
and you should expect new features *here*, rather than in those libraries.
|
|
(Those libraries still won't be going away anytime soon, but we really don't recomend new construction on them.)
|
|
|
|
### migrating
|
|
|
|
**For recommendations on where to start when migrating:**
|
|
see [README_migrationGuide](./README_migrationGuide.md).
|
|
That document will provide examples of which old concepts and API names map to which new APIs,
|
|
and should help set you on the right track.
|
|
|
|
### unixfsv1
|
|
|
|
Lots of people who hear about IPLD have heard about it through IPFS.
|
|
IPFS has IPLD-native APIs, but IPFS *also* makes heavy use of a specific system called "UnixFSv1",
|
|
so people often wonder if UnixFSv1 is supported in IPLD libraries.
|
|
|
|
The answer is "yes" -- but it's not part of the core.
|
|
|
|
UnixFSv1 is now treated as an [ADL](https://ipld.io/glossary/#adl),
|
|
and a go-ipld-prime compatible implementation can be found
|
|
in the [ipfs/go-unixfsnode](https://github.com/ipfs/go-unixfsnode) repo.
|
|
|
|
Additionally, the codec used in UnixFSv1 -- dag-pb --
|
|
can be found implemented in the [ipld/go-codec-dagpb](https://github.com/ipld/go-codec-dagpb) repo.
|
|
|
|
A "some assembly required" advisory may still be in effect for these pieces;
|
|
check the readmes in those repos for details on what they support.
|
|
|
|
The move to making UnixFSv1 a non-core system has been an arduous retrofit.
|
|
However, framing it as an ADL also provides many advantages:
|
|
|
|
- it demonstrates that ADLs as a plugin system _work_, and others can develop new systems in this pattern!
|
|
- it has made pathing over UnixFSv1 much more standard and well-defined
|
|
- this standardization means systems like [Selectors](https://ipld.io/glossary/#selectors) work naturally over UnixFSv1...
|
|
- ... which in turn means anything using them (ex: CAR export; graphsync; etc) can very easily be asked to produce a merkle-proof
|
|
for a path over UnixFSv1 data, without requiring the querier to know about the internals. Whew!
|
|
|
|
We hope users and developers alike will find value in how these systems are now layered.
|
|
|
|
|
|
|
|
Change Policy
|
|
-------------
|
|
|
|
The go-ipld-prime library is ready to use, and we value stability highly.
|
|
|
|
We make releases periodically.
|
|
However, using a commit hash to pin versions precisely when depending on this library is also perfectly acceptable.
|
|
(Only commit hashes on the master branch can be expected to persist, however;
|
|
depending on a commit hash in a branch is not recommended. See [development branches](#development-branches).)
|
|
|
|
We maintain a [CHANGELOG](CHANGELOG.md)!
|
|
Please read it, when updating!
|
|
|
|
We do make reasonable attempts to minimize the degree of changes to the library which will create "breaking change" experiences for downstream consumers,
|
|
and we do document these in the changelog (often, even with specific migration instructions).
|
|
However, we do also still recommend running your own compile and test suites as a matter of course after updating.
|
|
|
|
You can help make developing this library easier by staying up-to-date as a downstream consumer!
|
|
When we do discover a need for API changes, we typically try to introduce the new API first,
|
|
and do at least one release tag in which the old API is deprecated (but not yet removed).
|
|
We will all be able to develop software faster, together, as an ecosystem,
|
|
if libraries can keep reasonably closely up-to-date with the most recent tags.
|
|
|
|
|
|
### Version Names
|
|
|
|
When a tag is made, version number steps in go-ipld-prime advance as follows:
|
|
|
|
1. the number bumps when the lead maintainer says it does.
|
|
2. even numbers should be easy upgrades; odd numbers may change things.
|
|
3. the version will start with `v0.` until further notice.
|
|
|
|
[This is WarpVer](https://gist.github.com/warpfork/98d2f4060c68a565e8ad18ea4814c25f).
|
|
|
|
These version numbers are provided as hints about what to expect,
|
|
but ultimately, you should always invoke your compiler and your tests to tell you about compatibility,
|
|
as well as read the [changelog](CHANGELOG.md).
|
|
|
|
|
|
### Updating
|
|
|
|
**Read the [CHANGELOG](CHANGELOG.md).**
|
|
|
|
Really, read it. We put exact migration instructions in there, as much as possible. Even outright scripts, when feasible.
|
|
|
|
An even-number release tag is usually made very shortly before an odd number tag,
|
|
so if you're cautious about absorbing changes, you should update to the even number first,
|
|
run all your tests, and *then* upgrade to the odd number.
|
|
Usually the step to the even number should go off without a hitch, but if you *do* get problems from advancing to an even number tag,
|
|
A) you can be pretty sure it's a bug, and B) you didn't have to edit a bunch of code before finding that out.
|
|
|
|
|
|
### Development branches
|
|
|
|
The following are norms you can expect of changes to this codebase, and the treatment of branches:
|
|
|
|
- The `master` branch will not be force-pushed.
|
|
- (exceptional circumstances may exist, but such exceptions will only be considered valid for about as long after push as the "$N-second-rule" about dropped food).
|
|
- Therefore, commit hashes on master are gold to link against.
|
|
- All other branches *can* be force-pushed.
|
|
- Therefore, commit hashes not reachable from the master branch are inadvisable to link against.
|
|
- If it's on master, it's understood to be good, in as much as we can tell.
|
|
- Changes and features don't get merged until their tests pass!
|
|
- Packages of "alpha" developmental status may exist, and be more subject to change than other more finalized parts of the repo, but their self-tests will at least pass.
|
|
- Development proceeds -- both starting from and ending on -- the `master` branch.
|
|
- There are no other long-running supported-but-not-master branches.
|
|
- The existence of tags at any particular commit do not indicate that we will consider starting a long running and supported diverged branch from that point, nor start doing backports, etc.
|