https://github.com/filip26/copper-multicodec
Multicodec & Multihash Encoder/Decoder
https://github.com/filip26/copper-multicodec
multicodec multiformats multihash varint
Last synced: 2 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 (about 2 years ago)
- Default Branch: main
- Last Pushed: 2025-04-08T10:12:57.000Z (2 months ago)
- Last Synced: 2025-04-08T11:24:49.279Z (2 months ago)
- Topics: multicodec, multiformats, multihash, varint
- Language: Java
- Homepage: https://apicatalog.com
- Size: 358 KB
- Stars: 1
- 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
1.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)