diff options
author | obscuren <geffobscura@gmail.com> | 2015-04-08 23:14:58 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2015-04-08 23:15:45 +0800 |
commit | 1c872ddf4b1db51847a5d9d020e13d432e847f52 (patch) | |
tree | 72ec461427269a25165b58043f328fd374e143ee /core/state | |
parent | 6284604b52e075e454e61f2933cadaaf9ded364b (diff) | |
download | dexon-1c872ddf4b1db51847a5d9d020e13d432e847f52.tar dexon-1c872ddf4b1db51847a5d9d020e13d432e847f52.tar.gz dexon-1c872ddf4b1db51847a5d9d020e13d432e847f52.tar.bz2 dexon-1c872ddf4b1db51847a5d9d020e13d432e847f52.tar.lz dexon-1c872ddf4b1db51847a5d9d020e13d432e847f52.tar.xz dexon-1c872ddf4b1db51847a5d9d020e13d432e847f52.tar.zst dexon-1c872ddf4b1db51847a5d9d020e13d432e847f52.zip |
Changed how logs are being recorded
Logs are now recorded per transactions instead of tossing them out after
each transaction. This should also fix an issue with
`eth_getFilterLogs` (#629) Also now implemented are the `transactionHash,
blockHash, transactionIndex, logIndex` on logs. Closes #654.
Diffstat (limited to 'core/state')
-rw-r--r-- | core/state/log.go | 88 | ||||
-rw-r--r-- | core/state/statedb.go | 42 |
2 files changed, 49 insertions, 81 deletions
diff --git a/core/state/log.go b/core/state/log.go index f8aa4c08c..a7aa784e2 100644 --- a/core/state/log.go +++ b/core/state/log.go @@ -8,87 +8,31 @@ import ( "github.com/ethereum/go-ethereum/rlp" ) -type Log interface { - Address() common.Address - Topics() []common.Hash - Data() []byte +type Log struct { + Address common.Address + Topics []common.Hash + Data []byte + Number uint64 - Number() uint64 + TxHash common.Hash + TxIndex uint + BlockHash common.Hash + Index uint } -type StateLog struct { - address common.Address - topics []common.Hash - data []byte - number uint64 +func NewLog(address common.Address, topics []common.Hash, data []byte, number uint64) *Log { + return &Log{Address: address, Topics: topics, Data: data, Number: number} } -func NewLog(address common.Address, topics []common.Hash, data []byte, number uint64) *StateLog { - return &StateLog{address, topics, data, number} +func (self *Log) EncodeRLP(w io.Writer) error { + return rlp.Encode(w, []interface{}{self.Address, self.Topics, self.Data}) } -func (self *StateLog) Address() common.Address { - return self.address +func (self *Log) String() string { + return fmt.Sprintf(`log: %x %x %x`, self.Address, self.Topics, self.Data) } -func (self *StateLog) Topics() []common.Hash { - return self.topics -} - -func (self *StateLog) Data() []byte { - return self.data -} - -func (self *StateLog) Number() uint64 { - return self.number -} - -/* -func NewLogFromValue(decoder *common.Value) *StateLog { - var extlog struct { - - } - - 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()) - } - - return log -} -*/ - -func (self *StateLog) EncodeRLP(w io.Writer) error { - return rlp.Encode(w, []interface{}{self.address, self.topics, self.data}) -} - -/* -func (self *StateLog) RlpData() interface{} { - return []interface{}{self.address, common.ByteSliceToInterface(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 - -/* -func (self Logs) RlpData() interface{} { - data := make([]interface{}, len(self)) - for i, log := range self { - data[i] = log.RlpData() - } - - return data -} -*/ +type Logs []*Log func (self Logs) String() (ret string) { for _, log := range self { diff --git a/core/state/statedb.go b/core/state/statedb.go index 065cbd607..0651365f0 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -23,30 +23,53 @@ type StateDB struct { refund map[string]*big.Int - logs Logs + thash, bhash common.Hash + txIndex int + logs map[common.Hash]Logs } // Create a new state from a given trie func New(root common.Hash, db common.Database) *StateDB { trie := trie.NewSecure(root[:], db) - return &StateDB{db: db, trie: trie, stateObjects: make(map[string]*StateObject), refund: make(map[string]*big.Int)} + return &StateDB{db: db, trie: trie, stateObjects: make(map[string]*StateObject), refund: make(map[string]*big.Int), logs: make(map[common.Hash]Logs)} } func (self *StateDB) PrintRoot() { self.trie.Trie.PrintRoot() } -func (self *StateDB) EmptyLogs() { - self.logs = nil +func (self *StateDB) StartRecord(thash, bhash common.Hash, ti int) { + self.thash = thash + self.bhash = bhash + self.txIndex = ti } -func (self *StateDB) AddLog(log Log) { - self.logs = append(self.logs, log) +func (self *StateDB) AddLog(log *Log) { + log.TxHash = self.thash + log.BlockHash = self.bhash + log.TxIndex = uint(self.txIndex) + self.logs[self.thash] = append(self.logs[self.thash], log) +} + +func (self *StateDB) GetLogs(hash common.Hash) Logs { + return self.logs[hash] } func (self *StateDB) Logs() Logs { + var logs Logs + for _, lgs := range self.logs { + logs = append(logs, lgs...) + } + return logs +} + +/* +func (self *StateDB) Logs(txHash, blockHash common.Hash, txIndex uint) Logs { + self.logs.SetInfo(txHash, blockHash, txIndex) + return self.logs } +*/ func (self *StateDB) Refund(address common.Address, gas *big.Int) { addr := address.Str() @@ -253,9 +276,10 @@ func (self *StateDB) Copy() *StateDB { state.refund[addr] = new(big.Int).Set(refund) } - logs := make(Logs, len(self.logs)) - copy(logs, self.logs) - state.logs = logs + for hash, logs := range self.logs { + state.logs[hash] = make(Logs, len(logs)) + copy(state.logs[hash], logs) + } return state } |