mirror of
https://github.com/Chia-Network/chia-blockchain.git
synced 2026-08-24 10:05:29 -05:00
* Add (hopefully) non-controversial ruff rules * mypy-exclusions.txt * PIE * Fix pre-commit? * PYI * RSE * S + ignores * Whitespace fix * Re-add build-init-files.py * Add comment about security ignores * Update mypy-exclusions.txt Co-authored-by: Kyle Altendorf <sda@fstab.net> * Fix the executable status of build-init-files.py * Set executable bit for tools/run_block.py and readd shebang * Fix new errors --------- Co-authored-by: Kyle Altendorf <sda@fstab.net>
83 lines
3.2 KiB
Python
Executable File
83 lines
3.2 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
"""
|
|
run_block: Convert an encoded FullBlock from the Chia blockchain into a list of transactions
|
|
|
|
As input, takes a file containing a [FullBlock](../chia/types/full_block.py) in json format
|
|
|
|
```
|
|
curl --insecure --cert $config_root/config/ssl/full_node/private_full_node.crt \
|
|
--key $config_root/config/ssl/full_node/private_full_node.key \
|
|
-d '{ "header_hash": "'$hash'" }' -H "Content-Type: application/json" \
|
|
-X POST https://localhost:$port/get_block
|
|
|
|
$ca_root is the directory containing your current Chia config files
|
|
$hash is the header_hash of the [BlockRecord](../chia/consensus/block_record.py)
|
|
$port is the Full Node RPC API port
|
|
```
|
|
|
|
The `transactions_generator` and `transactions_generator_ref_list` fields of a `FullBlock`
|
|
contain the information necessary to produce transaction record details.
|
|
|
|
`transactions_generator` is CLVM bytecode
|
|
`transactions_generator_ref_list` is a list of block heights as `uint32`
|
|
|
|
When this CLVM code is run in the correct environment, it produces information that can
|
|
then be verified by the consensus rules, or used to view some aspects of transaction history.
|
|
|
|
The information for each spend is an "NPC" (Name, Puzzle, Condition):
|
|
"coin_name": a unique 32 byte identifier
|
|
"conditions": a list of condition expressions, as in [condition_opcodes.py](../chia/types/condition_opcodes.py)
|
|
"puzzle_hash": the sha256 of the CLVM bytecode that controls spending this coin
|
|
|
|
Condition Opcodes, such as AGG_SIG_ME, or CREATE_COIN are created by running the "puzzle", i.e. the CLVM bytecode
|
|
associated with the coin being spent. Condition Opcodes are verified by every client on the network for every spend,
|
|
and in this way they control whether a spend is valid or not.
|
|
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
import click
|
|
from chia_rs import ConsensusConstants
|
|
|
|
from chia._tests.util.run_block import run_json_block
|
|
from chia.consensus.constants import replace_str_to_bytes
|
|
from chia.consensus.default_constants import DEFAULT_CONSTANTS
|
|
from chia.util.config import load_config
|
|
from chia.util.default_root import DEFAULT_ROOT_PATH
|
|
|
|
|
|
@click.command()
|
|
@click.argument("filename", type=click.Path(exists=True), default="testnet10.396963.json")
|
|
def cmd_run_json_block_file(filename: str) -> None:
|
|
"""`file` is a file containing a FullBlock in JSON format"""
|
|
return run_json_block_file(Path(filename))
|
|
|
|
|
|
def run_json_block_file(filename: Path) -> None:
|
|
full_block = json.load(filename.open("rb"))
|
|
# pull in current constants from config.yaml
|
|
_, constants = get_config_and_constants()
|
|
|
|
cat_list = run_json_block(full_block, filename.parent.absolute(), constants)
|
|
|
|
cat_list_json = json.dumps([cat.cat_to_dict() for cat in cat_list])
|
|
print(cat_list_json)
|
|
|
|
|
|
def get_config_and_constants() -> tuple[dict[str, Any], ConsensusConstants]:
|
|
config = load_config(DEFAULT_ROOT_PATH, "config.yaml")
|
|
network = config["selected_network"]
|
|
overrides = config["network_overrides"]["constants"][network]
|
|
updated_constants = replace_str_to_bytes(DEFAULT_CONSTANTS, **overrides)
|
|
return config, updated_constants
|
|
|
|
|
|
if __name__ == "__main__":
|
|
cmd_run_json_block_file()
|