@@ -14,20 +14,30 @@ type rawPrecompileUpgrade struct {
1414 Bytes []byte `serialize:"true"`
1515}
1616
17- type upgradeConfigMessage struct {
17+ type networkUpgradeConfigMessage struct {
1818 OptionalNetworkUpgrades []params.Fork `serialize:"true"`
1919
2020 // Config for modifying state as a network upgrade.
2121 StateUpgrades []params.StateUpgrade `serialize:"true"`
2222
2323 // Config for enabling and disabling precompiles as network upgrades.
2424 PrecompileUpgrades []rawPrecompileUpgrade `serialize:"true"`
25- config params.UpgradeConfig
26- bytes []byte
2725}
2826
29- func ParseUpgradeConfig (bytes []byte ) (* upgradeConfigMessage , error ) {
30- var config upgradeConfigMessage
27+ type UpgradeConfigMessage struct {
28+ Bytes []byte
29+ Hash []byte
30+ }
31+
32+ // Attempts to parse a networkUpgradeConfigMessage from a []byte
33+ //
34+ // This function attempts to parse a stream of bytes as a
35+ // networkUpgradeConfigMessage (as serialized from
36+ // UpgradeConfigToNetworkMessage).
37+ //
38+ // The function returns a reference of *params.UpgradeConfig
39+ func ParseUpgradeConfigMessage (bytes []byte ) (* params.UpgradeConfig , error ) {
40+ var config networkUpgradeConfigMessage
3141 version , err := Codec .Unmarshal (bytes , & config )
3242 if err != nil {
3343 return nil , err
@@ -37,14 +47,12 @@ func ParseUpgradeConfig(bytes []byte) (*upgradeConfigMessage, error) {
3747 }
3848
3949 var PrecompileUpgrades []params.PrecompileUpgrade
40-
4150 for _ , precompileUpgrade := range config .PrecompileUpgrades {
4251 module , ok := modules .GetPrecompileModule (precompileUpgrade .Key )
4352 if ! ok {
4453 return nil , ErrUnknowPrecompile
4554 }
4655 preCompile := module .MakeConfig ()
47-
4856 version , err := Codec .Unmarshal (precompileUpgrade .Bytes , preCompile )
4957 if version != Version {
5058 return nil , ErrInvalidVersion
@@ -55,17 +63,23 @@ func ParseUpgradeConfig(bytes []byte) (*upgradeConfigMessage, error) {
5563 PrecompileUpgrades = append (PrecompileUpgrades , params.PrecompileUpgrade {Config : preCompile })
5664 }
5765
58- config . config = params.UpgradeConfig {
66+ return & params.UpgradeConfig {
5967 OptionalNetworkUpgrades : & params.OptionalNetworkUpgrades {Updates : config .OptionalNetworkUpgrades },
6068 StateUpgrades : config .StateUpgrades ,
6169 PrecompileUpgrades : PrecompileUpgrades ,
62- }
63- config .bytes = bytes
64-
65- return & config , nil
70+ }, nil
6671}
6772
68- func NewUpgradeConfig (config params.UpgradeConfig ) (* upgradeConfigMessage , error ) {
73+ // Wraps an instance of *params.UpgradeConfig
74+ //
75+ // This function returns the serialized UpgradeConfig, ready to be send over to
76+ // other peers. The struct also includes a hash of the content, ready to be used
77+ // as part of the handshake protocol.
78+ //
79+ // Since params.UpgradeConfig should never change without a node reloading, it
80+ // is safe to call this function once and store its output globally to re-use
81+ // multiple times
82+ func UpgradeConfigToNetworkMessage (config * params.UpgradeConfig ) (* UpgradeConfigMessage , error ) {
6983 PrecompileUpgrades := make ([]rawPrecompileUpgrade , 0 )
7084 for _ , precompileConfig := range config .PrecompileUpgrades {
7185 bytes , err := Codec .Marshal (Version , precompileConfig .Config )
@@ -83,33 +97,22 @@ func NewUpgradeConfig(config params.UpgradeConfig) (*upgradeConfigMessage, error
8397 optionalNetworkUpgrades = config .OptionalNetworkUpgrades .Updates
8498 }
8599
86- wrappedConfig := upgradeConfigMessage {
100+ wrappedConfig := networkUpgradeConfigMessage {
87101 OptionalNetworkUpgrades : optionalNetworkUpgrades ,
88102 StateUpgrades : config .StateUpgrades ,
89103 PrecompileUpgrades : PrecompileUpgrades ,
90- config : config ,
91- bytes : make ([]byte , 0 ),
92104 }
93105 bytes , err := Codec .Marshal (Version , wrappedConfig )
94106 if err != nil {
95107 return nil , err
96108 }
97- wrappedConfig .bytes = bytes
98109
99- return & wrappedConfig , nil
100- }
101-
102- func (r * upgradeConfigMessage ) Config () params.UpgradeConfig {
103- return r .config
104- }
105-
106- func (r * upgradeConfigMessage ) Bytes () []byte {
107- return r .bytes
108- }
109-
110- func (r * upgradeConfigMessage ) Hash () [8 ]byte {
111- hash := crypto .Keccak256 (r .bytes )
110+ hash := crypto .Keccak256 (bytes )
112111 var firstBytes [8 ]byte
113112 copy (firstBytes [:], hash [:8 ])
114- return firstBytes
113+
114+ return & UpgradeConfigMessage {
115+ Bytes : bytes ,
116+ Hash : hash ,
117+ }, nil
115118}
0 commit comments