mirror of
https://gitlab.com/pulsechaincom/erigon-pulse.git
synced 2025-01-03 17:44:29 +00:00
Fixed refund model
This commit is contained in:
parent
f7287c626e
commit
3325683794
@ -213,12 +213,10 @@ func MakeContract(msg Message, state *state.StateDB) *state.StateObject {
|
|||||||
func (self *StateTransition) RefundGas() {
|
func (self *StateTransition) RefundGas() {
|
||||||
coinbaseSub := new(big.Int).Set(self.gas)
|
coinbaseSub := new(big.Int).Set(self.gas)
|
||||||
uhalf := new(big.Int).Div(self.GasUsed(), ethutil.Big2)
|
uhalf := new(big.Int).Div(self.GasUsed(), ethutil.Big2)
|
||||||
for addr, refs := range self.state.Refunds() {
|
for addr, ref := range self.state.Refunds() {
|
||||||
for _, ref := range refs {
|
refund := ethutil.BigMin(uhalf, ref)
|
||||||
coinbaseSub.Add(self.gas, ref)
|
coinbaseSub.Add(self.gas, refund)
|
||||||
refund := ethutil.BigMin(uhalf, ref)
|
self.state.AddBalance([]byte(addr), refund.Mul(refund, self.msg.GasPrice()))
|
||||||
self.state.AddBalance([]byte(addr), refund.Mul(refund, self.msg.GasPrice()))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
coinbase, sender := self.Coinbase(), self.From()
|
coinbase, sender := self.Coinbase(), self.From()
|
||||||
|
@ -23,14 +23,14 @@ type StateDB struct {
|
|||||||
|
|
||||||
manifest *Manifest
|
manifest *Manifest
|
||||||
|
|
||||||
refund map[string][]*big.Int
|
refund map[string]*big.Int
|
||||||
|
|
||||||
logs Logs
|
logs Logs
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a new state from a given trie
|
// Create a new state from a given trie
|
||||||
func New(trie *trie.Trie) *StateDB {
|
func New(trie *trie.Trie) *StateDB {
|
||||||
return &StateDB{Trie: trie, stateObjects: make(map[string]*StateObject), manifest: NewManifest(), refund: make(map[string][]*big.Int)}
|
return &StateDB{Trie: trie, stateObjects: make(map[string]*StateObject), manifest: NewManifest(), refund: make(map[string]*big.Int)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *StateDB) EmptyLogs() {
|
func (self *StateDB) EmptyLogs() {
|
||||||
@ -56,7 +56,10 @@ func (self *StateDB) GetBalance(addr []byte) *big.Int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *StateDB) Refund(addr []byte, gas *big.Int) {
|
func (self *StateDB) Refund(addr []byte, gas *big.Int) {
|
||||||
self.refund[string(addr)] = append(self.refund[string(addr)], gas)
|
if self.refund[string(addr)] == nil {
|
||||||
|
self.refund[string(addr)] = new(big.Int)
|
||||||
|
}
|
||||||
|
self.refund[string(addr)].Add(self.refund[string(addr)], gas)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *StateDB) AddBalance(addr []byte, amount *big.Int) {
|
func (self *StateDB) AddBalance(addr []byte, amount *big.Int) {
|
||||||
@ -207,7 +210,7 @@ func (self *StateDB) Copy() *StateDB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for addr, refund := range self.refund {
|
for addr, refund := range self.refund {
|
||||||
state.refund[addr] = refund
|
state.refund[addr] = new(big.Int).Set(refund)
|
||||||
}
|
}
|
||||||
|
|
||||||
logs := make(Logs, len(self.logs))
|
logs := make(Logs, len(self.logs))
|
||||||
@ -269,17 +272,17 @@ func (s *StateDB) Sync() {
|
|||||||
|
|
||||||
func (self *StateDB) Empty() {
|
func (self *StateDB) Empty() {
|
||||||
self.stateObjects = make(map[string]*StateObject)
|
self.stateObjects = make(map[string]*StateObject)
|
||||||
self.refund = make(map[string][]*big.Int)
|
self.refund = make(map[string]*big.Int)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *StateDB) Refunds() map[string][]*big.Int {
|
func (self *StateDB) Refunds() map[string]*big.Int {
|
||||||
return self.refund
|
return self.refund
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *StateDB) Update(gasUsed *big.Int) {
|
func (self *StateDB) Update(gasUsed *big.Int) {
|
||||||
var deleted bool
|
var deleted bool
|
||||||
|
|
||||||
self.refund = make(map[string][]*big.Int)
|
self.refund = make(map[string]*big.Int)
|
||||||
|
|
||||||
for _, stateObject := range self.stateObjects {
|
for _, stateObject := range self.stateObjects {
|
||||||
if stateObject.remove {
|
if stateObject.remove {
|
||||||
|
@ -77,11 +77,11 @@ func RunVmTest(p string, t *testing.T) {
|
|||||||
tests := make(map[string]VmTest)
|
tests := make(map[string]VmTest)
|
||||||
helper.CreateFileTests(t, p, &tests)
|
helper.CreateFileTests(t, p, &tests)
|
||||||
|
|
||||||
helper.Logger.SetLogLevel(5)
|
//helper.Logger.SetLogLevel(5)
|
||||||
for name, test := range tests {
|
for name, test := range tests {
|
||||||
if name != "ABAcalls1" {
|
// if name != "refund50_1" {
|
||||||
continue
|
// continue
|
||||||
}
|
// }
|
||||||
statedb := state.New(helper.NewTrie())
|
statedb := state.New(helper.NewTrie())
|
||||||
for addr, account := range test.Pre {
|
for addr, account := range test.Pre {
|
||||||
obj := StateObjectFromAccount(addr, account)
|
obj := StateObjectFromAccount(addr, account)
|
||||||
|
Loading…
Reference in New Issue
Block a user