Skip to main content

Relay Protocol Specification

Table of Contents

  1. Overview
  2. Core Concepts
  3. RUFID Specification
  4. Protocol Architecture
  5. API Specification
  6. Federation Protocol
  7. Security Model
  8. Performance Requirements
  9. Implementation Guidelines

Overview

The Relay Protocol is a Universal Function Addressing System that enables direct function-level imports across distributed systems. It provides a deterministic, content-addressable identifier system (RUFID) that allows functions to be addressed, imported, and executed across language and platform boundaries.

Key Features

  • Universal Function Addressing: Every function gets a unique, deterministic RUFID
  • Direct Imports: from relay.rufid import abc123 as my_function
  • 92% Faster Resolution: 2ms RUFID resolution (vs 25ms traditional)
  • Protocol Federation: Seamless REST, GraphQL, gRPC, WebSocket support
  • Self-Hosted: No vendor lock-in, runs on your infrastructure
  • Language Agnostic: Works with Python, JavaScript, Go, Rust, and more

Design Goals

  1. Simplicity: Function addressing should be as simple as importing a module
  2. Performance: Sub-3ms resolution time for 99th percentile
  3. Deterministic: Same function always generates same RUFID
  4. Federated: Functions discoverable across network boundaries
  5. Secure: Built-in authentication, authorization, and audit logging

Core Concepts

RUFID (Relay Universal Function ID)

A RUFID is a deterministic, content-addressable identifier for functions. It consists of:

rufid:{hash}:v{version}:{tenant_id}

Components:

  • rufid: Protocol identifier prefix
  • {hash}: 12-character deterministic hash of function content
  • v{version}: Semantic version (e.g., v1, v2)
  • {tenant_id}: Multi-tenant isolation identifier

Example:

Full RUFID:  rufid:a1b2c3d4e5f6:v1:default
Short RUFID: a1b2c3d4e5f6

Function Metadata

Each RUFID carries essential metadata:

{
"rufid": "a1b2c3d4e5f6",
"function_name": "authenticate_user",
"signature": "(username: str, password: str) -> bool",
"language": "python",
"version": "v1",
"created_at": "2024-01-01T00:00:00Z",
"author": "user@example.com",
"tenant_id": "default",
"tags": ["auth", "security"],
"dependencies": ["bcrypt", "jwt"],
"metrics": {
"usage_count": 15420,
"avg_execution_time_ms": 12.3,
"success_rate": 0.998
}
}

RUFID Specification

Generation Algorithm

RUFIDs are generated using a deterministic hash algorithm:

def generate_rufid(function_name: str, source_code: str, signature: str, tenant_id: str) -> str:
# 1. Normalize source code (remove comments, normalize whitespace)
normalized_code = normalize(source_code)

# 2. Create canonical representation
canonical = f"{function_name}:{signature}:{normalized_code}"

# 3. Generate SHA-256 hash
hash_bytes = hashlib.sha256(canonical.encode()).digest()

# 4. Encode to base62 (alphanumeric)
rufid_hash = base62_encode(hash_bytes)[:12]

# 5. Construct full RUFID
return f"rufid:{rufid_hash}:v1:{tenant_id}"

Validation Rules

  1. Length: Short RUFID must be exactly 12 characters
  2. Characters: Only alphanumeric (a-z, A-Z, 0-9)
  3. Uniqueness: Collision probability < 10^-15
  4. Immutability: RUFIDs are immutable once created

Protocol Architecture

Multi-Protocol Support

The Relay Protocol supports multiple transport protocols through a unified translation layer:

┌─────────────────────────────────────────────────┐
│ Client Request │
└─────────────┬───────────┬───────────┬──────────┘
▼ ▼ ▼
┌────────┐ ┌────────┐ ┌────────┐
│ REST │ │GraphQL │ │ gRPC │
└───┬────┘ └───┬────┘ └───┬────┘
└───────────┼───────────┘

┌──────────────────────┐
│ Protocol Federation │
│ Translation Layer │
└──────────────────────┘


┌──────────────────────┐
│ RUFID Engine │
└──────────────────────┘


┌──────────────────────┐
│ PostgreSQL + Cache │
└──────────────────────┘

Component Architecture

Core Components:
RUFID Engine:
- Generation: Deterministic hash generation
- Validation: Format and integrity checks
- Resolution: High-speed lookup with caching

Protocol Federation:
- REST Translator: HTTP/JSON translation
- GraphQL Resolver: Query/mutation handling
- gRPC Service: Protobuf serialization
- WebSocket Manager: Real-time subscriptions

