A minimal, canonical Go library for the Arc protocol primitives.
Arc is a protocol where everything is a keypair, and keypairs with purpose become identities. This repository defines the foundational primitives that all Arc-compatible systems share.
This repo is intentionally minimal. It defines the protocol, not any particular implementation of storage, relay, or application logic. Those belong in separate repositories that import this foundation.
Arc has exactly four primitives:
| Primitive | Purpose | Size |
|---|---|---|
PublicKey |
A keypair's identity on the wire | 32 bytes (Ed25519) |
Reference |
A content-addressed pointer | 32 bytes (SHA-256) |
Content |
An immutable blob | Arbitrary bytes |
Message |
A signed envelope between keypairs | Structured |
Message {
from: PublicKey // Sender
to: PublicKey // Recipient
content: Reference // Hash of content
content_type: string // MIME type
timestamp: int64 // Unix milliseconds
signature: bytes // 64-byte Ed25519 signature
}
Arc defines canonical byte representations for all types. This ensures that references and signatures are computed identically across any language or implementation.
Message (canonical bytes):
from.key (32 bytes)
|| to.key (32 bytes)
|| content.hash (32 bytes)
|| content_type_len (4 bytes, big-endian uint32)
|| content_type (UTF-8 bytes)
|| timestamp (8 bytes, big-endian int64, Unix milliseconds)
|| signature (64 bytes)
Signing payload is canonical bytes without the signature.
Message reference is SHA-256(canonical bytes) — includes signature.
go get github.com/gezibash/arcpackage main
import (
"fmt"
"github.com/gezibash/arc/pkg/content"
"github.com/gezibash/arc/pkg/identity"
"github.com/gezibash/arc/pkg/message"
)
func main() {
// Create identities
alice, _ := identity.Generate()
bob, _ := identity.Generate()
// Create content
data := []byte(`{"hello": "world"}`)
c := content.New(data)
// Create and sign message
msg := message.New(alice.PublicKey(), bob.PublicKey(), c.Hash(), "application/json")
message.Sign(&msg, alice)
// Verify
valid, _ := message.Verify(msg)
fmt.Println("Valid:", valid) // true
}arc/
├── pkg/
│ ├── identity/ # Ed25519 keypair operations
│ ├── reference/ # SHA-256 content addressing
│ ├── message/ # Signed message envelopes
│ ├── content/ # Content with cached hash
│ └── errs/ # Error definitions
├── go.mod
└── README.md
MIT