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.
This commit is contained in:
@ -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 {
|
||||
|
@ -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
|
||||
}
|
||||
|
Reference in New Issue
Block a user