forked from cerc-io/plugeth
commit
2497f28aa9
@ -37,12 +37,11 @@ type blockPriceInfo struct {
|
|||||||
type GasPriceOracle struct {
|
type GasPriceOracle struct {
|
||||||
eth *Ethereum
|
eth *Ethereum
|
||||||
chain *core.ChainManager
|
chain *core.ChainManager
|
||||||
pool *core.TxPool
|
|
||||||
events event.Subscription
|
events event.Subscription
|
||||||
blocks map[uint64]*blockPriceInfo
|
blocks map[uint64]*blockPriceInfo
|
||||||
firstProcessed, lastProcessed uint64
|
firstProcessed, lastProcessed uint64
|
||||||
lastBaseMutex sync.Mutex
|
lastBaseMutex sync.Mutex
|
||||||
lastBase *big.Int
|
lastBase, minBase *big.Int
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewGasPriceOracle(eth *Ethereum) (self *GasPriceOracle) {
|
func NewGasPriceOracle(eth *Ethereum) (self *GasPriceOracle) {
|
||||||
@ -50,13 +49,15 @@ func NewGasPriceOracle(eth *Ethereum) (self *GasPriceOracle) {
|
|||||||
self.blocks = make(map[uint64]*blockPriceInfo)
|
self.blocks = make(map[uint64]*blockPriceInfo)
|
||||||
self.eth = eth
|
self.eth = eth
|
||||||
self.chain = eth.chainManager
|
self.chain = eth.chainManager
|
||||||
self.pool = eth.txPool
|
|
||||||
self.events = eth.EventMux().Subscribe(
|
self.events = eth.EventMux().Subscribe(
|
||||||
core.ChainEvent{},
|
core.ChainEvent{},
|
||||||
core.ChainSplitEvent{},
|
core.ChainSplitEvent{},
|
||||||
core.TxPreEvent{},
|
|
||||||
core.TxPostEvent{},
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
minbase := new(big.Int).Mul(self.eth.GpoMinGasPrice, big.NewInt(100))
|
||||||
|
minbase = minbase.Div(minbase, big.NewInt(int64(self.eth.GpobaseCorrectionFactor)))
|
||||||
|
self.minBase = minbase
|
||||||
|
|
||||||
self.processPastBlocks()
|
self.processPastBlocks()
|
||||||
go self.listenLoop()
|
go self.listenLoop()
|
||||||
return
|
return
|
||||||
@ -93,8 +94,6 @@ func (self *GasPriceOracle) listenLoop() {
|
|||||||
self.processBlock(ev.Block)
|
self.processBlock(ev.Block)
|
||||||
case core.ChainSplitEvent:
|
case core.ChainSplitEvent:
|
||||||
self.processBlock(ev.Block)
|
self.processBlock(ev.Block)
|
||||||
case core.TxPreEvent:
|
|
||||||
case core.TxPostEvent:
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.events.Unsubscribe()
|
self.events.Unsubscribe()
|
||||||
@ -131,6 +130,10 @@ func (self *GasPriceOracle) processBlock(block *types.Block) {
|
|||||||
newBase := new(big.Int).Mul(lastBase, big.NewInt(1000000+crand))
|
newBase := new(big.Int).Mul(lastBase, big.NewInt(1000000+crand))
|
||||||
newBase.Div(newBase, big.NewInt(1000000))
|
newBase.Div(newBase, big.NewInt(1000000))
|
||||||
|
|
||||||
|
if newBase.Cmp(self.minBase) < 0 {
|
||||||
|
newBase = self.minBase
|
||||||
|
}
|
||||||
|
|
||||||
bpi := self.blocks[i]
|
bpi := self.blocks[i]
|
||||||
if bpi == nil {
|
if bpi == nil {
|
||||||
bpi = &blockPriceInfo{}
|
bpi = &blockPriceInfo{}
|
||||||
@ -146,7 +149,7 @@ func (self *GasPriceOracle) processBlock(block *types.Block) {
|
|||||||
|
|
||||||
// returns the lowers possible price with which a tx was or could have been included
|
// returns the lowers possible price with which a tx was or could have been included
|
||||||
func (self *GasPriceOracle) lowestPrice(block *types.Block) *big.Int {
|
func (self *GasPriceOracle) lowestPrice(block *types.Block) *big.Int {
|
||||||
gasUsed := new(big.Int)
|
gasUsed := big.NewInt(0)
|
||||||
|
|
||||||
receipts := self.eth.BlockProcessor().GetBlockReceipts(block.Hash())
|
receipts := self.eth.BlockProcessor().GetBlockReceipts(block.Hash())
|
||||||
if len(receipts) > 0 {
|
if len(receipts) > 0 {
|
||||||
@ -158,12 +161,12 @@ func (self *GasPriceOracle) lowestPrice(block *types.Block) *big.Int {
|
|||||||
if new(big.Int).Mul(gasUsed, big.NewInt(100)).Cmp(new(big.Int).Mul(block.GasLimit(),
|
if new(big.Int).Mul(gasUsed, big.NewInt(100)).Cmp(new(big.Int).Mul(block.GasLimit(),
|
||||||
big.NewInt(int64(self.eth.GpoFullBlockRatio)))) < 0 {
|
big.NewInt(int64(self.eth.GpoFullBlockRatio)))) < 0 {
|
||||||
// block is not full, could have posted a tx with MinGasPrice
|
// block is not full, could have posted a tx with MinGasPrice
|
||||||
return self.eth.GpoMinGasPrice
|
return big.NewInt(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
txs := block.Transactions()
|
txs := block.Transactions()
|
||||||
if len(txs) == 0 {
|
if len(txs) == 0 {
|
||||||
return self.eth.GpoMinGasPrice
|
return big.NewInt(0)
|
||||||
}
|
}
|
||||||
// block is full, find smallest gasPrice
|
// block is full, find smallest gasPrice
|
||||||
minPrice := txs[0].GasPrice()
|
minPrice := txs[0].GasPrice()
|
||||||
|
Loading…
Reference in New Issue
Block a user