From 1e85abba8d116cf82c46b0893e7aef2c662b1c98 Mon Sep 17 00:00:00 2001 From: Matthew Howard Date: Fri, 18 Jul 2025 13:39:33 +0100 Subject: [PATCH 01/10] initial commit --- chia/_tests/clvm/coin_store.py | 2 +- .../core/mempool/test_mempool_manager.py | 2 +- chia/consensus/block_body_validation.py | 2 +- chia/consensus/check_time_locks.py | 57 ------------------- chia/full_node/mempool_manager.py | 20 ++++--- chia/types/coin_record.py | 33 +---------- 6 files changed, 18 insertions(+), 98 deletions(-) delete mode 100644 chia/consensus/check_time_locks.py diff --git a/chia/_tests/clvm/coin_store.py b/chia/_tests/clvm/coin_store.py index 110434de5484..eaab8fffee6a 100644 --- a/chia/_tests/clvm/coin_store.py +++ b/chia/_tests/clvm/coin_store.py @@ -10,7 +10,7 @@ from chia_rs.sized_ints import uint32, uint64 from chia._tests.util.get_name_puzzle_conditions import get_name_puzzle_conditions -from chia.consensus.check_time_locks import check_time_locks +from chia_rs import check_time_locks from chia.consensus.cost_calculator import NPCResult from chia.full_node.bundle_tools import simple_solution_generator from chia.types.blockchain_format.coin import Coin diff --git a/chia/_tests/core/mempool/test_mempool_manager.py b/chia/_tests/core/mempool/test_mempool_manager.py index 57eb05648d4d..fb6e84112ca9 100644 --- a/chia/_tests/core/mempool/test_mempool_manager.py +++ b/chia/_tests/core/mempool/test_mempool_manager.py @@ -27,7 +27,7 @@ from chia._tests.conftest import ConsensusMode from chia._tests.util.misc import Marks, datacases, invariant_check_mempool from chia._tests.util.setup_nodes import OldSimulatorsAndWallets, setup_simulators_and_wallets -from chia.consensus.check_time_locks import check_time_locks +from chia_rs import check_time_locks from chia.consensus.condition_costs import ConditionCost from chia.consensus.default_constants import DEFAULT_CONSTANTS from chia.full_node.eligible_coin_spends import ( diff --git a/chia/consensus/block_body_validation.py b/chia/consensus/block_body_validation.py index c113184cf9c6..0b02d4e24464 100644 --- a/chia/consensus/block_body_validation.py +++ b/chia/consensus/block_body_validation.py @@ -21,7 +21,7 @@ from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward from chia.consensus.blockchain_interface import BlockRecordsProtocol -from chia.consensus.check_time_locks import check_time_locks +from chia_rs import check_time_locks from chia.consensus.coinbase import create_farmer_coin, create_pool_coin from chia.types.blockchain_format.coin import Coin, hash_coin_ids from chia.types.coin_record import CoinRecord diff --git a/chia/consensus/check_time_locks.py b/chia/consensus/check_time_locks.py deleted file mode 100644 index e3a1870daf76..000000000000 --- a/chia/consensus/check_time_locks.py +++ /dev/null @@ -1,57 +0,0 @@ -from __future__ import annotations - -from typing import Optional - -from chia_rs import ( - SpendBundleConditions, -) -from chia_rs.sized_bytes import bytes32 -from chia_rs.sized_ints import uint32, uint64 - -from chia.types.coin_record import CoinRecord -from chia.util.errors import Err - - -def check_time_locks( - removal_coin_records: dict[bytes32, CoinRecord], - bundle_conds: SpendBundleConditions, - prev_transaction_block_height: uint32, - timestamp: uint64, -) -> Optional[Err]: - """ - Check all time and height conditions against current state. - """ - - if prev_transaction_block_height < bundle_conds.height_absolute: - return Err.ASSERT_HEIGHT_ABSOLUTE_FAILED - if timestamp < bundle_conds.seconds_absolute: - return Err.ASSERT_SECONDS_ABSOLUTE_FAILED - if bundle_conds.before_height_absolute is not None: - if prev_transaction_block_height >= bundle_conds.before_height_absolute: - return Err.ASSERT_BEFORE_HEIGHT_ABSOLUTE_FAILED - if bundle_conds.before_seconds_absolute is not None: - if timestamp >= bundle_conds.before_seconds_absolute: - return Err.ASSERT_BEFORE_SECONDS_ABSOLUTE_FAILED - - for spend in bundle_conds.spends: - unspent = removal_coin_records[bytes32(spend.coin_id)] - if spend.birth_height is not None: - if spend.birth_height != unspent.confirmed_block_index: - return Err.ASSERT_MY_BIRTH_HEIGHT_FAILED - if spend.birth_seconds is not None: - if spend.birth_seconds != unspent.timestamp: - return Err.ASSERT_MY_BIRTH_SECONDS_FAILED - if spend.height_relative is not None: - if prev_transaction_block_height < unspent.confirmed_block_index + spend.height_relative: - return Err.ASSERT_HEIGHT_RELATIVE_FAILED - if spend.seconds_relative is not None: - if timestamp < unspent.timestamp + spend.seconds_relative: - return Err.ASSERT_SECONDS_RELATIVE_FAILED - if spend.before_height_relative is not None: - if prev_transaction_block_height >= unspent.confirmed_block_index + spend.before_height_relative: - return Err.ASSERT_BEFORE_HEIGHT_RELATIVE_FAILED - if spend.before_seconds_relative is not None: - if timestamp >= unspent.timestamp + spend.before_seconds_relative: - return Err.ASSERT_BEFORE_SECONDS_RELATIVE_FAILED - - return None diff --git a/chia/full_node/mempool_manager.py b/chia/full_node/mempool_manager.py index 82ba6b760045..7532d093fafd 100644 --- a/chia/full_node/mempool_manager.py +++ b/chia/full_node/mempool_manager.py @@ -25,7 +25,7 @@ from chiabip158 import PyBIP158 from chia.consensus.block_record import BlockRecordProtocol -from chia.consensus.check_time_locks import check_time_locks +from chia_rs import check_time_locks from chia.consensus.cost_calculator import NPCResult from chia.full_node.bitcoin_fee_estimator import create_bitcoin_fee_estimator from chia.full_node.fee_estimation import FeeBlockInfo, MempoolInfo, MempoolItemInfo @@ -734,12 +734,18 @@ async def validate_spend_bundle( # point-of-view of the next block to be farmed. Therefore we pass in the # current peak's height and timestamp assert self.peak.timestamp is not None - tl_error: Optional[Err] = check_time_locks( - removal_record_dict, - conds, - self.peak.height, - self.peak.timestamp, - ) + try: + tl_error: Optional[Err] = check_time_locks( + removal_record_dict, + conds, + self.peak.height, + self.peak.timestamp, + ) + except Exception as e: + breakpoint() + + if tl_error is not None: + breakpoint() timelocks: TimelockConditions = compute_assert_height(removal_record_dict, conds) diff --git a/chia/types/coin_record.py b/chia/types/coin_record.py index 7ecb91bd7fa0..1009408edf4e 100644 --- a/chia/types/coin_record.py +++ b/chia/types/coin_record.py @@ -10,35 +10,6 @@ from chia.types.blockchain_format.coin import Coin from chia.util.streamable import Streamable, streamable +from chia_rs import CoinRecord as RustCoinRecord -@streamable -@dataclass(frozen=True) -class CoinRecord(Streamable): - """ - These are values that correspond to a CoinName that are used - in keeping track of the unspent database. - """ - - coin: Coin - confirmed_block_index: uint32 - spent_block_index: uint32 - coinbase: bool - timestamp: uint64 # Timestamp of the block at height confirmed_block_index - - @property - def spent(self) -> bool: - return self.spent_block_index > 0 - - @property - def name(self) -> bytes32: - return self.coin.name() - - @property - def coin_state(self) -> CoinState: - spent_h = None - if self.spent: - spent_h = self.spent_block_index - confirmed_height: Optional[uint32] = self.confirmed_block_index - if self.confirmed_block_index == 0 and self.timestamp == 0: - confirmed_height = None - return CoinState(self.coin, spent_h, confirmed_height) +CoinRecord = RustCoinRecord \ No newline at end of file From 2f56e81e3f9cccbc097965aaafa372eeb8868f33 Mon Sep 17 00:00:00 2001 From: Matthew Howard Date: Mon, 21 Jul 2025 11:07:11 +0100 Subject: [PATCH 02/10] fix int to bool map --- chia/consensus/block_body_validation.py | 10 ++++----- chia/full_node/coin_store.py | 27 ++++++++++++++++--------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/chia/consensus/block_body_validation.py b/chia/consensus/block_body_validation.py index 0b02d4e24464..c57402dbb75e 100644 --- a/chia/consensus/block_body_validation.py +++ b/chia/consensus/block_body_validation.py @@ -462,7 +462,7 @@ async def validate_block_body( False, block.foliage_transaction_block.timestamp, ) - removal_coin_records[new_unspent.name] = new_unspent + removal_coin_records[new_unspent.name()] = new_unspent else: # This check applies to both coins created before fork (pulled from coin_store), # and coins created after fork (additions_since_fork) @@ -484,9 +484,9 @@ async def validate_block_body( if unspent.spent == 1 and unspent.spent_block_index <= fork_info.fork_height: # Check for coins spent in an ancestor block return Err.DOUBLE_SPEND - removal_coin_records[unspent.name] = unspent + removal_coin_records[unspent.name()] = unspent else: - look_in_fork.append(unspent.name) + look_in_fork.append(unspent.name()) if log_coins and len(look_in_fork) > 0: log.info("%d coins spent after fork", len(look_in_fork)) @@ -494,7 +494,7 @@ async def validate_block_body( if len(unspent_records) != len(removals_from_db): # some coins could not be found in the DB. We need to find out which # ones and look for them in additions_since_fork - found: set[bytes32] = {u.name for u in unspent_records} + found: set[bytes32] = {u.name() for u in unspent_records} for rem in removals_from_db: if rem in found: continue @@ -552,7 +552,7 @@ async def validate_block_body( # 20. Verify that removed coin puzzle_hashes match with calculated puzzle_hashes for unspent in removal_coin_records.values(): - if unspent.coin.puzzle_hash != removals_puzzle_dic[unspent.name]: + if unspent.coin.puzzle_hash != removals_puzzle_dic[unspent.name()]: return Err.WRONG_PUZZLE_HASH # 21. Verify conditions diff --git a/chia/full_node/coin_store.py b/chia/full_node/coin_store.py index 653d62f5ac77..56a042ad8d2f 100644 --- a/chia/full_node/coin_store.py +++ b/chia/full_node/coin_store.py @@ -181,7 +181,8 @@ async def get_coin_record(self, coin_name: bytes32) -> Optional[CoinRecord]: if row is not None: coin = self.row_to_coin(row) spent_index = uint32(0) if row[1] <= 0 else uint32(row[1]) - return CoinRecord(coin, row[0], spent_index, row[2], row[6]) + coinbase = False if row[2] == 0 else True + return CoinRecord(coin, row[0], spent_index, coinbase, row[6]) return None async def get_coin_records(self, names: Collection[bytes32]) -> list[CoinRecord]: @@ -207,7 +208,8 @@ async def get_coin_records(self, names: Collection[bytes32]) -> list[CoinRecord] for row in await cursor.fetchall(): coin = self.row_to_coin(row) spent_index = uint32(0) if row[1] <= 0 else uint32(row[1]) - record = CoinRecord(coin, row[0], spent_index, row[2], row[6]) + coinbase = False if row[2] == 0 else True + record = CoinRecord(coin, row[0], spent_index, coinbase, row[6]) coins.append(record) return coins @@ -241,7 +243,8 @@ async def get_coins_removed_at_height(self, height: uint32) -> list[CoinRecord]: for row in await cursor.fetchall(): if row[1] > 0: coin = self.row_to_coin(row) - coin_record = CoinRecord(coin, row[0], row[1], row[2], row[6]) + coinbase = False if row[2] == 0 else True + coin_record = CoinRecord(coin, row[0], row[1], coinbase, row[6]) coins.append(coin_record) return coins @@ -266,7 +269,8 @@ async def get_coin_records_by_puzzle_hash( for row in await cursor.fetchall(): coin = self.row_to_coin(row) spent_index = uint32(0) if row[1] <= 0 else uint32(row[1]) - coins.add(CoinRecord(coin, row[0], spent_index, row[2], row[6])) + coinbase = False if row[2] == 0 else True + coins.add(CoinRecord(coin, row[0], spent_index, coinbase, row[6])) return list(coins) async def get_coin_records_by_puzzle_hashes( @@ -295,7 +299,8 @@ async def get_coin_records_by_puzzle_hashes( for row in await cursor.fetchall(): coin = self.row_to_coin(row) spent_index = uint32(0) if row[1] <= 0 else uint32(row[1]) - coins.add(CoinRecord(coin, row[0], spent_index, row[2], row[6])) + coinbase = False if row[2] == 0 else True + coins.add(CoinRecord(coin, row[0], spent_index, coinbase, row[6])) return list(coins) async def get_coin_records_by_names( @@ -322,7 +327,8 @@ async def get_coin_records_by_names( for row in await cursor.fetchall(): coin = self.row_to_coin(row) spent_index = uint32(0) if row[1] <= 0 else uint32(row[1]) - coins.add(CoinRecord(coin, row[0], spent_index, row[2], row[6])) + coinbase = False if row[2] == 0 else True + coins.add(CoinRecord(coin, row[0], spent_index, coinbase, row[6])) return list(coins) @@ -393,7 +399,8 @@ async def get_coin_records_by_parent_ids( async for row in cursor: coin = self.row_to_coin(row) spent_index = uint32(0) if row[1] <= 0 else uint32(row[1]) - coins.add(CoinRecord(coin, row[0], spent_index, row[2], row[6])) + coinbase = False if row[2] == 0 else True + coins.add(CoinRecord(coin, row[0], spent_index, coinbase, row[6])) return list(coins) @@ -567,7 +574,8 @@ async def rollback_to_block(self, block_index: int) -> dict[bytes32, CoinRecord] for row in rows: coin = self.row_to_coin(row) spent_index = uint32(0) if row[1] <= 0 else uint32(row[1]) - record = CoinRecord(coin, uint32(0), spent_index, row[2], uint64(0)) + coinbase = False if row[2] == 0 else True + record = CoinRecord(coin, uint32(0), spent_index, coinbase, uint64(0)) coin_name = bytes32(row[7]) coin_changes[coin_name] = record @@ -582,7 +590,8 @@ async def rollback_to_block(self, block_index: int) -> dict[bytes32, CoinRecord] ) for row in rows: coin = self.row_to_coin(row) - record = CoinRecord(coin, row[0], uint32(0), row[2], row[6]) + coinbase = False if row[2] == 0 else True + record = CoinRecord(coin, row[0], uint32(0), coinbase, row[6]) coin_name = bytes32(row[7]) if coin_name not in coin_changes: coin_changes[coin_name] = record From b0d477d2d446016597877164ef3dafc04a4cdf80 Mon Sep 17 00:00:00 2001 From: Matthew Howard Date: Mon, 21 Jul 2025 11:16:37 +0100 Subject: [PATCH 03/10] another int bool map --- chia/full_node/coin_store.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/chia/full_node/coin_store.py b/chia/full_node/coin_store.py index 56a042ad8d2f..46bcf134c580 100644 --- a/chia/full_node/coin_store.py +++ b/chia/full_node/coin_store.py @@ -226,7 +226,8 @@ async def get_coins_added_at_height(self, height: uint32) -> list[CoinRecord]: for row in rows: coin = self.row_to_coin(row) spent_index = uint32(0) if row[1] <= 0 else uint32(row[1]) - coins.append(CoinRecord(coin, row[0], spent_index, row[2], row[6])) + coinbase = False if row[2] == 0 else True + coins.append(CoinRecord(coin, row[0], spent_index, coinbase, row[6])) return coins async def get_coins_removed_at_height(self, height: uint32) -> list[CoinRecord]: From dbf73694552fbefed4c9551df4a4992c6a09b36f Mon Sep 17 00:00:00 2001 From: Matthew Howard Date: Mon, 21 Jul 2025 11:50:58 +0100 Subject: [PATCH 04/10] cast error to Err class --- chia/_tests/blockchain/test_blockchain_transactions.py | 2 +- chia/consensus/block_body_validation.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/chia/_tests/blockchain/test_blockchain_transactions.py b/chia/_tests/blockchain/test_blockchain_transactions.py index d959f882b538..0ae5f57aa448 100644 --- a/chia/_tests/blockchain/test_blockchain_transactions.py +++ b/chia/_tests/blockchain/test_blockchain_transactions.py @@ -92,7 +92,7 @@ async def test_basic_blockchain_tx( for coin in added_coins: unspent = await full_node_1.coin_store.get_coin_record(coin.name()) assert unspent is not None - assert not unspent.spent + assert not unspent.spent() assert not unspent.coinbase @pytest.mark.anyio diff --git a/chia/consensus/block_body_validation.py b/chia/consensus/block_body_validation.py index c57402dbb75e..94a2ed31a3e0 100644 --- a/chia/consensus/block_body_validation.py +++ b/chia/consensus/block_body_validation.py @@ -565,7 +565,8 @@ async def validate_block_body( prev_transaction_block_timestamp, ) if error is not None: - return error + # TODO: standardise errors across Rust and Python so cast is not necesary here + return Err(error) # 22. Verify aggregated signature is done in pre-validation if not block.transactions_info.aggregated_signature: From a81f87f847e704973b245d2e3e9d7862e33bddc7 Mon Sep 17 00:00:00 2001 From: Matthew Howard Date: Mon, 21 Jul 2025 13:17:13 +0100 Subject: [PATCH 05/10] cast to Err in a couple other places --- .../core/mempool/test_mempool_manager.py | 17 +++++++++-------- chia/full_node/mempool_manager.py | 18 +++++++----------- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/chia/_tests/core/mempool/test_mempool_manager.py b/chia/_tests/core/mempool/test_mempool_manager.py index fb6e84112ca9..896977eb00d1 100644 --- a/chia/_tests/core/mempool/test_mempool_manager.py +++ b/chia/_tests/core/mempool/test_mempool_manager.py @@ -431,15 +431,16 @@ def test_conditions( conds: SpendBundleConditions, expected: Optional[Err], ) -> None: - assert ( - check_time_locks( - dict(self.REMOVALS), - conds, - self.PREV_BLOCK_HEIGHT, - self.PREV_BLOCK_TIMESTAMP, - ) - == expected + res = check_time_locks( + dict(self.REMOVALS), + conds, + self.PREV_BLOCK_HEIGHT, + self.PREV_BLOCK_TIMESTAMP, ) + if res is not None: + # TODO: remove when Rust errors and Python Errors are the same + res = Err(res) + assert res == expected def expect( diff --git a/chia/full_node/mempool_manager.py b/chia/full_node/mempool_manager.py index 7532d093fafd..c89aa644604f 100644 --- a/chia/full_node/mempool_manager.py +++ b/chia/full_node/mempool_manager.py @@ -734,18 +734,14 @@ async def validate_spend_bundle( # point-of-view of the next block to be farmed. Therefore we pass in the # current peak's height and timestamp assert self.peak.timestamp is not None - try: - tl_error: Optional[Err] = check_time_locks( - removal_record_dict, - conds, - self.peak.height, - self.peak.timestamp, - ) - except Exception as e: - breakpoint() - + tl_error: Optional[Err] = check_time_locks( + removal_record_dict, + conds, + self.peak.height, + self.peak.timestamp, + ) if tl_error is not None: - breakpoint() + tl_error = Err(tl_error) timelocks: TimelockConditions = compute_assert_height(removal_record_dict, conds) From fb7330f437f3d25c4b5a1615c245a3ce359e4802 Mon Sep 17 00:00:00 2001 From: Matthew Howard Date: Thu, 31 Jul 2025 13:27:29 +0100 Subject: [PATCH 06/10] remaining couple --- chia/_tests/blockchain/test_blockchain_transactions.py | 2 +- chia/consensus/block_body_validation.py | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/chia/_tests/blockchain/test_blockchain_transactions.py b/chia/_tests/blockchain/test_blockchain_transactions.py index 0ae5f57aa448..d959f882b538 100644 --- a/chia/_tests/blockchain/test_blockchain_transactions.py +++ b/chia/_tests/blockchain/test_blockchain_transactions.py @@ -92,7 +92,7 @@ async def test_basic_blockchain_tx( for coin in added_coins: unspent = await full_node_1.coin_store.get_coin_record(coin.name()) assert unspent is not None - assert not unspent.spent() + assert not unspent.spent assert not unspent.coinbase @pytest.mark.anyio diff --git a/chia/consensus/block_body_validation.py b/chia/consensus/block_body_validation.py index 94a2ed31a3e0..81686021cc60 100644 --- a/chia/consensus/block_body_validation.py +++ b/chia/consensus/block_body_validation.py @@ -462,7 +462,7 @@ async def validate_block_body( False, block.foliage_transaction_block.timestamp, ) - removal_coin_records[new_unspent.name()] = new_unspent + removal_coin_records[new_unspent.name] = new_unspent else: # This check applies to both coins created before fork (pulled from coin_store), # and coins created after fork (additions_since_fork) @@ -484,9 +484,9 @@ async def validate_block_body( if unspent.spent == 1 and unspent.spent_block_index <= fork_info.fork_height: # Check for coins spent in an ancestor block return Err.DOUBLE_SPEND - removal_coin_records[unspent.name()] = unspent + removal_coin_records[unspent.name] = unspent else: - look_in_fork.append(unspent.name()) + look_in_fork.append(unspent.name) if log_coins and len(look_in_fork) > 0: log.info("%d coins spent after fork", len(look_in_fork)) @@ -494,7 +494,7 @@ async def validate_block_body( if len(unspent_records) != len(removals_from_db): # some coins could not be found in the DB. We need to find out which # ones and look for them in additions_since_fork - found: set[bytes32] = {u.name() for u in unspent_records} + found: set[bytes32] = {u.name for u in unspent_records} for rem in removals_from_db: if rem in found: continue @@ -552,7 +552,7 @@ async def validate_block_body( # 20. Verify that removed coin puzzle_hashes match with calculated puzzle_hashes for unspent in removal_coin_records.values(): - if unspent.coin.puzzle_hash != removals_puzzle_dic[unspent.name()]: + if unspent.coin.puzzle_hash != removals_puzzle_dic[unspent.name]: return Err.WRONG_PUZZLE_HASH # 21. Verify conditions From d4637580bb4ad0899cb62ba642cecc438d3023ce Mon Sep 17 00:00:00 2001 From: Matthew Howard Date: Thu, 31 Jul 2025 13:28:06 +0100 Subject: [PATCH 07/10] ruff --- chia/_tests/clvm/coin_store.py | 3 +-- chia/_tests/core/mempool/test_mempool_manager.py | 2 +- chia/consensus/block_body_validation.py | 2 +- chia/full_node/mempool_manager.py | 2 +- chia/types/coin_record.py | 12 +----------- 5 files changed, 5 insertions(+), 16 deletions(-) diff --git a/chia/_tests/clvm/coin_store.py b/chia/_tests/clvm/coin_store.py index eaab8fffee6a..942644def719 100644 --- a/chia/_tests/clvm/coin_store.py +++ b/chia/_tests/clvm/coin_store.py @@ -5,12 +5,11 @@ from dataclasses import dataclass, replace from typing import Optional -from chia_rs import ConsensusConstants, SpendBundle +from chia_rs import ConsensusConstants, SpendBundle, check_time_locks from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32, uint64 from chia._tests.util.get_name_puzzle_conditions import get_name_puzzle_conditions -from chia_rs import check_time_locks from chia.consensus.cost_calculator import NPCResult from chia.full_node.bundle_tools import simple_solution_generator from chia.types.blockchain_format.coin import Coin diff --git a/chia/_tests/core/mempool/test_mempool_manager.py b/chia/_tests/core/mempool/test_mempool_manager.py index 896977eb00d1..42cbd0cf2aa0 100644 --- a/chia/_tests/core/mempool/test_mempool_manager.py +++ b/chia/_tests/core/mempool/test_mempool_manager.py @@ -17,6 +17,7 @@ SpendBundle, SpendBundleConditions, SpendConditions, + check_time_locks, get_conditions_from_spendbundle, run_block_generator2, ) @@ -27,7 +28,6 @@ from chia._tests.conftest import ConsensusMode from chia._tests.util.misc import Marks, datacases, invariant_check_mempool from chia._tests.util.setup_nodes import OldSimulatorsAndWallets, setup_simulators_and_wallets -from chia_rs import check_time_locks from chia.consensus.condition_costs import ConditionCost from chia.consensus.default_constants import DEFAULT_CONSTANTS from chia.full_node.eligible_coin_spends import ( diff --git a/chia/consensus/block_body_validation.py b/chia/consensus/block_body_validation.py index 81686021cc60..84cd80c35c1f 100644 --- a/chia/consensus/block_body_validation.py +++ b/chia/consensus/block_body_validation.py @@ -12,6 +12,7 @@ FullBlock, SpendBundleConditions, UnfinishedBlock, + check_time_locks, compute_merkle_set_root, is_canonical_serialization, ) @@ -21,7 +22,6 @@ from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward from chia.consensus.blockchain_interface import BlockRecordsProtocol -from chia_rs import check_time_locks from chia.consensus.coinbase import create_farmer_coin, create_pool_coin from chia.types.blockchain_format.coin import Coin, hash_coin_ids from chia.types.coin_record import CoinRecord diff --git a/chia/full_node/mempool_manager.py b/chia/full_node/mempool_manager.py index c89aa644604f..6f3d7591bb59 100644 --- a/chia/full_node/mempool_manager.py +++ b/chia/full_node/mempool_manager.py @@ -16,6 +16,7 @@ ConsensusConstants, SpendBundle, SpendBundleConditions, + check_time_locks, get_flags_for_height_and_constants, supports_fast_forward, validate_clvm_and_signature, @@ -25,7 +26,6 @@ from chiabip158 import PyBIP158 from chia.consensus.block_record import BlockRecordProtocol -from chia_rs import check_time_locks from chia.consensus.cost_calculator import NPCResult from chia.full_node.bitcoin_fee_estimator import create_bitcoin_fee_estimator from chia.full_node.fee_estimation import FeeBlockInfo, MempoolInfo, MempoolItemInfo diff --git a/chia/types/coin_record.py b/chia/types/coin_record.py index 1009408edf4e..1210c48e325d 100644 --- a/chia/types/coin_record.py +++ b/chia/types/coin_record.py @@ -1,15 +1,5 @@ from __future__ import annotations -from dataclasses import dataclass -from typing import Optional - -from chia_rs import CoinState -from chia_rs.sized_bytes import bytes32 -from chia_rs.sized_ints import uint32, uint64 - -from chia.types.blockchain_format.coin import Coin -from chia.util.streamable import Streamable, streamable - from chia_rs import CoinRecord as RustCoinRecord -CoinRecord = RustCoinRecord \ No newline at end of file +CoinRecord = RustCoinRecord From 9f514ab20d9e3e7855cdad1cd77d2a26fef8efe2 Mon Sep 17 00:00:00 2001 From: Matthew Howard Date: Wed, 13 Aug 2025 14:30:03 +0100 Subject: [PATCH 08/10] inline coinstore bool --- chia/full_node/coin_store.py | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/chia/full_node/coin_store.py b/chia/full_node/coin_store.py index 46bcf134c580..84626080cb2e 100644 --- a/chia/full_node/coin_store.py +++ b/chia/full_node/coin_store.py @@ -181,8 +181,7 @@ async def get_coin_record(self, coin_name: bytes32) -> Optional[CoinRecord]: if row is not None: coin = self.row_to_coin(row) spent_index = uint32(0) if row[1] <= 0 else uint32(row[1]) - coinbase = False if row[2] == 0 else True - return CoinRecord(coin, row[0], spent_index, coinbase, row[6]) + return CoinRecord(coin, row[0], spent_index, row[2] != 0, row[6]) return None async def get_coin_records(self, names: Collection[bytes32]) -> list[CoinRecord]: @@ -208,8 +207,7 @@ async def get_coin_records(self, names: Collection[bytes32]) -> list[CoinRecord] for row in await cursor.fetchall(): coin = self.row_to_coin(row) spent_index = uint32(0) if row[1] <= 0 else uint32(row[1]) - coinbase = False if row[2] == 0 else True - record = CoinRecord(coin, row[0], spent_index, coinbase, row[6]) + record = CoinRecord(coin, row[0], spent_index, row[2] != 0, row[6]) coins.append(record) return coins @@ -226,8 +224,7 @@ async def get_coins_added_at_height(self, height: uint32) -> list[CoinRecord]: for row in rows: coin = self.row_to_coin(row) spent_index = uint32(0) if row[1] <= 0 else uint32(row[1]) - coinbase = False if row[2] == 0 else True - coins.append(CoinRecord(coin, row[0], spent_index, coinbase, row[6])) + coins.append(CoinRecord(coin, row[0], spent_index, row[2] != 0, row[6])) return coins async def get_coins_removed_at_height(self, height: uint32) -> list[CoinRecord]: @@ -244,8 +241,7 @@ async def get_coins_removed_at_height(self, height: uint32) -> list[CoinRecord]: for row in await cursor.fetchall(): if row[1] > 0: coin = self.row_to_coin(row) - coinbase = False if row[2] == 0 else True - coin_record = CoinRecord(coin, row[0], row[1], coinbase, row[6]) + coin_record = CoinRecord(coin, row[0], row[1], row[2] != 0, row[6]) coins.append(coin_record) return coins @@ -270,8 +266,7 @@ async def get_coin_records_by_puzzle_hash( for row in await cursor.fetchall(): coin = self.row_to_coin(row) spent_index = uint32(0) if row[1] <= 0 else uint32(row[1]) - coinbase = False if row[2] == 0 else True - coins.add(CoinRecord(coin, row[0], spent_index, coinbase, row[6])) + coins.add(CoinRecord(coin, row[0], spent_index, row[2] != 0, row[6])) return list(coins) async def get_coin_records_by_puzzle_hashes( @@ -300,8 +295,7 @@ async def get_coin_records_by_puzzle_hashes( for row in await cursor.fetchall(): coin = self.row_to_coin(row) spent_index = uint32(0) if row[1] <= 0 else uint32(row[1]) - coinbase = False if row[2] == 0 else True - coins.add(CoinRecord(coin, row[0], spent_index, coinbase, row[6])) + coins.add(CoinRecord(coin, row[0], spent_index, row[2] != 0, row[6])) return list(coins) async def get_coin_records_by_names( @@ -328,8 +322,7 @@ async def get_coin_records_by_names( for row in await cursor.fetchall(): coin = self.row_to_coin(row) spent_index = uint32(0) if row[1] <= 0 else uint32(row[1]) - coinbase = False if row[2] == 0 else True - coins.add(CoinRecord(coin, row[0], spent_index, coinbase, row[6])) + coins.add(CoinRecord(coin, row[0], spent_index, row[2] != 0, row[6])) return list(coins) @@ -400,8 +393,7 @@ async def get_coin_records_by_parent_ids( async for row in cursor: coin = self.row_to_coin(row) spent_index = uint32(0) if row[1] <= 0 else uint32(row[1]) - coinbase = False if row[2] == 0 else True - coins.add(CoinRecord(coin, row[0], spent_index, coinbase, row[6])) + coins.add(CoinRecord(coin, row[0], spent_index, row[2] != 0, row[6])) return list(coins) @@ -575,8 +567,7 @@ async def rollback_to_block(self, block_index: int) -> dict[bytes32, CoinRecord] for row in rows: coin = self.row_to_coin(row) spent_index = uint32(0) if row[1] <= 0 else uint32(row[1]) - coinbase = False if row[2] == 0 else True - record = CoinRecord(coin, uint32(0), spent_index, coinbase, uint64(0)) + record = CoinRecord(coin, uint32(0), spent_index, row[2] != 0, uint64(0)) coin_name = bytes32(row[7]) coin_changes[coin_name] = record @@ -591,8 +582,7 @@ async def rollback_to_block(self, block_index: int) -> dict[bytes32, CoinRecord] ) for row in rows: coin = self.row_to_coin(row) - coinbase = False if row[2] == 0 else True - record = CoinRecord(coin, row[0], uint32(0), coinbase, row[6]) + record = CoinRecord(coin, row[0], uint32(0), row[2] != 0, row[6]) coin_name = bytes32(row[7]) if coin_name not in coin_changes: coin_changes[coin_name] = record From c49ae98a0e06083cb9d38efd6c4147287fe7493d Mon Sep 17 00:00:00 2001 From: Matthew Howard Date: Wed, 13 Aug 2025 14:54:45 +0100 Subject: [PATCH 09/10] typing fixes --- chia/_tests/clvm/coin_store.py | 11 ++++++++--- chia/_tests/core/mempool/test_mempool_manager.py | 10 ++++++++-- chia/full_node/mempool_manager.py | 4 ++-- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/chia/_tests/clvm/coin_store.py b/chia/_tests/clvm/coin_store.py index 942644def719..18893959c4fc 100644 --- a/chia/_tests/clvm/coin_store.py +++ b/chia/_tests/clvm/coin_store.py @@ -2,7 +2,7 @@ from collections import defaultdict from collections.abc import Iterator -from dataclasses import dataclass, replace +from dataclasses import dataclass from typing import Optional from chia_rs import ConsensusConstants, SpendBundle, check_time_locks @@ -113,8 +113,13 @@ def update_coin_store_for_spend_bundle( self._add_coin_entry(new_coin, now) for spent_coin in removals: coin_name = spent_coin.name() - coin_record = self._db[coin_name] - self._db[coin_name] = replace(coin_record, spent_block_index=now.height) + self._db[coin_name] = CoinRecord( + self._db[coin_name].coin, + self._db[coin_name].confirmed_block_index, + now.height, + self._db[coin_name].coinbase, + self._db[coin_name].timestamp, + ) return additions, spend_bundle.coin_spends def coins_for_puzzle_hash(self, puzzle_hash: bytes32) -> Iterator[Coin]: diff --git a/chia/_tests/core/mempool/test_mempool_manager.py b/chia/_tests/core/mempool/test_mempool_manager.py index 42cbd0cf2aa0..31fcc2391eee 100644 --- a/chia/_tests/core/mempool/test_mempool_manager.py +++ b/chia/_tests/core/mempool/test_mempool_manager.py @@ -431,7 +431,7 @@ def test_conditions( conds: SpendBundleConditions, expected: Optional[Err], ) -> None: - res = check_time_locks( + res: Optional[Union[int, Err]] = check_time_locks( dict(self.REMOVALS), conds, self.PREV_BLOCK_HEIGHT, @@ -2340,7 +2340,13 @@ def __init__(self, coins: list[Coin], lineage: dict[bytes32, Coin]) -> None: self.lineage_info[ph] = UnspentLineageInfo(c.name(), c.parent_coin_info, bytes32([42] * 32)) def spend_coin(self, coin_id: bytes32, height: uint32 = uint32(10)) -> None: - self.coin_records[coin_id] = dataclasses.replace(self.coin_records[coin_id], spent_block_index=height) + self.coin_records[coin_id] = CoinRecord( + self.coin_records[coin_id].coin, + self.coin_records[coin_id].confirmed_block_index, + height, + self.coin_records[coin_id].coinbase, + self.coin_records[coin_id].timestamp, + ) def update_lineage(self, puzzle_hash: bytes32, coin: Optional[Coin]) -> None: if coin is None: diff --git a/chia/full_node/mempool_manager.py b/chia/full_node/mempool_manager.py index 6f3d7591bb59..eaaf9bda2e79 100644 --- a/chia/full_node/mempool_manager.py +++ b/chia/full_node/mempool_manager.py @@ -6,7 +6,7 @@ from collections.abc import Awaitable, Collection from concurrent.futures import Executor, ThreadPoolExecutor from dataclasses import dataclass, field -from typing import Callable, Optional, TypeVar +from typing import Callable, Optional, TypeVar, Union from chia_rs import ( ELIGIBLE_FOR_DEDUP, @@ -734,7 +734,7 @@ async def validate_spend_bundle( # point-of-view of the next block to be farmed. Therefore we pass in the # current peak's height and timestamp assert self.peak.timestamp is not None - tl_error: Optional[Err] = check_time_locks( + tl_error: Optional[Union[int, Err]] = check_time_locks( removal_record_dict, conds, self.peak.height, From 3c7e4563aadb215780935819664a1411b6ec43f8 Mon Sep 17 00:00:00 2001 From: Matthew Howard Date: Wed, 13 Aug 2025 15:29:44 +0100 Subject: [PATCH 10/10] import directly from rust and remove legacy file --- benchmarks/mempool-long-lived.py | 3 +-- benchmarks/mempool.py | 3 +-- chia/_tests/clvm/coin_store.py | 3 +-- chia/_tests/cmds/cmd_test_utils.py | 3 +-- chia/_tests/core/full_node/stores/test_coin_store.py | 3 +-- chia/_tests/core/full_node/test_conditions.py | 3 +-- chia/_tests/core/full_node/test_full_node.py | 2 +- chia/_tests/core/mempool/test_mempool_manager.py | 2 +- chia/_tests/util/coin_store.py | 3 ++- chia/_tests/util/spend_sim.py | 2 +- chia/_tests/wallet/rpc/test_wallet_rpc.py | 3 +-- chia/_tests/wallet/test_new_wallet_protocol.py | 3 +-- chia/cmds/sim_funcs.py | 3 +-- chia/consensus/block_body_validation.py | 2 +- chia/consensus/blockchain.py | 2 +- chia/consensus/coin_store_protocol.py | 3 +-- chia/full_node/coin_store.py | 3 +-- chia/full_node/full_node.py | 2 +- chia/full_node/full_node_api.py | 2 +- chia/full_node/full_node_rpc_api.py | 2 +- chia/full_node/full_node_rpc_client.py | 3 +-- chia/full_node/mempool_manager.py | 2 +- chia/simulator/full_node_simulator.py | 3 +-- chia/simulator/simulator_full_node_rpc_api.py | 3 +-- chia/simulator/simulator_full_node_rpc_client.py | 3 +-- chia/types/coin_record.py | 5 ----- chia/wallet/wallet_coin_record.py | 2 +- chia/wallet/wallet_rpc_api.py | 3 +-- chia/wallet/wallet_rpc_client.py | 2 +- chia/wallet/wallet_state_manager.py | 3 +-- 30 files changed, 30 insertions(+), 51 deletions(-) delete mode 100644 chia/types/coin_record.py diff --git a/benchmarks/mempool-long-lived.py b/benchmarks/mempool-long-lived.py index 1ba53ee3df22..89abfb638bd2 100644 --- a/benchmarks/mempool-long-lived.py +++ b/benchmarks/mempool-long-lived.py @@ -6,7 +6,7 @@ from time import monotonic from typing import Optional -from chia_rs import CoinSpend, G2Element, SpendBundle +from chia_rs import CoinRecord, CoinSpend, G2Element, SpendBundle from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32, uint64 @@ -14,7 +14,6 @@ from chia.full_node.mempool_manager import MempoolManager from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.serialized_program import SerializedProgram -from chia.types.coin_record import CoinRecord from chia.types.condition_opcodes import ConditionOpcode from chia.types.mempool_item import UnspentLineageInfo from chia.util.casts import int_to_bytes diff --git a/benchmarks/mempool.py b/benchmarks/mempool.py index 51202e973063..87b84cb86fbe 100644 --- a/benchmarks/mempool.py +++ b/benchmarks/mempool.py @@ -9,7 +9,7 @@ from time import monotonic from typing import Optional -from chia_rs import SpendBundle +from chia_rs import CoinRecord, SpendBundle from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32, uint64 @@ -18,7 +18,6 @@ from chia.full_node.mempool_manager import MempoolManager from chia.simulator.wallet_tools import WalletTool from chia.types.blockchain_format.coin import Coin -from chia.types.coin_record import CoinRecord from chia.types.mempool_inclusion_status import MempoolInclusionStatus from chia.types.mempool_item import UnspentLineageInfo from chia.util.batches import to_batches diff --git a/chia/_tests/clvm/coin_store.py b/chia/_tests/clvm/coin_store.py index 18893959c4fc..a9d52407d538 100644 --- a/chia/_tests/clvm/coin_store.py +++ b/chia/_tests/clvm/coin_store.py @@ -5,7 +5,7 @@ from dataclasses import dataclass from typing import Optional -from chia_rs import ConsensusConstants, SpendBundle, check_time_locks +from chia_rs import CoinRecord, ConsensusConstants, SpendBundle, check_time_locks from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32, uint64 @@ -13,7 +13,6 @@ from chia.consensus.cost_calculator import NPCResult from chia.full_node.bundle_tools import simple_solution_generator from chia.types.blockchain_format.coin import Coin -from chia.types.coin_record import CoinRecord from chia.util.errors import Err MAX_COST = 11000000000 diff --git a/chia/_tests/cmds/cmd_test_utils.py b/chia/_tests/cmds/cmd_test_utils.py index 8234fb838f03..0e31159fbb82 100644 --- a/chia/_tests/cmds/cmd_test_utils.py +++ b/chia/_tests/cmds/cmd_test_utils.py @@ -7,7 +7,7 @@ from pathlib import Path from typing import Any, Optional, cast -from chia_rs import BlockRecord, Coin, G1Element, G2Element +from chia_rs import BlockRecord, Coin, CoinRecord, G1Element, G2Element from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint8, uint16, uint32, uint64 @@ -22,7 +22,6 @@ from chia.full_node.full_node_rpc_client import FullNodeRpcClient from chia.rpc.rpc_client import RpcClient from chia.simulator.simulator_full_node_rpc_client import SimulatorFullNodeRpcClient -from chia.types.coin_record import CoinRecord from chia.types.signing_mode import SigningMode from chia.util.bech32m import encode_puzzle_hash from chia.util.config import load_config diff --git a/chia/_tests/core/full_node/stores/test_coin_store.py b/chia/_tests/core/full_node/stores/test_coin_store.py index 1b92f1bfd73a..5cc5b360c9d7 100644 --- a/chia/_tests/core/full_node/stores/test_coin_store.py +++ b/chia/_tests/core/full_node/stores/test_coin_store.py @@ -7,7 +7,7 @@ import aiosqlite import pytest -from chia_rs import CoinState, FullBlock, additions_and_removals, get_flags_for_height_and_constants +from chia_rs import CoinRecord, CoinState, FullBlock, additions_and_removals, get_flags_for_height_and_constants from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32, uint64 @@ -26,7 +26,6 @@ from chia.simulator.block_tools import BlockTools, test_constants from chia.simulator.wallet_tools import WalletTool from chia.types.blockchain_format.coin import Coin -from chia.types.coin_record import CoinRecord from chia.types.mempool_item import UnspentLineageInfo from chia.util.casts import int_to_bytes from chia.util.db_wrapper import DBWrapper2 diff --git a/chia/_tests/core/full_node/test_conditions.py b/chia/_tests/core/full_node/test_conditions.py index 729b2fe67ab1..553c8a175fa1 100644 --- a/chia/_tests/core/full_node/test_conditions.py +++ b/chia/_tests/core/full_node/test_conditions.py @@ -9,7 +9,7 @@ from typing import Optional import pytest -from chia_rs import AugSchemeMPL, FullBlock, G2Element, SpendBundle +from chia_rs import AugSchemeMPL, CoinRecord, FullBlock, G2Element, SpendBundle from chia_rs.sized_ints import uint32, uint64 from clvm_tools.binutils import assemble @@ -21,7 +21,6 @@ from chia.simulator.keyring import TempKeyring from chia.types.blockchain_format.program import Program from chia.types.blockchain_format.serialized_program import SerializedProgram -from chia.types.coin_record import CoinRecord from chia.types.coin_spend import make_spend from chia.types.condition_opcodes import ConditionOpcode from chia.util.casts import int_to_bytes diff --git a/chia/_tests/core/full_node/test_full_node.py b/chia/_tests/core/full_node/test_full_node.py index 89022b8f8c13..099d57694e16 100644 --- a/chia/_tests/core/full_node/test_full_node.py +++ b/chia/_tests/core/full_node/test_full_node.py @@ -12,6 +12,7 @@ import pytest from chia_rs import ( AugSchemeMPL, + CoinRecord, ConsensusConstants, Foliage, FoliageTransactionBlock, @@ -91,7 +92,6 @@ ) from chia.types.blockchain_format.serialized_program import SerializedProgram from chia.types.blockchain_format.vdf import CompressibleVDFField, VDFProof -from chia.types.coin_record import CoinRecord from chia.types.coin_spend import make_spend from chia.types.condition_opcodes import ConditionOpcode from chia.types.condition_with_args import ConditionWithArgs diff --git a/chia/_tests/core/mempool/test_mempool_manager.py b/chia/_tests/core/mempool/test_mempool_manager.py index 31fcc2391eee..543fc6698353 100644 --- a/chia/_tests/core/mempool/test_mempool_manager.py +++ b/chia/_tests/core/mempool/test_mempool_manager.py @@ -11,6 +11,7 @@ ELIGIBLE_FOR_DEDUP, ELIGIBLE_FOR_FF, AugSchemeMPL, + CoinRecord, CoinSpend, ConsensusConstants, G2Element, @@ -60,7 +61,6 @@ from chia.types.blockchain_format.program import DEFAULT_FLAGS, INFINITE_COST, Program from chia.types.blockchain_format.serialized_program import SerializedProgram from chia.types.clvm_cost import CLVMCost -from chia.types.coin_record import CoinRecord from chia.types.coin_spend import make_spend from chia.types.condition_opcodes import ConditionOpcode from chia.types.condition_with_args import ConditionWithArgs diff --git a/chia/_tests/util/coin_store.py b/chia/_tests/util/coin_store.py index b5eb266ec825..7fbf893705d2 100644 --- a/chia/_tests/util/coin_store.py +++ b/chia/_tests/util/coin_store.py @@ -1,7 +1,8 @@ from __future__ import annotations +from chia_rs import CoinRecord + from chia.consensus.coin_store_protocol import CoinStoreProtocol -from chia.types.coin_record import CoinRecord from chia.util.db_wrapper import DBWrapper2 diff --git a/chia/_tests/util/spend_sim.py b/chia/_tests/util/spend_sim.py index f746d4eedd42..d9095a2bb5f5 100644 --- a/chia/_tests/util/spend_sim.py +++ b/chia/_tests/util/spend_sim.py @@ -12,6 +12,7 @@ import anyio from chia_rs import ( DONT_VALIDATE_SIGNATURE, + CoinRecord, CoinSpend, ConsensusConstants, G2Element, @@ -34,7 +35,6 @@ from chia.full_node.mempool_manager import MempoolManager from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.program import INFINITE_COST -from chia.types.coin_record import CoinRecord from chia.types.generator_types import BlockGenerator from chia.types.mempool_inclusion_status import MempoolInclusionStatus from chia.types.mempool_item import MempoolItem diff --git a/chia/_tests/wallet/rpc/test_wallet_rpc.py b/chia/_tests/wallet/rpc/test_wallet_rpc.py index 1c60c5ffcc8e..871e175781c6 100644 --- a/chia/_tests/wallet/rpc/test_wallet_rpc.py +++ b/chia/_tests/wallet/rpc/test_wallet_rpc.py @@ -13,7 +13,7 @@ import aiosqlite import pytest -from chia_rs import CoinSpend, G1Element, G2Element +from chia_rs import CoinRecord, CoinSpend, G1Element, G2Element from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint16, uint32, uint64, uint128 @@ -57,7 +57,6 @@ from chia.simulator.simulator_protocol import FarmNewBlockProtocol from chia.types.blockchain_format.coin import Coin, coin_as_list from chia.types.blockchain_format.program import Program -from chia.types.coin_record import CoinRecord from chia.types.coin_spend import make_spend from chia.types.peer_info import PeerInfo from chia.types.signing_mode import SigningMode diff --git a/chia/_tests/wallet/test_new_wallet_protocol.py b/chia/_tests/wallet/test_new_wallet_protocol.py index 66df0c728e86..c0c1b5b0493d 100644 --- a/chia/_tests/wallet/test_new_wallet_protocol.py +++ b/chia/_tests/wallet/test_new_wallet_protocol.py @@ -8,7 +8,7 @@ from typing import Optional import pytest -from chia_rs import AugSchemeMPL, Coin, CoinSpend, CoinState, Program, SpendBundle +from chia_rs import AugSchemeMPL, Coin, CoinRecord, CoinSpend, CoinState, Program, SpendBundle from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint8, uint16, uint32, uint64 @@ -26,7 +26,6 @@ from chia.simulator.block_tools import BlockTools from chia.simulator.full_node_simulator import FullNodeSimulator from chia.simulator.start_simulator import SimulatorFullNodeService -from chia.types.coin_record import CoinRecord from chia.types.mempool_inclusion_status import MempoolInclusionStatus from chia.util.hash import std_hash from chia.wallet.wallet_service import WalletService diff --git a/chia/cmds/sim_funcs.py b/chia/cmds/sim_funcs.py index eda4efbb9f70..fd2a32541068 100644 --- a/chia/cmds/sim_funcs.py +++ b/chia/cmds/sim_funcs.py @@ -8,7 +8,7 @@ from typing import Any, Optional from aiohttp import ClientConnectorError -from chia_rs import PrivateKey +from chia_rs import CoinRecord, PrivateKey from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32 @@ -17,7 +17,6 @@ from chia.protocols.outbound_message import NodeType from chia.server.resolve_peer_info import set_peer_info from chia.simulator.simulator_full_node_rpc_client import SimulatorFullNodeRpcClient -from chia.types.coin_record import CoinRecord from chia.util.bech32m import decode_puzzle_hash, encode_puzzle_hash from chia.util.config import load_config, save_config from chia.util.errors import KeychainFingerprintExists diff --git a/chia/consensus/block_body_validation.py b/chia/consensus/block_body_validation.py index 84cd80c35c1f..377651a0ee84 100644 --- a/chia/consensus/block_body_validation.py +++ b/chia/consensus/block_body_validation.py @@ -8,6 +8,7 @@ from chia_rs import ( BlockRecord, + CoinRecord, ConsensusConstants, FullBlock, SpendBundleConditions, @@ -24,7 +25,6 @@ from chia.consensus.blockchain_interface import BlockRecordsProtocol from chia.consensus.coinbase import create_farmer_coin, create_pool_coin from chia.types.blockchain_format.coin import Coin, hash_coin_ids -from chia.types.coin_record import CoinRecord from chia.util.errors import Err from chia.util.hash import std_hash diff --git a/chia/consensus/blockchain.py b/chia/consensus/blockchain.py index 00d9df5d1a4c..d8efb71a8d69 100644 --- a/chia/consensus/blockchain.py +++ b/chia/consensus/blockchain.py @@ -11,6 +11,7 @@ from chia_rs import ( BlockRecord, + CoinRecord, ConsensusConstants, EndOfSubSlotBundle, FullBlock, @@ -38,7 +39,6 @@ from chia.full_node.block_store import BlockStore from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.vdf import VDFInfo -from chia.types.coin_record import CoinRecord from chia.types.generator_types import BlockGenerator from chia.types.unfinished_header_block import UnfinishedHeaderBlock from chia.types.validation_state import ValidationState diff --git a/chia/consensus/coin_store_protocol.py b/chia/consensus/coin_store_protocol.py index 6d8617446605..85c40da05103 100644 --- a/chia/consensus/coin_store_protocol.py +++ b/chia/consensus/coin_store_protocol.py @@ -3,12 +3,11 @@ from collections.abc import Collection from typing import Optional, Protocol -from chia_rs import CoinState +from chia_rs import CoinRecord, CoinState from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32, uint64 from chia.types.blockchain_format.coin import Coin -from chia.types.coin_record import CoinRecord from chia.types.mempool_item import UnspentLineageInfo diff --git a/chia/full_node/coin_store.py b/chia/full_node/coin_store.py index 84626080cb2e..a7a16216a4bc 100644 --- a/chia/full_node/coin_store.py +++ b/chia/full_node/coin_store.py @@ -9,12 +9,11 @@ import typing_extensions from aiosqlite import Cursor -from chia_rs import CoinState +from chia_rs import CoinRecord, CoinState from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32, uint64 from chia.types.blockchain_format.coin import Coin -from chia.types.coin_record import CoinRecord from chia.types.mempool_item import UnspentLineageInfo from chia.util.batches import to_batches from chia.util.db_wrapper import SQLITE_MAX_VARIABLE_NUMBER, DBWrapper2 diff --git a/chia/full_node/full_node.py b/chia/full_node/full_node.py index 28a8c9c397d2..3fba1750b1c7 100644 --- a/chia/full_node/full_node.py +++ b/chia/full_node/full_node.py @@ -19,6 +19,7 @@ AugSchemeMPL, BlockRecord, BLSCache, + CoinRecord, CoinState, ConsensusConstants, EndOfSubSlotBundle, @@ -76,7 +77,6 @@ from chia.server.ws_connection import WSChiaConnection from chia.types.blockchain_format.classgroup import ClassgroupElement from chia.types.blockchain_format.vdf import CompressibleVDFField, VDFInfo, VDFProof, validate_vdf -from chia.types.coin_record import CoinRecord from chia.types.mempool_inclusion_status import MempoolInclusionStatus from chia.types.mempool_item import MempoolItem from chia.types.peer_info import PeerInfo diff --git a/chia/full_node/full_node_api.py b/chia/full_node/full_node_api.py index 4d0a5dd1b2c8..d7b9446b5679 100644 --- a/chia/full_node/full_node_api.py +++ b/chia/full_node/full_node_api.py @@ -13,6 +13,7 @@ from chia_rs import ( AugSchemeMPL, BlockRecord, + CoinRecord, CoinState, EndOfSubSlotBundle, FoliageBlockData, @@ -66,7 +67,6 @@ from chia.types.block_protocol import BlockInfo from chia.types.blockchain_format.coin import Coin, hash_coin_ids from chia.types.blockchain_format.proof_of_space import verify_and_get_quality_string -from chia.types.coin_record import CoinRecord from chia.types.generator_types import BlockGenerator, NewBlockGenerator from chia.types.mempool_inclusion_status import MempoolInclusionStatus from chia.types.peer_info import PeerInfo diff --git a/chia/full_node/full_node_rpc_api.py b/chia/full_node/full_node_rpc_api.py index 3330583ee67a..f1fb558ddef5 100644 --- a/chia/full_node/full_node_rpc_api.py +++ b/chia/full_node/full_node_rpc_api.py @@ -9,6 +9,7 @@ from chia_rs import ( MEMPOOL_MODE, BlockRecord, + CoinRecord, CoinSpend, FullBlock, PlotSize, @@ -31,7 +32,6 @@ from chia.protocols.outbound_message import NodeType from chia.rpc.rpc_server import Endpoint, EndpointResult from chia.types.blockchain_format.proof_of_space import calculate_prefix_bits -from chia.types.coin_record import CoinRecord from chia.types.generator_types import BlockGenerator, NewBlockGenerator from chia.types.mempool_inclusion_status import MempoolInclusionStatus from chia.types.unfinished_header_block import UnfinishedHeaderBlock diff --git a/chia/full_node/full_node_rpc_client.py b/chia/full_node/full_node_rpc_client.py index ead3bdfa3c95..7d78b5464f8d 100644 --- a/chia/full_node/full_node_rpc_client.py +++ b/chia/full_node/full_node_rpc_client.py @@ -2,13 +2,12 @@ from typing import Any, Optional, cast -from chia_rs import BlockRecord, CoinSpend, EndOfSubSlotBundle, FullBlock, SpendBundle +from chia_rs import BlockRecord, CoinRecord, CoinSpend, EndOfSubSlotBundle, FullBlock, SpendBundle from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32 from chia.consensus.signage_point import SignagePoint from chia.rpc.rpc_client import ResponseFailureError, RpcClient -from chia.types.coin_record import CoinRecord from chia.types.coin_spend import CoinSpendWithConditions from chia.types.condition_opcodes import ConditionOpcode from chia.types.condition_with_args import ConditionWithArgs diff --git a/chia/full_node/mempool_manager.py b/chia/full_node/mempool_manager.py index eaaf9bda2e79..67c35d204d44 100644 --- a/chia/full_node/mempool_manager.py +++ b/chia/full_node/mempool_manager.py @@ -13,6 +13,7 @@ ELIGIBLE_FOR_FF, MEMPOOL_MODE, BLSCache, + CoinRecord, ConsensusConstants, SpendBundle, SpendBundleConditions, @@ -34,7 +35,6 @@ from chia.full_node.pending_tx_cache import ConflictTxCache, PendingTxCache from chia.types.blockchain_format.coin import Coin from chia.types.clvm_cost import CLVMCost -from chia.types.coin_record import CoinRecord from chia.types.fee_rate import FeeRate from chia.types.generator_types import NewBlockGenerator from chia.types.mempool_inclusion_status import MempoolInclusionStatus diff --git a/chia/simulator/full_node_simulator.py b/chia/simulator/full_node_simulator.py index 652cbd6ce4c2..6191c0126eda 100644 --- a/chia/simulator/full_node_simulator.py +++ b/chia/simulator/full_node_simulator.py @@ -7,7 +7,7 @@ from typing import Any, Optional, Union import anyio -from chia_rs import BlockRecord, FullBlock, SpendBundle +from chia_rs import BlockRecord, CoinRecord, FullBlock, SpendBundle from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint8, uint32, uint64, uint128 @@ -24,7 +24,6 @@ from chia.simulator.block_tools import BlockTools from chia.simulator.simulator_protocol import FarmNewBlockProtocol, GetAllCoinsProtocol, ReorgProtocol from chia.types.blockchain_format.coin import Coin -from chia.types.coin_record import CoinRecord from chia.types.validation_state import ValidationState from chia.util.config import lock_and_load_config, save_config from chia.util.timing import adjusted_timeout, backoff_times diff --git a/chia/simulator/simulator_full_node_rpc_api.py b/chia/simulator/simulator_full_node_rpc_api.py index 46f279ef3a20..df5e0d4a0fbb 100644 --- a/chia/simulator/simulator_full_node_rpc_api.py +++ b/chia/simulator/simulator_full_node_rpc_api.py @@ -1,6 +1,6 @@ from __future__ import annotations -from chia_rs import FullBlock +from chia_rs import CoinRecord, FullBlock from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32 @@ -8,7 +8,6 @@ from chia.rpc.rpc_server import Endpoint, EndpointResult from chia.simulator.full_node_simulator import FullNodeSimulator from chia.simulator.simulator_protocol import FarmNewBlockProtocol, GetAllCoinsProtocol, ReorgProtocol -from chia.types.coin_record import CoinRecord from chia.util.bech32m import decode_puzzle_hash diff --git a/chia/simulator/simulator_full_node_rpc_client.py b/chia/simulator/simulator_full_node_rpc_client.py index 4bf420fe295c..e1662211820c 100644 --- a/chia/simulator/simulator_full_node_rpc_client.py +++ b/chia/simulator/simulator_full_node_rpc_client.py @@ -1,11 +1,10 @@ from __future__ import annotations -from chia_rs import FullBlock +from chia_rs import CoinRecord, FullBlock from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint128 from chia.full_node.full_node_rpc_client import FullNodeRpcClient -from chia.types.coin_record import CoinRecord from chia.util.bech32m import encode_puzzle_hash diff --git a/chia/types/coin_record.py b/chia/types/coin_record.py deleted file mode 100644 index 1210c48e325d..000000000000 --- a/chia/types/coin_record.py +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import annotations - -from chia_rs import CoinRecord as RustCoinRecord - -CoinRecord = RustCoinRecord diff --git a/chia/wallet/wallet_coin_record.py b/chia/wallet/wallet_coin_record.py index 9252e0849fe2..944bae016278 100644 --- a/chia/wallet/wallet_coin_record.py +++ b/chia/wallet/wallet_coin_record.py @@ -3,11 +3,11 @@ from dataclasses import dataclass, field from typing import Any, Optional, Union +from chia_rs import CoinRecord from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint8, uint32, uint64 from chia.types.blockchain_format.coin import Coin -from chia.types.coin_record import CoinRecord from chia.util.streamable import VersionedBlob from chia.wallet.puzzles.clawback.metadata import ClawbackMetadata, ClawbackVersion from chia.wallet.util.wallet_types import CoinType, StreamableWalletIdentifier, WalletType diff --git a/chia/wallet/wallet_rpc_api.py b/chia/wallet/wallet_rpc_api.py index db33a641a332..6c64283b9d92 100644 --- a/chia/wallet/wallet_rpc_api.py +++ b/chia/wallet/wallet_rpc_api.py @@ -6,7 +6,7 @@ from pathlib import Path from typing import TYPE_CHECKING, Any, Callable, ClassVar, Optional, Union, cast -from chia_rs import AugSchemeMPL, Coin, CoinSpend, CoinState, G1Element, G2Element, PrivateKey +from chia_rs import AugSchemeMPL, Coin, CoinRecord, CoinSpend, CoinState, G1Element, G2Element, PrivateKey from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint8, uint16, uint32, uint64 from clvm_tools.binutils import assemble @@ -23,7 +23,6 @@ from chia.server.ws_connection import WSChiaConnection from chia.types.blockchain_format.coin import coin_as_list from chia.types.blockchain_format.program import INFINITE_COST, Program, run_with_cost -from chia.types.coin_record import CoinRecord from chia.types.signing_mode import CHIP_0002_SIGN_MESSAGE_PREFIX, SigningMode from chia.util.bech32m import decode_puzzle_hash, encode_puzzle_hash from chia.util.byte_types import hexstr_to_bytes diff --git a/chia/wallet/wallet_rpc_client.py b/chia/wallet/wallet_rpc_client.py index 16ecf7d584e0..b3ddcf956e5a 100644 --- a/chia/wallet/wallet_rpc_client.py +++ b/chia/wallet/wallet_rpc_client.py @@ -2,6 +2,7 @@ from typing import Any, Optional, Union, cast +from chia_rs import CoinRecord from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint32, uint64 @@ -9,7 +10,6 @@ from chia.rpc.rpc_client import RpcClient from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.program import Program -from chia.types.coin_record import CoinRecord from chia.wallet.conditions import Condition, ConditionValidTimes, conditions_to_json_dicts from chia.wallet.puzzles.clawback.metadata import AutoClaimSettings from chia.wallet.trade_record import TradeRecord diff --git a/chia/wallet/wallet_state_manager.py b/chia/wallet/wallet_state_manager.py index ba09ea83a206..358d40857eab 100644 --- a/chia/wallet/wallet_state_manager.py +++ b/chia/wallet/wallet_state_manager.py @@ -13,7 +13,7 @@ from typing import TYPE_CHECKING, Any, Callable, Optional, TypeVar, cast import aiosqlite -from chia_rs import AugSchemeMPL, CoinSpend, CoinState, ConsensusConstants, G1Element, G2Element, PrivateKey +from chia_rs import AugSchemeMPL, CoinRecord, CoinSpend, CoinState, ConsensusConstants, G1Element, G2Element, PrivateKey from chia_rs.sized_bytes import bytes32 from chia_rs.sized_ints import uint16, uint32, uint64, uint128 @@ -34,7 +34,6 @@ from chia.server.ws_connection import WSChiaConnection from chia.types.blockchain_format.coin import Coin from chia.types.blockchain_format.program import NIL, Program -from chia.types.coin_record import CoinRecord from chia.types.mempool_inclusion_status import MempoolInclusionStatus from chia.util.bech32m import encode_puzzle_hash from chia.util.db_synchronous import db_synchronous_on