In the "Same Slot L1 → L2 ('fast') Signaling" section of Signal Service doc, it mentioned that L2 proposer will inject L1 state root via anchor transaction (in step 3) and the inbox contract will verify the signals' proof against the injected L1 state root (in step 4):

My questions are:
- Doesn't this introduce a trust assumption on the L2 proposer? since he can inject any L1 state root he claimed to be "the upcoming L1 state root" and can thus fake any signal he desires. And how can the L2 proposer even come up with "the upcoming L1 state root" as "the upcoming L1 block" is not even created yet?
- There's
isSignalStored
function in the SignalService
contract, shouldn't the inbox contract just call this function to check a signal instead?