Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

remove chip13 #15871

Merged
merged 6 commits into from
Jul 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 0 additions & 35 deletions chia/consensus/block_body_validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
from chia.full_node.mempool_check_conditions import get_name_puzzle_conditions, mempool_check_time_locks
from chia.types.block_protocol import BlockInfo
from chia.types.blockchain_format.coin import Coin
from chia.types.blockchain_format.proof_of_space import calculate_prefix_bits, get_plot_id, passes_plot_filter
from chia.types.blockchain_format.sized_bytes import bytes32, bytes48
from chia.types.coin_record import CoinRecord
from chia.types.full_block import FullBlock
Expand Down Expand Up @@ -62,40 +61,6 @@ async def validate_block_body(
prev_transaction_block_height: uint32 = uint32(0)
prev_transaction_block_timestamp: uint64 = uint64(0)

# We repeat the ProofOfSpace check from block header validation here, because we want to fetch blocks
# from the database too (BlockStore). In `BlockHeaderValidation` we don't have access to the database,
# just the cache. This check makes sure we retrieve blocks from the database and perform the check with them,
# in case they were missing from the cache.
if height >= constants.SOFT_FORK3_HEIGHT:
curr_optional_block_record: Optional[BlockRecord] = await blocks.get_block_record_from_db(
block.prev_header_hash
)
plot_id = get_plot_id(block.reward_chain_block.proof_of_space)
if block.reward_chain_block.challenge_chain_sp_vdf is None:
# Edge case of first sp (start of slot), where sp_iters == 0
curr_sp: bytes32 = block.reward_chain_block.pos_ss_cc_challenge_hash
else:
curr_sp = block.reward_chain_block.challenge_chain_sp_vdf.output.get_hash()
sp_count = 1

while curr_optional_block_record is not None and sp_count < constants.UNIQUE_PLOTS_WINDOW:
prefix_bits = calculate_prefix_bits(constants, curr_optional_block_record.height)

if curr_optional_block_record.cc_sp_hash != curr_sp:
if passes_plot_filter(
prefix_bits,
plot_id,
curr_optional_block_record.pos_ss_cc_challenge_hash,
curr_optional_block_record.cc_sp_hash,
):
log.error(f"Chip-13 Block Failed at height: {height}")
return Err.INVALID_POSPACE, None

sp_count += 1
curr_sp = curr_optional_block_record.cc_sp_hash
if sp_count < constants.UNIQUE_PLOTS_WINDOW:
curr_optional_block_record = await blocks.get_block_record_from_db(curr_optional_block_record.prev_hash)

# 1. For non transaction-blocs: foliage block, transaction filter, transactions info, and generator must
# be empty. If it is a block but not a transaction block, there is no body to validate. Check that all fields are
# None
Expand Down
31 changes: 1 addition & 30 deletions chia/consensus/block_header_validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,7 @@
)
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 (
calculate_prefix_bits,
get_plot_id,
passes_plot_filter,
verify_and_get_quality_string,
)
from chia.types.blockchain_format.proof_of_space import verify_and_get_quality_string
from chia.types.blockchain_format.sized_bytes import bytes32
from chia.types.blockchain_format.slots import ChallengeChainSubSlot, RewardChainSubSlot, SubSlotProofs
from chia.types.blockchain_format.vdf import VDFInfo, VDFProof
Expand Down Expand Up @@ -496,30 +491,6 @@ def validate_unfinished_header_block(
if q_str is None:
return None, ValidationError(Err.INVALID_POSPACE)

# 5c. Check plot id is not present within last `NUM_DISTINCT_CONSECUTIVE_PLOT_IDS` blocks.
if height >= constants.SOFT_FORK3_HEIGHT:
curr_optional_block_record: Optional[BlockRecord] = prev_b
plot_id = get_plot_id(header_block.reward_chain_block.proof_of_space)
curr_sp = cc_sp_hash
sp_count = 1

while curr_optional_block_record is not None and sp_count < constants.UNIQUE_PLOTS_WINDOW:
prefix_bits = calculate_prefix_bits(constants, curr_optional_block_record.height)

if curr_optional_block_record.cc_sp_hash != curr_sp:
if passes_plot_filter(
prefix_bits,
plot_id,
curr_optional_block_record.pos_ss_cc_challenge_hash,
curr_optional_block_record.cc_sp_hash,
):
return None, ValidationError(Err.INVALID_POSPACE, f"Chip-13 Block Failed: {height}")

sp_count += 1
curr_sp = curr_optional_block_record.cc_sp_hash
if sp_count < constants.UNIQUE_PLOTS_WINDOW:
curr_optional_block_record = blocks.try_block_record(curr_optional_block_record.prev_hash)

# 6. check signage point index
# no need to check negative values as this is uint 8
if header_block.reward_chain_block.signage_point_index >= constants.NUM_SPS_SUB_SLOT:
Expand Down
9 changes: 0 additions & 9 deletions chia/simulator/block_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,6 @@
calculate_prefix_bits,
generate_plot_public_key,
generate_taproot_sk,
get_plot_id,
passes_plot_filter,
verify_and_get_quality_string,
)
Expand Down Expand Up @@ -724,10 +723,6 @@ def get_consecutive_blocks(
if required_iters <= latest_block.required_iters:
continue
assert latest_block.header_hash in blocks
plot_id = get_plot_id(proof_of_space)
if latest_block.height + 1 >= constants.SOFT_FORK3_HEIGHT:
if self.plot_id_passed_previous_filters(plot_id, cc_sp_output_hash, block_list):
continue
additions = None
removals = None
if transaction_data_included:
Expand Down Expand Up @@ -1026,10 +1021,6 @@ def get_consecutive_blocks(
if blocks_added_this_sub_slot == constants.MAX_SUB_SLOT_BLOCKS:
break
assert last_timestamp is not None
plot_id = get_plot_id(proof_of_space)
if latest_block.height + 1 >= constants.SOFT_FORK3_HEIGHT:
if self.plot_id_passed_previous_filters(plot_id, cc_sp_output_hash, block_list):
continue
if proof_of_space.pool_contract_puzzle_hash is not None:
if pool_reward_puzzle_hash is not None:
# The caller wants to be paid to a specific address, but this PoSpace is tied to an
Expand Down
59 changes: 0 additions & 59 deletions tests/blockchain/test_blockchain.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@
from tests.blockchain.blockchain_test_utils import (
_validate_and_add_block,
_validate_and_add_block_multi_error,
_validate_and_add_block_multi_error_or_pass,
_validate_and_add_block_multi_result,
_validate_and_add_block_no_error,
)
Expand Down Expand Up @@ -3672,61 +3671,3 @@ async def test_reorg_flip_flop(empty_blockchain, bt):

for block in chain_b[40:]:
await _validate_and_add_block(b, block)


@pytest.mark.parametrize("unique_plots_window", [1, 2])
@pytest.mark.parametrize("bt_respects_soft_fork3", [True, False])
@pytest.mark.parametrize("soft_fork3_height", [0, 10, 10000])
@pytest.mark.asyncio
async def test_soft_fork3_activation(
consensus_mode, blockchain_constants, bt_respects_soft_fork3, soft_fork3_height, db_version, unique_plots_window
):
# We don't run Mode.SOFT_FORK3, since this is already parametrized by this test.
# Additionally, Mode.HARD_FORK_2_0 mode is incopatible with this test, since plot filter size would be zero,
# blocks won't ever be produced (we'll pass every consecutive plot filter, hence no block would pass CHIP-13).
if consensus_mode != Mode.PLAIN:
pytest.skip("Skipped test")
with TempKeyring() as keychain:
bt = await create_block_tools_async(
constants=blockchain_constants.replace(
SOFT_FORK3_HEIGHT=(0 if bt_respects_soft_fork3 else 10000),
UNIQUE_PLOTS_WINDOW=unique_plots_window,
),
keychain=keychain,
)
blockchain_constants = bt.constants.replace(SOFT_FORK3_HEIGHT=soft_fork3_height)
b, db_wrapper, db_path = await create_blockchain(blockchain_constants, db_version)
blocks = bt.get_consecutive_blocks(25)
for height, block in enumerate(blocks):
await _validate_and_add_block_multi_error_or_pass(b, block, [Err.INVALID_POSPACE])
peak = b.get_peak()
assert peak is not None
if peak.height != height:
break

peak = b.get_peak()
assert peak is not None

# We expect to add all blocks here (25 blocks), either because `unique_plots_window`=1 means we're not
# checking any extra plot filter, or `unique_plots_window`=True means `BlockTools` produced blocks
# that respect CHIP-13.
if bt_respects_soft_fork3 or unique_plots_window == 1:
assert peak.height == 24
else:
# Here we have `bt_respects_soft_fork3`=False, which means the produced blocks by `BlockTools` will not
# respect the CHIP-13 condition. We expect not adding blocks at some point after the soft fork 3
# activation height (`soft_fork3_height`).
if soft_fork3_height == 0:
# We're not adding all blocks, since at some point `BlockTools` will break the CHIP-13 condition with
# very high likelyhood.
assert peak.height < 24
elif soft_fork3_height == 10:
# We're not adding all blocks, but we've added all of them until the soft fork 3 activated (height 10)
assert peak.height < 24 and peak.height >= 9
else:
# Soft fork 3 will activate in the future (height 100), so we're adding all blocks.
assert peak.height == 24

await db_wrapper.close()
b.shut_down()
db_path.unlink()