|
| 1 | +package handshake |
| 2 | + |
| 3 | +import ( |
| 4 | + "crypto/sha256" |
| 5 | + "fmt" |
| 6 | + |
| 7 | + "github.com/ava-labs/subnet-evm/params" |
| 8 | + "github.com/ava-labs/subnet-evm/precompile/modules" |
| 9 | + "github.com/ava-labs/subnet-evm/precompile/precompileconfig" |
| 10 | +) |
| 11 | + |
| 12 | +type PrecompileUpgrade struct { |
| 13 | + StructName string `serialize:"true"` |
| 14 | + Bytes []byte `serialize:"true"` |
| 15 | +} |
| 16 | + |
| 17 | +type UpgradeConfig struct { |
| 18 | + OptionalNetworkUpgrades []params.Fork `serialize:"true"` |
| 19 | + |
| 20 | + // Config for modifying state as a network upgrade. |
| 21 | + StateUpgrades []params.StateUpgrade `serialize:"true"` |
| 22 | + |
| 23 | + // Config for enabling and disabling precompiles as network upgrades. |
| 24 | + PrecompileUpgrades []PrecompileUpgrade `serialize:"true"` |
| 25 | + config params.UpgradeConfig |
| 26 | + bytes []byte |
| 27 | +} |
| 28 | + |
| 29 | +func ParseUpgradeConfig(bytes []byte) (*UpgradeConfig, error) { |
| 30 | + var config UpgradeConfig |
| 31 | + version, err := Codec.Unmarshal(bytes, &config) |
| 32 | + if err != nil { |
| 33 | + return nil, err |
| 34 | + } |
| 35 | + if version != Version { |
| 36 | + return nil, fmt.Errorf("Invalid version") |
| 37 | + } |
| 38 | + |
| 39 | + var PrecompileUpgrades []params.PrecompileUpgrade |
| 40 | + |
| 41 | + for _, precompileUpgrade := range config.PrecompileUpgrades { |
| 42 | + module, ok := modules.GetPrecompileModule(precompileUpgrade.StructName) |
| 43 | + if !ok { |
| 44 | + return nil, fmt.Errorf("unknown precompile config: %s", precompileUpgrade.StructName) |
| 45 | + } |
| 46 | + preCompile := module.MakeConfig() |
| 47 | + |
| 48 | + version, err := Codec.Unmarshal(precompileUpgrade.Bytes, preCompile) |
| 49 | + if version != Version { |
| 50 | + return nil, fmt.Errorf("Invalid version") |
| 51 | + } |
| 52 | + if err != nil { |
| 53 | + return nil, err |
| 54 | + } |
| 55 | + if Config, ok := preCompile.(precompileconfig.Config); ok { |
| 56 | + PrecompileUpgrades = append(PrecompileUpgrades, params.PrecompileUpgrade{Config: Config}) |
| 57 | + } else { |
| 58 | + return nil, fmt.Errorf("Error deserializing precompile %s", precompileUpgrade.StructName) |
| 59 | + } |
| 60 | + } |
| 61 | + |
| 62 | + config.config = params.UpgradeConfig{ |
| 63 | + OptionalNetworkUpgrades: ¶ms.OptionalNetworkUpgrades{config.OptionalNetworkUpgrades}, |
| 64 | + StateUpgrades: config.StateUpgrades, |
| 65 | + PrecompileUpgrades: PrecompileUpgrades, |
| 66 | + } |
| 67 | + config.bytes = bytes |
| 68 | + |
| 69 | + return &config, nil |
| 70 | +} |
| 71 | + |
| 72 | +func NewUpgradeConfig(config params.UpgradeConfig) (*UpgradeConfig, error) { |
| 73 | + PrecompileUpgrades := make([]PrecompileUpgrade, 0) |
| 74 | + for _, precompileConfig := range config.PrecompileUpgrades { |
| 75 | + bytes, err := Codec.Marshal(Version, precompileConfig.Config) |
| 76 | + if err != nil { |
| 77 | + return nil, err |
| 78 | + } |
| 79 | + PrecompileUpgrades = append(PrecompileUpgrades, PrecompileUpgrade{ |
| 80 | + StructName: precompileConfig.Key(), |
| 81 | + Bytes: bytes, |
| 82 | + }) |
| 83 | + } |
| 84 | + |
| 85 | + optionalNetworkUpgrades := make([]params.Fork, 0) |
| 86 | + if config.OptionalNetworkUpgrades != nil { |
| 87 | + optionalNetworkUpgrades = config.OptionalNetworkUpgrades.Updates |
| 88 | + } |
| 89 | + |
| 90 | + wrappedConfig := UpgradeConfig{ |
| 91 | + OptionalNetworkUpgrades: optionalNetworkUpgrades, |
| 92 | + StateUpgrades: config.StateUpgrades, |
| 93 | + PrecompileUpgrades: PrecompileUpgrades, |
| 94 | + config: config, |
| 95 | + bytes: make([]byte, 0), |
| 96 | + } |
| 97 | + bytes, err := Codec.Marshal(Version, wrappedConfig) |
| 98 | + if err != nil { |
| 99 | + return nil, err |
| 100 | + } |
| 101 | + wrappedConfig.bytes = bytes |
| 102 | + |
| 103 | + return &wrappedConfig, nil |
| 104 | +} |
| 105 | + |
| 106 | +func (r *UpgradeConfig) Config() params.UpgradeConfig { |
| 107 | + return r.config |
| 108 | +} |
| 109 | + |
| 110 | +func (r *UpgradeConfig) Bytes() []byte { |
| 111 | + return r.bytes |
| 112 | +} |
| 113 | + |
| 114 | +func (r *UpgradeConfig) Hash() [32]byte { |
| 115 | + return sha256.Sum256(r.bytes) |
| 116 | +} |
0 commit comments