diff --git a/ethchain/closure.go b/ethchain/closure.go index 32b297e903..966e8254a0 100644 --- a/ethchain/closure.go +++ b/ethchain/closure.go @@ -10,7 +10,7 @@ import ( type ClosureRef interface { ReturnGas(*big.Int, *big.Int, *State) Address() []byte - GetMem(*big.Int) *ethutil.Value + GetStorage(*big.Int) *ethutil.Value SetStorage(*big.Int, *ethutil.Value) N() *big.Int } @@ -43,8 +43,8 @@ func NewClosure(caller ClosureRef, object *StateObject, script []byte, state *St } // Retuns the x element in data slice -func (c *Closure) GetMem(x *big.Int) *ethutil.Value { - m := c.object.GetMem(x) +func (c *Closure) GetStorage(x *big.Int) *ethutil.Value { + m := c.object.GetStorage(x) if m == nil { return ethutil.EmptyValue() } diff --git a/ethchain/state.go b/ethchain/state.go index 8b6c2efb82..3d05ff582c 100644 --- a/ethchain/state.go +++ b/ethchain/state.go @@ -66,7 +66,11 @@ func (self *State) Empty() { func (self *State) Update() { for _, stateObject := range self.stateObjects { - self.UpdateStateObject(stateObject) + if stateObject.remove { + self.trie.Delete(string(stateObject.Address())) + } else { + self.UpdateStateObject(stateObject) + } } } diff --git a/ethchain/state_object.go b/ethchain/state_object.go index 35928c8996..cc9a801f9a 100644 --- a/ethchain/state_object.go +++ b/ethchain/state_object.go @@ -31,6 +31,11 @@ type StateObject struct { // left if this object is the coinbase. Gas is directly // purchased of the coinbase. gasPool *big.Int + + // Mark for deletion + // When an object is marked for deletion it will be delete from the trie + // during the "update" phase of the state transition + remove bool } // Converts an transaction in to a state object @@ -77,15 +82,11 @@ func NewStateObjectFromBytes(address, data []byte) *StateObject { return object } -func (c *StateObject) State() *State { - return c.state -} - -func (c *StateObject) N() *big.Int { - return big.NewInt(int64(c.Nonce)) +func (self *StateObject) MarkForDeletion() { + self.remove = true } -func (c *StateObject) Addr(addr []byte) *ethutil.Value { +func (c *StateObject) GetAddr(addr []byte) *ethutil.Value { return ethutil.NewValueFromBytes([]byte(c.state.trie.Get(string(addr)))) } @@ -108,12 +109,7 @@ func (c *StateObject) SetStorage(num *big.Int, val *ethutil.Value) { func (c *StateObject) GetStorage(num *big.Int) *ethutil.Value { nb := ethutil.BigToBytes(num, 256) - return c.Addr(nb) -} - -/* DEPRECATED */ -func (c *StateObject) GetMem(num *big.Int) *ethutil.Value { - return c.GetStorage(num) + return c.GetAddr(nb) } func (c *StateObject) GetInstr(pc *big.Int) *ethutil.Value { @@ -124,14 +120,6 @@ func (c *StateObject) GetInstr(pc *big.Int) *ethutil.Value { return ethutil.NewValueFromBytes([]byte{c.script[pc.Int64()]}) } -// Return the gas back to the origin. Used by the Virtual machine or Closures -func (c *StateObject) ReturnGas(gas, price *big.Int, state *State) { - /* - remainder := new(big.Int).Mul(gas, price) - c.AddAmount(remainder) - */ -} - func (c *StateObject) AddAmount(amount *big.Int) { c.SetAmount(new(big.Int).Add(c.Amount, amount)) @@ -148,6 +136,12 @@ func (c *StateObject) SetAmount(amount *big.Int) { c.Amount = amount } +// +// Gas setters and getters +// + +// Return the gas back to the origin. Used by the Virtual machine or Closures +func (c *StateObject) ReturnGas(gas, price *big.Int, state *State) {} func (c *StateObject) ConvertGas(gas, price *big.Int) error { total := new(big.Int).Mul(gas, price) if total.Cmp(c.Amount) > 0 { @@ -206,26 +200,17 @@ func (self *StateObject) Set(stateObject *StateObject) { self = stateObject } -/* -func (self *StateObject) Copy() *StateObject { - stCopy := &StateObject{} - stCopy.address = make([]byte, len(self.address)) - copy(stCopy.address, self.address) - stCopy.Amount = new(big.Int).Set(self.Amount) - stCopy.ScriptHash = make([]byte, len(self.ScriptHash)) - copy(stCopy.ScriptHash, self.ScriptHash) - stCopy.Nonce = self.Nonce - if self.state != nil { - stCopy.state = self.state.Copy() - } - stCopy.script = make([]byte, len(self.script)) - copy(stCopy.script, self.script) - stCopy.initScript = make([]byte, len(self.initScript)) - copy(stCopy.initScript, self.initScript) +// +// Attribute accessors +// + +func (c *StateObject) State() *State { + return c.state +} - return stCopy +func (c *StateObject) N() *big.Int { + return big.NewInt(int64(c.Nonce)) } -*/ // Returns the address of the contract/account func (c *StateObject) Address() []byte { @@ -242,6 +227,10 @@ func (c *StateObject) Init() Code { return c.initScript } +// +// Encoding +// + // State object encoding methods func (c *StateObject) RlpEncode() []byte { var root interface{} diff --git a/ethpub/pub.go b/ethpub/pub.go index ee4c07cf1c..4845b1d13a 100644 --- a/ethpub/pub.go +++ b/ethpub/pub.go @@ -166,7 +166,7 @@ func (lib *PEthereum) Create(key, valueStr, gasStr, gasPriceStr, script string) return lib.createTx(key, "", valueStr, gasStr, gasPriceStr, script) } -func GetAddressFromNameReg(stateManager *ethchain.StateManager, name string) []byte { +func FindAddressInNameReg(stateManager *ethchain.StateManager, name string) []byte { nameReg := EthereumConfig(stateManager).NameReg() if nameReg != nil { addr := ethutil.RightPadBytes([]byte(name), 32) @@ -186,7 +186,7 @@ func (lib *PEthereum) createTx(key, recipient, valueStr, gasStr, gasPriceStr, sc contractCreation = true } else { // Check if an address is stored by this address - addr := GetAddressFromNameReg(lib.stateManager, recipient) + addr := FindAddressInNameReg(lib.stateManager, recipient) if len(addr) > 0 { hash = addr } else { diff --git a/ethpub/types.go b/ethpub/types.go index 05031dea23..5d41269c88 100644 --- a/ethpub/types.go +++ b/ethpub/types.go @@ -164,7 +164,7 @@ func (c *PStateObject) GetStorage(address string) string { // still has some magical object so we can't rely on // undefined or null at the QML side if c.object != nil { - val := c.object.GetMem(ethutil.Big("0x" + address)) + val := c.object.GetStorage(ethutil.Big("0x" + address)) return val.BigInt().String() }