Skip to content

Commit

Permalink
initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
matt-o-how committed Jan 28, 2025
1 parent 26b0fbe commit 9b7a1ab
Show file tree
Hide file tree
Showing 20 changed files with 224 additions and 145 deletions.
19 changes: 14 additions & 5 deletions chia/_tests/blockchain/test_blockchain.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from typing import Optional

import pytest
from chia_rs import AugSchemeMPL, G2Element, MerkleSet
from chia_rs import AugSchemeMPL, G2Element, MerkleSet, is_overflow_block
from clvm.casts import int_to_bytes

from chia._tests.blockchain.blockchain_test_utils import (
Expand All @@ -34,7 +34,6 @@
from chia.consensus.full_block_to_block_record import block_to_block_record
from chia.consensus.get_block_generator import get_block_generator
from chia.consensus.multiprocess_validation import PreValidationResult, pre_validate_block
from chia.consensus.pot_iterations import is_overflow_block
from chia.simulator.block_tools import BlockTools, create_block_tools_async
from chia.simulator.keyring import TempKeyring
from chia.simulator.wallet_tools import WalletTool
Expand Down Expand Up @@ -854,7 +853,11 @@ async def test_invalid_cc_sub_slot_vdf(self, empty_blockchain: Blockchain, bt: B
block = blocks[-1]
if (
len(block.finished_sub_slots)
and is_overflow_block(bt.constants, block.reward_chain_block.signage_point_index)
and is_overflow_block(
bt.constants.NUM_SPS_SUB_SLOT,
bt.constants.NUM_SP_INTERVALS_EXTRA,
block.reward_chain_block.signage_point_index,
)
and block.finished_sub_slots[-1].challenge_chain.challenge_chain_end_of_slot_vdf.output
!= ClassgroupElement.get_default_element()
):
Expand Down Expand Up @@ -1101,7 +1104,9 @@ async def test_no_ses_if_no_se(self, empty_blockchain: Blockchain, bt: BlockTool
while True:
blocks = bt.get_consecutive_blocks(1, block_list_input=blocks)
if len(blocks[-1].finished_sub_slots) > 0 and is_overflow_block(
bt.constants, blocks[-1].reward_chain_block.signage_point_index
bt.constants.NUM_SPS_SUB_SLOT,
bt.constants.NUM_SP_INTERVALS_EXTRA,
blocks[-1].reward_chain_block.signage_point_index,
):
new_finished_ss: EndOfSubSlotBundle = recursive_replace(
blocks[-1].finished_sub_slots[0],
Expand Down Expand Up @@ -1206,7 +1211,11 @@ async def test_sp_0_no_sp(self, empty_blockchain: Blockchain, bt: BlockTools) ->
block_bad = recursive_replace(blocks[-1], "reward_chain_block.signage_point_index", uint8(1))
await _validate_and_add_block(empty_blockchain, block_bad, expected_error=Err.INVALID_SP_INDEX)

elif not is_overflow_block(bt.constants, blocks[-1].reward_chain_block.signage_point_index):
elif not is_overflow_block(
bt.constants.NUM_SPS_SUB_SLOT,
bt.constants.NUM_SP_INTERVALS_EXTRA,
blocks[-1].reward_chain_block.signage_point_index,
):
case_2 = True
block_bad = recursive_replace(blocks[-1], "reward_chain_block.signage_point_index", uint8(0))
await _validate_and_add_block_multi_error(
Expand Down
63 changes: 45 additions & 18 deletions chia/_tests/core/consensus/test_pot_iterations.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
from __future__ import annotations

from chia_rs import (
calculate_ip_iters,
calculate_sp_iters,
is_overflow_block,
)
from pytest import raises

from chia.consensus.default_constants import DEFAULT_CONSTANTS
from chia.consensus.pos_quality import _expected_plot_size
from chia.consensus.pot_iterations import (
calculate_ip_iters,
calculate_iterations_quality,
calculate_sp_iters,
is_overflow_block,
)
from chia.util.hash import std_hash
from chia.util.ints import uint8, uint16, uint32, uint64, uint128
Expand All @@ -18,19 +20,19 @@

class TestPotIterations:
def test_is_overflow_block(self):
assert not is_overflow_block(test_constants, uint8(27))
assert not is_overflow_block(test_constants, uint8(28))
assert is_overflow_block(test_constants, uint8(29))
assert is_overflow_block(test_constants, uint8(30))
assert is_overflow_block(test_constants, uint8(31))
assert not is_overflow_block(test_constants.NUM_SPS_SUB_SLOT, test_constants.NUM_SP_INTERVALS_EXTRA, uint8(27))
assert not is_overflow_block(test_constants.NUM_SPS_SUB_SLOT, test_constants.NUM_SP_INTERVALS_EXTRA, uint8(28))
assert is_overflow_block(test_constants.NUM_SPS_SUB_SLOT, test_constants.NUM_SP_INTERVALS_EXTRA, uint8(29))
assert is_overflow_block(test_constants.NUM_SPS_SUB_SLOT, test_constants.NUM_SP_INTERVALS_EXTRA, uint8(30))
assert is_overflow_block(test_constants.NUM_SPS_SUB_SLOT, test_constants.NUM_SP_INTERVALS_EXTRA, uint8(31))
with raises(ValueError):
assert is_overflow_block(test_constants, uint8(32))
assert is_overflow_block(test_constants.NUM_SPS_SUB_SLOT, test_constants.NUM_SP_INTERVALS_EXTRA, uint8(32))

def test_calculate_sp_iters(self):
ssi: uint64 = uint64(100001 * 64 * 4)
with raises(ValueError):
calculate_sp_iters(test_constants, ssi, uint8(32))
calculate_sp_iters(test_constants, ssi, uint8(31))
calculate_sp_iters(test_constants.NUM_SPS_SUB_SLOT, ssi, uint8(32))
calculate_sp_iters(test_constants.NUM_SPS_SUB_SLOT, ssi, uint8(31))

def test_calculate_ip_iters(self):
ssi: uint64 = uint64(100001 * 64 * 4)
Expand All @@ -44,33 +46,58 @@ def test_calculate_ip_iters(self):

with raises(ValueError):
# required_iters too high
calculate_ip_iters(test_constants, ssi, sp_interval_iters, sp_interval_iters)
calculate_ip_iters(
test_constants.NUM_SPS_SUB_SLOT,
test_constants.NUM_SP_INTERVALS_EXTRA,
ssi,
sp_interval_iters,
sp_interval_iters,
)

with raises(ValueError):
# required_iters too high
calculate_ip_iters(test_constants, ssi, sp_interval_iters, sp_interval_iters * 12)
calculate_ip_iters(
test_constants.NUM_SPS_SUB_SLOT,
test_constants.NUM_SP_INTERVALS_EXTRA,
ssi,
sp_interval_iters,
sp_interval_iters * 12,
)

with raises(ValueError):
# required_iters too low (0)
calculate_ip_iters(test_constants, ssi, sp_interval_iters, uint64(0))
calculate_ip_iters(
test_constants.NUM_SPS_SUB_SLOT,
test_constants.NUM_SP_INTERVALS_EXTRA,
ssi,
sp_interval_iters,
uint64(0),
)

required_iters = sp_interval_iters - 1
ip_iters = calculate_ip_iters(test_constants, ssi, uint8(13), required_iters)
ip_iters = calculate_ip_iters(
test_constants.NUM_SPS_SUB_SLOT, test_constants.NUM_SP_INTERVALS_EXTRA, ssi, uint8(13), required_iters
)
assert ip_iters == sp_iters + test_constants.NUM_SP_INTERVALS_EXTRA * sp_interval_iters + required_iters

required_iters = uint64(1)
ip_iters = calculate_ip_iters(test_constants, ssi, uint8(13), required_iters)
ip_iters = calculate_ip_iters(
test_constants.NUM_SPS_SUB_SLOT, test_constants.NUM_SP_INTERVALS_EXTRA, ssi, uint8(13), required_iters
)
assert ip_iters == sp_iters + test_constants.NUM_SP_INTERVALS_EXTRA * sp_interval_iters + required_iters

required_iters = uint64(int(ssi * 4 / 300))
ip_iters = calculate_ip_iters(test_constants, ssi, uint8(13), required_iters)
ip_iters = calculate_ip_iters(
test_constants.NUM_SPS_SUB_SLOT, test_constants.NUM_SP_INTERVALS_EXTRA, ssi, uint8(13), required_iters
)
assert ip_iters == sp_iters + test_constants.NUM_SP_INTERVALS_EXTRA * sp_interval_iters + required_iters
assert sp_iters < ip_iters

# Overflow
sp_iters = sp_interval_iters * (test_constants.NUM_SPS_SUB_SLOT - 1)
ip_iters = calculate_ip_iters(
test_constants,
test_constants.NUM_SPS_SUB_SLOT,
test_constants.NUM_SP_INTERVALS_EXTRA,
ssi,
uint8(test_constants.NUM_SPS_SUB_SLOT - 1),
required_iters,
Expand Down
6 changes: 4 additions & 2 deletions chia/_tests/core/full_node/stores/test_full_node_store.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from typing import Optional

import pytest
from chia_rs import is_overflow_block

from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block, _validate_and_add_block_no_error
from chia._tests.util.blockchain import create_blockchain
Expand All @@ -17,7 +18,6 @@
from chia.consensus.difficulty_adjustment import get_next_sub_slot_iters_and_difficulty
from chia.consensus.find_fork_point import find_fork_point_in_chain
from chia.consensus.multiprocess_validation import PreValidationResult
from chia.consensus.pot_iterations import is_overflow_block
from chia.full_node.full_node_store import FullNodeStore, UnfinishedBlockEntry, find_best_block
from chia.full_node.signage_point import SignagePoint
from chia.protocols import timelord_protocol
Expand Down Expand Up @@ -817,7 +817,9 @@ async def test_basic_store(
sb.signage_point_index + custom_block_tools.constants.NUM_SP_INTERVALS_EXTRA,
custom_block_tools.constants.NUM_SPS_SUB_SLOT,
):
if is_overflow_block(custom_block_tools.constants, uint8(i)):
if is_overflow_block(
custom_block_tools.constants.NUM_SPS_SUB_SLOT, custom_block_tools.constants.NUM_SP_INTERVALS_EXTRA, uint8(i)
):
finished_sub_slots = blocks_5[-1].finished_sub_slots
else:
finished_sub_slots = []
Expand Down
6 changes: 4 additions & 2 deletions chia/_tests/core/full_node/test_full_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
SpendBundleConditions,
additions_and_removals,
get_flags_for_height_and_constants,
is_overflow_block,
)
from clvm.casts import int_to_bytes
from packaging.version import Version
Expand All @@ -32,7 +33,6 @@
from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_custom_interval, time_out_messages
from chia.consensus.block_body_validation import ForkInfo
from chia.consensus.multiprocess_validation import PreValidationResult, pre_validate_block
from chia.consensus.pot_iterations import is_overflow_block
from chia.full_node.coin_store import CoinStore
from chia.full_node.full_node import WalletUpdate
from chia.full_node.full_node_api import FullNodeAPI
Expand Down Expand Up @@ -1402,7 +1402,9 @@ async def test_unfinished_block_with_replaced_generator(wallet_nodes, self_hostn

blocks = bt.get_consecutive_blocks(1, block_list_input=blocks)
block: FullBlock = blocks[0]
overflow = is_overflow_block(bt.constants, block.reward_chain_block.signage_point_index)
overflow = is_overflow_block(
bt.constants.NUM_SPS_SUB_SLOT, bt.constants.NUM_SP_INTERVALS_EXTRA, block.reward_chain_block.signage_point_index
)

replaced_generator = SerializedProgram.from_bytes(b"\x80")

Expand Down
8 changes: 6 additions & 2 deletions chia/_tests/core/full_node/test_performance.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import random

import pytest
from chia_rs import is_overflow_block
from clvm.casts import int_to_bytes

from chia._tests.connection_utils import add_dummy_connection
Expand All @@ -12,7 +13,6 @@
from chia._tests.util.misc import BenchmarkRunner
from chia._tests.util.time_out_assert import time_out_assert
from chia.consensus.block_record import BlockRecord
from chia.consensus.pot_iterations import is_overflow_block
from chia.full_node.full_node_api import FullNodeAPI
from chia.protocols import full_node_protocol as fnp
from chia.types.condition_opcodes import ConditionOpcode
Expand Down Expand Up @@ -150,7 +150,11 @@ async def test_full_block_performance(
guarantee_transaction_block=True,
)
block = blocks[-1]
if is_overflow_block(bt.constants, block.reward_chain_block.signage_point_index):
if is_overflow_block(
bt.constants.NUM_SPS_SUB_SLOT,
bt.constants.NUM_SP_INTERVALS_EXTRA,
block.reward_chain_block.signage_point_index,
):
sub_slots = block.finished_sub_slots[:-1]
else:
sub_slots = block.finished_sub_slots
Expand Down
9 changes: 6 additions & 3 deletions chia/_tests/core/test_full_node_rpc.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from __future__ import annotations

import pytest
from chia_rs import AugSchemeMPL
from chia_rs import AugSchemeMPL, is_overflow_block
from clvm.casts import int_to_bytes

from chia import __version__
Expand All @@ -10,7 +10,6 @@
from chia._tests.util.rpc import validate_get_routes
from chia._tests.util.time_out_assert import time_out_assert
from chia.consensus.block_record import BlockRecord
from chia.consensus.pot_iterations import is_overflow_block
from chia.full_node.signage_point import SignagePoint
from chia.protocols import full_node_protocol
from chia.rpc.full_node_rpc_api import get_average_block_time, get_nearest_transaction_block
Expand Down Expand Up @@ -61,7 +60,11 @@ async def test1(two_nodes_sim_and_wallets_services, self_hostname, consensus_mod
assert len(await client.get_unfinished_block_headers()) == 0
assert len(await client.get_block_records(0, 100)) == 0
for block in blocks:
if is_overflow_block(bt.constants, block.reward_chain_block.signage_point_index):
if is_overflow_block(
bt.constants.NUM_SPS_SUB_SLOT,
bt.constants.NUM_SP_INTERVAL_EXTRA,
block.reward_chain_block.signage_point_index,
):
finished_ss = block.finished_sub_slots[:-1]
else:
finished_ss = block.finished_sub_slots
Expand Down
32 changes: 19 additions & 13 deletions chia/consensus/block_header_validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,13 @@
import time
from typing import Optional

from chia_rs import AugSchemeMPL
from chia_rs import (
AugSchemeMPL,
calculate_ip_iters,
calculate_sp_interval_iters,
calculate_sp_iters,
is_overflow_block,
)

from chia.consensus.block_record import BlockRecord
from chia.consensus.blockchain_interface import BlockRecordsProtocol
Expand All @@ -13,13 +19,7 @@
from chia.consensus.difficulty_adjustment import can_finish_sub_and_full_epoch
from chia.consensus.get_block_challenge import final_eos_is_already_included, get_block_challenge
from chia.consensus.make_sub_epoch_summary import make_sub_epoch_summary
from chia.consensus.pot_iterations import (
calculate_ip_iters,
calculate_iterations_quality,
calculate_sp_interval_iters,
calculate_sp_iters,
is_overflow_block,
)
from chia.consensus.pot_iterations import calculate_iterations_quality
from chia.consensus.vdf_info_computation import get_signage_point_vdf_info
from chia.types.blockchain_format.classgroup import ClassgroupElement
from chia.types.blockchain_format.proof_of_space import verify_and_get_quality_string
Expand Down Expand Up @@ -66,7 +66,11 @@ def validate_unfinished_header_block(
if genesis_block and header_block.prev_header_hash != constants.GENESIS_CHALLENGE:
return None, ValidationError(Err.INVALID_PREV_BLOCK_HASH)

overflow = is_overflow_block(constants, header_block.reward_chain_block.signage_point_index)
overflow = is_overflow_block(
constants.NUM_SPS_SUB_SLOT,
constants.NUM_SP_INTERVALS_EXTRA,
header_block.reward_chain_block.signage_point_index,
)
if skip_overflow_last_ss_validation and overflow:
if final_eos_is_already_included(header_block, blocks, expected_vs.ssi):
skip_overflow_last_ss_validation = False
Expand Down Expand Up @@ -508,7 +512,7 @@ def validate_unfinished_header_block(
)

# 7. check required iters
if required_iters >= calculate_sp_interval_iters(constants, expected_vs.ssi):
if required_iters >= calculate_sp_interval_iters(constants.NUM_SPS_SUB_SLOT, expected_vs.ssi):
return None, ValidationError(Err.INVALID_REQUIRED_ITERS)

# 8a. check signage point index 0 has no cc sp
Expand All @@ -524,13 +528,14 @@ def validate_unfinished_header_block(
return None, ValidationError(Err.INVALID_SP_INDEX)

sp_iters: uint64 = calculate_sp_iters(
constants,
constants.NUM_SPS_SUB_SLOT,
expected_vs.ssi,
header_block.reward_chain_block.signage_point_index,
)

ip_iters: uint64 = calculate_ip_iters(
constants,
constants.NUM_SPS_SUB_SLOT,
constants.NUM_SP_INTERVALS_EXTRA,
expected_vs.ssi,
header_block.reward_chain_block.signage_point_index,
required_iters,
Expand Down Expand Up @@ -874,7 +879,8 @@ def validate_finished_header_block(
new_sub_slot: bool = len(header_block.finished_sub_slots) > 0

ip_iters: uint64 = calculate_ip_iters(
constants,
constants.NUM_SPS_SUB_SLOT,
constants.NUM_SP_INTERVALS_EXTRA,
expected_vs.ssi,
header_block.reward_chain_block.signage_point_index,
required_iters,
Expand Down
7 changes: 5 additions & 2 deletions chia/consensus/full_block_to_block_record.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@

from typing import Optional, Union

from chia_rs import is_overflow_block

from chia.consensus.block_record import BlockRecord
from chia.consensus.blockchain_interface import BlockRecordsProtocol
from chia.consensus.constants import ConsensusConstants
from chia.consensus.deficit import calculate_deficit
from chia.consensus.difficulty_adjustment import get_next_sub_slot_iters_and_difficulty
from chia.consensus.make_sub_epoch_summary import make_sub_epoch_summary
from chia.consensus.pot_iterations import is_overflow_block
from chia.types.blockchain_format.classgroup import ClassgroupElement
from chia.types.blockchain_format.sized_bytes import bytes32
from chia.types.blockchain_format.slots import ChallengeBlockInfo
Expand All @@ -34,7 +35,9 @@ def block_to_block_record(
sub_slot_iters, _ = get_next_sub_slot_iters_and_difficulty(
constants, len(block.finished_sub_slots) > 0, prev_b, blocks
)
overflow = is_overflow_block(constants, block.reward_chain_block.signage_point_index)
overflow = is_overflow_block(
constants.NUM_SPS_SUB_SLOT, constants.NUM_SP_INTERVALS_EXTRA, block.reward_chain_block.signage_point_index
)
deficit = calculate_deficit(
constants,
block.height,
Expand Down
Loading

0 comments on commit 9b7a1ab

Please sign in to comment.