chia-blockchain/tests/full_node/test_mempool.py

696 lines
28 KiB
Python
Raw Normal View History

2020-01-30 04:28:53 +03:00
import asyncio
2020-02-01 03:28:16 +03:00
from time import time
from typing import Dict, List
2020-02-01 03:28:16 +03:00
2020-01-30 04:28:53 +03:00
import pytest
2020-01-31 23:44:04 +03:00
from src.protocols import full_node_protocol
from src.types.coin import Coin
from src.types.coin_solution import CoinSolution
from src.types.condition_var_pair import ConditionVarPair
2020-02-03 08:59:00 +03:00
from src.types.condition_opcodes import ConditionOpcode
from src.types.spend_bundle import SpendBundle
from src.util.condition_tools import (
conditions_for_solution,
)
from src.util.clvm import int_to_bytes
2020-01-31 23:44:04 +03:00
from src.util.ints import uint64
2020-12-09 12:28:13 +03:00
from tests.full_node.test_full_node import connect_and_get_peer, node_height_at_least
2020-06-27 12:19:42 +03:00
from tests.setup_nodes import setup_two_nodes, test_constants, bt
2020-12-09 12:28:13 +03:00
from tests.time_out_assert import time_out_assert
2020-01-30 04:28:53 +03:00
2020-10-02 03:09:34 +03:00
BURN_PUZZLE_HASH = b"0" * 32
2020-10-02 04:12:35 +03:00
BURN_PUZZLE_HASH_2 = b"1" * 32
2020-10-02 03:09:34 +03:00
WALLET_A = bt.get_pool_wallet_tool()
def generate_test_spend_bundle(
coin: Coin,
condition_dic: Dict[ConditionOpcode, List[ConditionVarPair]] = None,
fee: int = 0,
amount: int = 1000,
newpuzzlehash=BURN_PUZZLE_HASH,
) -> SpendBundle:
if condition_dic is None:
condition_dic = {}
2020-12-01 12:16:14 +03:00
transaction = WALLET_A.generate_signed_transaction(amount, newpuzzlehash, coin, condition_dic, fee)
assert transaction is not None
2020-11-03 20:02:30 +03:00
return transaction
2020-01-30 04:28:53 +03:00
@pytest.fixture(scope="module")
def event_loop():
loop = asyncio.get_event_loop()
yield loop
class TestMempool:
@pytest.fixture(scope="function")
async def two_nodes(self):
constants = test_constants.replace(COINBASE_FREEZE_PERIOD=0)
async for _ in setup_two_nodes(constants):
2020-02-02 10:52:33 +03:00
yield _
@pytest.fixture(scope="function")
async def two_nodes_small_freeze(self):
constants = test_constants.replace(COINBASE_FREEZE_PERIOD=30)
async for _ in setup_two_nodes(constants):
2020-01-30 04:28:53 +03:00
yield _
@pytest.mark.asyncio
async def test_basic_mempool(self, two_nodes):
2020-12-09 12:28:13 +03:00
reward_ph = WALLET_A.get_new_puzzlehash()
blocks = bt.get_consecutive_blocks(
3, guarantee_block=True, farmer_reward_puzzle_hash=reward_ph, pool_reward_puzzle_hash=reward_ph
)
full_node_1, full_node_2, server_1, server_2 = two_nodes
peer = await connect_and_get_peer(server_1, server_2)
2020-01-30 04:28:53 +03:00
2020-12-09 12:28:13 +03:00
for block in blocks:
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(block))
2020-01-30 04:28:53 +03:00
2020-12-09 12:28:13 +03:00
await time_out_assert(60, node_height_at_least, True, full_node_1, 2)
2020-02-02 10:52:33 +03:00
2020-12-09 12:28:13 +03:00
spend_bundle = generate_test_spend_bundle(list(blocks[-1].get_included_reward_coins())[0])
2020-03-30 12:03:03 +03:00
assert spend_bundle is not None
2020-12-01 12:16:14 +03:00
tx: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle)
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx, peer)
2020-02-02 10:52:33 +03:00
2020-12-09 12:28:13 +03:00
await time_out_assert(
10, full_node_1.full_node.mempool_manager.get_spendbundle, spend_bundle, spend_bundle.name()
)
2020-02-02 10:52:33 +03:00
@pytest.mark.asyncio
async def test_coinbase_freeze(self, two_nodes_small_freeze):
2020-12-09 12:28:13 +03:00
reward_ph = WALLET_A.get_new_puzzlehash()
blocks = bt.get_consecutive_blocks(
3, guarantee_block=True, farmer_reward_puzzle_hash=reward_ph, pool_reward_puzzle_hash=reward_ph
)
full_node_1, full_node_2, server_1, server_2 = two_nodes_small_freeze
peer = await connect_and_get_peer(server_1, server_2)
2020-02-02 10:52:33 +03:00
2020-12-09 12:28:13 +03:00
for block in blocks:
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(block))
await time_out_assert(60, node_height_at_least, True, full_node_1, 2)
2020-02-02 10:52:33 +03:00
2020-12-09 12:28:13 +03:00
spend_bundle = generate_test_spend_bundle(list(blocks[-1].get_included_reward_coins())[0])
assert spend_bundle is not None
2020-12-01 12:16:14 +03:00
tx: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle)
2020-02-02 10:52:33 +03:00
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx, peer)
2020-02-02 10:52:33 +03:00
2020-12-09 12:28:13 +03:00
sb = full_node_1.full_node.mempool_manager.get_spendbundle(spend_bundle.name())
2020-02-02 10:52:33 +03:00
assert sb is None
2020-12-09 12:28:13 +03:00
blocks = bt.get_consecutive_blocks(
30,
block_list_input=blocks,
guarantee_block=True,
farmer_reward_puzzle_hash=reward_ph,
pool_reward_puzzle_hash=reward_ph,
)
for block in blocks:
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(block))
await time_out_assert(60, node_height_at_least, True, full_node_1, 32)
2020-10-22 22:56:14 +03:00
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx, peer)
2020-10-22 22:56:14 +03:00
2020-12-09 12:28:13 +03:00
sb = full_node_1.full_node.mempool_manager.get_spendbundle(spend_bundle.name())
2020-02-02 10:52:33 +03:00
assert sb is spend_bundle
2020-01-30 04:28:53 +03:00
@pytest.mark.asyncio
async def test_double_spend(self, two_nodes):
2020-12-09 12:28:13 +03:00
reward_ph = WALLET_A.get_new_puzzlehash()
blocks = bt.get_consecutive_blocks(
3, guarantee_block=True, farmer_reward_puzzle_hash=reward_ph, pool_reward_puzzle_hash=reward_ph
)
full_node_1, full_node_2, server_1, server_2 = two_nodes
peer = await connect_and_get_peer(server_1, server_2)
2020-01-30 04:28:53 +03:00
2020-12-09 12:28:13 +03:00
for block in blocks:
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(block))
await time_out_assert(60, node_height_at_least, True, full_node_1, 2)
2020-01-30 04:28:53 +03:00
2020-12-09 12:28:13 +03:00
spend_bundle1 = generate_test_spend_bundle(list(blocks[-1].get_included_reward_coins())[0])
assert spend_bundle1 is not None
2020-12-01 12:16:14 +03:00
tx1: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle1)
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx1, peer)
2020-01-30 04:28:53 +03:00
spend_bundle2 = generate_test_spend_bundle(
2020-12-09 12:28:13 +03:00
list(blocks[-1].get_included_reward_coins())[0], newpuzzlehash=BURN_PUZZLE_HASH_2
)
assert spend_bundle2 is not None
2020-12-01 12:16:14 +03:00
tx2: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle2)
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx2, peer)
2020-01-30 04:28:53 +03:00
2020-12-09 12:28:13 +03:00
sb1 = full_node_1.full_node.mempool_manager.get_spendbundle(spend_bundle1.name())
sb2 = full_node_1.full_node.mempool_manager.get_spendbundle(spend_bundle2.name())
2020-01-30 04:28:53 +03:00
assert sb1 == spend_bundle1
assert sb2 is None
2020-01-31 03:56:24 +03:00
@pytest.mark.asyncio
async def test_double_spend_with_higher_fee(self, two_nodes):
2020-12-09 12:28:13 +03:00
reward_ph = WALLET_A.get_new_puzzlehash()
blocks = bt.get_consecutive_blocks(
3, guarantee_block=True, farmer_reward_puzzle_hash=reward_ph, pool_reward_puzzle_hash=reward_ph
)
full_node_1, full_node_2, server_1, server_2 = two_nodes
peer = await connect_and_get_peer(server_1, server_2)
2020-01-31 03:56:24 +03:00
2020-12-09 12:28:13 +03:00
for block in blocks:
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(block))
await time_out_assert(60, node_height_at_least, True, full_node_1, 2)
2020-01-31 03:56:24 +03:00
2020-12-09 12:28:13 +03:00
spend_bundle1 = generate_test_spend_bundle(list(blocks[-1].get_included_reward_coins())[0])
assert spend_bundle1 is not None
2020-12-01 12:16:14 +03:00
tx1: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle1)
2020-10-22 22:56:14 +03:00
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx1, peer)
2020-01-31 03:56:24 +03:00
2020-12-09 12:28:13 +03:00
spend_bundle2 = generate_test_spend_bundle(list(blocks[-1].get_included_reward_coins())[0], fee=1)
2020-01-31 03:56:24 +03:00
assert spend_bundle2 is not None
2020-12-01 12:16:14 +03:00
tx2: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle2)
2020-01-31 03:56:24 +03:00
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx2, peer)
2020-10-22 22:56:14 +03:00
2020-12-09 12:28:13 +03:00
sb1 = full_node_1.full_node.mempool_manager.get_spendbundle(spend_bundle1.name())
sb2 = full_node_1.full_node.mempool_manager.get_spendbundle(spend_bundle2.name())
2020-01-31 03:56:24 +03:00
assert sb1 is None
assert sb2 == spend_bundle2
2020-01-31 23:44:04 +03:00
@pytest.mark.asyncio
async def test_invalid_block_index(self, two_nodes):
2020-12-09 12:28:13 +03:00
reward_ph = WALLET_A.get_new_puzzlehash()
blocks = bt.get_consecutive_blocks(
3, guarantee_block=True, farmer_reward_puzzle_hash=reward_ph, pool_reward_puzzle_hash=reward_ph
)
full_node_1, full_node_2, server_1, server_2 = two_nodes
peer = await connect_and_get_peer(server_1, server_2)
2020-01-31 23:44:04 +03:00
2020-12-09 12:28:13 +03:00
for block in blocks:
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(block))
await time_out_assert(60, node_height_at_least, True, full_node_1, 2)
2020-01-31 23:44:04 +03:00
cvp = ConditionVarPair(
ConditionOpcode.ASSERT_BLOCK_INDEX_EXCEEDS,
2020-12-09 12:28:13 +03:00
uint64(4).to_bytes(4, "big"),
None,
)
2020-01-31 23:44:04 +03:00
dic = {ConditionOpcode.ASSERT_BLOCK_INDEX_EXCEEDS: [cvp]}
2020-12-09 12:28:13 +03:00
spend_bundle1 = generate_test_spend_bundle(list(blocks[-1].get_included_reward_coins())[0], dic)
2020-01-31 23:44:04 +03:00
assert spend_bundle1 is not None
2020-12-01 12:16:14 +03:00
tx1: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle1)
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx1, peer)
2020-01-31 23:44:04 +03:00
2020-12-09 12:28:13 +03:00
sb1 = full_node_1.full_node.mempool_manager.get_spendbundle(spend_bundle1.name())
2020-01-31 23:44:04 +03:00
assert sb1 is None
@pytest.mark.asyncio
async def test_correct_block_index(self, two_nodes):
2020-12-09 12:28:13 +03:00
reward_ph = WALLET_A.get_new_puzzlehash()
blocks = bt.get_consecutive_blocks(
3, guarantee_block=True, farmer_reward_puzzle_hash=reward_ph, pool_reward_puzzle_hash=reward_ph
)
2020-01-31 23:44:04 +03:00
full_node_1, full_node_2, server_1, server_2 = two_nodes
2020-12-09 12:28:13 +03:00
peer = await connect_and_get_peer(server_1, server_2)
2020-01-31 23:44:04 +03:00
2020-12-09 12:28:13 +03:00
for block in blocks:
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(block))
await time_out_assert(60, node_height_at_least, True, full_node_1, 2)
2020-01-31 23:44:04 +03:00
cvp = ConditionVarPair(
ConditionOpcode.ASSERT_BLOCK_INDEX_EXCEEDS,
uint64(1).to_bytes(4, "big"),
None,
)
2020-01-31 23:44:04 +03:00
dic = {ConditionOpcode.ASSERT_BLOCK_INDEX_EXCEEDS: [cvp]}
2020-12-09 12:28:13 +03:00
spend_bundle1 = generate_test_spend_bundle(list(blocks[-1].get_included_reward_coins())[0], dic)
2020-01-31 23:44:04 +03:00
assert spend_bundle1 is not None
2020-12-01 12:16:14 +03:00
tx1: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle1)
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx1, peer)
2020-01-31 23:44:04 +03:00
2020-12-01 12:16:14 +03:00
sb1 = full_node_1.full_node.mempool_manager.get_spendbundle(spend_bundle1.name())
2020-01-31 23:44:04 +03:00
assert sb1 is spend_bundle1
2020-02-01 01:19:35 +03:00
@pytest.mark.asyncio
async def test_invalid_block_age(self, two_nodes):
2020-12-09 12:28:13 +03:00
reward_ph = WALLET_A.get_new_puzzlehash()
blocks = bt.get_consecutive_blocks(
3, guarantee_block=True, farmer_reward_puzzle_hash=reward_ph, pool_reward_puzzle_hash=reward_ph
)
2020-02-01 01:19:35 +03:00
full_node_1, full_node_2, server_1, server_2 = two_nodes
2020-12-09 12:28:13 +03:00
peer = await connect_and_get_peer(server_1, server_2)
2020-02-01 01:19:35 +03:00
2020-12-09 12:28:13 +03:00
for block in blocks:
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(block))
await time_out_assert(60, node_height_at_least, True, full_node_1, 2)
2020-02-01 01:19:35 +03:00
2020-12-01 12:16:14 +03:00
cvp = ConditionVarPair(ConditionOpcode.ASSERT_BLOCK_AGE_EXCEEDS, uint64(5).to_bytes(4, "big"), None)
2020-02-01 01:19:35 +03:00
dic = {cvp.opcode: [cvp]}
2020-12-09 12:28:13 +03:00
spend_bundle1 = generate_test_spend_bundle(list(blocks[-1].get_included_reward_coins())[0], dic)
2020-02-01 01:19:35 +03:00
assert spend_bundle1 is not None
2020-12-01 12:16:14 +03:00
tx1: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle1)
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx1, peer)
2020-02-01 01:19:35 +03:00
2020-12-01 12:16:14 +03:00
sb1 = full_node_1.full_node.mempool_manager.get_spendbundle(spend_bundle1.name())
2020-02-01 01:19:35 +03:00
assert sb1 is None
@pytest.mark.asyncio
async def test_correct_block_age(self, two_nodes):
2020-12-09 12:28:13 +03:00
reward_ph = WALLET_A.get_new_puzzlehash()
blocks = bt.get_consecutive_blocks(
4, guarantee_block=True, farmer_reward_puzzle_hash=reward_ph, pool_reward_puzzle_hash=reward_ph
)
2020-02-01 01:19:35 +03:00
full_node_1, full_node_2, server_1, server_2 = two_nodes
2020-12-09 12:28:13 +03:00
peer = await connect_and_get_peer(server_1, server_2)
2020-02-01 01:19:35 +03:00
2020-12-09 12:28:13 +03:00
for block in blocks:
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(block))
2020-02-01 01:19:35 +03:00
2020-12-09 12:28:13 +03:00
await time_out_assert(60, node_height_at_least, True, full_node_1, 3)
2020-02-01 01:19:35 +03:00
2020-12-09 12:28:13 +03:00
cvp = ConditionVarPair(ConditionOpcode.ASSERT_BLOCK_AGE_EXCEEDS, uint64(1).to_bytes(4, "big"), None)
2020-02-01 01:19:35 +03:00
dic = {cvp.opcode: [cvp]}
2020-12-09 12:28:13 +03:00
spend_bundle1 = generate_test_spend_bundle(list(blocks[-2].get_included_reward_coins())[0], dic)
2020-02-01 01:19:35 +03:00
assert spend_bundle1 is not None
2020-12-01 12:16:14 +03:00
tx1: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle1)
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx1, peer)
2020-02-01 01:19:35 +03:00
2020-12-01 12:16:14 +03:00
sb1 = full_node_1.full_node.mempool_manager.get_spendbundle(spend_bundle1.name())
2020-02-01 01:19:35 +03:00
assert sb1 is spend_bundle1
2020-02-01 01:58:07 +03:00
@pytest.mark.asyncio
async def test_correct_my_id(self, two_nodes):
2020-12-09 12:28:13 +03:00
reward_ph = WALLET_A.get_new_puzzlehash()
blocks = bt.get_consecutive_blocks(
3, guarantee_block=True, farmer_reward_puzzle_hash=reward_ph, pool_reward_puzzle_hash=reward_ph
)
2020-02-01 01:58:07 +03:00
full_node_1, full_node_2, server_1, server_2 = two_nodes
2020-12-09 12:28:13 +03:00
peer = await connect_and_get_peer(server_1, server_2)
2020-02-01 01:58:07 +03:00
2020-12-09 12:28:13 +03:00
for block in blocks:
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(block))
2020-02-01 01:58:07 +03:00
2020-12-09 12:28:13 +03:00
await time_out_assert(60, node_height_at_least, True, full_node_1, 2)
2020-02-01 01:58:07 +03:00
2020-12-09 12:28:13 +03:00
coin = list(blocks[-1].get_included_reward_coins())[0]
cvp = ConditionVarPair(ConditionOpcode.ASSERT_MY_COIN_ID, coin.name(), None)
2020-02-01 01:58:07 +03:00
dic = {cvp.opcode: [cvp]}
2020-12-09 12:28:13 +03:00
spend_bundle1 = generate_test_spend_bundle(coin, dic)
2020-02-01 01:58:07 +03:00
assert spend_bundle1 is not None
2020-12-01 12:16:14 +03:00
tx1: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle1)
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx1, peer)
2020-02-01 01:58:07 +03:00
2020-12-01 12:16:14 +03:00
sb1 = full_node_1.full_node.mempool_manager.get_spendbundle(spend_bundle1.name())
2020-02-01 01:58:07 +03:00
assert sb1 is spend_bundle1
@pytest.mark.asyncio
async def test_invalid_my_id(self, two_nodes):
2020-12-09 12:28:13 +03:00
reward_ph = WALLET_A.get_new_puzzlehash()
blocks = bt.get_consecutive_blocks(
3, guarantee_block=True, farmer_reward_puzzle_hash=reward_ph, pool_reward_puzzle_hash=reward_ph
)
2020-02-01 01:58:07 +03:00
full_node_1, full_node_2, server_1, server_2 = two_nodes
2020-12-09 12:28:13 +03:00
peer = await connect_and_get_peer(server_1, server_2)
2020-02-01 01:58:07 +03:00
2020-12-09 12:28:13 +03:00
for block in blocks:
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(block))
2020-02-01 01:58:07 +03:00
2020-12-09 12:28:13 +03:00
await time_out_assert(60, node_height_at_least, True, full_node_1, 2)
2020-02-01 01:58:07 +03:00
2020-12-09 12:28:13 +03:00
coin = list(blocks[-1].get_included_reward_coins())[0]
coin_2 = list(blocks[-2].get_included_reward_coins())[0]
cvp = ConditionVarPair(
2020-09-16 21:11:01 +03:00
ConditionOpcode.ASSERT_MY_COIN_ID,
2020-12-09 12:28:13 +03:00
coin_2.name(),
2020-09-16 21:11:01 +03:00
None,
)
2020-02-01 01:58:07 +03:00
dic = {cvp.opcode: [cvp]}
2020-12-09 12:28:13 +03:00
spend_bundle1 = generate_test_spend_bundle(coin, dic)
2020-02-01 01:58:07 +03:00
2020-03-30 12:03:03 +03:00
assert spend_bundle1 is not None
2020-12-01 12:16:14 +03:00
tx1: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle1)
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx1, peer)
2020-02-01 01:58:07 +03:00
2020-12-01 12:16:14 +03:00
sb1 = full_node_1.full_node.mempool_manager.get_spendbundle(spend_bundle1.name())
2020-02-01 01:58:07 +03:00
assert sb1 is None
2020-02-01 03:28:16 +03:00
@pytest.mark.asyncio
async def test_assert_time_exceeds(self, two_nodes):
2020-12-09 12:28:13 +03:00
reward_ph = WALLET_A.get_new_puzzlehash()
blocks = bt.get_consecutive_blocks(
3, guarantee_block=True, farmer_reward_puzzle_hash=reward_ph, pool_reward_puzzle_hash=reward_ph
)
2020-02-01 03:28:16 +03:00
full_node_1, full_node_2, server_1, server_2 = two_nodes
2020-12-09 12:28:13 +03:00
peer = await connect_and_get_peer(server_1, server_2)
2020-02-01 03:28:16 +03:00
2020-12-09 12:28:13 +03:00
for block in blocks:
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(block))
2020-02-01 03:28:16 +03:00
2020-12-09 12:28:13 +03:00
await time_out_assert(60, node_height_at_least, True, full_node_1, 2)
2020-02-01 03:28:16 +03:00
time_now = uint64(int(time() * 1000))
2020-02-01 03:28:16 +03:00
2020-12-01 12:16:14 +03:00
cvp = ConditionVarPair(ConditionOpcode.ASSERT_TIME_EXCEEDS, time_now.to_bytes(8, "big"), None)
2020-02-01 03:28:16 +03:00
dic = {cvp.opcode: [cvp]}
2020-12-09 12:28:13 +03:00
spend_bundle1 = generate_test_spend_bundle(list(blocks[-1].get_included_reward_coins())[0], dic)
2020-02-01 03:28:16 +03:00
2020-03-30 12:03:03 +03:00
assert spend_bundle1 is not None
2020-12-01 12:16:14 +03:00
tx1: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle1)
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx1, peer)
2020-02-01 03:28:16 +03:00
2020-12-01 12:16:14 +03:00
sb1 = full_node_1.full_node.mempool_manager.get_spendbundle(spend_bundle1.name())
2020-02-01 03:28:16 +03:00
assert sb1 is spend_bundle1
@pytest.mark.asyncio
async def test_assert_time_exceeds_both_cases(self, two_nodes):
2020-12-09 12:28:13 +03:00
reward_ph = WALLET_A.get_new_puzzlehash()
blocks = bt.get_consecutive_blocks(
3, guarantee_block=True, farmer_reward_puzzle_hash=reward_ph, pool_reward_puzzle_hash=reward_ph
)
2020-02-01 03:28:16 +03:00
full_node_1, full_node_2, server_1, server_2 = two_nodes
2020-12-09 12:28:13 +03:00
peer = await connect_and_get_peer(server_1, server_2)
2020-02-01 03:28:16 +03:00
2020-12-09 12:28:13 +03:00
for block in blocks:
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(block))
2020-02-01 03:28:16 +03:00
2020-12-09 12:28:13 +03:00
await time_out_assert(60, node_height_at_least, True, full_node_1, 2)
2020-02-01 03:28:16 +03:00
time_now = uint64(int(time() * 1000))
2020-02-01 03:29:15 +03:00
time_now_plus_3 = time_now + 3000
2020-02-01 03:28:16 +03:00
cvp = ConditionVarPair(
ConditionOpcode.ASSERT_TIME_EXCEEDS,
time_now_plus_3.to_bytes(8, "big"),
None,
)
2020-02-01 03:28:16 +03:00
dic = {cvp.opcode: [cvp]}
2020-12-09 12:28:13 +03:00
spend_bundle1 = generate_test_spend_bundle(list(blocks[-1].get_included_reward_coins())[0], dic)
2020-02-01 03:28:16 +03:00
assert spend_bundle1 is not None
2020-12-01 12:16:14 +03:00
tx1: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle1)
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx1, peer)
2020-02-01 03:28:16 +03:00
# Sleep so that 3 sec passes
await asyncio.sleep(3)
2020-12-01 12:16:14 +03:00
tx2: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle1)
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx2, peer)
2020-02-01 03:28:16 +03:00
2020-12-01 12:16:14 +03:00
sb1 = full_node_1.full_node.mempool_manager.get_spendbundle(spend_bundle1.name())
2020-02-01 03:28:16 +03:00
assert sb1 is spend_bundle1
2020-02-28 00:44:24 +03:00
@pytest.mark.asyncio
async def test_correct_coin_consumed(self, two_nodes):
2020-12-09 12:28:13 +03:00
reward_ph = WALLET_A.get_new_puzzlehash()
blocks = bt.get_consecutive_blocks(
4, guarantee_block=True, farmer_reward_puzzle_hash=reward_ph, pool_reward_puzzle_hash=reward_ph
)
2020-02-28 00:44:24 +03:00
full_node_1, full_node_2, server_1, server_2 = two_nodes
2020-12-09 12:28:13 +03:00
peer = await connect_and_get_peer(server_1, server_2)
2020-02-28 00:44:24 +03:00
2020-12-09 12:28:13 +03:00
for block in blocks:
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(block))
2020-02-28 00:44:24 +03:00
2020-12-09 12:28:13 +03:00
await time_out_assert(60, node_height_at_least, True, full_node_1, 3)
2020-02-28 00:44:24 +03:00
2020-12-09 12:28:13 +03:00
coin_1 = list(blocks[-2].get_included_reward_coins())[0]
coin_2 = list(blocks[-1].get_included_reward_coins())[0]
2020-02-28 00:44:24 +03:00
cvp = ConditionVarPair(
2020-09-16 21:11:01 +03:00
ConditionOpcode.ASSERT_COIN_CONSUMED,
2020-12-09 12:28:13 +03:00
coin_2.name(),
2020-09-16 21:11:01 +03:00
None,
2020-02-28 00:44:24 +03:00
)
dic = {cvp.opcode: [cvp]}
2020-12-09 12:28:13 +03:00
spend_bundle1 = generate_test_spend_bundle(coin_1, dic)
2020-02-28 00:44:24 +03:00
2020-12-09 12:28:13 +03:00
spend_bundle2 = generate_test_spend_bundle(coin_2)
2020-02-28 00:44:24 +03:00
bundle = SpendBundle.aggregate([spend_bundle1, spend_bundle2])
2020-12-01 12:16:14 +03:00
tx1: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(bundle)
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx1, peer)
2020-02-28 00:44:24 +03:00
2020-12-01 12:16:14 +03:00
mempool_bundle = full_node_1.full_node.mempool_manager.get_spendbundle(bundle.name())
2020-02-28 00:44:24 +03:00
assert mempool_bundle is bundle
@pytest.mark.asyncio
async def test_invalid_coin_consumed(self, two_nodes):
2020-12-09 12:28:13 +03:00
reward_ph = WALLET_A.get_new_puzzlehash()
blocks = bt.get_consecutive_blocks(
4, guarantee_block=True, farmer_reward_puzzle_hash=reward_ph, pool_reward_puzzle_hash=reward_ph
)
2020-02-28 00:44:24 +03:00
full_node_1, full_node_2, server_1, server_2 = two_nodes
2020-12-09 12:28:13 +03:00
peer = await connect_and_get_peer(server_1, server_2)
for block in blocks:
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(block))
2020-02-28 00:44:24 +03:00
2020-12-09 12:28:13 +03:00
await time_out_assert(60, node_height_at_least, True, full_node_1, 3)
2020-02-28 00:44:24 +03:00
for b in blocks:
2020-12-09 12:28:13 +03:00
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(b))
2020-02-28 00:44:24 +03:00
2020-12-09 12:28:13 +03:00
coin_1 = list(blocks[-2].get_included_reward_coins())[0]
coin_2 = list(blocks[-1].get_included_reward_coins())[0]
2020-02-28 00:44:24 +03:00
cvp = ConditionVarPair(
2020-09-16 21:11:01 +03:00
ConditionOpcode.ASSERT_COIN_CONSUMED,
2020-12-09 12:28:13 +03:00
coin_2.name(),
2020-09-16 21:11:01 +03:00
None,
2020-02-28 00:44:24 +03:00
)
dic = {cvp.opcode: [cvp]}
2020-12-09 12:28:13 +03:00
spend_bundle1 = generate_test_spend_bundle(coin_1, dic)
2020-02-28 00:44:24 +03:00
2020-03-30 12:03:03 +03:00
assert spend_bundle1 is not None
2020-12-01 12:16:14 +03:00
tx1: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle1)
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx1, peer)
2020-02-28 00:44:24 +03:00
2020-12-01 12:16:14 +03:00
mempool_bundle = full_node_1.full_node.mempool_manager.get_spendbundle(spend_bundle1.name())
2020-02-28 00:44:24 +03:00
assert mempool_bundle is None
2020-04-20 08:08:16 +03:00
@pytest.mark.asyncio
async def test_assert_fee_condition(self, two_nodes):
2020-12-09 12:28:13 +03:00
reward_ph = WALLET_A.get_new_puzzlehash()
blocks = bt.get_consecutive_blocks(
3, guarantee_block=True, farmer_reward_puzzle_hash=reward_ph, pool_reward_puzzle_hash=reward_ph
)
2020-04-20 08:08:16 +03:00
full_node_1, full_node_2, server_1, server_2 = two_nodes
2020-12-09 12:28:13 +03:00
peer = await connect_and_get_peer(server_1, server_2)
2020-04-20 08:08:16 +03:00
2020-12-09 12:28:13 +03:00
for block in blocks:
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(block))
2020-04-20 08:08:16 +03:00
2020-12-09 12:28:13 +03:00
await time_out_assert(60, node_height_at_least, True, full_node_1, 2)
2020-04-20 08:08:16 +03:00
2020-09-16 21:11:01 +03:00
cvp = ConditionVarPair(
ConditionOpcode.ASSERT_FEE,
int_to_bytes(10),
None,
)
2020-04-20 08:08:16 +03:00
dic = {cvp.opcode: [cvp]}
2020-12-09 12:28:13 +03:00
spend_bundle1 = generate_test_spend_bundle(list(blocks[-1].get_included_reward_coins())[0], dic, 10)
2020-04-20 08:08:16 +03:00
assert spend_bundle1 is not None
2020-12-01 12:16:14 +03:00
tx1: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle1)
2020-04-20 08:08:16 +03:00
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx1, peer)
2020-04-20 08:08:16 +03:00
2020-12-01 12:16:14 +03:00
mempool_bundle = full_node_1.full_node.mempool_manager.get_spendbundle(spend_bundle1.name())
2020-04-20 08:08:16 +03:00
assert mempool_bundle is not None
@pytest.mark.asyncio
async def test_assert_fee_condition_wrong_fee(self, two_nodes):
2020-12-09 12:28:13 +03:00
reward_ph = WALLET_A.get_new_puzzlehash()
blocks = bt.get_consecutive_blocks(
3, guarantee_block=True, farmer_reward_puzzle_hash=reward_ph, pool_reward_puzzle_hash=reward_ph
)
2020-04-20 08:08:16 +03:00
full_node_1, full_node_2, server_1, server_2 = two_nodes
2020-12-09 12:28:13 +03:00
peer = await connect_and_get_peer(server_1, server_2)
2020-04-20 08:08:16 +03:00
2020-12-09 12:28:13 +03:00
for block in blocks:
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(block))
2020-04-20 08:08:16 +03:00
2020-12-09 12:28:13 +03:00
await time_out_assert(60, node_height_at_least, True, full_node_1, 2)
2020-04-20 08:08:16 +03:00
2020-09-16 21:11:01 +03:00
cvp = ConditionVarPair(
ConditionOpcode.ASSERT_FEE,
int_to_bytes(10),
None,
)
2020-04-20 08:08:16 +03:00
dic = {cvp.opcode: [cvp]}
2020-12-09 12:28:13 +03:00
spend_bundle1 = generate_test_spend_bundle(list(blocks[-1].get_included_reward_coins())[0], dic, 9)
2020-04-20 08:08:16 +03:00
assert spend_bundle1 is not None
2020-12-01 12:16:14 +03:00
tx1: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle1)
2020-04-20 08:08:16 +03:00
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx1, peer)
2020-04-20 08:08:16 +03:00
2020-12-01 12:16:14 +03:00
mempool_bundle = full_node_1.full_node.mempool_manager.get_spendbundle(spend_bundle1.name())
2020-04-20 08:08:16 +03:00
assert mempool_bundle is None
@pytest.mark.asyncio
async def test_stealing_fee(self, two_nodes):
2020-12-09 12:28:13 +03:00
reward_ph = WALLET_A.get_new_puzzlehash()
blocks = bt.get_consecutive_blocks(
5, guarantee_block=True, farmer_reward_puzzle_hash=reward_ph, pool_reward_puzzle_hash=reward_ph
)
2020-04-20 08:08:16 +03:00
full_node_1, full_node_2, server_1, server_2 = two_nodes
2020-12-09 12:28:13 +03:00
peer = await connect_and_get_peer(server_1, server_2)
2020-04-20 08:08:16 +03:00
2020-12-09 12:28:13 +03:00
for block in blocks:
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(block))
2020-04-20 08:08:16 +03:00
2020-12-09 12:28:13 +03:00
await time_out_assert(60, node_height_at_least, True, full_node_1, 4)
receiver_puzzlehash = BURN_PUZZLE_HASH
2020-04-20 08:08:16 +03:00
2020-09-16 21:11:01 +03:00
cvp = ConditionVarPair(
ConditionOpcode.ASSERT_FEE,
int_to_bytes(10),
None,
)
2020-04-20 08:08:16 +03:00
dic = {cvp.opcode: [cvp]}
fee = 9
2020-12-09 12:28:13 +03:00
coin_1 = list(blocks[-2].get_included_reward_coins())[0]
coin_2 = None
for coin in list(blocks[-1].get_included_reward_coins()):
if coin.amount == coin_1.amount:
coin_2 = coin
spend_bundle1 = generate_test_spend_bundle(coin_1, dic, fee)
steal_fee_spendbundle = WALLET_A.generate_signed_transaction(
coin_1.amount + fee - 4, receiver_puzzlehash, coin_2
2020-04-20 08:10:19 +03:00
)
2020-04-20 08:08:16 +03:00
assert spend_bundle1 is not None
assert steal_fee_spendbundle is not None
combined = SpendBundle.aggregate([spend_bundle1, steal_fee_spendbundle])
assert combined.fees() == 4
2020-04-20 08:08:16 +03:00
2020-12-01 12:16:14 +03:00
tx1: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle1)
2020-04-20 08:08:16 +03:00
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx1, peer)
2020-04-20 08:08:16 +03:00
2020-12-01 12:16:14 +03:00
mempool_bundle = full_node_1.full_node.mempool_manager.get_spendbundle(spend_bundle1.name())
2020-04-20 08:08:16 +03:00
assert mempool_bundle is None
2020-04-29 23:41:42 +03:00
@pytest.mark.asyncio
2020-04-29 23:45:05 +03:00
async def test_double_spend_same_bundle(self, two_nodes):
2020-12-09 12:28:13 +03:00
reward_ph = WALLET_A.get_new_puzzlehash()
blocks = bt.get_consecutive_blocks(
3, guarantee_block=True, farmer_reward_puzzle_hash=reward_ph, pool_reward_puzzle_hash=reward_ph
)
2020-04-29 23:41:42 +03:00
full_node_1, full_node_2, server_1, server_2 = two_nodes
2020-12-09 12:28:13 +03:00
peer = await connect_and_get_peer(server_1, server_2)
2020-04-29 23:41:42 +03:00
2020-12-09 12:28:13 +03:00
for block in blocks:
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(block))
2020-04-29 23:41:42 +03:00
2020-12-09 12:28:13 +03:00
await time_out_assert(60, node_height_at_least, True, full_node_1, 2)
coin = list(blocks[-1].get_included_reward_coins())[0]
spend_bundle1 = generate_test_spend_bundle(coin)
2020-04-29 23:41:42 +03:00
assert spend_bundle1 is not None
spend_bundle2 = generate_test_spend_bundle(
2020-12-09 12:28:13 +03:00
coin,
newpuzzlehash=BURN_PUZZLE_HASH_2,
2020-04-29 23:41:42 +03:00
)
assert spend_bundle2 is not None
spend_bundle_combined = SpendBundle.aggregate([spend_bundle1, spend_bundle2])
2020-12-01 12:16:14 +03:00
tx: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle_combined)
2020-04-29 23:41:42 +03:00
2020-12-09 12:28:13 +03:00
await full_node_1.respond_transaction(tx, peer)
2020-10-22 22:56:14 +03:00
2020-12-01 12:16:14 +03:00
sb = full_node_1.full_node.mempool_manager.get_spendbundle(spend_bundle_combined.name())
2020-04-29 23:41:42 +03:00
assert sb is None
@pytest.mark.asyncio
async def test_agg_sig_condition(self, two_nodes):
2020-12-09 12:28:13 +03:00
reward_ph = WALLET_A.get_new_puzzlehash()
blocks = bt.get_consecutive_blocks(
3, guarantee_block=True, farmer_reward_puzzle_hash=reward_ph, pool_reward_puzzle_hash=reward_ph
)
full_node_1, full_node_2, server_1, server_2 = two_nodes
2020-12-09 12:28:13 +03:00
for block in blocks:
await full_node_1.full_node.respond_sub_block(full_node_protocol.RespondSubBlock(block))
2020-12-09 12:28:13 +03:00
await time_out_assert(60, node_height_at_least, True, full_node_1, 2)
# this code has been changed to use generate_test_spend_bundle
# not quite sure why all the gymnastics are being performed
2020-12-09 12:28:13 +03:00
coin = list(blocks[-1].get_included_reward_coins())[0]
spend_bundle_0 = generate_test_spend_bundle(coin)
unsigned: List[CoinSolution] = spend_bundle_0.coin_solutions
assert len(unsigned) == 1
2020-09-17 02:41:06 +03:00
coin_solution = unsigned[0]
2020-09-17 02:41:06 +03:00
err, con, cost = conditions_for_solution(coin_solution.solution)
assert con is not None
2020-12-11 09:59:09 +03:00
# TODO(straya): fix this test
# puzzle, solution = list(coin_solution.solution.as_iter())
# conditions_dict = conditions_by_opcode(con)
# pkm_pairs = pkm_pairs_for_conditions_dict(conditions_dict, coin_solution.coin.name())
# assert len(pkm_pairs) == 1
#
# assert pkm_pairs[0][1] == solution.rest().first().get_tree_hash() + coin_solution.coin.name()
#
# spend_bundle = WALLET_A.sign_transaction(unsigned)
# assert spend_bundle is not None
#
# tx: full_node_protocol.RespondTransaction = full_node_protocol.RespondTransaction(spend_bundle)
# await full_node_1.respond_transaction(tx, peer)
#
# sb = full_node_1.full_node.mempool_manager.get_spendbundle(spend_bundle.name())
# assert sb is spend_bundle