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 110434de5484..a9d52407d538 100644 --- a/chia/_tests/clvm/coin_store.py +++ b/chia/_tests/clvm/coin_store.py @@ -2,19 +2,17 @@ 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 +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 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.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 @@ -114,8 +112,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/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 57eb05648d4d..543fc6698353 100644 --- a/chia/_tests/core/mempool/test_mempool_manager.py +++ b/chia/_tests/core/mempool/test_mempool_manager.py @@ -11,12 +11,14 @@ ELIGIBLE_FOR_DEDUP, ELIGIBLE_FOR_FF, AugSchemeMPL, + CoinRecord, CoinSpend, ConsensusConstants, G2Element, SpendBundle, SpendBundleConditions, SpendConditions, + check_time_locks, get_conditions_from_spendbundle, run_block_generator2, ) @@ -27,7 +29,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.consensus.check_time_locks 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 ( @@ -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 @@ -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: Optional[Union[int, Err]] = 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( @@ -2339,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/_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 c113184cf9c6..377651a0ee84 100644 --- a/chia/consensus/block_body_validation.py +++ b/chia/consensus/block_body_validation.py @@ -8,10 +8,12 @@ from chia_rs import ( BlockRecord, + CoinRecord, ConsensusConstants, FullBlock, SpendBundleConditions, UnfinishedBlock, + check_time_locks, compute_merkle_set_root, is_canonical_serialization, ) @@ -21,10 +23,8 @@ 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.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 @@ -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: 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/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/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 653d62f5ac77..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 @@ -181,7 +180,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]) - return CoinRecord(coin, row[0], spent_index, row[2], 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]: @@ -207,7 +206,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]) - record = CoinRecord(coin, row[0], spent_index, row[2], row[6]) + record = CoinRecord(coin, row[0], spent_index, row[2] != 0, row[6]) coins.append(record) return coins @@ -224,7 +223,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]) - coins.append(CoinRecord(coin, row[0], spent_index, row[2], 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]: @@ -241,7 +240,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) - coin_record = CoinRecord(coin, row[0], row[1], row[2], row[6]) + coin_record = CoinRecord(coin, row[0], row[1], row[2] != 0, row[6]) coins.append(coin_record) return coins @@ -266,7 +265,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]) - coins.add(CoinRecord(coin, row[0], spent_index, row[2], 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( @@ -295,7 +294,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]) - coins.add(CoinRecord(coin, row[0], spent_index, row[2], 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( @@ -322,7 +321,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]) - coins.add(CoinRecord(coin, row[0], spent_index, row[2], row[6])) + coins.add(CoinRecord(coin, row[0], spent_index, row[2] != 0, row[6])) return list(coins) @@ -393,7 +392,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]) - coins.add(CoinRecord(coin, row[0], spent_index, row[2], row[6])) + coins.add(CoinRecord(coin, row[0], spent_index, row[2] != 0, row[6])) return list(coins) @@ -567,7 +566,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]) - record = CoinRecord(coin, uint32(0), spent_index, row[2], uint64(0)) + record = CoinRecord(coin, uint32(0), spent_index, row[2] != 0, uint64(0)) coin_name = bytes32(row[7]) coin_changes[coin_name] = record @@ -582,7 +581,7 @@ 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]) + 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 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 82ba6b760045..67c35d204d44 100644 --- a/chia/full_node/mempool_manager.py +++ b/chia/full_node/mempool_manager.py @@ -6,16 +6,18 @@ 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, ELIGIBLE_FOR_FF, MEMPOOL_MODE, BLSCache, + CoinRecord, ConsensusConstants, SpendBundle, SpendBundleConditions, + check_time_locks, get_flags_for_height_and_constants, supports_fast_forward, validate_clvm_and_signature, @@ -25,7 +27,6 @@ from chiabip158 import PyBIP158 from chia.consensus.block_record import BlockRecordProtocol -from chia.consensus.check_time_locks 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 @@ -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 @@ -734,12 +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 - tl_error: Optional[Err] = check_time_locks( + tl_error: Optional[Union[int, Err]] = check_time_locks( removal_record_dict, conds, self.peak.height, self.peak.timestamp, ) + if tl_error is not None: + tl_error = Err(tl_error) timelocks: TimelockConditions = compute_assert_height(removal_record_dict, conds) 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 7ecb91bd7fa0..000000000000 --- a/chia/types/coin_record.py +++ /dev/null @@ -1,44 +0,0 @@ -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 - - -@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) 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