Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
N
nebula
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
exchain
nebula
Commits
1c840c68
Unverified
Commit
1c840c68
authored
Feb 13, 2023
by
mergify[bot]
Committed by
GitHub
Feb 13, 2023
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop' into bugfix/check-messenger-addr-migration
parents
be7524ee
2c0ad576
Changes
10
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
325 additions
and
126 deletions
+325
-126
nervous-years-explain.md
.changeset/nervous-years-explain.md
+5
-0
account_proof.go
op-node/eth/account_proof.go
+6
-3
account_proof_test.go
op-node/eth/account_proof_test.go
+72
-28
.depcheckrc
packages/data-transport-layer/.depcheckrc
+1
-0
package.json
packages/data-transport-layer/package.json
+1
-1
service.ts
packages/data-transport-layer/src/services/main/service.ts
+1
-1
helpers.ts
packages/fault-detector/src/helpers.ts
+35
-23
service.ts
packages/fault-detector/src/service.ts
+186
-64
helpers.spec.ts
packages/fault-detector/test/helpers.spec.ts
+17
-5
yarn.lock
yarn.lock
+1
-1
No files found.
.changeset/nervous-years-explain.md
0 → 100644
View file @
1c840c68
---
'
@eth-optimism/fault-detector'
:
minor
---
Updates the fault detector to support Bedrock networks.
op-node/eth/account_proof.go
View file @
1c840c68
...
@@ -3,7 +3,6 @@ package eth
...
@@ -3,7 +3,6 @@ package eth
import
(
import
(
"bytes"
"bytes"
"fmt"
"fmt"
"math/big"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/common/hexutil"
...
@@ -52,12 +51,16 @@ func (res *AccountResult) Verify(stateRoot common.Hash) error {
...
@@ -52,12 +51,16 @@ func (res *AccountResult) Verify(stateRoot common.Hash) error {
if
err
!=
nil
{
if
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to verify storage value %d with key %s (path %x) in storage trie %s: %w"
,
i
,
entry
.
Key
,
path
,
res
.
StorageHash
,
err
)
return
fmt
.
Errorf
(
"failed to verify storage value %d with key %s (path %x) in storage trie %s: %w"
,
i
,
entry
.
Key
,
path
,
res
.
StorageHash
,
err
)
}
}
if
!
bytes
.
Equal
(
val
,
val
)
{
comparison
,
err
:=
rlp
.
EncodeToBytes
(
entry
.
Value
.
ToInt
()
.
Bytes
())
if
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to encode storage value %d with key %s (path %x) in storage trie %s: %w"
,
i
,
entry
.
Key
,
path
,
res
.
StorageHash
,
err
)
}
if
!
bytes
.
Equal
(
val
,
comparison
)
{
return
fmt
.
Errorf
(
"value %d in storage proof does not match proven value at key %s (path %x)"
,
i
,
entry
.
Key
,
path
)
return
fmt
.
Errorf
(
"value %d in storage proof does not match proven value at key %s (path %x)"
,
i
,
entry
.
Key
,
path
)
}
}
}
}
accountClaimed
:=
[]
any
{
uint64
(
res
.
Nonce
),
(
*
big
.
Int
)(
res
.
Balance
)
.
Bytes
(),
res
.
StorageHash
,
res
.
CodeHash
}
accountClaimed
:=
[]
any
{
uint64
(
res
.
Nonce
),
res
.
Balance
.
ToInt
(
)
.
Bytes
(),
res
.
StorageHash
,
res
.
CodeHash
}
accountClaimedValue
,
err
:=
rlp
.
EncodeToBytes
(
accountClaimed
)
accountClaimedValue
,
err
:=
rlp
.
EncodeToBytes
(
accountClaimed
)
if
err
!=
nil
{
if
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to encode account from retrieved values: %w"
,
err
)
return
fmt
.
Errorf
(
"failed to encode account from retrieved values: %w"
,
err
)
...
...
op-node/eth/account_proof_test.go
View file @
1c840c68
This diff is collapsed.
Click to expand it.
packages/data-transport-layer/.depcheckrc
View file @
1c840c68
ignores: [
ignores: [
"@babel/eslint-parser",
"@babel/eslint-parser",
"@types/level",
"@typescript-eslint/parser",
"@typescript-eslint/parser",
"eslint-plugin-import",
"eslint-plugin-import",
"eslint-plugin-unicorn",
"eslint-plugin-unicorn",
...
...
packages/data-transport-layer/package.json
View file @
1c840c68
...
@@ -52,7 +52,7 @@
...
@@ -52,7 +52,7 @@
"ethers"
:
"^5.7.0"
,
"ethers"
:
"^5.7.0"
,
"express"
:
"^4.17.1"
,
"express"
:
"^4.17.1"
,
"express-prom-bundle"
:
"^6.3.6"
,
"express-prom-bundle"
:
"^6.3.6"
,
"level
"
:
"
^6.0.1"
,
"level
6"
:
"npm:level@
^6.0.1"
,
"levelup"
:
"^4.4.0"
"levelup"
:
"^4.4.0"
},
},
"devDependencies"
:
{
"devDependencies"
:
{
...
...
packages/data-transport-layer/src/services/main/service.ts
View file @
1c840c68
/* Imports: External */
/* Imports: External */
import
{
BaseService
,
LegacyMetrics
}
from
'
@eth-optimism/common-ts
'
import
{
BaseService
,
LegacyMetrics
}
from
'
@eth-optimism/common-ts
'
import
{
LevelUp
}
from
'
levelup
'
import
{
LevelUp
}
from
'
levelup
'
import
level
from
'
level
'
import
level
from
'
level
6
'
import
{
Counter
}
from
'
prom-client
'
import
{
Counter
}
from
'
prom-client
'
/* Imports: Internal */
/* Imports: Internal */
...
...
packages/fault-detector/src/helpers.ts
View file @
1c840c68
import
{
Contract
}
from
'
ethers
'
import
{
Contract
,
BigNumber
}
from
'
ethers
'
export
interface
OutputOracle
<
TSubmissionEventArgs
>
{
contract
:
Contract
filter
:
any
getTotalElements
:
()
=>
Promise
<
BigNumber
>
getEventIndex
:
(
args
:
TSubmissionEventArgs
)
=>
BigNumber
}
/**
/**
* Partial event interface, meant to reduce the size of the event cache to avoid
* Partial event interface, meant to reduce the size of the event cache to avoid
...
@@ -41,27 +48,32 @@ const getCache = (
...
@@ -41,27 +48,32 @@ const getCache = (
}
}
/**
/**
* Updates the event cache for
the SCC
.
* Updates the event cache for
a contract and event
.
*
*
* @param scc The State Commitment Chain contract.
* @param contract Contract to update cache for.
* @param filter Event filter to use.
*/
*/
export
const
update
StateBatchEventCache
=
async
(
export
const
update
OracleCache
=
async
<
TSubmissionEventArgs
>
(
scc
:
Contract
oracle
:
OutputOracle
<
TSubmissionEventArgs
>
):
Promise
<
void
>
=>
{
):
Promise
<
void
>
=>
{
const
cache
=
getCache
(
scc
.
address
)
const
cache
=
getCache
(
oracle
.
contract
.
address
)
let
currentBlock
=
cache
.
highestBlock
let
currentBlock
=
cache
.
highestBlock
const
endingBlock
=
await
scc
.
provider
.
getBlockNumber
()
const
endingBlock
=
await
oracle
.
contract
.
provider
.
getBlockNumber
()
let
step
=
endingBlock
-
currentBlock
let
step
=
endingBlock
-
currentBlock
let
failures
=
0
let
failures
=
0
while
(
currentBlock
<
endingBlock
)
{
while
(
currentBlock
<
endingBlock
)
{
try
{
try
{
const
events
=
await
scc
.
queryFilter
(
const
events
=
await
oracle
.
contract
.
queryFilter
(
scc
.
filters
.
StateBatchAppended
()
,
oracle
.
filter
,
currentBlock
,
currentBlock
,
currentBlock
+
step
currentBlock
+
step
)
)
// Throw the events into the cache.
for
(
const
event
of
events
)
{
for
(
const
event
of
events
)
{
cache
.
eventCache
[
event
.
args
.
_batchIndex
.
toNumber
()]
=
{
cache
.
eventCache
[
oracle
.
getEventIndex
(
event
.
args
as
TSubmissionEventArgs
).
toNumber
()
]
=
{
blockNumber
:
event
.
blockNumber
,
blockNumber
:
event
.
blockNumber
,
transactionHash
:
event
.
transactionHash
,
transactionHash
:
event
.
transactionHash
,
args
:
event
.
args
,
args
:
event
.
args
,
...
@@ -97,15 +109,15 @@ export const updateStateBatchEventCache = async (
...
@@ -97,15 +109,15 @@ export const updateStateBatchEventCache = async (
/**
/**
* Finds the Event that corresponds to a given state batch by index.
* Finds the Event that corresponds to a given state batch by index.
*
*
* @param
scc StateCommitmentChain contract.
* @param
oracle Output oracle contract
* @param index State batch index to search for.
* @param index State batch index to search for.
* @returns Event corresponding to the batch.
* @returns Event corresponding to the batch.
*/
*/
export
const
findEventForStateBatch
=
async
(
export
const
findEventForStateBatch
=
async
<
TSubmissionEventArgs
>
(
scc
:
Contract
,
oracle
:
OutputOracle
<
TSubmissionEventArgs
>
,
index
:
number
index
:
number
):
Promise
<
PartialEvent
>
=>
{
):
Promise
<
PartialEvent
>
=>
{
const
cache
=
getCache
(
scc
.
address
)
const
cache
=
getCache
(
oracle
.
contract
.
address
)
// Try to find the event in cache first.
// Try to find the event in cache first.
if
(
cache
.
eventCache
[
index
])
{
if
(
cache
.
eventCache
[
index
])
{
...
@@ -113,7 +125,7 @@ export const findEventForStateBatch = async (
...
@@ -113,7 +125,7 @@ export const findEventForStateBatch = async (
}
}
// Update the event cache if we don't have the event.
// Update the event cache if we don't have the event.
await
update
StateBatchEventCache
(
scc
)
await
update
OracleCache
(
oracle
)
// Event better be in cache now!
// Event better be in cache now!
if
(
cache
.
eventCache
[
index
]
===
undefined
)
{
if
(
cache
.
eventCache
[
index
]
===
undefined
)
{
...
@@ -126,23 +138,23 @@ export const findEventForStateBatch = async (
...
@@ -126,23 +138,23 @@ export const findEventForStateBatch = async (
/**
/**
* Finds the first state batch index that has not yet passed the fault proof window.
* Finds the first state batch index that has not yet passed the fault proof window.
*
*
* @param
scc StateCommitmentChain
contract.
* @param
oracle Output oracle
contract.
* @returns Starting state root batch index.
* @returns Starting state root batch index.
*/
*/
export
const
findFirstUnfinalizedStateBatchIndex
=
async
(
export
const
findFirstUnfinalizedStateBatchIndex
=
async
<
TSubmissionEventArgs
>
(
scc
:
Contract
oracle
:
OutputOracle
<
TSubmissionEventArgs
>
,
fpw
:
number
):
Promise
<
number
>
=>
{
):
Promise
<
number
>
=>
{
const
fpw
=
(
await
scc
.
FRAUD_PROOF_WINDOW
()).
toNumber
()
const
latestBlock
=
await
oracle
.
contract
.
provider
.
getBlock
(
'
latest
'
)
const
latestBlock
=
await
scc
.
provider
.
getBlock
(
'
latest
'
)
const
totalBatches
=
(
await
oracle
.
getTotalElements
()).
toNumber
()
const
totalBatches
=
(
await
scc
.
getTotalBatches
()).
toNumber
()
// Perform a binary search to find the next batch that will pass the challenge period.
// Perform a binary search to find the next batch that will pass the challenge period.
let
lo
=
0
let
lo
=
0
let
hi
=
totalBatches
let
hi
=
totalBatches
while
(
lo
!==
hi
)
{
while
(
lo
!==
hi
)
{
const
mid
=
Math
.
floor
((
lo
+
hi
)
/
2
)
const
mid
=
Math
.
floor
((
lo
+
hi
)
/
2
)
const
event
=
await
findEventForStateBatch
(
scc
,
mid
)
const
event
=
await
findEventForStateBatch
(
oracle
,
mid
)
const
block
=
await
scc
.
provider
.
getBlock
(
event
.
blockNumber
)
const
block
=
await
oracle
.
contract
.
provider
.
getBlock
(
event
.
blockNumber
)
if
(
block
.
timestamp
+
fpw
<
latestBlock
.
timestamp
)
{
if
(
block
.
timestamp
+
fpw
<
latestBlock
.
timestamp
)
{
lo
=
mid
+
1
lo
=
mid
+
1
...
...
packages/fault-detector/src/service.ts
View file @
1c840c68
This diff is collapsed.
Click to expand it.
packages/fault-detector/test/helpers.spec.ts
View file @
1c840c68
...
@@ -12,6 +12,7 @@ import { expect } from './setup'
...
@@ -12,6 +12,7 @@ import { expect } from './setup'
import
{
import
{
findEventForStateBatch
,
findEventForStateBatch
,
findFirstUnfinalizedStateBatchIndex
,
findFirstUnfinalizedStateBatchIndex
,
OutputOracle
,
}
from
'
../src
'
}
from
'
../src
'
describe
(
'
helpers
'
,
()
=>
{
describe
(
'
helpers
'
,
()
=>
{
...
@@ -28,6 +29,7 @@ describe('helpers', () => {
...
@@ -28,6 +29,7 @@ describe('helpers', () => {
let
AddressManager
:
Contract
let
AddressManager
:
Contract
let
ChainStorageContainer
:
Contract
let
ChainStorageContainer
:
Contract
let
StateCommitmentChain
:
Contract
let
StateCommitmentChain
:
Contract
let
oracle
:
OutputOracle
<
any
>
beforeEach
(
async
()
=>
{
beforeEach
(
async
()
=>
{
// Set up fakes
// Set up fakes
FakeBondManager
=
await
smock
.
fake
(
getContractInterface
(
'
BondManager
'
))
FakeBondManager
=
await
smock
.
fake
(
getContractInterface
(
'
BondManager
'
))
...
@@ -67,6 +69,13 @@ describe('helpers', () => {
...
@@ -67,6 +69,13 @@ describe('helpers', () => {
// Set up mock returns
// Set up mock returns
FakeCanonicalTransactionChain
.
getTotalElements
.
returns
(
1000000000
)
// just needs to be large
FakeCanonicalTransactionChain
.
getTotalElements
.
returns
(
1000000000
)
// just needs to be large
FakeBondManager
.
isCollateralized
.
returns
(
true
)
FakeBondManager
.
isCollateralized
.
returns
(
true
)
oracle
=
{
contract
:
StateCommitmentChain
,
filter
:
StateCommitmentChain
.
filters
.
StateBatchAppended
(),
getTotalElements
:
async
()
=>
StateCommitmentChain
.
getTotalBatches
(),
getEventIndex
:
(
args
:
any
)
=>
args
.
_batchIndex
,
}
})
})
describe
(
'
findEventForStateBatch
'
,
()
=>
{
describe
(
'
findEventForStateBatch
'
,
()
=>
{
...
@@ -79,7 +88,7 @@ describe('helpers', () => {
...
@@ -79,7 +88,7 @@ describe('helpers', () => {
})
})
it
(
'
should return the event
'
,
async
()
=>
{
it
(
'
should return the event
'
,
async
()
=>
{
const
event
=
await
findEventForStateBatch
(
StateCommitmentChain
,
0
)
const
event
=
await
findEventForStateBatch
(
oracle
,
0
)
expect
(
event
.
args
.
_batchIndex
).
to
.
equal
(
0
)
expect
(
event
.
args
.
_batchIndex
).
to
.
equal
(
0
)
})
})
...
@@ -88,7 +97,7 @@ describe('helpers', () => {
...
@@ -88,7 +97,7 @@ describe('helpers', () => {
describe
(
'
when the event does not exist
'
,
()
=>
{
describe
(
'
when the event does not exist
'
,
()
=>
{
it
(
'
should throw an error
'
,
async
()
=>
{
it
(
'
should throw an error
'
,
async
()
=>
{
await
expect
(
await
expect
(
findEventForStateBatch
(
StateCommitmentChain
,
0
)
findEventForStateBatch
(
oracle
,
0
)
).
to
.
eventually
.
be
.
rejectedWith
(
'
unable to find event for batch
'
)
).
to
.
eventually
.
be
.
rejectedWith
(
'
unable to find event for batch
'
)
})
})
})
})
...
@@ -119,7 +128,8 @@ describe('helpers', () => {
...
@@ -119,7 +128,8 @@ describe('helpers', () => {
it
(
'
should find the first batch older than the FPW
'
,
async
()
=>
{
it
(
'
should find the first batch older than the FPW
'
,
async
()
=>
{
const
first
=
await
findFirstUnfinalizedStateBatchIndex
(
const
first
=
await
findFirstUnfinalizedStateBatchIndex
(
StateCommitmentChain
oracle
,
challengeWindowSeconds
)
)
expect
(
first
).
to
.
equal
(
1
)
expect
(
first
).
to
.
equal
(
1
)
...
@@ -144,7 +154,8 @@ describe('helpers', () => {
...
@@ -144,7 +154,8 @@ describe('helpers', () => {
it
(
'
should return zero
'
,
async
()
=>
{
it
(
'
should return zero
'
,
async
()
=>
{
const
first
=
await
findFirstUnfinalizedStateBatchIndex
(
const
first
=
await
findFirstUnfinalizedStateBatchIndex
(
StateCommitmentChain
oracle
,
challengeWindowSeconds
)
)
expect
(
first
).
to
.
equal
(
0
)
expect
(
first
).
to
.
equal
(
0
)
...
@@ -177,7 +188,8 @@ describe('helpers', () => {
...
@@ -177,7 +188,8 @@ describe('helpers', () => {
it
(
'
should return undefined
'
,
async
()
=>
{
it
(
'
should return undefined
'
,
async
()
=>
{
const
first
=
await
findFirstUnfinalizedStateBatchIndex
(
const
first
=
await
findFirstUnfinalizedStateBatchIndex
(
StateCommitmentChain
oracle
,
challengeWindowSeconds
)
)
expect
(
first
).
to
.
equal
(
undefined
)
expect
(
first
).
to
.
equal
(
undefined
)
...
...
yarn.lock
View file @
1c840c68
...
@@ -12090,7 +12090,7 @@ level-ws@^2.0.0:
...
@@ -12090,7 +12090,7 @@ level-ws@^2.0.0:
readable-stream "^3.1.0"
readable-stream "^3.1.0"
xtend "^4.0.1"
xtend "^4.0.1"
level@^6.0.1
:
"level6@npm:level@^6.0.1"
:
version "6.0.1"
version "6.0.1"
resolved "https://registry.yarnpkg.com/level/-/level-6.0.1.tgz#dc34c5edb81846a6de5079eac15706334b0d7cd6"
resolved "https://registry.yarnpkg.com/level/-/level-6.0.1.tgz#dc34c5edb81846a6de5079eac15706334b0d7cd6"
integrity sha512-psRSqJZCsC/irNhfHzrVZbmPYXDcEYhA5TVNwr+V92jF44rbf86hqGp8fiT702FyiArScYIlPSBTDUASCVNSpw==
integrity sha512-psRSqJZCsC/irNhfHzrVZbmPYXDcEYhA5TVNwr+V92jF44rbf86hqGp8fiT702FyiArScYIlPSBTDUASCVNSpw==
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment