Protocol Specification v0.6
OIP Overview
The Oracle Interoperability Protocol (OIP) (opens in a new tab) defines how state synchronization (opens in a new tab) participants encode a request, authenticate it and preserve its result across retries and recovery. OIP v0.6.0 adds a canonical Protocol Buffers schema, positional operation layouts and executable Rust and Go wire consumers to the design presented in v0.5.
This edition is a complete reference for its own scope. The protocol core (opens in a new tab) and the reference profile are distinct: the core fixes interoperable bytes and product rules, while the profile records the choices made by the supplied reference implementation. OSS (opens in a new tab) is a separate product in development. It uses OIP; it is not the reference implementation in this repository.
Core and profile
One schema fixes the bytes for Rust and Go; only the Rust reference turns an admitted request into an effect.
- 1
One schema, two bindings
Both language bindings are generated from
proto/oip.proto, and the operation table fixes the operands of every opcode. Both test suites read vectors from the same folder. - 2
A parse grants nothing
A successful parse does not authorize an effect. The final consumer checks the current cut, role, lock and evidence for the exact decoded request.
- 3
Wire and admission only
The Go package implements the wire and admission surfaces. It is not the durable authority or a signed-response verifier.
- 4
Profile choices
Accepted operations, configured limits, storage, session tokens and host credentials are choices of the supplied reference implementation. Configured limits do not become network-wide constants.
- Path of an admitted request
- Rust reference authority
- Not in the Go package
Schematic: folders stand for the files that implement each step.
Who should read this edition#
Protocol implementers, off-chain Driver builders and implementation reviewers should start with Wire Format and Field Tables. A DeFi application reads RWA Registry (opens in a new tab) contracts rather than exchanging OIP frames. Its reader can begin with System Architecture and State Synchronization.
Specification boundary#
NormativeBytes, test vectors and proofs
| Surface | This edition |
|---|---|
| Envelope | Canonical Packet and signed Core with fixed field numbers |
| Operations | Family and opcode select the exact word, blob and deadline layout |
| Authentication | Current registered identity, channel binding and per-operation authority |
| Effects | One authoritative request binding, recorded result and durable effect boundary |
| Recovery | Fresh authoritative state, exact retained outcomes and held unresolved obligations |
| Implementation | Rust reference authority and Go wire/admission package |
A successful parse does not authorize an effect. The final product consumer checks the current cut (opens in a new tab), role, lock and evidence for the exact decoded request. A transport timeout does not prove that a debit was reversed.
The envelope is defined in one schema file, proto/oip.proto, from which both language bindings are generated. Its first message is the packet:
syntax = "proto2";package oip.v06;option go_package = "github.com/Oraclizer/oip-spec/go/wirepb";// The canonical OIP v0.6 wire schema. Receivers accept only the canonical// encoding of these messages and reject unknown fields; the encoding rules are// in spec/wire-conformance.md. New fields enter only through a new negotiated// version.message Packet { optional Core core = 1; optional bytes signature = 2;}Reference implementation#
NormativeBytes, test vectors and proofs
The public specification repository (opens in a new tab) contains the oip-spec Rust crate and the Go module github.com/Oraclizer/oip-spec/go. The specification, schema, field table, vectors, Rust reference implementation and Go bindings use Apache-2.0.
The two package manifests name the crate and the module and pin their dependencies:
[package]name = "oip-spec"version = "0.6.0"edition = "2024"license = "Apache-2.0"publish = false[lib]path = "src/lib.rs"[dependencies]serde = { version = "=1.0.228", features = ["derive", "rc"] }serde_json = "=1.0.149"sha2 = "=0.10.9"prost = "=0.13.5"ed25519-dalek = { version = "=2.2.0", default-features = false, features = ["std"] }module github.com/Oraclizer/oip-spec/gogo 1.25.5require google.golang.org/protobuf v1.36.8Both languages implement the wire and admission (opens in a new tab) surfaces identified by Conformance. The Go package is not the durable Rust authority or a signed-response verifier.
Both test suites run from a fresh clone with the pinned toolchain, and the Rust suite runs the reference against the shared vectors:
git clone https://github.com/Oraclizer/oip-spec.gitcd oip-specrustup toolchain install 1.96.1 --profile minimalcargo +1.96.1 test --locked(cd go && go test -mod=readonly ./...)The reference profile accepts the operations marked as supported in Field Tables. Its storage, session tokens and host-supplied execution credentials are profile choices. Configuration limits do not become network-wide constants.
Reading the status labels#
Normative sections state the v0.6 contract and link it to the schema, vectors or verification artifacts. Design sections explain concepts carried from v0.5 that have no executable wire realization in this profile. A section label does not claim that every compiled instruction or external service is formally verified. Conformance states the assurance boundary.
Design context#
DesignCarried from v0.5, without bytes or test vectors in this version
OIP belongs to the architecture described in the Core Concepts pages. Peer discovery, network-wide sequencing, arbitrary multi-hop relaying and the complete deployed OSS service are outside this edition's executable reference. The v0.5 migration guide identifies replaced and unimplemented design surfaces instead of implying wire compatibility.
Related Pages#
Edition history#
- 0.6.0: Added this edition. The v0.5 specification remains available at its original addresses.
