https://github.com/filip26/copper-multicodec
Multicodec & Multihash Encoder/Decoder
https://github.com/filip26/copper-multicodec
multicodec multiformats multihash varint
Last synced: 3 months ago
JSON representation
Multicodec & Multihash Encoder/Decoder
- Host: GitHub
- URL: https://github.com/filip26/copper-multicodec
- Owner: filip26
- License: apache-2.0
- Created: 2023-04-12T23:01:57.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2025-08-09T13:00:00.000Z (3 months ago)
- Last Synced: 2025-08-09T14:28:08.803Z (3 months ago)
- Topics: multicodec, multiformats, multihash, varint
- Language: Java
- Homepage: https://apicatalog.com
- Size: 411 KB
- Stars: 2
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE
- Security: SECURITY.md
Awesome Lists containing this project
README
# Copper Multicodec
Copper Multicodec is a Java library that implements [Multicodec](https://github.com/multiformats/multicodec) and [Multihash](https://github.com/multiformats/multihash), enabling efficient encoding and decoding of data.
[](https://github.com/filip26/copper-multicodec/actions/workflows/java8-build.yml)
[](https://sonarcloud.io/summary/new_code?id=filip26_copper-multicodec)
[](https://search.maven.org/search?q=g:com.apicatalog%20AND%20a:copper-multicodec)
[](https://opensource.org/licenses/Apache-2.0)
## Features
- **Static Codec Registry:** Predefined codecs for efficient access.
- **Direct Static Access to Codecs:** Eliminates runtime searches for codecs.
- **Custom Codec Support:** Allows customization of supported codecs.
- **Multihash Support:** Provides compatibility with multihash encoding.
- **Unsigned VarInt Support:** Handles unsigned variable-length integers.
- **Zero Third-Party Dependencies:** Ensures a lightweight and self-contained implementation.
## Examples
```java
/* encode an input as P-521 public key */
byte[] encoded = KeyCodec.P521_PUBLIC_KEY.encode(input);
/* encode an input as an identity */
byte[] encoded = MultihashCodec.IDENTITY.encode(input);
/* get decoder instance initialized with all supported codecs */
var decoder = MulticodecDecoder.getInstance();
/* get custom decoder initialized with codecs tagged as key and hash */
var decoder = MulticodecDecoder.getInstance(Tag.Key, Tag.Hash);
/* get custom decoder initialized with custom codec set */
var decoder = MulticodecDecoder.getInstance(codecs...);
/* decode */
byte[] decoded = decoder.decode(encoded);
/* or check if encoding is supported */
Multicodec codec = decoder.getCodec(encoded).orElseThrow(() -> new IllegalArgumentException("Unsupported codec."));
byte[] decoded = codec.decode(encoded);
/* or directly when only one codec is supported */
byte[] decoded = KeyCodec.P521_PUBLIC_KEY.decode(encoded);
/* check if byte array is encoded with a codec */
if (KeyCodec.P521_PUBLIC_KEY.isEncoded(encoded)) {
...
}
/* create a custom codec */
var codec = Multicodec.of(name, tag, code);
/* get registry instance initialized with all supported codecs */
var registry = MulticodecRegistry.getInstance();
/* get custom registry initialized with codecs tagged as key and hash */
var registry = MulticodecRegistry.getInstance(Tag.Key, Tag.Hash);
/* get custom registry initialized with custom codec set */
var registry = MulticodecRegistry.getInstance(codecs...);
/* get codec */
var codec = registry.getCodec(code).orElseThrow(() -> new IllegalArgumentException("Unsupported codec."));
byte[] encoded = codec.encode(input);
```
### Multihash
```java
/* get multihash decoder initialized with all multihash codecs */
var decoder = MulticodecDecoder.getInstance(Tag.Multihash);
/* decode; digest size is checked and removed */
byte[] decoded = decoder.decode(encoded);
/* or check if supported */
var codec = decoder.get(encoded).orElseThrow(() -> new IllegalArgumentException("Unsupported multihash."));
byte[] decoded = codec.decode(encoded);
/* or directly */
byte[] decoded = MultihashCodec.SHA2_384.decode(encoded);
/*
/* check if byte array is encoded with multihash codec */
if (MultihashCodec.SHA2_384.isEncoded(encoded)) {
...
}
/* get registry initialized with all multihash codecs */
var registry = MulticodecRegistry.getInstance(Tag.Multihash);
/* encode an input as multihash */
var codec = registry.get(code).orElseThrow(() -> new IllegalArgumentException("Unsupported multihash."));
byte[] encoded = codec.encode(input);
```
## Installation
### Maven
To include Copper Multicodec in your project, add the following dependency to your `pom.xml`:
```xml
com.apicatalog
copper-multicodec
2.1.0
```
## Documentation
* [](https://javadoc.io/doc/com.apicatalog/copper-multicodec)
* [Supported Codecs](https://github.com/filip26/copper-multicodec/tree/main/src/main/java/com/apicatalog/multicodec/codec)
## Contributing
All PR's welcome!
### Building
Fork and clone the project repository.
```bash
> cd copper-multicodec
> mvn clean package
```
## Additional Resources
- [Copper Multibase](https://github.com/filip26/copper-multibase)
- [Multicodec](https://github.com/multiformats/multicodec)
- [Multihash](https://github.com/multiformats/multihash)
- [unsigned-varint](https://github.com/multiformats/unsigned-varint)