Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
whqwjb
go-ethereum
提交
dea71556
G
go-ethereum
项目概览
whqwjb
/
go-ethereum
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
go-ethereum
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
dea71556
编写于
7月 08, 2021
作者:
P
Péter Szilágyi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
eth/gasprice, internal/ethapi, miner: minor feehistory fixes
上级
5441a8fa
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
108 addition
and
100 deletion
+108
-100
eth/gasprice/feehistory.go
eth/gasprice/feehistory.go
+88
-81
eth/gasprice/feehistory_test.go
eth/gasprice/feehistory_test.go
+3
-2
internal/ethapi/api.go
internal/ethapi/api.go
+15
-15
miner/worker.go
miner/worker.go
+2
-2
未找到文件。
eth/gasprice/feehistory.go
浏览文件 @
dea71556
...
@@ -19,6 +19,7 @@ package gasprice
...
@@ -19,6 +19,7 @@ package gasprice
import
(
import
(
"context"
"context"
"errors"
"errors"
"fmt"
"math/big"
"math/big"
"sort"
"sort"
"sync/atomic"
"sync/atomic"
...
@@ -30,11 +31,19 @@ import (
...
@@ -30,11 +31,19 @@ import (
)
)
var
(
var
(
errInvalidPercentile
s
=
errors
.
New
(
"Invalid reward percentiles
"
)
errInvalidPercentile
=
errors
.
New
(
"invalid reward percentile
"
)
errRequestBeyondHead
=
errors
.
New
(
"R
equest beyond head block"
)
errRequestBeyondHead
=
errors
.
New
(
"r
equest beyond head block"
)
)
)
const
maxBlockCount
=
1024
// number of blocks retrievable with a single query
const
(
// maxFeeHistory is the maximum number of blocks that can be retrieved for a
// fee history request.
maxFeeHistory
=
1024
// maxBlockFetchers is the max number of goroutines to spin up to pull blocks
// for the fee history calculation (mostly relevant for LES).
maxBlockFetchers
=
4
)
// blockFees represents a single block for processing
// blockFees represents a single block for processing
type
blockFees
struct
{
type
blockFees
struct
{
...
@@ -124,23 +133,22 @@ func (oracle *Oracle) processBlock(bf *blockFees, percentiles []float64) {
...
@@ -124,23 +133,22 @@ 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
Number
rpc
.
BlockNumber
,
blockCount
,
maxHistory
int
)
(
*
types
.
Block
,
types
.
Receipts
,
rpc
.
BlockNumber
,
int
,
error
)
{
func
(
oracle
*
Oracle
)
resolveBlockRange
(
ctx
context
.
Context
,
lastBlock
rpc
.
BlockNumber
,
blocks
,
maxHistory
int
)
(
*
types
.
Block
,
[]
*
types
.
Receipt
,
rpc
.
BlockNumber
,
int
,
error
)
{
var
(
var
(
headBlock
Number
rpc
.
BlockNumber
headBlock
rpc
.
BlockNumber
pendingBlock
*
types
.
Block
pendingBlock
*
types
.
Block
pendingReceipts
types
.
Receipts
pendingReceipts
types
.
Receipts
)
)
// query either pending block or head header and set headBlock
// query either pending block or head header and set headBlockNumber
if
lastBlock
==
rpc
.
PendingBlockNumber
{
if
lastBlockNumber
==
rpc
.
PendingBlockNumber
{
if
pendingBlock
,
pendingReceipts
=
oracle
.
backend
.
PendingBlockAndReceipts
();
pendingBlock
!=
nil
{
if
pendingBlock
,
pendingReceipts
=
oracle
.
backend
.
PendingBlockAndReceipts
();
pendingBlock
!=
nil
{
lastBlock
Number
=
rpc
.
BlockNumber
(
pendingBlock
.
NumberU64
())
lastBlock
=
rpc
.
BlockNumber
(
pendingBlock
.
NumberU64
())
headBlock
Number
=
lastBlockNumber
-
1
headBlock
=
lastBlock
-
1
}
else
{
}
else
{
// pending block not supported by backend, process until latest block
// pending block not supported by backend, process until latest block
lastBlock
Number
=
rpc
.
LatestBlockNumber
lastBlock
=
rpc
.
LatestBlockNumber
block
Count
--
block
s
--
if
block
Count
==
0
{
if
block
s
==
0
{
return
nil
,
nil
,
0
,
0
,
nil
return
nil
,
nil
,
0
,
0
,
nil
}
}
}
}
...
@@ -148,32 +156,32 @@ func (oracle *Oracle) resolveBlockRange(ctx context.Context, lastBlockNumber rpc
...
@@ -148,32 +156,32 @@ func (oracle *Oracle) resolveBlockRange(ctx context.Context, lastBlockNumber rpc
if
pendingBlock
==
nil
{
if
pendingBlock
==
nil
{
// if pending block is not fetched then we retrieve the head header to get the head block number
// 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
{
if
latestHeader
,
err
:=
oracle
.
backend
.
HeaderByNumber
(
ctx
,
rpc
.
LatestBlockNumber
);
err
==
nil
{
headBlock
Number
=
rpc
.
BlockNumber
(
latestHeader
.
Number
.
Uint64
())
headBlock
=
rpc
.
BlockNumber
(
latestHeader
.
Number
.
Uint64
())
}
else
{
}
else
{
return
nil
,
nil
,
0
,
0
,
err
return
nil
,
nil
,
0
,
0
,
err
}
}
}
}
if
lastBlock
Number
==
rpc
.
LatestBlockNumber
{
if
lastBlock
==
rpc
.
LatestBlockNumber
{
lastBlock
Number
=
headBlockNumber
lastBlock
=
headBlock
}
else
if
pendingBlock
==
nil
&&
lastBlock
Number
>
headBlockNumber
{
}
else
if
pendingBlock
==
nil
&&
lastBlock
>
headBlock
{
return
nil
,
nil
,
0
,
0
,
errRequestBeyondHead
return
nil
,
nil
,
0
,
0
,
fmt
.
Errorf
(
"%w: requested %d, head %d"
,
errRequestBeyondHead
,
lastBlock
,
headBlock
)
}
}
if
maxHistory
!=
0
{
if
maxHistory
!=
0
{
// limit retrieval to the given number of latest blocks
// limit retrieval to the given number of latest blocks
if
tooOldCount
:=
int64
(
headBlock
Number
)
-
int64
(
maxHistory
)
-
int64
(
lastBlockNumber
)
+
int64
(
blockCount
);
tooOldCount
>
0
{
if
tooOldCount
:=
int64
(
headBlock
)
-
int64
(
maxHistory
)
-
int64
(
lastBlock
)
+
int64
(
blocks
);
tooOldCount
>
0
{
// tooOldCount is the number of requested blocks that are too old to be served
// tooOldCount is the number of requested blocks that are too old to be served
if
int64
(
block
Count
)
>
tooOldCount
{
if
int64
(
block
s
)
>
tooOldCount
{
block
Count
-=
int
(
tooOldCount
)
block
s
-=
int
(
tooOldCount
)
}
else
{
}
else
{
return
nil
,
nil
,
0
,
0
,
nil
return
nil
,
nil
,
0
,
0
,
nil
}
}
}
}
}
}
// ensure not trying to retrieve before genesis
// ensure not trying to retrieve before genesis
if
rpc
.
BlockNumber
(
block
Count
)
>
lastBlockNumber
+
1
{
if
rpc
.
BlockNumber
(
block
s
)
>
lastBlock
+
1
{
block
Count
=
int
(
lastBlockNumber
+
1
)
block
s
=
int
(
lastBlock
+
1
)
}
}
return
pendingBlock
,
pendingReceipts
,
lastBlock
Number
,
blockCount
,
nil
return
pendingBlock
,
pendingReceipts
,
lastBlock
,
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.
...
@@ -189,90 +197,89 @@ func (oracle *Oracle) resolveBlockRange(ctx context.Context, lastBlockNumber rpc
...
@@ -189,90 +197,89 @@ func (oracle *Oracle) resolveBlockRange(ctx context.Context, lastBlockNumber rpc
// - gasUsedRatio: gasUsed/gasLimit in the given block
// - gasUsedRatio: gasUsed/gasLimit in the given block
// Note: baseFee includes the next block after the newest of the returned range, because this
// Note: baseFee includes the next block after the newest of the returned range, because this
// value can be derived from the newest block.
// value can be derived from the newest block.
func
(
oracle
*
Oracle
)
FeeHistory
(
ctx
context
.
Context
,
blockCount
int
,
lastBlockNumber
rpc
.
BlockNumber
,
rewardPercentiles
[]
float64
)
(
firstBlockNumber
rpc
.
BlockNumber
,
reward
[][]
*
big
.
Int
,
baseFee
[]
*
big
.
Int
,
gasUsedRatio
[]
float64
,
err
error
)
{
func
(
oracle
*
Oracle
)
FeeHistory
(
ctx
context
.
Context
,
blocks
int
,
lastBlock
rpc
.
BlockNumber
,
rewardPercentiles
[]
float64
)
(
rpc
.
BlockNumber
,
[][]
*
big
.
Int
,
[]
*
big
.
Int
,
[]
float64
,
error
)
{
if
blockCount
<
1
{
if
blocks
<
1
{
// returning with no data and no error means there are no retrievable blocks
return
0
,
nil
,
nil
,
nil
,
nil
// returning with no data and no error means there are no retrievable blocks
return
}
}
if
blockCount
>
maxBlockCount
{
if
blocks
>
maxFeeHistory
{
blockCount
=
maxBlockCount
log
.
Warn
(
"Sanitizing fee history length"
,
"requested"
,
blocks
,
"truncated"
,
maxFeeHistory
)
blocks
=
maxFeeHistory
}
}
for
i
,
p
:=
range
rewardPercentiles
{
for
i
,
p
:=
range
rewardPercentiles
{
if
p
<
0
||
p
>
100
||
(
i
>
0
&&
p
<
rewardPercentiles
[
i
-
1
])
{
if
p
<
0
||
p
>
100
{
return
0
,
nil
,
nil
,
nil
,
errInvalidPercentiles
return
0
,
nil
,
nil
,
nil
,
fmt
.
Errorf
(
"%w: %f"
,
errInvalidPercentile
,
p
)
}
if
i
>
0
&&
p
<
rewardPercentiles
[
i
-
1
]
{
return
0
,
nil
,
nil
,
nil
,
fmt
.
Errorf
(
"%w: #%d:%f > #%d:%f"
,
errInvalidPercentile
,
i
-
1
,
rewardPercentiles
[
i
-
1
],
i
,
p
)
}
}
}
}
// Only process blocks if reward percentiles were requested
processBlocks
:=
len
(
rewardPercentiles
)
!=
0
maxHistory
:=
oracle
.
maxHeaderHistory
// limit retrieval to maxHistory if set
if
len
(
rewardPercentiles
)
!=
0
{
var
maxHistory
int
if
processBlocks
{
maxHistory
=
oracle
.
maxBlockHistory
maxHistory
=
oracle
.
maxBlockHistory
}
else
{
maxHistory
=
oracle
.
maxHeaderHistory
}
}
var
(
var
(
pendingBlock
*
types
.
Block
pendingBlock
*
types
.
Block
pendingReceipts
types
.
Receipts
pendingReceipts
[]
*
types
.
Receipt
err
error
)
)
if
pendingBlock
,
pendingReceipts
,
lastBlockNumber
,
blockCount
,
err
=
oracle
.
resolveBlockRange
(
ctx
,
lastBlockNumber
,
blockCount
,
maxHistory
);
err
!=
nil
||
blockCount
==
0
{
pendingBlock
,
pendingReceipts
,
lastBlock
,
blocks
,
err
=
oracle
.
resolveBlockRange
(
ctx
,
lastBlock
,
blocks
,
maxHistory
)
return
if
err
!=
nil
||
blocks
==
0
{
return
0
,
nil
,
nil
,
nil
,
err
}
}
firstBlockNumber
=
lastBlockNumber
+
1
-
rpc
.
BlockNumber
(
blockCount
)
oldestBlock
:=
lastBlock
+
1
-
rpc
.
BlockNumber
(
blocks
)
processNext
:=
int64
(
firstBlockNumber
)
var
(
resultCh
:=
make
(
chan
*
blockFees
,
blockCount
)
next
=
int64
(
oldestBlock
)
threadCount
:=
4
results
=
make
(
chan
*
blockFees
,
blocks
)
if
blockCount
<
threadCount
{
)
threadCount
=
blockCount
for
i
:=
0
;
i
<
maxBlockFetchers
&&
i
<
blocks
;
i
++
{
}
for
i
:=
0
;
i
<
threadCount
;
i
++
{
go
func
()
{
go
func
()
{
for
{
for
{
blockNumber
:=
rpc
.
BlockNumber
(
atomic
.
AddInt64
(
&
processNext
,
1
)
-
1
)
// Retrieve the next block number to fetch with this goroutine
if
blockNumber
>
lastBlockNumber
{
blockNumber
:=
rpc
.
BlockNumber
(
atomic
.
AddInt64
(
&
next
,
1
)
-
1
)
if
blockNumber
>
lastBlock
{
return
return
}
}
bf
:=
&
blockFees
{
blockNumber
:
blockNumber
}
fees
:=
&
blockFees
{
blockNumber
:
blockNumber
}
if
pendingBlock
!=
nil
&&
blockNumber
>=
rpc
.
BlockNumber
(
pendingBlock
.
NumberU64
())
{
if
pendingBlock
!=
nil
&&
blockNumber
>=
rpc
.
BlockNumber
(
pendingBlock
.
NumberU64
())
{
bf
.
block
,
bf
.
receipts
=
pendingBlock
,
pendingReceipts
fees
.
block
,
fees
.
receipts
=
pendingBlock
,
pendingReceipts
}
else
{
}
else
{
if
processBlocks
{
if
len
(
rewardPercentiles
)
!=
0
{
bf
.
block
,
bf
.
err
=
oracle
.
backend
.
BlockByNumber
(
ctx
,
blockNumber
)
fees
.
block
,
fees
.
err
=
oracle
.
backend
.
BlockByNumber
(
ctx
,
blockNumber
)
if
bf
.
block
!
=
nil
{
if
fees
.
block
!=
nil
&&
fees
.
err
=
=
nil
{
bf
.
receipts
,
bf
.
err
=
oracle
.
backend
.
GetReceipts
(
ctx
,
bf
.
block
.
Hash
())
fees
.
receipts
,
fees
.
err
=
oracle
.
backend
.
GetReceipts
(
ctx
,
fees
.
block
.
Hash
())
}
}
}
else
{
}
else
{
bf
.
header
,
bf
.
err
=
oracle
.
backend
.
HeaderByNumber
(
ctx
,
blockNumber
)
fees
.
header
,
fees
.
err
=
oracle
.
backend
.
HeaderByNumber
(
ctx
,
blockNumber
)
}
}
}
}
if
bf
.
block
!=
nil
{
if
fees
.
block
!=
nil
{
bf
.
header
=
bf
.
block
.
Header
()
fees
.
header
=
fees
.
block
.
Header
()
}
}
if
bf
.
header
!=
nil
{
if
fees
.
header
!=
nil
{
oracle
.
processBlock
(
bf
,
rewardPercentiles
)
oracle
.
processBlock
(
fees
,
rewardPercentiles
)
}
}
// send to result
Ch even if empty to guarantee that blockCount
items are sent in total
// send to result
s even if empty to guarantee that blocks
items are sent in total
result
Ch
<-
bf
result
s
<-
fees
}
}
}()
}()
}
}
var
(
reward
=
make
([][]
*
big
.
Int
,
blockCount
)
reward
=
make
([][]
*
big
.
Int
,
blocks
)
baseFee
=
make
([]
*
big
.
Int
,
blockCount
+
1
)
baseFee
=
make
([]
*
big
.
Int
,
blocks
+
1
)
gasUsedRatio
=
make
([]
float64
,
blockCount
)
gasUsedRatio
=
make
([]
float64
,
blocks
)
firstMissing
:=
blockCount
firstMissing
=
blocks
)
for
;
block
Count
>
0
;
blockCount
--
{
for
;
block
s
>
0
;
blocks
--
{
bf
:=
<-
resultCh
fees
:=
<-
results
if
bf
.
err
!=
nil
{
if
fees
.
err
!=
nil
{
return
0
,
nil
,
nil
,
nil
,
bf
.
err
return
0
,
nil
,
nil
,
nil
,
fees
.
err
}
}
i
:=
int
(
bf
.
blockNumber
-
firstBlockNumber
)
i
:=
int
(
fees
.
blockNumber
-
oldestBlock
)
if
bf
.
header
!=
nil
{
if
fees
.
header
!=
nil
{
reward
[
i
],
baseFee
[
i
],
baseFee
[
i
+
1
],
gasUsedRatio
[
i
]
=
bf
.
reward
,
bf
.
baseFee
,
bf
.
nextBaseFee
,
bf
.
gasUsedRatio
reward
[
i
],
baseFee
[
i
],
baseFee
[
i
+
1
],
gasUsedRatio
[
i
]
=
fees
.
reward
,
fees
.
baseFee
,
fees
.
nextBaseFee
,
fees
.
gasUsedRatio
}
else
{
}
else
{
// getting no block and no error means we are requesting into the future (might happen because of a reorg)
// getting no block and no error means we are requesting into the future (might happen because of a reorg)
if
i
<
firstMissing
{
if
i
<
firstMissing
{
...
@@ -283,11 +290,11 @@ func (oracle *Oracle) FeeHistory(ctx context.Context, blockCount int, lastBlockN
...
@@ -283,11 +290,11 @@ func (oracle *Oracle) FeeHistory(ctx context.Context, blockCount int, lastBlockN
if
firstMissing
==
0
{
if
firstMissing
==
0
{
return
0
,
nil
,
nil
,
nil
,
nil
return
0
,
nil
,
nil
,
nil
,
nil
}
}
if
processBlocks
{
if
len
(
rewardPercentiles
)
!=
0
{
reward
=
reward
[
:
firstMissing
]
reward
=
reward
[
:
firstMissing
]
}
else
{
}
else
{
reward
=
nil
reward
=
nil
}
}
baseFee
,
gasUsedRatio
=
baseFee
[
:
firstMissing
+
1
],
gasUsedRatio
[
:
firstMissing
]
baseFee
,
gasUsedRatio
=
baseFee
[
:
firstMissing
+
1
],
gasUsedRatio
[
:
firstMissing
]
return
return
oldestBlock
,
reward
,
baseFee
,
gasUsedRatio
,
nil
}
}
eth/gasprice/feehistory_test.go
浏览文件 @
dea71556
...
@@ -18,6 +18,7 @@ package gasprice
...
@@ -18,6 +18,7 @@ package gasprice
import
(
import
(
"context"
"context"
"errors"
"math/big"
"math/big"
"testing"
"testing"
...
@@ -37,7 +38,7 @@ func TestFeeHistory(t *testing.T) {
...
@@ -37,7 +38,7 @@ func TestFeeHistory(t *testing.T) {
}{
}{
{
false
,
0
,
0
,
10
,
30
,
nil
,
21
,
10
,
nil
},
{
false
,
0
,
0
,
10
,
30
,
nil
,
21
,
10
,
nil
},
{
false
,
0
,
0
,
10
,
30
,
[]
float64
{
0
,
10
},
21
,
10
,
nil
},
{
false
,
0
,
0
,
10
,
30
,
[]
float64
{
0
,
10
},
21
,
10
,
nil
},
{
false
,
0
,
0
,
10
,
30
,
[]
float64
{
20
,
10
},
0
,
0
,
errInvalidPercentile
s
},
{
false
,
0
,
0
,
10
,
30
,
[]
float64
{
20
,
10
},
0
,
0
,
errInvalidPercentile
},
{
false
,
0
,
0
,
1000000000
,
30
,
nil
,
0
,
31
,
nil
},
{
false
,
0
,
0
,
1000000000
,
30
,
nil
,
0
,
31
,
nil
},
{
false
,
0
,
0
,
1000000000
,
rpc
.
LatestBlockNumber
,
nil
,
0
,
33
,
nil
},
{
false
,
0
,
0
,
1000000000
,
rpc
.
LatestBlockNumber
,
nil
,
0
,
33
,
nil
},
{
false
,
0
,
0
,
10
,
40
,
nil
,
0
,
0
,
errRequestBeyondHead
},
{
false
,
0
,
0
,
10
,
40
,
nil
,
0
,
0
,
errRequestBeyondHead
},
...
@@ -81,7 +82,7 @@ func TestFeeHistory(t *testing.T) {
...
@@ -81,7 +82,7 @@ func TestFeeHistory(t *testing.T) {
if
len
(
ratio
)
!=
c
.
expCount
{
if
len
(
ratio
)
!=
c
.
expCount
{
t
.
Fatalf
(
"Test case %d: gasUsedRatio array length mismatch, want %d, got %d"
,
i
,
c
.
expCount
,
len
(
ratio
))
t
.
Fatalf
(
"Test case %d: gasUsedRatio array length mismatch, want %d, got %d"
,
i
,
c
.
expCount
,
len
(
ratio
))
}
}
if
err
!=
c
.
expErr
{
if
err
!=
c
.
expErr
&&
!
errors
.
Is
(
err
,
c
.
expErr
)
{
t
.
Fatalf
(
"Test case %d: error mismatch, want %v, got %v"
,
i
,
c
.
expErr
,
err
)
t
.
Fatalf
(
"Test case %d: error mismatch, want %v, got %v"
,
i
,
c
.
expErr
,
err
)
}
}
}
}
...
...
internal/ethapi/api.go
浏览文件 @
dea71556
...
@@ -80,28 +80,28 @@ func (s *PublicEthereumAPI) MaxPriorityFeePerGas(ctx context.Context) (*hexutil.
...
@@ -80,28 +80,28 @@ func (s *PublicEthereumAPI) MaxPriorityFeePerGas(ctx context.Context) (*hexutil.
return
(
*
hexutil
.
Big
)(
tipcap
),
err
return
(
*
hexutil
.
Big
)(
tipcap
),
err
}
}
type
feeHistoryResult
s
struct
{
type
feeHistoryResult
struct
{
FirstBlock
rpc
.
BlockNumber
OldestBlock
rpc
.
BlockNumber
`json:"oldestBlock"`
Reward
[][]
*
hexutil
.
Big
Reward
[][]
*
hexutil
.
Big
`json:"reward,omitempty"`
BaseFee
[]
*
hexutil
.
Big
BaseFee
[]
*
hexutil
.
Big
`json:"baseFeePerGas,omitempty"`
GasUsedRatio
[]
float64
GasUsedRatio
[]
float64
`json:"gasUsedRatio"`
}
}
func
(
s
*
PublicEthereumAPI
)
FeeHistory
(
ctx
context
.
Context
,
blockCount
int
,
lastBlock
rpc
.
BlockNumber
,
rewardPercentiles
[]
float64
)
(
feeHistoryResults
,
error
)
{
func
(
s
*
PublicEthereumAPI
)
FeeHistory
(
ctx
context
.
Context
,
blockCount
int
,
lastBlock
rpc
.
BlockNumber
,
rewardPercentiles
[]
float64
)
(
*
feeHistoryResult
,
error
)
{
firstBlock
,
reward
,
baseFee
,
gasUsedRatio
,
err
:=
s
.
b
.
FeeHistory
(
ctx
,
blockCount
,
lastBlock
,
rewardPercentiles
)
oldest
,
reward
,
baseFee
,
gasUsed
,
err
:=
s
.
b
.
FeeHistory
(
ctx
,
blockCount
,
lastBlock
,
rewardPercentiles
)
if
err
!=
nil
{
if
err
!=
nil
{
return
feeHistoryResults
{}
,
err
return
nil
,
err
}
}
results
:=
feeHistoryResults
{
results
:=
&
feeHistoryResult
{
FirstBlock
:
firstBlock
,
OldestBlock
:
oldest
,
GasUsedRatio
:
gasUsed
Ratio
,
GasUsedRatio
:
gasUsed
,
}
}
if
reward
!=
nil
{
if
reward
!=
nil
{
results
.
Reward
=
make
([][]
*
hexutil
.
Big
,
len
(
reward
))
results
.
Reward
=
make
([][]
*
hexutil
.
Big
,
len
(
reward
))
for
j
,
w
:=
range
reward
{
for
i
,
w
:=
range
reward
{
results
.
Reward
[
j
]
=
make
([]
*
hexutil
.
Big
,
len
(
w
))
results
.
Reward
[
i
]
=
make
([]
*
hexutil
.
Big
,
len
(
w
))
for
i
,
v
:=
range
w
{
for
j
,
v
:=
range
w
{
results
.
Reward
[
j
][
i
]
=
(
*
hexutil
.
Big
)(
v
)
results
.
Reward
[
i
][
j
]
=
(
*
hexutil
.
Big
)(
v
)
}
}
}
}
}
}
...
...
miner/worker.go
浏览文件 @
dea71556
...
@@ -162,7 +162,7 @@ type worker struct {
...
@@ -162,7 +162,7 @@ type worker struct {
pendingMu
sync
.
RWMutex
pendingMu
sync
.
RWMutex
pendingTasks
map
[
common
.
Hash
]
*
task
pendingTasks
map
[
common
.
Hash
]
*
task
snapshotMu
sync
.
RWMutex
// The lock used to protect the
block snapshot and state snapshot
snapshotMu
sync
.
RWMutex
// The lock used to protect the
snapshots below
snapshotBlock
*
types
.
Block
snapshotBlock
*
types
.
Block
snapshotReceipts
types
.
Receipts
snapshotReceipts
types
.
Receipts
snapshotState
*
state
.
StateDB
snapshotState
*
state
.
StateDB
...
@@ -745,7 +745,7 @@ func (w *worker) updateSnapshot() {
...
@@ -745,7 +745,7 @@ func (w *worker) updateSnapshot() {
w
.
current
.
receipts
,
w
.
current
.
receipts
,
trie
.
NewStackTrie
(
nil
),
trie
.
NewStackTrie
(
nil
),
)
)
w
.
snapshotReceipts
=
w
.
current
.
receipts
w
.
snapshotReceipts
=
copyReceipts
(
w
.
current
.
receipts
)
w
.
snapshotState
=
w
.
current
.
state
.
Copy
()
w
.
snapshotState
=
w
.
current
.
state
.
Copy
()
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录