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))) | 	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() | 	db, _ := ethdb.NewMemDatabase() | ||||||
| 	statedb := state.New(trie.New(db, "")) | 	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) GasLimit() *big.Int    { return self.block.GasLimit } | ||||||
| func (self *VMEnv) Depth() int            { return self.depth } | func (self *VMEnv) Depth() int            { return self.depth } | ||||||
| func (self *VMEnv) SetDepth(i int)        { self.depth = i } | 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) | 	self.state.AddLog(log) | ||||||
| } | } | ||||||
| func (self *VMEnv) Transfer(from, to vm.Account, amount *big.Int) error { | 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 { | func LogsBloom(logs state.Logs) *big.Int { | ||||||
| 	bin := new(big.Int) | 	bin := new(big.Int) | ||||||
| 	for _, log := range logs { | 	for _, log := range logs { | ||||||
| 		data := [][]byte{log.Address} | 		data := [][]byte{log.Address()} | ||||||
| 		for _, topic := range log.Topics { | 		for _, topic := range log.Topics() { | ||||||
| 			data = append(data, topic) | 			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) GasLimit() *big.Int    { return self.block.GasLimit } | ||||||
| func (self *VMEnv) Depth() int            { return self.depth } | func (self *VMEnv) Depth() int            { return self.depth } | ||||||
| func (self *VMEnv) SetDepth(i int)        { self.depth = i } | 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) | 	self.state.AddLog(log) | ||||||
| } | } | ||||||
| func (self *VMEnv) Transfer(from, to vm.Account, amount *big.Int) error { | 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 ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"strings" |  | ||||||
|  |  | ||||||
| 	"github.com/ethereum/go-ethereum/ethutil" | 	"github.com/ethereum/go-ethereum/ethutil" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type Log struct { | type Log interface { | ||||||
| 	Address []byte | 	ethutil.RlpEncodable | ||||||
| 	Topics  [][]byte |  | ||||||
| 	Data    []byte | 	Address() []byte | ||||||
|  | 	Topics() [][]byte | ||||||
|  | 	Data() []byte | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewLogFromValue(decoder *ethutil.Value) *Log { | type StateLog struct { | ||||||
| 	log := &Log{ | 	address []byte | ||||||
| 		Address: decoder.Get(0).Bytes(), | 	topics  [][]byte | ||||||
| 		Data:    decoder.Get(2).Bytes(), | 	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() | 	it := decoder.Get(1).NewIterator() | ||||||
| 	for it.Next() { | 	for it.Next() { | ||||||
| 		log.Topics = append(log.Topics, it.Value().Bytes()) | 		log.topics = append(log.topics, it.Value().Bytes()) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return log | 	return log | ||||||
| } | } | ||||||
|  |  | ||||||
| func (self *Log) RlpData() interface{} { | func (self *StateLog) RlpData() interface{} { | ||||||
| 	return []interface{}{self.Address, ethutil.ByteSliceToInterface(self.Topics), self.Data} | 	return []interface{}{self.address, ethutil.ByteSliceToInterface(self.topics), self.data} | ||||||
| } | } | ||||||
|  |  | ||||||
| func (self *Log) String() string { | func (self *StateLog) String() string { | ||||||
| 	return fmt.Sprintf(`log: %x %x %x`, self.Address, self.Topics, self.Data) | 	return fmt.Sprintf(`log: %x %x %x`, self.address, self.topics, self.data) | ||||||
| } | } | ||||||
|  |  | ||||||
| type Logs []*Log | type Logs []Log | ||||||
|  |  | ||||||
| func (self Logs) RlpData() interface{} { | func (self Logs) RlpData() interface{} { | ||||||
| 	data := make([]interface{}, len(self)) | 	data := make([]interface{}, len(self)) | ||||||
| @@ -46,10 +69,10 @@ func (self Logs) RlpData() interface{} { | |||||||
| 	return data | 	return data | ||||||
| } | } | ||||||
|  |  | ||||||
| func (self Logs) String() string { | func (self Logs) String() (ret string) { | ||||||
| 	var logs []string |  | ||||||
| 	for _, log := range self { | 	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 | 	self.logs = nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (self *StateDB) AddLog(log *Log) { | func (self *StateDB) AddLog(log Log) { | ||||||
| 	self.logs = append(self.logs, 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) BlockHash() []byte     { return nil } | ||||||
| func (self *Env) State() *state.StateDB { return self.state } | func (self *Env) State() *state.StateDB { return self.state } | ||||||
| func (self *Env) GasLimit() *big.Int    { return self.gasLimit } | 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) | 	self.logs = append(self.logs, log) | ||||||
| } | } | ||||||
| func (self *Env) Depth() int     { return self.depth } | func (self *Env) Depth() int     { return self.depth } | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ type Environment interface { | |||||||
| 	BlockHash() []byte | 	BlockHash() []byte | ||||||
| 	GasLimit() *big.Int | 	GasLimit() *big.Int | ||||||
| 	Transfer(from, to Account, amount *big.Int) error | 	Transfer(from, to Account, amount *big.Int) error | ||||||
| 	AddLog(*state.Log) | 	AddLog(state.Log) | ||||||
|  |  | ||||||
| 	Depth() int | 	Depth() int | ||||||
| 	SetDepth(i int) | 	SetDepth(i int) | ||||||
| @@ -52,3 +52,25 @@ func Transfer(from, to Account, amount *big.Int) error { | |||||||
|  |  | ||||||
| 	return nil | 	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 | 		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) { | 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) | 				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.env.AddLog(log) | ||||||
|  |  | ||||||
| 			self.Printf(" => %v", 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) GasLimit() *big.Int    { return self.block.GasLimit } | ||||||
| func (self *VMEnv) Depth() int            { return self.depth } | func (self *VMEnv) Depth() int            { return self.depth } | ||||||
| func (self *VMEnv) SetDepth(i int)        { self.depth = i } | 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) | 	self.state.AddLog(log) | ||||||
| } | } | ||||||
| func (self *VMEnv) Transfer(from, to vm.Account, amount *big.Int) error { | func (self *VMEnv) Transfer(from, to vm.Account, amount *big.Int) error { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user