# HardFork.go

```go
package patch

import (
	"saseul/config"
	"saseul/data"
	"saseul/model"
)

type HardFork struct{}

func (hf *HardFork) ResourceCondition(block model.ResourceBlock) bool {
	if config.Network == "SASEUL PUBLIC NETWORK" {
		mainBlock := data.MainChainInstance().Block(block.MainHeight)

		return block.Height <= 83500 && mainBlock.Height > 0
	}

	return false
}

func (hf *HardFork) ResourceConditionA(block model.ResourceBlock) bool {
	if config.Network == "SASEUL PUBLIC NETWORK" {
		// legacy
		return block.Height <= 625000
	}

	return false
}

func (hf *HardFork) Validators(block model.MainBlock) bool {
	if config.Network == "SASEUL PUBLIC NETWORK" {
		// 59779 ~ 59788: Hard fork;
		return block.Height >= 59779 && block.Height <= 59788
	}

	return false
}

func (hf *HardFork) ForkValidators() []string {
	return []string{config.GenesisAddress}
	// return config.ManagerAddresses;
}

func (hf *HardFork) ConfirmedHeight(block model.MainBlock) bool {
	if config.Network == "SASEUL PUBLIC NETWORK" {
		// 40937 ~ 41032: Bug blocks;
		return block.Height >= 40937 && block.Height <= 41032
	}

	return false
}

func (hf *HardFork) ForkHeight(height int) int {
	return height - 65536
}

func (hf *HardFork) MainCondition(block model.MainBlock) bool {
	if config.Network == "SASEUL PUBLIC NETWORK" {
		return block.Height <= 150000
	}

	return false
}

```

이 코드는 `HardFork`라는 구조체와 그 메서드를 통해 블록체인 네트워크에서 특정 조건을 검사하고, 하드 포크 관련 기능을 수행하는 방법을 정의한 것입니다. 비전공자도 이해할 수 있도록 각 부분을 설명하겠습니다.

#### 개요

`HardFork` 구조체는 블록체인 네트워크에서 특정 조건이 충족될 때 하드 포크를 관리하는 기능을 제공합니다. 하드 포크는 블록체인에서 체인의 분리를 의미하며, 이 코드는 특정 조건에 따라 블록을 검사하고, 유효한 검증자를 설정하는 등의 기능을 합니다.

#### `HardFork` 구조체

```go
type HardFork struct{}
```

* `HardFork`: 하드 포크 관련 기능을 담고 있는 빈 구조체입니다.

#### `ResourceCondition` 메서드

```go
func (hf *HardFork) ResourceCondition(block model.ResourceBlock) bool {
    if config.Network == "SASEUL PUBLIC NETWORK" {
        mainBlock := data.MainChainInstance().Block(block.MainHeight)
        return block.Height <= 83500 && mainBlock.Height > 0
    }
    return false
}
```

이 메서드는 `ResourceBlock`의 조건을 검사합니다. 네트워크가 "SASEUL PUBLIC NETWORK"일 때, 주어진 블록의 높이가 83500 이하이고, 해당 블록의 메인 블록 높이가 0보다 큰지 확인합니다.

#### `ResourceConditionA` 메서드

```go
func (hf *HardFork) ResourceConditionA(block model.ResourceBlock) bool {
    if config.Network == "SASEUL PUBLIC NETWORK" {
        return block.Height <= 625000
    }
    return false
}
```

이 메서드는 `ResourceBlock`의 또 다른 조건을 검사합니다. 네트워크가 "SASEUL PUBLIC NETWORK"일 때, 주어진 블록의 높이가 625000 이하인지 확인합니다.

#### `Validators` 메서드

```go
func (hf *HardFork) Validators(block model.MainBlock) bool {
    if config.Network == "SASEUL PUBLIC NETWORK" {
        return block.Height >= 59779 && block.Height <= 59788
    }
    return false
}
```

이 메서드는 `MainBlock`이 하드 포크 기간에 속하는지 검사합니다. 네트워크가 "SASEUL PUBLIC NETWORK"일 때, 블록의 높이가 59779에서 59788 사이인지 확인합니다.

#### `ForkValidators` 메서드

```go
func (hf *HardFork) ForkValidators() []string {
    return []string{config.GenesisAddress}
    // return config.ManagerAddresses;
}
```

이 메서드는 하드 포크 기간 동안 유효한 검증자 주소를 반환합니다. 여기서는 `config.GenesisAddress`를 반환합니다.

#### `ConfirmedHeight` 메서드

```go
func (hf *HardFork) ConfirmedHeight(block model.MainBlock) bool {
    if config.Network == "SASEUL PUBLIC NETWORK" {
        return block.Height >= 40937 && block.Height <= 41032
    }
    return false
}
```

이 메서드는 특정 블록이 문제가 있는지 검사합니다. 네트워크가 "SASEUL PUBLIC NETWORK"일 때, 블록의 높이가 40937에서 41032 사이인지 확인합니다.

#### `ForkHeight` 메서드

```go
func (hf *HardFork) ForkHeight(height int) int {
    return height - 65536
}
```

이 메서드는 주어진 높이에서 65536을 뺀 값을 반환합니다. 하드 포크 시의 블록 높이 조정에 사용됩니다.

#### `MainCondition` 메서드

```go
func (hf *HardFork) MainCondition(block model.MainBlock) bool {
    if config.Network == "SASEUL PUBLIC NETWORK" {
        return block.Height <= 150000
    }
    return false
}
```

이 메서드는 `MainBlock`의 조건을 검사합니다. 네트워크가 "SASEUL PUBLIC NETWORK"일 때, 주어진 블록의 높이가 150000 이하인지 확인합니다.

#### 요약

* **HardFork 구조체**: 하드 포크 관련 조건을 정의합니다.
* **ResourceCondition 메서드**: 특정 블록의 조건을 검사합니다.
* **ResourceConditionA 메서드**: 또 다른 블록 조건을 검사합니다.
* **Validators 메서드**: 하드 포크 기간 동안 유효한 블록을 검사합니다.
* **ForkValidators 메서드**: 하드 포크 동안 유효한 검증자 주소를 반환합니다.
* **ConfirmedHeight 메서드**: 특정 블록이 문제가 있는지 검사합니다.
* **ForkHeight 메서드**: 블록 높이를 조정합니다.
* **MainCondition 메서드**: 특정 블록의 조건을 검사합니다.

이렇게 블록체인 네트워크에서 하드 포크와 관련된 다양한 조건을 정의하고, 이를 기반으로 블록을 검사하는 과정을 이해할 수 있습니다.
