|
|
@@ -23,14 +23,14 @@ type State struct {
|
|
|
|
|
|
manifest *Manifest
|
|
|
|
|
|
- refund map[string]*big.Int
|
|
|
+ refund map[string][]refund
|
|
|
|
|
|
logs Logs
|
|
|
}
|
|
|
|
|
|
// Create a new state from a given trie
|
|
|
func New(trie *trie.Trie) *State {
|
|
|
- return &State{Trie: trie, stateObjects: make(map[string]*StateObject), manifest: NewManifest(), refund: make(map[string]*big.Int)}
|
|
|
+ return &State{Trie: trie, stateObjects: make(map[string]*StateObject), manifest: NewManifest(), refund: make(map[string][]refund)}
|
|
|
}
|
|
|
|
|
|
func (self *State) EmptyLogs() {
|
|
|
@@ -55,14 +55,12 @@ func (self *State) GetBalance(addr []byte) *big.Int {
|
|
|
return ethutil.Big0
|
|
|
}
|
|
|
|
|
|
-func (self *State) Refund(addr []byte, gas, price *big.Int) {
|
|
|
- amount := new(big.Int).Mul(gas, price)
|
|
|
-
|
|
|
- if self.refund[string(addr)] == nil {
|
|
|
- self.refund[string(addr)] = new(big.Int)
|
|
|
- }
|
|
|
+type refund struct {
|
|
|
+ gas, price *big.Int
|
|
|
+}
|
|
|
|
|
|
- self.refund[string(addr)].Add(self.refund[string(addr)], amount)
|
|
|
+func (self *State) Refund(addr []byte, gas, price *big.Int) {
|
|
|
+ self.refund[string(addr)] = append(self.refund[string(addr)], refund{gas, price})
|
|
|
}
|
|
|
|
|
|
func (self *State) AddBalance(addr []byte, amount *big.Int) {
|
|
|
@@ -276,15 +274,20 @@ func (s *State) Sync() {
|
|
|
|
|
|
func (self *State) Empty() {
|
|
|
self.stateObjects = make(map[string]*StateObject)
|
|
|
- self.refund = make(map[string]*big.Int)
|
|
|
+ self.refund = make(map[string][]refund)
|
|
|
}
|
|
|
|
|
|
-func (self *State) Update() {
|
|
|
+func (self *State) Update(gasUsed *big.Int) {
|
|
|
var deleted bool
|
|
|
|
|
|
// Refund any gas that's left
|
|
|
- for addr, amount := range self.refund {
|
|
|
- self.GetStateObject([]byte(addr)).AddBalance(amount)
|
|
|
+ uhalf := new(big.Int).Div(gasUsed, ethutil.Big2)
|
|
|
+ for addr, refs := range self.refund {
|
|
|
+ for _, ref := range refs {
|
|
|
+ refund := ethutil.BigMin(uhalf, ref.gas)
|
|
|
+
|
|
|
+ self.GetStateObject([]byte(addr)).AddBalance(refund.Mul(refund, ref.price))
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
for _, stateObject := range self.stateObjects {
|