|
1 | 1 | package hardfork |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "encoding/json" |
4 | 5 | "fmt" |
| 6 | + "math" |
5 | 7 | "os" |
| 8 | + "os/exec" |
| 9 | + "path/filepath" |
| 10 | + "strconv" |
6 | 11 | "time" |
7 | 12 | ) |
8 | 13 |
|
@@ -113,7 +118,6 @@ func (t *HardforkTest) RunForkNetworkPhase(latestPreForkHeight int, forkData For |
113 | 118 |
|
114 | 119 | func (t *HardforkTest) LegacyForkPhase(analysis *BlockAnalysisResult, forkConfigBytes []byte, mainGenesisTs int64) (*ForkData, error) { |
115 | 120 |
|
116 | | - // Define all localnet file paths |
117 | 121 | if err := os.MkdirAll("fork_data/prefork", 0755); err != nil { |
118 | 122 | return nil, err |
119 | 123 | } |
@@ -150,11 +154,73 @@ func (t *HardforkTest) LegacyForkPhase(analysis *BlockAnalysisResult, forkConfig |
150 | 154 | { |
151 | 155 | preforkGenesisConfigFile := fmt.Sprintf("%s/daemon.json", t.Config.Root) |
152 | 156 | forkHashesFile := "fork_data/hf_ledger_hashes.json" |
153 | | - if err := t.GenerateForkConfigAndLedgers(analysis, preforkConfig, forkLedgersDir, forkHashesFile, postforkConfig, preforkGenesisConfigFile, forkGenesisTs, mainGenesisTs); err != nil { |
| 157 | + if err := t.PatchForkConfigAndGenerateLedgersLegacy(analysis, preforkConfig, forkLedgersDir, forkHashesFile, postforkConfig, preforkGenesisConfigFile, forkGenesisTs, mainGenesisTs); err != nil { |
154 | 158 | return nil, err |
155 | 159 | } |
156 | 160 | } |
157 | 161 |
|
158 | 162 | return &ForkData{config: postforkConfig, ledgersDir: forkLedgersDir, genesis: forkGenesisTs}, nil |
159 | 163 |
|
160 | 164 | } |
| 165 | + |
| 166 | +// Uses `mina advanced generate-hardfork-config CLI` |
| 167 | +func (t *HardforkTest) AdvancedForkPhase(analysis *BlockAnalysisResult, forkConfigBytes []byte, mainGenesisTs int64) (*ForkData, error) { |
| 168 | + |
| 169 | + cwd := "" |
| 170 | + var err error = nil |
| 171 | + if cwd, err = os.Getwd(); err != nil { |
| 172 | + return nil, err |
| 173 | + } |
| 174 | + |
| 175 | + forkDataPath := fmt.Sprintf("%s/fork_data", cwd) |
| 176 | + if err := os.MkdirAll(forkDataPath, 0755); err != nil { |
| 177 | + return nil, err |
| 178 | + } |
| 179 | + |
| 180 | + if err := t.AdvancedGenerateHardForkConfig(forkDataPath); err != nil { |
| 181 | + return nil, err |
| 182 | + } |
| 183 | + |
| 184 | + configToPatch := fmt.Sprintf("%s/daemon.json", forkDataPath) |
| 185 | + |
| 186 | + configJsonString, err := os.ReadFile(configToPatch) |
| 187 | + if err != nil { |
| 188 | + return nil, err |
| 189 | + } |
| 190 | + |
| 191 | + var configRaw map[string]map[string]string |
| 192 | + json.Unmarshal(configJsonString, &configRaw) |
| 193 | + |
| 194 | + preforkChainEndTs, err := time.Parse(time.RFC3339Nano, configRaw["genesis"]["genesis_state_timestamp"]) |
| 195 | + if err != nil { |
| 196 | + return nil, err |
| 197 | + } |
| 198 | + roughForkGenesisTs := time.Now().Add(time.Duration(t.Config.ForkDelay) * time.Minute) |
| 199 | + hardforkGenesisSecDelta := roughForkGenesisTs.Sub(preforkChainEndTs).Seconds() |
| 200 | + hardforkGenesisSlotDelta := int(math.Ceil(hardforkGenesisSecDelta / float64(t.Config.MainSlot))) |
| 201 | + forkSlotDuration := time.Duration(t.Config.MainSlot) * time.Second |
| 202 | + forkGenesisTs := preforkChainEndTs.Add(time.Duration(hardforkGenesisSlotDelta) * forkSlotDuration).Unix() |
| 203 | + |
| 204 | + cmd := exec.Command(filepath.Join(t.ScriptDir, "patch-runtime-config-advanced-gen-fork-config.sh")) |
| 205 | + |
| 206 | + cmd.Env = append(os.Environ(), |
| 207 | + "FORK_CONFIG_TO_PATCH="+configToPatch, |
| 208 | + "PREFORK_SLOT_TIME_SEC="+strconv.Itoa(t.Config.MainSlot), |
| 209 | + "HARDFORK_GENESIS_SLOT_DELTA="+strconv.Itoa(hardforkGenesisSlotDelta), |
| 210 | + ) |
| 211 | + cmd.Stderr = os.Stderr |
| 212 | + |
| 213 | + if err := cmd.Run(); err != nil { |
| 214 | + return nil, fmt.Errorf("failed to run patch-runtime-config-advanced-gen-fork-config.sh: %w", err) |
| 215 | + } |
| 216 | + |
| 217 | + patchedConfigString, err := cmd.Output() |
| 218 | + |
| 219 | + err = os.WriteFile(configToPatch, patchedConfigString, 0644) |
| 220 | + if err != nil { |
| 221 | + return nil, fmt.Errorf("failed to patch fork config: %w", err) |
| 222 | + } |
| 223 | + |
| 224 | + forkLedgersDir := fmt.Sprintf("%s/genesis", forkDataPath) |
| 225 | + return &ForkData{config: configToPatch, ledgersDir: forkLedgersDir, genesis: forkGenesisTs}, nil |
| 226 | +} |
0 commit comments