Skip to content

Commit 90ac2f6

Browse files
committed
add bls package and tests
1 parent c9a436c commit 90ac2f6

File tree

7 files changed

+32
-698
lines changed

7 files changed

+32
-698
lines changed

chains/manager.go

Lines changed: 26 additions & 314 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import (
2727
"github.com/ava-labs/avalanchego/message"
2828
"github.com/ava-labs/avalanchego/network"
2929
"github.com/ava-labs/avalanchego/network/p2p"
30-
"github.com/ava-labs/avalanchego/simplex"
3130
"github.com/ava-labs/avalanchego/snow"
3231
"github.com/ava-labs/avalanchego/snow/consensus/snowball"
3332
"github.com/ava-labs/avalanchego/snow/engine/avalanche/bootstrap/queue"
@@ -152,14 +151,6 @@ type Manager interface {
152151
Shutdown()
153152
}
154153

155-
var (
156-
SimplexID = ids.ID{'s', 'i', 'm', 'p', 'l', 'e', 'x'}
157-
)
158-
159-
type ConsensusConfig struct {
160-
ProtocolID ids.ID
161-
}
162-
163154
// ChainParameters defines the chain being created
164155
type ChainParameters struct {
165156
// The ID of the chain being created.
@@ -174,8 +165,6 @@ type ChainParameters struct {
174165
FxIDs []ids.ID
175166
// Invariant: Only used when [ID] is the P-chain ID.
176167
CustomBeacons validators.Manager
177-
// The consensus parameters of this chain.
178-
ConsensusConfig ConsensusConfig
179168
}
180169

181170
type chain struct {
@@ -577,34 +566,15 @@ func (m *manager) buildChain(chainParams ChainParameters, sb subnets.Subnet) (*c
577566
beacons = chainParams.CustomBeacons
578567
}
579568

580-
var err error
581-
582-
// TODO: replace this hack with an additional field in ChainParameters
583-
// something like a ConsensusContext with an id for a consensus type
584-
isPrimaryNetwork := chainParams.SubnetID == constants.PrimaryNetworkID
585-
isPlugin := chainParams.VMID == constants.SubnetEVMID || chainParams.VMID == constants.XSVMID
586-
587-
if isPlugin && !isPrimaryNetwork {
588-
chain, err = m.createSimplexChain(
589-
ctx,
590-
chainParams.GenesisData,
591-
m.Validators,
592-
beacons,
593-
vm,
594-
chainFxs,
595-
sb)
596-
} else {
597-
chain, err = m.createSnowmanChain(
598-
ctx,
599-
chainParams.GenesisData,
600-
m.Validators,
601-
beacons,
602-
vm,
603-
chainFxs,
604-
sb,
605-
)
606-
}
607-
569+
chain, err = m.createSnowmanChain(
570+
ctx,
571+
chainParams.GenesisData,
572+
m.Validators,
573+
beacons,
574+
vm,
575+
chainFxs,
576+
sb,
577+
)
608578
if err != nil {
609579
return nil, fmt.Errorf("error while creating new snowman vm %w", err)
610580
}
@@ -1088,6 +1058,9 @@ func (m *manager) createSnowmanChain(
10881058
fxs []*common.Fx,
10891059
sb subnets.Subnet,
10901060
) (*chain, error) {
1061+
ctx.Lock.Lock()
1062+
defer ctx.Lock.Unlock()
1063+
10911064
ctx.State.Set(snow.EngineState{
10921065
Type: p2ppb.EngineType_ENGINE_TYPE_SNOWMAN,
10931066
State: snow.Initializing,
@@ -1112,11 +1085,24 @@ func (m *manager) createSnowmanChain(
11121085
bootstrappingDB := prefixdb.New(ChainBootstrappingDBPrefix, prefixDB)
11131086

11141087
// Passes messages from the consensus engine to the network
1115-
messageSender, err := m.createChainSender(ctx, p2ppb.EngineType_ENGINE_TYPE_SNOWMAN, sb)
1088+
messageSender, err := sender.New(
1089+
ctx,
1090+
m.MsgCreator,
1091+
m.Net,
1092+
m.ManagerConfig.Router,
1093+
m.TimeoutManager,
1094+
p2ppb.EngineType_ENGINE_TYPE_SNOWMAN,
1095+
sb,
1096+
ctx.Registerer,
1097+
)
11161098
if err != nil {
11171099
return nil, fmt.Errorf("couldn't initialize sender: %w", err)
11181100
}
11191101

1102+
if m.TracingEnabled {
1103+
messageSender = sender.Trace(messageSender, m.Tracer)
1104+
}
1105+
11201106
var bootstrapFunc func()
11211107
// If [m.validatorState] is nil then we are creating the P-Chain. Since the
11221108
// P-Chain is the first chain to be created, we can use it to initialize
@@ -1580,277 +1566,3 @@ func (m *manager) getOrMakeVMGatherer(vmID ids.ID) (metrics.MultiGatherer, error
15801566
m.vmGatherer[vmID] = vmGatherer
15811567
return vmGatherer, nil
15821568
}
1583-
1584-
func (m *manager) createSimplexChain(
1585-
ctx *snow.ConsensusContext,
1586-
genesisData []byte,
1587-
vdrs validators.Manager,
1588-
beacons validators.Manager,
1589-
vm block.ChainVM,
1590-
fxs []*common.Fx,
1591-
sb subnets.Subnet,
1592-
) (*chain, error) {
1593-
ctx.State.Set(snow.EngineState{
1594-
Type: p2ppb.EngineType_ENGINE_TYPE_SIMPLEX,
1595-
State: snow.Initializing,
1596-
})
1597-
1598-
primaryAlias := m.PrimaryAliasOrDefault(ctx.ChainID)
1599-
vm, msgChan, err := m.createChainVM(ctx, vm, genesisData, primaryAlias, sb, fxs)
1600-
if err != nil {
1601-
return nil, fmt.Errorf("couldn't initialize chain vm: %w", err)
1602-
}
1603-
1604-
connectedBeacons := tracker.NewPeers()
1605-
bootstrapWeight, err := beacons.TotalWeight(ctx.SubnetID)
1606-
if err != nil {
1607-
return nil, fmt.Errorf("error while fetching weight for subnet %s: %w", ctx.SubnetID, err)
1608-
}
1609-
startupTracker := tracker.NewStartup(connectedBeacons, (3*bootstrapWeight+3)/4)
1610-
beacons.RegisterSetCallbackListener(ctx.SubnetID, startupTracker)
1611-
1612-
h, err := m.createChainHandler(
1613-
ctx,
1614-
vdrs,
1615-
msgChan,
1616-
sb,
1617-
primaryAlias,
1618-
)
1619-
if err != nil {
1620-
return nil, fmt.Errorf("couldn't initialize message handler: %w", err)
1621-
}
1622-
1623-
return &chain{
1624-
Name: primaryAlias,
1625-
Context: ctx,
1626-
VM: vm,
1627-
Handler: h,
1628-
}, nil
1629-
}
1630-
1631-
func (m *manager) createChainSender(
1632-
ctx *snow.ConsensusContext,
1633-
chainType p2ppb.EngineType,
1634-
sb subnets.Subnet,
1635-
) (common.Sender, error) {
1636-
s, err := sender.New(
1637-
ctx,
1638-
m.MsgCreator,
1639-
m.Net,
1640-
m.ManagerConfig.Router,
1641-
m.TimeoutManager,
1642-
chainType,
1643-
sb,
1644-
ctx.Registerer,
1645-
)
1646-
if err != nil {
1647-
return nil, fmt.Errorf("couldn't initialize sender: %w", err)
1648-
}
1649-
if m.TracingEnabled {
1650-
s = sender.Trace(s, m.Tracer)
1651-
}
1652-
1653-
return s, nil
1654-
}
1655-
1656-
func (m *manager) createSimplexEngine() (common.Engine, error) {
1657-
simplexEngine := simplex.NewEngine(nil, m.Log)
1658-
1659-
var engine common.Engine
1660-
engine = simplexEngine
1661-
1662-
if m.TracingEnabled {
1663-
engine = common.TraceEngine(engine, m.Tracer)
1664-
}
1665-
m.Log.Warn("Simplex engine is not fully implemented yet, it will not be able to process any messages",
1666-
zap.String("engine", "simplex"),
1667-
zap.String("status", "not fully implemented"))
1668-
return engine, nil
1669-
}
1670-
1671-
func (m *manager) createProposeVM(ctx *snow.ConsensusContext, primaryAlias string, vm block.ChainVM) (block.ChainVM, error) {
1672-
var (
1673-
// A default subnet configuration will be present if explicit configuration is not provided
1674-
subnetCfg = m.SubnetConfigs[ctx.SubnetID]
1675-
minBlockDelay = subnetCfg.ProposerMinBlockDelay
1676-
numHistoricalBlocks = subnetCfg.ProposerNumHistoricalBlocks
1677-
)
1678-
m.Log.Info("creating proposervm wrapper",
1679-
zap.Time("activationTime", m.Upgrades.ApricotPhase4Time),
1680-
zap.Uint64("minPChainHeight", m.Upgrades.ApricotPhase4MinPChainHeight),
1681-
zap.Duration("minBlockDelay", minBlockDelay),
1682-
zap.Uint64("numHistoricalBlocks", numHistoricalBlocks),
1683-
)
1684-
1685-
proposervmReg, err := metrics.MakeAndRegister(
1686-
m.proposervmGatherer,
1687-
primaryAlias,
1688-
)
1689-
if err != nil {
1690-
return nil, err
1691-
}
1692-
1693-
proposerVM := proposervm.New(
1694-
vm,
1695-
proposervm.Config{
1696-
Upgrades: m.Upgrades,
1697-
MinBlkDelay: minBlockDelay,
1698-
NumHistoricalBlocks: numHistoricalBlocks,
1699-
StakingLeafSigner: m.StakingTLSSigner,
1700-
StakingCertLeaf: m.StakingTLSCert,
1701-
Registerer: proposervmReg,
1702-
},
1703-
)
1704-
1705-
return proposerVM, nil
1706-
}
1707-
1708-
func (m *manager) createChainHandler(ctx *snow.ConsensusContext, vdrs validators.Manager, msgChan chan common.Message, sb subnets.Subnet, primaryAlias string) (handler.Handler, error) {
1709-
stakeReg, err := metrics.MakeAndRegister(
1710-
m.stakeGatherer,
1711-
primaryAlias,
1712-
)
1713-
if err != nil {
1714-
return nil, err
1715-
}
1716-
1717-
connectedValidators, err := tracker.NewMeteredPeers(stakeReg)
1718-
if err != nil {
1719-
return nil, fmt.Errorf("error creating peer tracker: %w", err)
1720-
}
1721-
vdrs.RegisterSetCallbackListener(ctx.SubnetID, connectedValidators)
1722-
1723-
var halter common.Halter
1724-
1725-
p2pReg, err := metrics.MakeAndRegister(
1726-
m.p2pGatherer,
1727-
primaryAlias,
1728-
)
1729-
if err != nil {
1730-
return nil, err
1731-
}
1732-
1733-
peerTracker, err := p2p.NewPeerTracker(
1734-
ctx.Log,
1735-
"peer_tracker",
1736-
p2pReg,
1737-
set.Of(ctx.NodeID),
1738-
nil,
1739-
)
1740-
if err != nil {
1741-
return nil, fmt.Errorf("error creating peer tracker: %w", err)
1742-
}
1743-
1744-
handlerReg, err := metrics.MakeAndRegister(
1745-
m.handlerGatherer,
1746-
primaryAlias,
1747-
)
1748-
if err != nil {
1749-
return nil, err
1750-
}
1751-
1752-
_, err = m.createSimplexEngine()
1753-
if err != nil {
1754-
return nil, fmt.Errorf("couldn't create simplex instance: %w", err)
1755-
}
1756-
1757-
// Asynchronously passes messages from the network to the consensus engine
1758-
h, err := handler.New(
1759-
ctx,
1760-
vdrs,
1761-
msgChan,
1762-
m.FrontierPollFrequency,
1763-
m.ConsensusAppConcurrency,
1764-
m.ResourceTracker,
1765-
sb,
1766-
connectedValidators,
1767-
peerTracker,
1768-
handlerReg,
1769-
halter.Halt,
1770-
)
1771-
if err != nil {
1772-
return nil, fmt.Errorf("couldn't initialize message handler: %w", err)
1773-
}
1774-
1775-
h.SetEngineManager(&handler.EngineManager{
1776-
Avalanche: nil,
1777-
Snowman: nil,
1778-
})
1779-
1780-
return h, nil
1781-
}
1782-
1783-
func (m *manager) createChainVM(ctx *snow.ConsensusContext, vm block.ChainVM, genesisData []byte, primaryAlias string, sb subnets.Subnet, fxs []*common.Fx) (block.ChainVM, chan common.Message, error) {
1784-
meterDBReg, err := metrics.MakeAndRegister(
1785-
m.MeterDBMetrics,
1786-
primaryAlias,
1787-
)
1788-
if err != nil {
1789-
return nil, nil, err
1790-
}
1791-
1792-
meterDB, err := meterdb.New(meterDBReg, m.DB)
1793-
if err != nil {
1794-
return nil, nil, err
1795-
}
1796-
1797-
prefixDB := prefixdb.New(ctx.ChainID[:], meterDB)
1798-
vmDB := prefixdb.New(VMDBPrefix, prefixDB)
1799-
1800-
// Passes messages from the consensus engine to the network
1801-
messageSender, err := m.createChainSender(
1802-
ctx,
1803-
p2ppb.EngineType_ENGINE_TYPE_SIMPLEX,
1804-
sb,
1805-
)
1806-
if err != nil {
1807-
return nil, nil, fmt.Errorf("couldn't initialize sender: %w", err)
1808-
}
1809-
1810-
if m.TracingEnabled {
1811-
vm = tracedvm.NewBlockVM(vm, primaryAlias, m.Tracer)
1812-
}
1813-
1814-
proposerVM, err := m.createProposeVM(ctx, primaryAlias, vm)
1815-
if err != nil {
1816-
return nil, nil, fmt.Errorf("couldn't create proposer vm: %w", err)
1817-
}
1818-
vm = proposerVM
1819-
1820-
if m.MeterVMEnabled {
1821-
meterchainvmReg, err := metrics.MakeAndRegister(
1822-
m.meterChainVMGatherer,
1823-
primaryAlias,
1824-
)
1825-
if err != nil {
1826-
return nil, nil, err
1827-
}
1828-
1829-
vm = metervm.NewBlockVM(vm, meterchainvmReg)
1830-
}
1831-
if m.TracingEnabled {
1832-
vm = tracedvm.NewBlockVM(vm, "proposervm", m.Tracer)
1833-
}
1834-
1835-
// The channel through which a VM may send messages to the consensus engine
1836-
// VM uses this channel to notify engine that a block is ready to be made
1837-
msgChan := make(chan common.Message, defaultChannelSize)
1838-
// Initialize the ProposerVM and the vm wrapped inside it
1839-
chainConfig, err := m.getChainConfig(ctx.ChainID)
1840-
if err != nil {
1841-
return nil, nil, fmt.Errorf("error while fetching chain config: %w", err)
1842-
}
1843-
err = vm.Initialize(
1844-
context.TODO(),
1845-
ctx.Context,
1846-
vmDB,
1847-
genesisData,
1848-
chainConfig.Upgrade,
1849-
chainConfig.Config,
1850-
msgChan,
1851-
fxs,
1852-
messageSender,
1853-
)
1854-
1855-
return vm, msgChan, err
1856-
}

0 commit comments

Comments
 (0)