Storage Layer:
- PostgreSQL: Primary data store
- Redis Cache: Hot path optimization
- Index Manager: B-tree and hash indexes

Execution Engine:
- Sandbox: Isolated execution environment
- Resource Limits: CPU, memory, time constraints
- Telemetry: Execution metrics and tracing

API Specification

REST API

Create RUFID

POST /api/v1/functions/create
Content-Type: application/json

{
"function_name": "calculate_discount",
"source_code": "def calculate_discount(price, rate): ...",
"signature": "(price: float, rate: float) -> float",
"language": "python",
"description": "Calculate discount amount",
"tags": ["commerce", "pricing"]
}

Response:
{
"rufid": "rufid:x7y8z9a0b1c2:v1:default",
"rufid_short": "x7y8z9a0b1c2",
"import_statement": "from relay.rufid import x7y8z9a0b1c2 as calculate_discount",
"share_url": "https://rufid.run/x7y8z9a0b1c2",
"api_endpoint": "/api/v1/functions/x7y8z9a0b1c2/execute"
}

Resolve RUFID

POST /api/v1/functions/resolve
Content-Type: application/json

{
"rufid": "x7y8z9a0b1c2",
"version": "v1"
}

Response:
{
"function_id": "uuid-1234-5678",
"rufid": "x7y8z9a0b1c2",
"version": "v1",
"accessible": true,
"cached": true,
"resolution_time_ms": 1.8
}

Execute Function

POST /api/v1/functions/{rufid}/execute
Content-Type: application/json

{
"arguments": {
"price": 100.00,
"rate": 0.15
}
}

Response:
{
"result": 15.00,
"execution_time_ms": 2.3,
"status": "success"
}

GraphQL Schema

type Query {
resolveRUFID(rufid: String!): RUFIDResolution
listFunctions(
search: String
tags: [String]
limit: Int = 20
offset: Int = 0
): FunctionList
getFunctionMetrics(rufid: String!): FunctionMetrics
}

type Mutation {
createFunction(input: CreateFunctionInput!): Function
executeFunction(rufid: String!, args: JSON!): ExecutionResult
deleteFunction(rufid: String!): Boolean
}

type Subscription {
functionExecutions(rufid: String): ExecutionEvent
systemEvents: SystemEvent
}

type Function {
rufid: String!
shortRufid: String!
name: String!
signature: String!
language: String!
version: String!
createdAt: DateTime!
metrics: FunctionMetrics
}

gRPC Service

service RelayProtocolService {
rpc CreateRUFID(CreateRUFIDRequest) returns (CreateRUFIDResponse);
rpc ResolveRUFID(ResolveRUFIDRequest) returns (ResolveRUFIDResponse);
rpc ExecuteFunction(ExecuteFunctionRequest) returns (ExecuteFunctionResponse);
rpc StreamExecutions(StreamRequest) returns (stream ExecutionEvent);
}

message CreateRUFIDRequest {
string function_name = 1;
string source_code = 2;
string signature = 3;
string language = 4;
repeated string tags = 5;
}

message CreateRUFIDResponse {
string rufid = 1;
string import_statement = 2;
string share_url = 3;
}

Federation Protocol

Node Registration

Federation nodes register with the network to participate in RUFID discovery:

{
"node_id": "node-east-1",
"endpoint": "https://east1.relay.network",
"capabilities": {
"languages": ["python", "javascript", "go"],
"max_concurrent": 1000,
"protocols": ["rest", "grpc", "graphql"]
},
"auth": {
"certificate": "-----BEGIN CERTIFICATE-----...",
"public_key": "ssh-rsa AAAAB3..."
}
}

Discovery Protocol

Nodes broadcast and discover RUFIDs across the federation:

Node A                    Registry                   Node B
│ │ │
├──Register Node───────────►│ │
│ ├──Broadcast──────────────►
│ │ │
│◄──Node List───────────────┤ │
│ │ │
├──Discover RUFID──────────►│ │
│ ├──Query Nodes────────────►
│ │◄─────Results────────────┤
│◄──Federated Results───────┤ │

Synchronization

Nodes synchronize RUFID catalogs using incremental sync:

async def sync_catalog(since: datetime, node: FederatedNode):
# Get changes since last sync
changes = await get_catalog_changes(since)

# Send to peer node
response = await node.sync({
"added": changes.added,
"updated": changes.updated,
"deleted": changes.deleted,
"timestamp": datetime.utcnow()
})

