| 
									
										
										
										
											2014-10-31 14:43:14 +01:00
										 |  |  | package state | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2014-07-30 00:31:15 +02:00
										 |  |  | 	"math/big" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 12:37:43 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/crypto" | 
					
						
							| 
									
										
										
										
											2014-10-23 15:01:27 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/ethutil" | 
					
						
							| 
									
										
										
										
											2015-01-08 11:47:04 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/trie" | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type Code []byte | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self Code) String() string { | 
					
						
							| 
									
										
										
										
											2014-07-22 15:57:54 +02:00
										 |  |  | 	return string(self) //strings.Join(Disassemble(self), " ") | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type Storage map[string]*ethutil.Value | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self Storage) Copy() Storage { | 
					
						
							|  |  |  | 	cpy := make(Storage) | 
					
						
							|  |  |  | 	for key, value := range self { | 
					
						
							|  |  |  | 		// XXX Do we need a 'value' copy or is this sufficient? | 
					
						
							|  |  |  | 		cpy[key] = value | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return cpy | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type StateObject struct { | 
					
						
							| 
									
										
										
										
											2015-01-07 13:17:48 +01:00
										 |  |  | 	db ethutil.Database | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	// Address of the object | 
					
						
							|  |  |  | 	address []byte | 
					
						
							|  |  |  | 	// Shared attributes | 
					
						
							| 
									
										
										
										
											2014-10-22 15:22:21 +02:00
										 |  |  | 	balance  *big.Int | 
					
						
							| 
									
										
										
										
											2014-09-15 15:42:12 +02:00
										 |  |  | 	codeHash []byte | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	Nonce    uint64 | 
					
						
							|  |  |  | 	// Contract related attributes | 
					
						
							| 
									
										
										
										
											2014-12-04 11:40:20 +01:00
										 |  |  | 	State    *StateDB | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	Code     Code | 
					
						
							| 
									
										
										
										
											2014-07-24 12:04:15 +02:00
										 |  |  | 	InitCode Code | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	storage Storage | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Total gas pool is the total amount of gas currently | 
					
						
							|  |  |  | 	// 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 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *StateObject) Reset() { | 
					
						
							|  |  |  | 	self.storage = make(Storage) | 
					
						
							| 
									
										
										
										
											2014-07-24 12:04:15 +02:00
										 |  |  | 	self.State.Reset() | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-07 13:17:48 +01:00
										 |  |  | func NewStateObject(addr []byte, db ethutil.Database) *StateObject { | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	// This to ensure that it has 20 bytes (and not 0 bytes), thus left or right pad doesn't matter. | 
					
						
							|  |  |  | 	address := ethutil.Address(addr) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-07 13:17:48 +01:00
										 |  |  | 	object := &StateObject{db: db, address: address, balance: new(big.Int), gasPool: new(big.Int)} | 
					
						
							|  |  |  | 	object.State = New(nil, db) //New(trie.New(ethutil.Config.Db, "")) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	object.storage = make(Storage) | 
					
						
							|  |  |  | 	object.gasPool = new(big.Int) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return object | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-07 13:17:48 +01:00
										 |  |  | func NewStateObjectFromBytes(address, data []byte, db ethutil.Database) *StateObject { | 
					
						
							|  |  |  | 	object := &StateObject{address: address, db: db} | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	object.RlpDecode(data) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return object | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *StateObject) MarkForDeletion() { | 
					
						
							|  |  |  | 	self.remove = true | 
					
						
							| 
									
										
										
										
											2014-10-22 15:22:21 +02:00
										 |  |  | 	statelogger.DebugDetailf("%x: #%d %v (deletion)\n", self.Address(), self.Nonce, self.balance) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-23 18:35:36 +01:00
										 |  |  | func (c *StateObject) getAddr(addr []byte) *ethutil.Value { | 
					
						
							|  |  |  | 	return ethutil.NewValueFromBytes([]byte(c.State.trie.Get(addr))) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-23 18:35:36 +01:00
										 |  |  | func (c *StateObject) setAddr(addr []byte, value interface{}) { | 
					
						
							|  |  |  | 	c.State.trie.Update(addr, ethutil.Encode(value)) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *StateObject) GetStorage(key *big.Int) *ethutil.Value { | 
					
						
							| 
									
										
										
										
											2014-10-15 17:12:26 +02:00
										 |  |  | 	return self.GetState(key.Bytes()) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | func (self *StateObject) SetStorage(key *big.Int, value *ethutil.Value) { | 
					
						
							| 
									
										
										
										
											2014-10-15 17:12:26 +02:00
										 |  |  | 	self.SetState(key.Bytes(), value) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-16 13:38:21 +02:00
										 |  |  | func (self *StateObject) Storage() map[string]*ethutil.Value { | 
					
						
							|  |  |  | 	return self.storage | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-15 17:12:26 +02:00
										 |  |  | func (self *StateObject) GetState(k []byte) *ethutil.Value { | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	key := ethutil.LeftPadBytes(k, 32) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	value := self.storage[string(key)] | 
					
						
							|  |  |  | 	if value == nil { | 
					
						
							| 
									
										
										
										
											2014-12-23 18:35:36 +01:00
										 |  |  | 		value = self.getAddr(key) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if !value.IsNil() { | 
					
						
							|  |  |  | 			self.storage[string(key)] = value | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return value | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-15 17:12:26 +02:00
										 |  |  | func (self *StateObject) SetState(k []byte, value *ethutil.Value) { | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	key := ethutil.LeftPadBytes(k, 32) | 
					
						
							|  |  |  | 	self.storage[string(key)] = value.Copy() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *StateObject) Sync() { | 
					
						
							|  |  |  | 	for key, value := range self.storage { | 
					
						
							| 
									
										
										
										
											2014-11-19 15:05:08 +01:00
										 |  |  | 		if value.Len() == 0 { | 
					
						
							| 
									
										
										
										
											2014-12-23 18:35:36 +01:00
										 |  |  | 			self.State.trie.Delete([]byte(key)) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-23 18:35:36 +01:00
										 |  |  | 		self.setAddr([]byte(key), value) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c *StateObject) GetInstr(pc *big.Int) *ethutil.Value { | 
					
						
							|  |  |  | 	if int64(len(c.Code)-1) < pc.Int64() { | 
					
						
							|  |  |  | 		return ethutil.NewValue(0) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ethutil.NewValueFromBytes([]byte{c.Code[pc.Int64()]}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-22 15:22:21 +02:00
										 |  |  | func (c *StateObject) AddBalance(amount *big.Int) { | 
					
						
							|  |  |  | 	c.SetBalance(new(big.Int).Add(c.balance, amount)) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-22 15:22:21 +02:00
										 |  |  | 	statelogger.Debugf("%x: #%d %v (+ %v)\n", c.Address(), c.Nonce, c.balance, amount) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-10-22 15:22:21 +02:00
										 |  |  | func (c *StateObject) AddAmount(amount *big.Int) { c.AddBalance(amount) } | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-22 15:22:21 +02:00
										 |  |  | func (c *StateObject) SubBalance(amount *big.Int) { | 
					
						
							|  |  |  | 	c.SetBalance(new(big.Int).Sub(c.balance, amount)) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-22 15:22:21 +02:00
										 |  |  | 	statelogger.Debugf("%x: #%d %v (- %v)\n", c.Address(), c.Nonce, c.balance, amount) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-10-22 15:22:21 +02:00
										 |  |  | func (c *StateObject) SubAmount(amount *big.Int) { c.SubBalance(amount) } | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-30 00:31:15 +02:00
										 |  |  | func (c *StateObject) SetBalance(amount *big.Int) { | 
					
						
							| 
									
										
										
										
											2014-10-22 15:22:21 +02:00
										 |  |  | 	c.balance = amount | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-22 15:22:21 +02:00
										 |  |  | func (self *StateObject) Balance() *big.Int { return self.balance } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | // | 
					
						
							|  |  |  | // 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) {} | 
					
						
							|  |  |  | func (c *StateObject) ConvertGas(gas, price *big.Int) error { | 
					
						
							|  |  |  | 	total := new(big.Int).Mul(gas, price) | 
					
						
							| 
									
										
										
										
											2014-10-22 15:22:21 +02:00
										 |  |  | 	if total.Cmp(c.balance) > 0 { | 
					
						
							|  |  |  | 		return fmt.Errorf("insufficient amount: %v, %v", c.balance, total) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	c.SubAmount(total) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *StateObject) SetGasPool(gasLimit *big.Int) { | 
					
						
							|  |  |  | 	self.gasPool = new(big.Int).Set(gasLimit) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-01 20:18:09 +01:00
										 |  |  | 	statelogger.Debugf("%x: gas (+ %v)", self.Address(), self.gasPool) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *StateObject) BuyGas(gas, price *big.Int) error { | 
					
						
							|  |  |  | 	if self.gasPool.Cmp(gas) < 0 { | 
					
						
							|  |  |  | 		return GasLimitError(self.gasPool, gas) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	rGas := new(big.Int).Set(gas) | 
					
						
							|  |  |  | 	rGas.Mul(rGas, price) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	self.AddAmount(rGas) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *StateObject) RefundGas(gas, price *big.Int) { | 
					
						
							|  |  |  | 	self.gasPool.Add(self.gasPool, gas) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	rGas := new(big.Int).Set(gas) | 
					
						
							|  |  |  | 	rGas.Mul(rGas, price) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-22 15:22:21 +02:00
										 |  |  | 	self.balance.Sub(self.balance, rGas) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *StateObject) Copy() *StateObject { | 
					
						
							| 
									
										
										
										
											2015-01-07 13:17:48 +01:00
										 |  |  | 	stateObject := NewStateObject(self.Address(), self.db) | 
					
						
							| 
									
										
										
										
											2014-10-22 15:22:21 +02:00
										 |  |  | 	stateObject.balance.Set(self.balance) | 
					
						
							| 
									
										
										
										
											2014-09-15 15:42:12 +02:00
										 |  |  | 	stateObject.codeHash = ethutil.CopyBytes(self.codeHash) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	stateObject.Nonce = self.Nonce | 
					
						
							| 
									
										
										
										
											2014-07-24 12:04:15 +02:00
										 |  |  | 	if self.State != nil { | 
					
						
							|  |  |  | 		stateObject.State = self.State.Copy() | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	stateObject.Code = ethutil.CopyBytes(self.Code) | 
					
						
							| 
									
										
										
										
											2014-07-24 12:04:15 +02:00
										 |  |  | 	stateObject.InitCode = ethutil.CopyBytes(self.InitCode) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	stateObject.storage = self.storage.Copy() | 
					
						
							|  |  |  | 	stateObject.gasPool.Set(self.gasPool) | 
					
						
							| 
									
										
										
										
											2014-08-25 11:29:42 +02:00
										 |  |  | 	stateObject.remove = self.remove | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return stateObject | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *StateObject) Set(stateObject *StateObject) { | 
					
						
							|  |  |  | 	*self = *stateObject | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // Attribute accessors | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c *StateObject) N() *big.Int { | 
					
						
							|  |  |  | 	return big.NewInt(int64(c.Nonce)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Returns the address of the contract/account | 
					
						
							|  |  |  | func (c *StateObject) Address() []byte { | 
					
						
							|  |  |  | 	return c.address | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Returns the initialization Code | 
					
						
							|  |  |  | func (c *StateObject) Init() Code { | 
					
						
							| 
									
										
										
										
											2014-07-24 12:04:15 +02:00
										 |  |  | 	return c.InitCode | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-08 11:47:04 +01:00
										 |  |  | func (self *StateObject) Trie() *trie.Trie { | 
					
						
							| 
									
										
										
										
											2014-12-23 18:35:36 +01:00
										 |  |  | 	return self.State.trie | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-03 23:45:44 +01:00
										 |  |  | func (self *StateObject) Root() []byte { | 
					
						
							| 
									
										
										
										
											2014-12-23 18:35:36 +01:00
										 |  |  | 	return self.Trie().Root() | 
					
						
							| 
									
										
										
										
											2014-11-03 23:45:44 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-03 17:06:54 +01:00
										 |  |  | func (self *StateObject) SetCode(code []byte) { | 
					
						
							|  |  |  | 	self.Code = code | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | // | 
					
						
							|  |  |  | // Encoding | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // State object encoding methods | 
					
						
							|  |  |  | func (c *StateObject) RlpEncode() []byte { | 
					
						
							| 
									
										
										
										
											2014-11-12 01:36:36 +01:00
										 |  |  | 	return ethutil.Encode([]interface{}{c.Nonce, c.balance, c.Root(), c.CodeHash()}) | 
					
						
							| 
									
										
										
										
											2014-09-15 15:42:12 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c *StateObject) CodeHash() ethutil.Bytes { | 
					
						
							| 
									
										
										
										
											2014-11-03 00:31:15 +01:00
										 |  |  | 	return crypto.Sha3(c.Code) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c *StateObject) RlpDecode(data []byte) { | 
					
						
							|  |  |  | 	decoder := ethutil.NewValueFromBytes(data) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	c.Nonce = decoder.Get(0).Uint() | 
					
						
							| 
									
										
										
										
											2014-10-22 15:22:21 +02:00
										 |  |  | 	c.balance = decoder.Get(1).BigInt() | 
					
						
							| 
									
										
										
										
											2015-01-07 13:17:48 +01:00
										 |  |  | 	c.State = New(decoder.Get(2).Bytes(), c.db) //New(trie.New(ethutil.Config.Db, decoder.Get(2).Interface())) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	c.storage = make(map[string]*ethutil.Value) | 
					
						
							|  |  |  | 	c.gasPool = new(big.Int) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-15 15:42:12 +02:00
										 |  |  | 	c.codeHash = decoder.Get(3).Bytes() | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-07 13:17:48 +01:00
										 |  |  | 	c.Code, _ = c.db.Get(c.codeHash) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Storage change object. Used by the manifest for notifying changes to | 
					
						
							|  |  |  | // the sub channels. | 
					
						
							|  |  |  | type StorageState struct { | 
					
						
							|  |  |  | 	StateAddress []byte | 
					
						
							|  |  |  | 	Address      []byte | 
					
						
							|  |  |  | 	Value        *big.Int | 
					
						
							|  |  |  | } |