@@ -27,7 +27,6 @@ import (
27
27
"github.com/ava-labs/avalanchego/message"
28
28
"github.com/ava-labs/avalanchego/network"
29
29
"github.com/ava-labs/avalanchego/network/p2p"
30
- "github.com/ava-labs/avalanchego/simplex"
31
30
"github.com/ava-labs/avalanchego/snow"
32
31
"github.com/ava-labs/avalanchego/snow/consensus/snowball"
33
32
"github.com/ava-labs/avalanchego/snow/engine/avalanche/bootstrap/queue"
@@ -152,14 +151,6 @@ type Manager interface {
152
151
Shutdown ()
153
152
}
154
153
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
-
163
154
// ChainParameters defines the chain being created
164
155
type ChainParameters struct {
165
156
// The ID of the chain being created.
@@ -174,8 +165,6 @@ type ChainParameters struct {
174
165
FxIDs []ids.ID
175
166
// Invariant: Only used when [ID] is the P-chain ID.
176
167
CustomBeacons validators.Manager
177
- // The consensus parameters of this chain.
178
- ConsensusConfig ConsensusConfig
179
168
}
180
169
181
170
type chain struct {
@@ -577,34 +566,15 @@ func (m *manager) buildChain(chainParams ChainParameters, sb subnets.Subnet) (*c
577
566
beacons = chainParams .CustomBeacons
578
567
}
579
568
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
+ )
608
578
if err != nil {
609
579
return nil , fmt .Errorf ("error while creating new snowman vm %w" , err )
610
580
}
@@ -1088,6 +1058,9 @@ func (m *manager) createSnowmanChain(
1088
1058
fxs []* common.Fx ,
1089
1059
sb subnets.Subnet ,
1090
1060
) (* chain , error ) {
1061
+ ctx .Lock .Lock ()
1062
+ defer ctx .Lock .Unlock ()
1063
+
1091
1064
ctx .State .Set (snow.EngineState {
1092
1065
Type : p2ppb .EngineType_ENGINE_TYPE_SNOWMAN ,
1093
1066
State : snow .Initializing ,
@@ -1112,11 +1085,24 @@ func (m *manager) createSnowmanChain(
1112
1085
bootstrappingDB := prefixdb .New (ChainBootstrappingDBPrefix , prefixDB )
1113
1086
1114
1087
// 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
+ )
1116
1098
if err != nil {
1117
1099
return nil , fmt .Errorf ("couldn't initialize sender: %w" , err )
1118
1100
}
1119
1101
1102
+ if m .TracingEnabled {
1103
+ messageSender = sender .Trace (messageSender , m .Tracer )
1104
+ }
1105
+
1120
1106
var bootstrapFunc func ()
1121
1107
// If [m.validatorState] is nil then we are creating the P-Chain. Since the
1122
1108
// 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
1580
1566
m .vmGatherer [vmID ] = vmGatherer
1581
1567
return vmGatherer , nil
1582
1568
}
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