Log is now interface
This commit is contained in:
		| @@ -62,7 +62,7 @@ func main() { | ||||
|  | ||||
| 	logger.AddLogSystem(logger.NewStdLogSystem(os.Stdout, log.LstdFlags, logger.LogLevel(*loglevel))) | ||||
|  | ||||
| 	ethutil.ReadConfig("/tm/evmtest", "/tmp/evm", "") | ||||
| 	ethutil.ReadConfig("/tmp/evmtest", "/tmp/evm", "") | ||||
|  | ||||
| 	db, _ := ethdb.NewMemDatabase() | ||||
| 	statedb := state.New(trie.New(db, "")) | ||||
|   | ||||
| @@ -41,7 +41,7 @@ func (self *VMEnv) State() *state.StateDB { return self.state } | ||||
| func (self *VMEnv) GasLimit() *big.Int    { return self.block.GasLimit } | ||||
| func (self *VMEnv) Depth() int            { return self.depth } | ||||
| func (self *VMEnv) SetDepth(i int)        { self.depth = i } | ||||
| func (self *VMEnv) AddLog(log *state.Log) { | ||||
| func (self *VMEnv) AddLog(log state.Log) { | ||||
| 	self.state.AddLog(log) | ||||
| } | ||||
| func (self *VMEnv) Transfer(from, to vm.Account, amount *big.Int) error { | ||||
|   | ||||
| @@ -20,8 +20,8 @@ func CreateBloom(receipts Receipts) []byte { | ||||
| func LogsBloom(logs state.Logs) *big.Int { | ||||
| 	bin := new(big.Int) | ||||
| 	for _, log := range logs { | ||||
| 		data := [][]byte{log.Address} | ||||
| 		for _, topic := range log.Topics { | ||||
| 		data := [][]byte{log.Address()} | ||||
| 		for _, topic := range log.Topics() { | ||||
| 			data = append(data, topic) | ||||
| 		} | ||||
|  | ||||
|   | ||||
| @@ -35,7 +35,7 @@ func (self *VMEnv) State() *state.StateDB { return self.state } | ||||
| func (self *VMEnv) GasLimit() *big.Int    { return self.block.GasLimit } | ||||
| func (self *VMEnv) Depth() int            { return self.depth } | ||||
| func (self *VMEnv) SetDepth(i int)        { self.depth = i } | ||||
| func (self *VMEnv) AddLog(log *state.Log) { | ||||
| func (self *VMEnv) AddLog(log state.Log) { | ||||
| 	self.state.AddLog(log) | ||||
| } | ||||
| func (self *VMEnv) Transfer(from, to vm.Account, amount *big.Int) error { | ||||
|   | ||||
							
								
								
									
										61
									
								
								state/log.go
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								state/log.go
									
									
									
									
									
								
							| @@ -2,40 +2,63 @@ package state | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/ethereum/go-ethereum/ethutil" | ||||
| ) | ||||
|  | ||||
| type Log struct { | ||||
| 	Address []byte | ||||
| 	Topics  [][]byte | ||||
| 	Data    []byte | ||||
| type Log interface { | ||||
| 	ethutil.RlpEncodable | ||||
|  | ||||
| 	Address() []byte | ||||
| 	Topics() [][]byte | ||||
| 	Data() []byte | ||||
| } | ||||
|  | ||||
| func NewLogFromValue(decoder *ethutil.Value) *Log { | ||||
| 	log := &Log{ | ||||
| 		Address: decoder.Get(0).Bytes(), | ||||
| 		Data:    decoder.Get(2).Bytes(), | ||||
| type StateLog struct { | ||||
| 	address []byte | ||||
| 	topics  [][]byte | ||||
| 	data    []byte | ||||
| } | ||||
|  | ||||
| func NewLog(address []byte, topics [][]byte, data []byte) *StateLog { | ||||
| 	return &StateLog{address, topics, data} | ||||
| } | ||||
|  | ||||
| func (self *StateLog) Address() []byte { | ||||
| 	return self.address | ||||
| } | ||||
|  | ||||
| func (self *StateLog) Topics() [][]byte { | ||||
| 	return self.topics | ||||
| } | ||||
|  | ||||
| func (self *StateLog) Data() []byte { | ||||
| 	return self.data | ||||
| } | ||||
|  | ||||
| func NewLogFromValue(decoder *ethutil.Value) *StateLog { | ||||
| 	log := &StateLog{ | ||||
| 		address: decoder.Get(0).Bytes(), | ||||
| 		data:    decoder.Get(2).Bytes(), | ||||
| 	} | ||||
|  | ||||
| 	it := decoder.Get(1).NewIterator() | ||||
| 	for it.Next() { | ||||
| 		log.Topics = append(log.Topics, it.Value().Bytes()) | ||||
| 		log.topics = append(log.topics, it.Value().Bytes()) | ||||
| 	} | ||||
|  | ||||
| 	return log | ||||
| } | ||||
|  | ||||
| func (self *Log) RlpData() interface{} { | ||||
| 	return []interface{}{self.Address, ethutil.ByteSliceToInterface(self.Topics), self.Data} | ||||
| func (self *StateLog) RlpData() interface{} { | ||||
| 	return []interface{}{self.address, ethutil.ByteSliceToInterface(self.topics), self.data} | ||||
| } | ||||
|  | ||||
| func (self *Log) String() string { | ||||
| 	return fmt.Sprintf(`log: %x %x %x`, self.Address, self.Topics, self.Data) | ||||
| func (self *StateLog) String() string { | ||||
| 	return fmt.Sprintf(`log: %x %x %x`, self.address, self.topics, self.data) | ||||
| } | ||||
|  | ||||
| type Logs []*Log | ||||
| type Logs []Log | ||||
|  | ||||
| func (self Logs) RlpData() interface{} { | ||||
| 	data := make([]interface{}, len(self)) | ||||
| @@ -46,10 +69,10 @@ func (self Logs) RlpData() interface{} { | ||||
| 	return data | ||||
| } | ||||
|  | ||||
| func (self Logs) String() string { | ||||
| 	var logs []string | ||||
| func (self Logs) String() (ret string) { | ||||
| 	for _, log := range self { | ||||
| 		logs = append(logs, log.String()) | ||||
| 		ret += fmt.Sprintf("%v", log) | ||||
| 	} | ||||
| 	return "[ " + strings.Join(logs, ", ") + " ]" | ||||
|  | ||||
| 	return "[" + ret + "]" | ||||
| } | ||||
|   | ||||
| @@ -37,7 +37,7 @@ func (self *StateDB) EmptyLogs() { | ||||
| 	self.logs = nil | ||||
| } | ||||
|  | ||||
| func (self *StateDB) AddLog(log *Log) { | ||||
| func (self *StateDB) AddLog(log Log) { | ||||
| 	self.logs = append(self.logs, log) | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -57,7 +57,7 @@ func (self *Env) Difficulty() *big.Int  { return self.difficulty } | ||||
| func (self *Env) BlockHash() []byte     { return nil } | ||||
| func (self *Env) State() *state.StateDB { return self.state } | ||||
| func (self *Env) GasLimit() *big.Int    { return self.gasLimit } | ||||
| func (self *Env) AddLog(log *state.Log) { | ||||
| func (self *Env) AddLog(log state.Log) { | ||||
| 	self.logs = append(self.logs, log) | ||||
| } | ||||
| func (self *Env) Depth() int     { return self.depth } | ||||
|   | ||||
| @@ -20,7 +20,7 @@ type Environment interface { | ||||
| 	BlockHash() []byte | ||||
| 	GasLimit() *big.Int | ||||
| 	Transfer(from, to Account, amount *big.Int) error | ||||
| 	AddLog(*state.Log) | ||||
| 	AddLog(state.Log) | ||||
|  | ||||
| 	Depth() int | ||||
| 	SetDepth(i int) | ||||
| @@ -52,3 +52,25 @@ func Transfer(from, to Account, amount *big.Int) error { | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type Log struct { | ||||
| 	address []byte | ||||
| 	topics  [][]byte | ||||
| 	data    []byte | ||||
| } | ||||
|  | ||||
| func (self *Log) Address() []byte { | ||||
| 	return self.address | ||||
| } | ||||
|  | ||||
| func (self *Log) Topics() [][]byte { | ||||
| 	return self.topics | ||||
| } | ||||
|  | ||||
| func (self *Log) Data() []byte { | ||||
| 	return self.data | ||||
| } | ||||
|  | ||||
| func (self *Log) RlpData() interface{} { | ||||
| 	return []interface{}{self.address, ethutil.ByteSliceToInterface(self.topics), self.data} | ||||
| } | ||||
|   | ||||
| @@ -35,7 +35,7 @@ func NewDebugVm(env Environment) *DebugVm { | ||||
| 		lt = LogTyDiff | ||||
| 	} | ||||
|  | ||||
| 	return &DebugVm{env: env, logTy: lt, Recoverable: false} | ||||
| 	return &DebugVm{env: env, logTy: lt, Recoverable: true} | ||||
| } | ||||
|  | ||||
| func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price *big.Int, callData []byte) (ret []byte, err error) { | ||||
| @@ -750,7 +750,7 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price * | ||||
| 				topics[i] = ethutil.LeftPadBytes(stack.Pop().Bytes(), 32) | ||||
| 			} | ||||
|  | ||||
| 			log := &state.Log{closure.Address(), topics, data} | ||||
| 			log := &Log{closure.Address(), topics, data} | ||||
| 			self.env.AddLog(log) | ||||
|  | ||||
| 			self.Printf(" => %v", log) | ||||
|   | ||||
| @@ -39,7 +39,7 @@ func (self *VMEnv) State() *state.StateDB { return self.state } | ||||
| func (self *VMEnv) GasLimit() *big.Int    { return self.block.GasLimit } | ||||
| func (self *VMEnv) Depth() int            { return self.depth } | ||||
| func (self *VMEnv) SetDepth(i int)        { self.depth = i } | ||||
| func (self *VMEnv) AddLog(log *state.Log) { | ||||
| func (self *VMEnv) AddLog(log state.Log) { | ||||
| 	self.state.AddLog(log) | ||||
| } | ||||
| func (self *VMEnv) Transfer(from, to vm.Account, amount *big.Int) error { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user