Returns the raw activation height for a given hardfork version. Needed by the pre-hardfork transaction freeze logic. Co-Authored-By: Charon <charon@lethean.io>
107 lines
4.1 KiB
Go
107 lines
4.1 KiB
Go
// Copyright (c) 2017-2026 Lethean (https://lt.hn)
|
|
//
|
|
// Licensed under the European Union Public Licence (EUPL) version 1.2.
|
|
// You may obtain a copy of the licence at:
|
|
//
|
|
// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl
|
|
//
|
|
// SPDX-License-Identifier: EUPL-1.2
|
|
|
|
package config
|
|
|
|
// HardFork describes a single hard fork activation point on the chain.
|
|
type HardFork struct {
|
|
// Version is the hardfork version number (0-6).
|
|
Version uint8
|
|
|
|
// Height is the block height AFTER which this fork activates.
|
|
// The fork is active at heights strictly greater than this value.
|
|
// A value of 0 means the fork is active from genesis.
|
|
Height uint64
|
|
|
|
// Mandatory indicates whether nodes must support this fork version
|
|
// to remain on the network.
|
|
Mandatory bool
|
|
|
|
// Description is a short human-readable summary of what this fork changes.
|
|
Description string
|
|
}
|
|
|
|
// Hardfork version constants, matching the C++ ZANO_HARDFORK_* identifiers.
|
|
const (
|
|
HF0Initial uint8 = 0
|
|
HF1 uint8 = 1
|
|
HF2 uint8 = 2
|
|
HF3 uint8 = 3
|
|
HF4Zarcanum uint8 = 4
|
|
HF5 uint8 = 5
|
|
HF6 uint8 = 6
|
|
HFTotal uint8 = 7
|
|
)
|
|
|
|
// MainnetForks lists all hardfork activations for the Lethean mainnet.
|
|
// Heights correspond to ZANO_HARDFORK_*_AFTER_HEIGHT in the C++ source.
|
|
// The fork activates at heights strictly greater than the listed height,
|
|
// so Height=0 means active from genesis, and Height=10080 means active
|
|
// from block 10081 onwards.
|
|
var MainnetForks = []HardFork{
|
|
{Version: HF0Initial, Height: 0, Mandatory: true, Description: "CryptoNote base, PoW+PoS hybrid"},
|
|
{Version: HF1, Height: 10080, Mandatory: true, Description: "New transaction types"},
|
|
{Version: HF2, Height: 10080, Mandatory: true, Description: "Block time adjustment (720 blocks/day)"},
|
|
{Version: HF3, Height: 999999999, Mandatory: false, Description: "Block version 2"},
|
|
{Version: HF4Zarcanum, Height: 999999999, Mandatory: false, Description: "Zarcanum privacy (confidential txs, CLSAG)"},
|
|
{Version: HF5, Height: 999999999, Mandatory: false, Description: "Confidential assets, surjection proofs"},
|
|
{Version: HF6, Height: 999999999, Mandatory: false, Description: "Block time halving (120s to 240s)"},
|
|
}
|
|
|
|
// TestnetForks lists all hardfork activations for the Lethean testnet.
|
|
var TestnetForks = []HardFork{
|
|
{Version: HF0Initial, Height: 0, Mandatory: true, Description: "CryptoNote base, PoW+PoS hybrid"},
|
|
{Version: HF1, Height: 0, Mandatory: true, Description: "New transaction types"},
|
|
{Version: HF2, Height: 10, Mandatory: true, Description: "Block time adjustment"},
|
|
{Version: HF3, Height: 0, Mandatory: true, Description: "Block version 2"},
|
|
{Version: HF4Zarcanum, Height: 100, Mandatory: true, Description: "Zarcanum privacy"},
|
|
{Version: HF5, Height: 200, Mandatory: true, Description: "Confidential assets"},
|
|
{Version: HF6, Height: 999999999, Mandatory: false, Description: "Block time halving"},
|
|
}
|
|
|
|
// VersionAtHeight returns the highest hardfork version that is active at the
|
|
// given block height. It performs a reverse scan of the fork list to find the
|
|
// latest applicable version.
|
|
//
|
|
// A fork with Height=0 is active from genesis (height 0).
|
|
// A fork with Height=N is active at heights > N.
|
|
func VersionAtHeight(forks []HardFork, height uint64) uint8 {
|
|
var version uint8
|
|
for _, hf := range forks {
|
|
if hf.Height == 0 || height > hf.Height {
|
|
if hf.Version > version {
|
|
version = hf.Version
|
|
}
|
|
}
|
|
}
|
|
return version
|
|
}
|
|
|
|
// IsHardForkActive reports whether the specified hardfork version is active
|
|
// at the given block height.
|
|
func IsHardForkActive(forks []HardFork, version uint8, height uint64) bool {
|
|
for _, hf := range forks {
|
|
if hf.Version == version {
|
|
return hf.Height == 0 || height > hf.Height
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// HardforkActivationHeight returns the activation height for the given
|
|
// hardfork version. The fork becomes active at heights strictly greater
|
|
// than the returned value. Returns (0, false) if the version is not found.
|
|
func HardforkActivationHeight(forks []HardFork, version uint8) (uint64, bool) {
|
|
for _, hf := range forks {
|
|
if hf.Version == version {
|
|
return hf.Height, true
|
|
}
|
|
}
|
|
return 0, false
|
|
}
|