# Block Consensus Contract

## blkendt.xsat

This contract processes votes from validators on the hash of each Bitcoin block. When more than two-thirds of the validators submit the same hash for a block, and it matches the hash of the block data submitted by the Synchronizer, the block is considered to have reached consensus.

### Actions

* Endorse a block

### QuickStart

```
# config @blkendt.xsat
$ cleos push action blkendt.xsat config '{"limit_endorse_height": 840000, "limit_num_endorsed_blocks": 4, "min_validators": 15, "consensus_interval_seconds": 480, "xsat_stake_activation_height": 860000}' -p blkendt.xsat

# erase @utxomng.xsat
$ cleos push action blkendt.xsat erase '{"height": 840000}' -p utxomng.xsat

# endorse @validator
$ cleos push action blkendt.xsat endorse '{"validator": "alice", "height": 840000, "hash": "0000000000000000000320283a032748cef8227873ff4872689bf23f1cda83a5"}' -p alice

# setqualify @auth get_self()
$ cleos push action blkendt.xsat setqualify '{"min_xsat_qualification": "2100.00000000 XSAT", "min_btc_qualification": "100.00000000 BTC"}' -p blkendt.xsat

# setconheight @auth get_self()
$ cleos push action blkendt.xsat setconheight '{"xsat_stake_activation_height": 890000, "xsat_reward_height": 890000}' -p blkendt.xsat  

# revote @auth synchronizer
$ cleos push action blkendt.xsat revote '{"synchronizer": "synchronizer", "height": 840000}' -p synchronizer
```

### Table Information

```
$ cleos get table blkendt.xsat <height> endorsements

# by hash
$ cleos get table blkendt.xsat <height> endorsements --index 2 --key-type sha256 -L <hash> -U <hash>
```

### STRUCT `requested_validator_info`

* `{name} account` - validator account
* `{uint64_t} staking` - the validator's staking amount

```
{
  "account": "test.xsat",
  "staking": "10200000000"
}
```

### STRUCT `provider_validator_info`

* `{name} account` - validator account
* `{uint64_t} staking` - the validator's staking amount
* `{time_point_sec} created_at` - created at time

#### example

```
{
  "account": "test.xsat",
  "staking": "10200000000",
  "created_at": "2024-08-13T00:00:00"
}
```

### TABLE `config`

#### scope &#x20;

blkendt.xsat

#### params

* `{uint64_t} limit_endorse_height` - limit the endorsement height. If it is 0, there will be no limit. If it is greater than this height, endorsement will not be allowed.
* `{uint16_t} limit_num_endorsed_blocks` - limit the endorsement height to no more than the number of blocks of the parsed height. If it is 0, there will be no limit.
* `{uint16_t} min_validators` - the minimum number of validators, which limits the number of validators that pledge more than 100 BTC at the time of first endorsement.
* `{uint16_t} consensus_interval_seconds` - the interval in seconds between consensus rounds.
* `{uint64_t} xsat_stake_activation_height` - block height at which XSAT staking feature is activated
* `{asset} min_xsat_qualification` - minimum XSAT amount required for qualification
* `{asset} min_btc_qualification` - minimum BTC amount required for qualification
* `{uint64_t} xsat_reward_height` - block height at which XSAT rewards are activated
* `{uint64_t} validator_active_vote_count` - count of active validator votes

#### example

```
{
  "limit_endorse_height": 840000,
  "limit_num_endorsed_blocks": 10,
  "min_validators": 15,
  "consensus_interval_seconds": 480,
  "xsat_stake_activation_height": 860000,
  "min_xsat_qualification": "2100.00000000 XSAT",
  "min_btc_qualification": "100.00000000 BTC",
  "xsat_reward_height": 890000,
  "validator_active_vote_count": 0
}
```

### TABLE `endorsements`

#### scope&#x20;

height

#### params

