> How is block hash calculated?

You create a block hashing blob (which is the block header, the tree root hash of the blocks transactions and a varint of the transaction count), then hash this using the RandomX hashing algorithm.

> The hash blob returned for get_block(1)["blob"] is...

That is *not* a block hashing blob, that's the *block* blob as returned from the RPC [get_block](https://web.getmonero.org/resources/developer-guides/daemon-rpc.html#get_block).

> How do I calculate the hashes for an existing block?

For an existing block, obtain the block blob (per above), parse it to extract the header and transactions, construct your hashing blob (per above) and hash that.

>...then to combine it with nonce

An *existing* block already has the nonce data, which can be in both the block header / in the miner transaction. Thus you don't need to do anything particular with the nonce data for an existing block - rather what you need is the block blob data and a way to parse it (extract the header and transactions) so you can construct a hashing blob.