Call Graph
---
title: LockstepCrossValidator Call Graph
---
graph LR
Backend.CheckAccessList --> ValidateAccessEntry
ValidateAccessEntry --> getMinIngestedTimestamp
ValidateAccessEntry --> CrossValidatedTimestamp
ValidateAccessEntry --> validateMessageTiming
ValidateAccessEntry --> ChainIngester.Contains
validateExecutingMessage --> validateMessageTiming
validateExecutingMessage --> ChainIngester.Contains
runValidationLoop --> advanceValidation
advanceValidation --> getMinIngestedTimestamp
advanceValidation --> validateTimestamp
advanceValidation --> ChainIngester.Error
advanceValidation --> ChainIngester.Ready
validateTimestamp --> ChainIngester.GetExecMsgsAtTimestamp
validateTimestamp --> validateExecutingMessage
getMinIngestedTimestamp --> ChainIngester.Ready
getMinIngestedTimestamp --> ChainIngester.LatestTimestamp
Backend.Start --> Start
Start --> runValidationLoop
Loading
Function Summaries
The following section is a simplified summary of function postconditions for LockstepCrossValidator.
We apply the following simplifying assumptions:
We assume each function to evaluate in an instant, in particular, we do not consider race conditions arising from asynchronous ChainIngester behavior.
Since we're not reasoning about concurrency, we treat crossValidatedTs as uint64.
validateMessageTiming
func validateMessageTiming (
initTimestamp uint64 ,
inclusionTimestamp uint64 ,
messageExpiryWindow uint64 ,
timeout uint64 ,
execTimestamp uint64 ,
) (err error )
Summary
If timeout == 0, then err == nil iff
initTimestamp < inclusionTimestamp <= initTimestamp + messageExpiryWindow
If timeout > 0, then err == nil iff
initTimestamp < inclusionTimestamp <= initTimestamp + messageExpiryWindow
execTimestamp < execTimestamp + timeout <= initTimestamp + messageExpiryWindow
getMinIngestedTimestamp
func (v * LockstepCrossValidator ) getMinIngestedTimestamp () (ts uint64 , ok bool )
Summary
ok iff
len(v.chains) > 0
forall (ingester : v.chains)
ingester.Ready()
ingester.LatestTimestamp().ok
If ok then ts == min (ingester : v.chains) ingester.LatestTimestamp().ts
If !ok then ts == 0
CrossValidatedTimestamp
func (v * LockstepCrossValidator ) CrossValidatedTimestamp () (ts uint64 , init bool )
Summary
ts == v.crossValidatedTs
init iff ts != 0
ValidateAccessEntry
func (v * LockstepCrossValidator ) ValidateAccessEntry (
access types.Access ,
minSafety types.SafetyLevel ,
execDescriptor types.ExecutingDescriptor ,
) (err error )
Summary
err == nil iff
v.getMinIngestedTimestamp().ok
v.getMinIngestedTimestamp().ts >= access.Timestamp
if minSafety == types.CrossUnsafe then v.CrossValidatedTimestamp().init
if minSafety == types.CrossUnsafe then v.CrossValidatedTimestamp().ts >= access.Timestamp
validateMessageTiming (
access .Timestamp , // initTimestamp
execDescriptor .Timestamp , // inclusionTimestamp
v .messageExpiryWindow , // messageExpiryWindow
execDescriptor .Timeout , // timeout
execDescriptor .Timestamp , // execTimestamp
).err == nil
v.chains[access.ChainID].ok
ingester .Contains (types.ContainsQuery {
Timestamp : access .Timestamp ,
BlockNum : access .BlockNumber ,
LogIdx : access .LogIndex ,
Checksum : access .Checksum ,
}).err == nil
where ingester == v.chains[access.ChainID].value
After substitutions:
err == nil iff
len(v.chains) > 0
forall (ingester : v.chains)
ingester.Ready()
ingester.LatestTimestamp().ok
min (ingester : v.chains) ingester.LatestTimestamp().ts >= access.Timestamp
if minSafety == types.CrossUnsafe then
v.crossValidatedTs != 0
v.crossValidatedTs >= access.Timestamp
access.Timestamp
< execDescriptor.Timestamp
<= execDescriptor.Timestamp + execDescriptor.Timeout
<= access.Timestamp + v.messageExpiryWindow
v.chains[access.ChainID].ok
i .Contains (types.ContainsQuery {
Timestamp : access .Timestamp ,
BlockNum : access .BlockNumber ,
LogIdx : access .LogIndex ,
Checksum : access .Checksum ,
}).err == nil
where i == v.chains[access.ChainID].value
validateExecutingMessage
func (v * LockstepCrossValidator ) validateExecutingMessage (
execMsg * types.ExecutingMessage ,
inclusionTimestamp uint64 ,
) (err error )
Summary
err == nil iff
v.chains[execMsg.ChainID].ok
validateMessageTiming (
execMsg .Timestamp , // initTimestamp
inclusionTimestamp , // inclusionTimestamp
v .messageExpiryWindow , // messageExpiryWindow
0 , // timeout
0 , // execTimestamp
).err == nil
ingester .Contains (types.ContainsQuery {
Timestamp : execMsg .Timestamp ,
BlockNum : execMsg .BlockNum ,
LogIdx : execMsg .LogIdx ,
Checksum : execMsg .Checksum ,
}).err == nil
where ingester == v.chains[execMsg.ChainID].value
After substitutions:
err == nil iff
v.chains[execMsg.ChainID].ok
execMsg.Timestamp < inclusionTimestamp <= execMsg.Timestamp + v.messageExpiryWindow
ingester .Contains (types.ContainsQuery {
Timestamp : execMsg .Timestamp ,
BlockNum : execMsg .BlockNum ,
LogIdx : execMsg .LogIdx ,
Checksum : execMsg .Checksum ,
}).err == nil
where ingester == v.chains[execMsg.ChainID].value
validateTimestamp
func (v * LockstepCrossValidator ) validateTimestamp (ts uint64 ) (err error )
Summary
err == nil iff
forall (ingester : v.chains)
ingester.GetExecMsgsAtTimestamp(ts).err == nil
forall (msg : ingester.GetExecMsgsAtTimestamp(ts).msgs) v.validateExecutingMessage(msg.ExecutingMessage, msg.InclusionTimestamp).err == nil
After substitutions:
err == nil iff
forall (ingester : v.chains)
ingester.GetExecMsgsAtTimestamp(ts).err == nil
forall (msg : ingester.GetExecMsgsAtTimestamp(ts).msgs)
v.chains[msg.ExecutingMessage.ChainID].ok
msg.ExecutingMessage.Timestamp < msg.InclusionTimestamp <= msg.ExecutingMessage.Timestamp + v.messageExpiryWindow
i .Contains (types.ContainsQuery {
Timestamp : msg .ExecutingMessage .Timestamp ,
BlockNum : msg .ExecutingMessage .BlockNum ,
LogIdx : msg .ExecutingMessage .LogIdx ,
Checksum : msg .ExecutingMessage .Checksum ,
}).err == nil
where i == v.chains[msg.ExecutingMessage.ChainID].value
advanceValidation
func (v * LockstepCrossValidator ) advanceValidation ()
Summary
If either
then
Otherwise, if v.crossValidatedTs == 0 and v.startTimestamp != 0, then
next(v) == { ...v, crossValidatedTs: v.startTimestamp }
Otherwise, if
forall (ts : [v.crossValidatedTs + 1 .. v.getMinIngestedTimestamp().ts]) v.validateTimestamp(ts) == nil
then
next(v) == { ...v, crossValidatedTs: v.getMinIngestedTimestamp().ts }
Otherwise, let minimal
ts : [v.crossValidatedTs + 1 .. v.getMinIngestedTimestamp().ts]
such that v.validateTimestamp(ts) != nil. Then
next(v) == { ...v, crossValidatedTs: ts - 1, err: e }
for some e != nil
After substitutions:
Call Graph
--- title: LockstepCrossValidator Call Graph --- graph LR Backend.CheckAccessList --> ValidateAccessEntry ValidateAccessEntry --> getMinIngestedTimestamp ValidateAccessEntry --> CrossValidatedTimestamp ValidateAccessEntry --> validateMessageTiming ValidateAccessEntry --> ChainIngester.Contains validateExecutingMessage --> validateMessageTiming validateExecutingMessage --> ChainIngester.Contains runValidationLoop --> advanceValidation advanceValidation --> getMinIngestedTimestamp advanceValidation --> validateTimestamp advanceValidation --> ChainIngester.Error advanceValidation --> ChainIngester.Ready validateTimestamp --> ChainIngester.GetExecMsgsAtTimestamp validateTimestamp --> validateExecutingMessage getMinIngestedTimestamp --> ChainIngester.Ready getMinIngestedTimestamp --> ChainIngester.LatestTimestamp Backend.Start --> Start Start --> runValidationLoopFunction Summaries
The following section is a simplified summary of function postconditions for
LockstepCrossValidator.We apply the following simplifying assumptions:
ChainIngesterbehavior.crossValidatedTsasuint64.validateMessageTimingSummary
timeout == 0, thenerr == niliffinitTimestamp < inclusionTimestamp <= initTimestamp + messageExpiryWindowtimeout > 0, thenerr == niliffinitTimestamp < inclusionTimestamp <= initTimestamp + messageExpiryWindowexecTimestamp < execTimestamp + timeout <= initTimestamp + messageExpiryWindowgetMinIngestedTimestampSummary
okifflen(v.chains) > 0forall (ingester : v.chains)ingester.Ready()ingester.LatestTimestamp().okokthents == min (ingester : v.chains) ingester.LatestTimestamp().ts!okthents == 0CrossValidatedTimestampSummary
ts == v.crossValidatedTsinitiffts != 0ValidateAccessEntrySummary
err == niliffv.getMinIngestedTimestamp().okv.getMinIngestedTimestamp().ts >= access.TimestampminSafety == types.CrossUnsafethenv.CrossValidatedTimestamp().initminSafety == types.CrossUnsafethenv.CrossValidatedTimestamp().ts >= access.Timestampv.chains[access.ChainID].okingester == v.chains[access.ChainID].valueAfter substitutions:
err == nilifflen(v.chains) > 0forall (ingester : v.chains)ingester.Ready()ingester.LatestTimestamp().okmin (ingester : v.chains) ingester.LatestTimestamp().ts >= access.TimestampminSafety == types.CrossUnsafethenv.crossValidatedTs != 0v.crossValidatedTs >= access.Timestampv.chains[access.ChainID].oki == v.chains[access.ChainID].valuevalidateExecutingMessageSummary
err == niliffv.chains[execMsg.ChainID].okingester == v.chains[execMsg.ChainID].valueAfter substitutions:
err == niliffv.chains[execMsg.ChainID].okexecMsg.Timestamp < inclusionTimestamp <= execMsg.Timestamp + v.messageExpiryWindowingester == v.chains[execMsg.ChainID].valuevalidateTimestampSummary
err == niliffAfter substitutions:
err == niliffi == v.chains[msg.ExecutingMessage.ChainID].valueadvanceValidationSummary
If either
v.Error() != nilexists (ingester : v.chains)where eitheringester.Error() != nil!ingester.Ready()!v.getMinIngestedTimestamp().okv.crossValidatedTs == 0andv.startTimestamp == 0(seeLockstepCrossValidatornever advances ifstartTimestampis0#28)v.crossValidatedTs >= v.getMinIngestedTimestamp().tsthen
Otherwise, if
v.crossValidatedTs == 0andv.startTimestamp != 0, thenOtherwise, if
then
Otherwise, let minimal
such that
v.validateTimestamp(ts) != nil. Thenfor some
e != nilAfter substitutions:
If either
v.Error() != nillen(v.chains) == 0exists (ingester : v.chains)where eitheringester.Error() != nil!ingester.Ready()!ingester.LatestTimestamp().okv.crossValidatedTs == 0andv.startTimestamp == 0v.crossValidatedTs >= min (ingester : v.chains) ingester.LatestTimestamp().tsthen
Otherwise, if
v.crossValidatedTs == 0andv.startTimestamp != 0, thenOtherwise, if
i == v.chains[msg.ExecutingMessage.ChainID].valuethen
Otherwise, let minimal
such that
where either
i == v.chains[msg.ExecutingMessage.ChainID].valueThen
for some
e != nil.