Files
node/version/compatibility.go
zeekay 7cf87b230b node-unified is the node
The module already called itself github.com/luxfi/node while containing no node
in Go: cmd/luxd was twenty-one lines that printed the size of a few types, and
the Go column of the matrix measured a VM plugin. A repo that fetches the thing
it claims to be has not replaced it, so the Go sources move in — 1515 files,
the daemon and everything under it — and the build reaches outside this module
for nothing.

Rust and C++ sit beside it unchanged and are still measured against it by the
differential. That is the point of one repo: the reference implementation and
the two ports are the same checkout, so parity is a thing you can run rather
than a thing you assert.

Verified: builds, and the closure carries no lux-private — checked at build time
rather than believed. The daemon starts twelve chains on a local network
(P X C Q Z A B G K M F, plus D through its plugin) and reports healthy.
2026-09-07 16:15:25 -07:00

82 lines
1.9 KiB
Go

// Copyright (C) 2019-2025, Lux Industries Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package version
import (
"errors"
"time"
"github.com/luxfi/timer/mockable"
)
var (
errIncompatible = errors.New("peers version is incompatible")
_ Compatibility = (*compatibility)(nil)
)
// Compatibility a utility for checking the compatibility of peer versions
type Compatibility interface {
// Returns the local version
Version() *Application
// Returns nil if the provided version is compatible with the local version.
// This means that the version is connectable and that consensus messages
// can be made to them.
Compatible(*Application) error
}
type compatibility struct {
version *Application
minCompatible *Application
minCompatibleTime time.Time
prevMinCompatible *Application
clock mockable.Clock
}
// NewCompatibility returns a compatibility checker with the provided options
func NewCompatibility(
version *Application,
minCompatible *Application,
minCompatibleTime time.Time,
prevMinCompatible *Application,
) Compatibility {
return &compatibility{
version: version,
minCompatible: minCompatible,
minCompatibleTime: minCompatibleTime,
prevMinCompatible: prevMinCompatible,
}
}
func (c *compatibility) Version() *Application {
return c.version
}
func (c *compatibility) Compatible(peer *Application) error {
if err := c.version.Compatible(peer); err != nil {
return err
}
if !peer.Before(c.minCompatible) {
// The peer is at least the minimum compatible version.
return nil
}
// The peer is going to be marked as incompatible at [c.minCompatibleTime].
now := c.clock.Time()
if !now.Before(c.minCompatibleTime) {
return errIncompatible
}
// The minCompatible check isn't being enforced yet.
if !peer.Before(c.prevMinCompatible) {
// The peer is at least the previous minimum compatible version.
return nil
}
return errIncompatible
}