* `{uint64_t} id` - primary key
* `{checksum256} hash` - endorsement block hash
* `{std::vector<requested_validator_info>} requested_validators` - list of unendorsed validators
* `{std::vector<provider_validator_info>} provider_validators` - list of endorsed validators

#### example

```
{
  "id": 0,
  "hash": "00000000000000000000da20f7d8e9e6412d4f1d8b62d88264cddbdd48256ba0",
  "requested_validators": [{
      "account": "alice",
      "staking": "10000000000"
   }
  ],
  "provider_validators": [{
      "account": "test.xsat",
      "staking": "10200000000",
      "created_at": "2024-08-13T00:00:00"
     }
  ]
}
```

### TABLE `revote_record`

#### scope&#x20;

blkendt.xsat

#### params

* `{uint64_t} id` - primary key
* `{uint64_t} height` - height
* `{std::vector<name>} synchronizers` - synchronizers
* `{uint8_t} status` - status
* `{time_point_sec} created_at` - created at time
* `{time_point_sec} updated_at` - updated at time

#### example

```
{
  "id": 0,
  "height": 840000,
  "synchronizers": ["alice", "bob"],
  "status": 0,
  "created_at": "2024-08-13T00:00:00",
  "updated_at": "2024-08-13T00:00:00"
}
```

### ACTION `config`

* **authority**: blkendt.xsat

> Configure endorsement status

#### params

* `{uint64_t} limit_endorse_height` - limit the endorsement height. If it is 0, there will be no limit. If it is greater than this height, endorsement will not be allowed.
* `{uint16_t} limit_num_endorsed_blocks` - limit the endorsement height to no more than the number of blocks of the parsed height. If it is 0, there will be no limit.
* `{uint16_t} min_validators` - the minimum number of validators, which limits the number of validators that pledge more than 100 BTC at the time of first endorsement.
* `{uint64_t} xsat_stake_activation_height` - block height at which XSAT staking feature is activated
* `{uint16_t} consensus_interval_seconds` - the interval in seconds between consensus rounds.

#### example

```
$ cleos push action blkendt.xsat config '[840003, 10, 15, 860000, 480]' -p blkendt.xsat
```

### ACTION `endorse`

* **authority**: `validator`

> Endorsement block

#### params

* `{name} validator` - validator account
* `{uint64_t} height` - to endorse the height of the block
* `{checksum256} hash` - to endorse the hash of the block

#### example

```
$ cleos push action blkendt.xsat endorse '["alice", 840000, "0000000000000000000320283a032748cef8227873ff4872689bf23f1cda83a5"]' -p alice
```

### ACTION `erase`

* **authority**: `utxomng.xsat`

> To erase high endorsements

#### params

* `{uint64_t} height` - to endorse the height of the block

#### example

```
$ cleos push action blkendt.xsat erase '[840000]' -p utxomng.xsat
```

### ACTION `revote`

* **authority**: `synchronizer`

> To initiate a revote for a specific height

#### params

* `{name} synchronizer` - synchronizer account
* `{uint64_t} height` - height

#### example

```
$ cleos push action blkendt.xsat revote '["alice", 840000]' -p alice
```

### ACTION `setqualify`

* **authority**: `endrmng.xsat` or `blkendt.sat`

> Set the minimum pledge amount of xast to become a validator

#### params

* `{asset} min_xsat_qualification` - the minimum pledge amount of xast to become a validator
* `{asset} min_btc_qualification` - the minimum pledge amount of btc to become a validator

#### example

```
$ cleos push action blkendt.xsat setqualify '["21000.00000000 XSAT", "100.00000000 BTC"]' -p endrmng.xsat
```

### ACTION `setconheight`

* **authority**: `blkendt.sat`

> Set the XSAT stake activation height and XSAT reward height

#### params

* `{uint64_t} xsat_stake_activation_height` - block height at which XSAT staking feature is activated
* `{uint64_t} xsat_reward_height` - block height at which XSAT reward feature is activated

#### example

```
$ cleos push action blkendt.xsat setconheight '[860000, 870000]' -p blkendt.xsat
```
