Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
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
张蕾
Geth-Modification
Commits
a0b88ce8
Unverified
Commit
a0b88ce8
authored
Aug 01, 2022
by
lightclient
Committed by
GitHub
Aug 01, 2022
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
eth/gasprice/feehistory: support finalized block (#25442)
parent
1b34ed2e
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
74 additions
and
27 deletions
+74
-27
feehistory.go
eth/gasprice/feehistory.go
+51
-27
feehistory_test.go
eth/gasprice/feehistory_test.go
+2
-0
gasprice_test.go
eth/gasprice/gasprice_test.go
+21
-0
No files found.
eth/gasprice/feehistory.go
View file @
a0b88ce8
...
@@ -137,44 +137,68 @@ func (oracle *Oracle) processBlock(bf *blockFees, percentiles []float64) {
...
@@ -137,44 +137,68 @@ func (oracle *Oracle) processBlock(bf *blockFees, percentiles []float64) {
// also returned if requested and available.
// also returned if requested and available.
// Note: an error is only returned if retrieving the head header has failed. If there are no
// Note: an error is only returned if retrieving the head header has failed. If there are no
// retrievable blocks in the specified range then zero block count is returned with no error.
// retrievable blocks in the specified range then zero block count is returned with no error.
func
(
oracle
*
Oracle
)
resolveBlockRange
(
ctx
context
.
Context
,
lastBlock
rpc
.
BlockNumber
,
blocks
int
)
(
*
types
.
Block
,
[]
*
types
.
Receipt
,
uint64
,
int
,
error
)
{
func
(
oracle
*
Oracle
)
resolveBlockRange
(
ctx
context
.
Context
,
reqEnd
rpc
.
BlockNumber
,
blocks
int
)
(
*
types
.
Block
,
[]
*
types
.
Receipt
,
uint64
,
int
,
error
)
{
var
(
var
(
headBlock
rpc
.
BlockNumb
er
headBlock
*
types
.
Head
er
pendingBlock
*
types
.
Block
pendingBlock
*
types
.
Block
pendingReceipts
types
.
Receipts
pendingReceipts
types
.
Receipts
err
error
)
)
// query either pending block or head header and set headBlock
if
lastBlock
==
rpc
.
PendingBlockNumber
{
// Get the chain's current head.
if
pendingBlock
,
pendingReceipts
=
oracle
.
backend
.
PendingBlockAndReceipts
();
pendingBlock
!=
nil
{
if
headBlock
,
err
=
oracle
.
backend
.
HeaderByNumber
(
ctx
,
rpc
.
LatestBlockNumber
);
err
!=
nil
{
lastBlock
=
rpc
.
BlockNumber
(
pendingBlock
.
NumberU64
())
return
nil
,
nil
,
0
,
0
,
err
headBlock
=
lastBlock
-
1
}
}
else
{
head
:=
rpc
.
BlockNumber
(
headBlock
.
Number
.
Uint64
())
// pending block not supported by backend, process until latest block
lastBlock
=
rpc
.
LatestBlockNumber
// Fail if request block is beyond the chain's current head.
blocks
--
if
head
<
reqEnd
{
if
blocks
==
0
{
return
nil
,
nil
,
0
,
0
,
fmt
.
Errorf
(
"%w: requested %d, head %d"
,
errRequestBeyondHead
,
reqEnd
,
head
)
return
nil
,
nil
,
0
,
0
,
nil
}
// Resolve block tag.
if
reqEnd
<
0
{
var
(
resolved
*
types
.
Header
err
error
)
switch
reqEnd
{
case
rpc
.
PendingBlockNumber
:
if
pendingBlock
,
pendingReceipts
=
oracle
.
backend
.
PendingBlockAndReceipts
();
pendingBlock
!=
nil
{
resolved
=
pendingBlock
.
Header
()
}
else
{
// Pending block not supported by backend, process only until latest block.
resolved
=
headBlock
// Update total blocks to return to account for this.
blocks
--
}
}
case
rpc
.
LatestBlockNumber
:
// Retrieved above.
resolved
=
headBlock
case
rpc
.
SafeBlockNumber
:
resolved
,
err
=
oracle
.
backend
.
HeaderByNumber
(
ctx
,
rpc
.
SafeBlockNumber
)
case
rpc
.
FinalizedBlockNumber
:
resolved
,
err
=
oracle
.
backend
.
HeaderByNumber
(
ctx
,
rpc
.
FinalizedBlockNumber
)
case
rpc
.
EarliestBlockNumber
:
resolved
,
err
=
oracle
.
backend
.
HeaderByNumber
(
ctx
,
rpc
.
EarliestBlockNumber
)
}
}
}
if
resolved
==
nil
||
err
!=
nil
{
if
pendingBlock
==
nil
{
// if pending block is not fetched then we retrieve the head header to get the head block number
if
latestHeader
,
err
:=
oracle
.
backend
.
HeaderByNumber
(
ctx
,
rpc
.
LatestBlockNumber
);
err
==
nil
{
headBlock
=
rpc
.
BlockNumber
(
latestHeader
.
Number
.
Uint64
())
}
else
{
return
nil
,
nil
,
0
,
0
,
err
return
nil
,
nil
,
0
,
0
,
err
}
}
// Absolute number resolved.
reqEnd
=
rpc
.
BlockNumber
(
resolved
.
Number
.
Uint64
())
}
}
if
lastBlock
==
rpc
.
LatestBlockNumber
{
lastBlock
=
headBlock
// If there are no blocks to return, short circuit.
}
else
if
pendingBlock
==
nil
&&
lastBlock
>
headBlock
{
if
blocks
==
0
{
return
nil
,
nil
,
0
,
0
,
fmt
.
Errorf
(
"%w: requested %d, head %d"
,
errRequestBeyondHead
,
lastBlock
,
headBlock
)
return
nil
,
nil
,
0
,
0
,
nil
}
}
//
ensure not trying to retrieve before genesis
//
Ensure not trying to retrieve before genesis.
if
rpc
.
BlockNumber
(
blocks
)
>
lastBlock
+
1
{
if
int
(
reqEnd
+
1
)
<
blocks
{
blocks
=
int
(
lastBlock
+
1
)
blocks
=
int
(
reqEnd
+
1
)
}
}
return
pendingBlock
,
pendingReceipts
,
uint64
(
lastBlock
),
blocks
,
nil
return
pendingBlock
,
pendingReceipts
,
uint64
(
reqEnd
),
blocks
,
nil
}
}
// FeeHistory returns data relevant for fee estimation based on the specified range of blocks.
// FeeHistory returns data relevant for fee estimation based on the specified range of blocks.
...
...
eth/gasprice/feehistory_test.go
View file @
a0b88ce8
...
@@ -50,6 +50,8 @@ func TestFeeHistory(t *testing.T) {
...
@@ -50,6 +50,8 @@ func TestFeeHistory(t *testing.T) {
{
false
,
1000
,
1000
,
2
,
rpc
.
PendingBlockNumber
,
nil
,
32
,
1
,
nil
},
{
false
,
1000
,
1000
,
2
,
rpc
.
PendingBlockNumber
,
nil
,
32
,
1
,
nil
},
{
true
,
1000
,
1000
,
2
,
rpc
.
PendingBlockNumber
,
nil
,
32
,
2
,
nil
},
{
true
,
1000
,
1000
,
2
,
rpc
.
PendingBlockNumber
,
nil
,
32
,
2
,
nil
},
{
true
,
1000
,
1000
,
2
,
rpc
.
PendingBlockNumber
,
[]
float64
{
0
,
10
},
32
,
2
,
nil
},
{
true
,
1000
,
1000
,
2
,
rpc
.
PendingBlockNumber
,
[]
float64
{
0
,
10
},
32
,
2
,
nil
},
{
false
,
1000
,
1000
,
2
,
rpc
.
FinalizedBlockNumber
,
[]
float64
{
0
,
10
},
24
,
2
,
nil
},
{
false
,
1000
,
1000
,
2
,
rpc
.
SafeBlockNumber
,
[]
float64
{
0
,
10
},
24
,
2
,
nil
},
}
}
for
i
,
c
:=
range
cases
{
for
i
,
c
:=
range
cases
{
config
:=
Config
{
config
:=
Config
{
...
...
eth/gasprice/gasprice_test.go
View file @
a0b88ce8
...
@@ -45,6 +45,15 @@ func (b *testBackend) HeaderByNumber(ctx context.Context, number rpc.BlockNumber
...
@@ -45,6 +45,15 @@ func (b *testBackend) HeaderByNumber(ctx context.Context, number rpc.BlockNumber
if
number
>
testHead
{
if
number
>
testHead
{
return
nil
,
nil
return
nil
,
nil
}
}
if
number
==
rpc
.
EarliestBlockNumber
{
number
=
0
}
if
number
==
rpc
.
FinalizedBlockNumber
{
return
b
.
chain
.
CurrentFinalizedBlock
()
.
Header
(),
nil
}
if
number
==
rpc
.
SafeBlockNumber
{
return
b
.
chain
.
CurrentSafeBlock
()
.
Header
(),
nil
}
if
number
==
rpc
.
LatestBlockNumber
{
if
number
==
rpc
.
LatestBlockNumber
{
number
=
testHead
number
=
testHead
}
}
...
@@ -62,6 +71,15 @@ func (b *testBackend) BlockByNumber(ctx context.Context, number rpc.BlockNumber)
...
@@ -62,6 +71,15 @@ func (b *testBackend) BlockByNumber(ctx context.Context, number rpc.BlockNumber)
if
number
>
testHead
{
if
number
>
testHead
{
return
nil
,
nil
return
nil
,
nil
}
}
if
number
==
rpc
.
EarliestBlockNumber
{
number
=
0
}
if
number
==
rpc
.
FinalizedBlockNumber
{
return
b
.
chain
.
CurrentFinalizedBlock
(),
nil
}
if
number
==
rpc
.
SafeBlockNumber
{
return
b
.
chain
.
CurrentSafeBlock
(),
nil
}
if
number
==
rpc
.
LatestBlockNumber
{
if
number
==
rpc
.
LatestBlockNumber
{
number
=
testHead
number
=
testHead
}
}
...
@@ -109,6 +127,7 @@ func newTestBackend(t *testing.T, londonBlock *big.Int, pending bool) *testBacke
...
@@ -109,6 +127,7 @@ func newTestBackend(t *testing.T, londonBlock *big.Int, pending bool) *testBacke
config
.
LondonBlock
=
londonBlock
config
.
LondonBlock
=
londonBlock
config
.
ArrowGlacierBlock
=
londonBlock
config
.
ArrowGlacierBlock
=
londonBlock
config
.
GrayGlacierBlock
=
londonBlock
config
.
GrayGlacierBlock
=
londonBlock
config
.
TerminalTotalDifficulty
=
common
.
Big0
engine
:=
ethash
.
NewFaker
()
engine
:=
ethash
.
NewFaker
()
db
:=
rawdb
.
NewMemoryDatabase
()
db
:=
rawdb
.
NewMemoryDatabase
()
genesis
,
err
:=
gspec
.
Commit
(
db
)
genesis
,
err
:=
gspec
.
Commit
(
db
)
...
@@ -150,6 +169,8 @@ func newTestBackend(t *testing.T, londonBlock *big.Int, pending bool) *testBacke
...
@@ -150,6 +169,8 @@ func newTestBackend(t *testing.T, londonBlock *big.Int, pending bool) *testBacke
t
.
Fatalf
(
"Failed to create local chain, %v"
,
err
)
t
.
Fatalf
(
"Failed to create local chain, %v"
,
err
)
}
}
chain
.
InsertChain
(
blocks
)
chain
.
InsertChain
(
blocks
)
chain
.
SetFinalized
(
chain
.
GetBlockByNumber
(
25
))
chain
.
SetSafe
(
chain
.
GetBlockByNumber
(
25
))
return
&
testBackend
{
chain
:
chain
,
pending
:
pending
}
return
&
testBackend
{
chain
:
chain
,
pending
:
pending
}
}
}
...
...
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