Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

New RPC block_spends - Get spends for block using transaction generator #10446

Merged
merged 24 commits into from
Jun 24, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
c69f96f
get spends for block using transaction generator
freddiecoleman Feb 26, 2022
b7f961e
type annotations and use existing function
freddiecoleman Feb 26, 2022
914aa58
return None on exception
freddiecoleman Feb 26, 2022
402c9a1
parse to CoinSpend
freddiecoleman Feb 26, 2022
5dd28b8
specify return type of get_block_spends in rpc client
freddiecoleman Feb 26, 2022
9b1fd78
see what can be asserted
freddiecoleman Feb 26, 2022
d7b181f
test fix
freddiecoleman Feb 27, 2022
faad4d4
flags not necessary as we don't validate
freddiecoleman Mar 13, 2022
ae579aa
simplifying as cost is not required as we are not validating
freddiecoleman Mar 13, 2022
5e857ff
improve test to cover transaction generator ref_list
freddiecoleman Mar 13, 2022
58baa04
Merge branch 'main' of github.com:freddiecoleman/chia-blockchain into…
freddiecoleman Mar 13, 2022
74ca788
simplify test
freddiecoleman Mar 13, 2022
d7f2079
Merge branch 'main' of github.com:freddiecoleman/chia-blockchain into…
freddiecoleman Mar 18, 2022
4a2909a
remove unused import
freddiecoleman Mar 18, 2022
57666c5
Merge branch 'main' of github.com:freddiecoleman/chia-blockchain into…
freddiecoleman Apr 4, 2022
b7b4f7e
Merge branch 'main' of github.com:freddiecoleman/chia-blockchain into…
freddiecoleman May 14, 2022
6595a95
slight change and cleanup
jack60612 Jun 16, 2022
5dfbe7f
Merge branch 'main' into jn.get_block_spends_changes
jack60612 Jun 16, 2022
a3a2483
lint cleanup
jack60612 Jun 16, 2022
24f6328
clean up
jack60612 Jun 17, 2022
89bb9e4
wait until transaction is in mempool
jack60612 Jun 24, 2022
4951131
Merge branch 'main' into jn.get_block_spends_changes
jack60612 Jun 24, 2022
27d8061
fix lint
jack60612 Jun 24, 2022
d53f02c
Merge pull request #1 from Chia-Network/jn.get_block_spends_changes
freddiecoleman Jun 24, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions chia/rpc/full_node_rpc_api.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
from typing import Any, Dict, List, Optional

from clvm.casts import int_from_bytes

from chia.consensus.block_record import BlockRecord
from chia.consensus.pos_quality import UI_ACTUAL_SPACE_CONSTANT_FACTOR
from chia.full_node.full_node import FullNode
from chia.full_node.generator import create_generator_args
from chia.full_node.mempool_check_conditions import get_puzzle_and_solution_for_coin
from chia.types.blockchain_format.coin import Coin
from chia.rpc.rpc_server import Endpoint
from chia.types.blockchain_format.program import Program, SerializedProgram
from chia.types.blockchain_format.sized_bytes import bytes32
Expand Down Expand Up @@ -41,6 +45,7 @@ def get_routes(self) -> Dict[str, Endpoint]:
"/get_block_record_by_height": self.get_block_record_by_height,
"/get_block_record": self.get_block_record,
"/get_block_records": self.get_block_records,
"/get_block_spends": self.get_block_spends,
"/get_unfinished_block_headers": self.get_unfinished_block_headers,
"/get_network_space": self.get_network_space,
"/get_additions_and_removals": self.get_additions_and_removals,
Expand Down Expand Up @@ -399,6 +404,32 @@ async def get_block_records(self, request: Dict) -> Dict[str, object]:
records.append(record)
return {"block_records": records}

async def get_block_spends(self, request: Dict) -> Optional[Dict]:
if "header_hash" not in request:
raise ValueError("No header_hash in request")
header_hash = bytes32.from_hexstr(request["header_hash"])
full_block: Optional[FullBlock] = await self.service.block_store.get_full_block(header_hash)
if full_block is None or full_block.transactions_generator is None:
raise ValueError(f"Block {header_hash.hex()} not found or invalid block generator")

spends: List[CoinSpend] = []
block_generator = await self.service.blockchain.get_block_generator(full_block)
if block_generator is None:
return {"block_spends": spends}

args = create_generator_args(block_generator.generator_refs).first()
_, block_result = block_generator.program.run_with_cost(self.service.constants.MAX_BLOCK_COST_CLVM, 0, args)

coin_spends = block_result.first()

for spend in coin_spends.as_iter():
parent, puzzle, amount, solution = spend.as_iter()
puzzle_hash = puzzle.get_tree_hash()
coin = Coin(parent.atom, puzzle_hash, int_from_bytes(amount.atom))
spends.append(CoinSpend(coin, puzzle, solution))

return {"block_spends": spends}

async def get_block_record_by_height(self, request: Dict) -> Dict[str, object]:
if "height" not in request:
raise ValueError("No height in request")
Expand Down
10 changes: 10 additions & 0 deletions chia/rpc/full_node_rpc_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,16 @@ async def get_block_records(self, start: int, end: int) -> List:
# TODO: return block records
return response["block_records"]

async def get_block_spends(self, header_hash: bytes32) -> Optional[List[CoinSpend]]:
try:
response = await self.fetch("get_block_spends", {"header_hash": header_hash.hex()})
block_spends = []
for block_spend in response["block_spends"]:
block_spends.append(CoinSpend.from_json_dict(block_spend))
return block_spends
except Exception:
freddiecoleman marked this conversation as resolved.
Show resolved Hide resolved
return None

async def push_tx(self, spend_bundle: SpendBundle):
return await self.fetch("push_tx", {"spend_bundle": spend_bundle.to_json_dict()})

Expand Down
25 changes: 25 additions & 0 deletions tests/core/test_full_node_rpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,31 @@ def stop_node_cb():
assert len(await client.get_coin_records_by_puzzle_hash(ph, True, 0, blocks[-1].height + 1)) == 2
assert len(await client.get_coin_records_by_puzzle_hash(ph, True, 0, 1)) == 0

coin_records = await client.get_coin_records_by_puzzle_hash(ph, False)

coin_spends = []

# Spend 3 coins using standard transaction
for i in range(3):
spend_bundle = wallet.generate_signed_transaction(
coin_records[i].coin.amount, ph_receiver, coin_records[i].coin
)
await client.push_tx(spend_bundle)
coin_spends = coin_spends + spend_bundle.coin_spends
await time_out_assert(
5, full_node_api_1.full_node.mempool_manager.get_spendbundle, spend_bundle, spend_bundle.name()
)

await full_node_api_1.farm_new_transaction_block(FarmNewBlockProtocol(ph_2))
block: FullBlock = (await full_node_api_1.get_all_full_blocks())[-1]

assert len(block.transactions_generator_ref_list) > 0 # compression has occurred

block_spends = await client.get_block_spends(block.header_hash)

assert len(block_spends) == 3
assert block_spends == coin_spends

memo = 32 * b"\f"

for i in range(2):
Expand Down