I understand the entire path of a parachain
block upto and including its candidateReciept being "included" on the relaychain, and its erasure coded PoVs being available with the relaychain validators - incase the parent block's collator fails to share the block.
What I do not understand is how does the subsequent collator know which is the block (or rather the hash) that it should build on?
Does the collator attempt to read the relaychain state to find the latest parchain block hash in the parachain relevant storage (the ones that are updated upon candidateReceipt inclusion) either explicitly or implicitly? Does it read the relaychain blocks for it? Does it somehow depend on the relaychain validators for this info?
Also, at what point is this info apparent to the collator?
Further, and very importantly, once a collator has recognized which parachain parent block to build on and then imported it, we can consider the parachain parent block to be "finalized", right? Save for relaychain re-orgs that is.
I would greatly appreciate if this were to be pointed out in code as well.
Thank you very much!!