# Apply peer changes locally
await apply_peer_changes(response)

Security Model

Authentication

The protocol supports multiple authentication methods:

  1. JWT Tokens: Bearer token authentication
  2. API Keys: Static key authentication
  3. mTLS: Certificate-based mutual TLS
  4. OAuth 2.0: Third-party authorization

Authorization

Fine-grained permissions control access:

Permissions:
rufid.create: Create new RUFIDs
rufid.read: Resolve and read RUFIDs
rufid.execute: Execute functions
rufid.delete: Delete RUFIDs
rufid.admin: Full administrative access

Roles:
developer:
- rufid.create
- rufid.read
- rufid.execute

consumer:
- rufid.read
- rufid.execute

admin:
- rufid.*

Audit Logging

All operations are logged for compliance:

{
"timestamp": "2024-01-01T12:00:00Z",
"operation": "rufid.execute",
"rufid": "x7y8z9a0b1c2",
"user": "user@example.com",
"tenant": "default",
"ip": "192.168.1.100",
"result": "success",
"duration_ms": 2.3
}

Performance Requirements

SLA Targets

MetricTarget99th Percentile
RUFID Generation< 5ms< 10ms
RUFID Resolution< 2ms< 3ms
Function Execution< 50ms< 100ms
Federation Sync< 100ms< 200ms
Cache Hit Rate> 95%-
Availability99.99%-

Optimization Strategies

  1. In-Memory Caching: Hot RUFIDs cached with TTL
  2. Connection Pooling: Reuse database connections
  3. Index Optimization: B-tree on rufid_short, hash on tenant_id
  4. Batch Operations: Bulk RUFID resolution
  5. CDN Distribution: Static assets and share URLs

Implementation Guidelines

Client Libraries

Official SDKs provide native integration:

Python

from relay_protocol import RelayClient

client = RelayClient(api_key="...")
rufid = client.create_function(
name="process_order",
code=process_order_func,
signature="(order: Order) -> bool"
)

# Direct import
from relay.rufid import x7y8z9a0b1c2 as process_order
result = process_order(my_order)

JavaScript/TypeScript

import { RelayClient } from '@relay/protocol';

const client = new RelayClient({ apiKey: '...' });
const rufid = await client.createFunction({
name: 'processOrder',
code: processOrderFunc,
signature: '(order: Order) => boolean'
});

// Dynamic import
const { processOrder } = await import(`relay://x7y8z9a0b1c2`);
const result = await processOrder(myOrder);

Go

import "github.com/relay-protocol/go-sdk"

client := relay.NewClient("api-key")
rufid, _ := client.CreateFunction(relay.Function{
Name: "ProcessOrder",
Code: processOrderFunc,
Signature: "func(Order) bool",
})

// Execute
result, _ := client.Execute(rufid, order)

Error Handling

Standardized error codes across all protocols:

CodeNameDescription
1001INVALID_RUFIDRUFID format validation failed
1002RUFID_NOT_FOUNDRUFID does not exist
1003PERMISSION_DENIEDInsufficient permissions
1004EXECUTION_TIMEOUTFunction execution exceeded timeout
1005RATE_LIMITEDRequest rate limit exceeded
2001FEDERATION_UNREACHABLECannot reach federation node
2002SYNC_CONFLICTCatalog sync conflict

Monitoring

Required metrics for production deployments:

Metrics:
System:
- relay_protocol_requests_total
- relay_protocol_request_duration_seconds
- relay_protocol_errors_total

RUFID:
- relay_rufid_creations_total
- relay_rufid_resolutions_total
- relay_rufid_cache_hits_ratio

Execution:
- relay_function_executions_total
- relay_function_execution_duration_seconds
- relay_function_errors_total

Federation:
- relay_federation_nodes_active
- relay_federation_sync_duration_seconds
- relay_federation_discovery_requests_total

Appendix

Reference Implementation

The reference implementation is available at:

Version History

VersionDateChanges
2.0.02024-01Protocol federation, multi-protocol support
1.5.02023-10Performance optimizations, 92% faster resolution
1.0.02023-06Initial specification release

Contributing

Protocol improvements are managed through:

  1. RFC Process: Submit proposals as GitHub issues
  2. Reference Implementation: Prove concepts with code
  3. Community Review: 30-day comment period
  4. Adoption: Gradual rollout with compatibility period

This specification is released under the MIT License and is maintained by the Relay Protocol Consortium.