Jelajahi Sumber

Fixed refund model

obscuren 11 tahun lalu
induk
melakukan
3325683794
3 mengubah file dengan 18 tambahan dan 17 penghapusan
  1. 4 6
      core/state_transition.go
  2. 10 7
      state/state.go
  3. 4 4
      tests/vm/gh_test.go

+ 4 - 6
core/state_transition.go

@@ -213,12 +213,10 @@ func MakeContract(msg Message, state *state.StateDB) *state.StateObject {
 func (self *StateTransition) RefundGas() {
 	coinbaseSub := new(big.Int).Set(self.gas)
 	uhalf := new(big.Int).Div(self.GasUsed(), ethutil.Big2)
-	for addr, refs := range self.state.Refunds() {
-		for _, ref := range refs {
-			coinbaseSub.Add(self.gas, ref)
-			refund := ethutil.BigMin(uhalf, ref)
-			self.state.AddBalance([]byte(addr), refund.Mul(refund, self.msg.GasPrice()))
-		}
+	for addr, ref := range self.state.Refunds() {
+		refund := ethutil.BigMin(uhalf, ref)
+		coinbaseSub.Add(self.gas, refund)
+		self.state.AddBalance([]byte(addr), refund.Mul(refund, self.msg.GasPrice()))
 	}
 
 	coinbase, sender := self.Coinbase(), self.From()

+ 10 - 7
state/state.go

@@ -23,14 +23,14 @@ type StateDB struct {
 
 	manifest *Manifest
 
-	refund map[string][]*big.Int
+	refund map[string]*big.Int
 
 	logs Logs
 }
 
 // Create a new state from a given trie
 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() {
@@ -56,7 +56,10 @@ func (self *StateDB) GetBalance(addr []byte) *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) {
@@ -207,7 +210,7 @@ func (self *StateDB) Copy() *StateDB {
 		}
 
 		for addr, refund := range self.refund {
-			state.refund[addr] = refund
+			state.refund[addr] = new(big.Int).Set(refund)
 		}
 
 		logs := make(Logs, len(self.logs))
@@ -269,17 +272,17 @@ func (s *StateDB) Sync() {
 
 func (self *StateDB) Empty() {
 	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
 }
 
 func (self *StateDB) Update(gasUsed *big.Int) {
 	var deleted bool
 
-	self.refund = make(map[string][]*big.Int)
+	self.refund = make(map[string]*big.Int)
 
 	for _, stateObject := range self.stateObjects {
 		if stateObject.remove {

+ 4 - 4
tests/vm/gh_test.go

@@ -77,11 +77,11 @@ func RunVmTest(p string, t *testing.T) {
 	tests := make(map[string]VmTest)
 	helper.CreateFileTests(t, p, &tests)
 
-	helper.Logger.SetLogLevel(5)
+	//helper.Logger.SetLogLevel(5)
 	for name, test := range tests {
-		if name != "ABAcalls1" {
-			continue
-		}
+		//	if name != "refund50_1" {
+		//		continue
+		//	}
 		statedb := state.New(helper.NewTrie())
 		for addr, account := range test.Pre {
 			obj := StateObjectFromAccount(addr, account)