Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
f3e78c8f
Commit
f3e78c8f
authored
Jan 28, 2015
by
obscuren
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
reworking messages => log
parent
c54a85ee
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
76 additions
and
114 deletions
+76
-114
block_processor.go
core/block_processor.go
+21
-0
filter.go
core/filter.go
+35
-83
old_filter.go
event/filter/old_filter.go
+4
-4
filter.go
ui/filter.go
+9
-17
filter.go
ui/qt/filter.go
+7
-10
No files found.
core/block_processor.go
View file @
f3e78c8f
...
...
@@ -330,3 +330,24 @@ func (sm *BlockProcessor) GetMessages(block *types.Block) (messages []*state.Mes
return
state
.
Manifest
()
.
Messages
,
nil
}
func
(
sm
*
BlockProcessor
)
GetLogs
(
block
*
types
.
Block
)
(
logs
state
.
Logs
,
err
error
)
{
if
!
sm
.
bc
.
HasBlock
(
block
.
Header
()
.
ParentHash
)
{
return
nil
,
ParentError
(
block
.
Header
()
.
ParentHash
)
}
sm
.
lastAttemptedBlock
=
block
var
(
parent
=
sm
.
bc
.
GetBlock
(
block
.
Header
()
.
ParentHash
)
//state = state.New(parent.Trie().Copy())
state
=
state
.
New
(
parent
.
Root
(),
sm
.
db
)
)
defer
state
.
Reset
()
sm
.
TransitionState
(
state
,
parent
,
block
)
sm
.
AccumelateRewards
(
state
,
block
,
parent
)
return
state
.
Logs
(),
nil
}
core/filter.go
View file @
f3e78c8f
...
...
@@ -3,10 +3,8 @@ package core
import
(
"bytes"
"math"
"math/big"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/state"
)
...
...
@@ -20,13 +18,12 @@ type Filter struct {
earliest
int64
latest
int64
skip
int
from
,
to
[]
[]
byte
address
[]
byte
max
int
topics
[][]
byte
Altered
[]
AccountChange
BlockCallback
func
(
*
types
.
Block
)
MessageCallback
func
(
state
.
Messages
)
BlockCallback
func
(
*
types
.
Block
)
LogsCallback
func
(
state
.
Logs
)
}
// Create a new filter which uses a bloom filter on blocks to figure out whether a particular block
...
...
@@ -35,10 +32,6 @@ func NewFilter(eth EthManager) *Filter {
return
&
Filter
{
eth
:
eth
}
}
func
(
self
*
Filter
)
AddAltered
(
address
,
stateAddress
[]
byte
)
{
self
.
Altered
=
append
(
self
.
Altered
,
AccountChange
{
address
,
stateAddress
})
}
// Set the earliest and latest block for filtering.
// -1 = latest block (i.e., the current block)
// hash = particular hash from-to
...
...
@@ -50,20 +43,12 @@ func (self *Filter) SetLatestBlock(latest int64) {
self
.
latest
=
latest
}
func
(
self
*
Filter
)
SetFrom
(
addr
[][]
byte
)
{
self
.
from
=
addr
}
func
(
self
*
Filter
)
AddFrom
(
addr
[]
byte
)
{
self
.
from
=
append
(
self
.
from
,
addr
)
}
func
(
self
*
Filter
)
SetTo
(
addr
[][]
byte
)
{
self
.
to
=
addr
func
(
self
*
Filter
)
SetAddress
(
addr
[]
byte
)
{
self
.
address
=
addr
}
func
(
self
*
Filter
)
AddTo
(
addr
[]
byte
)
{
self
.
to
=
append
(
self
.
to
,
addr
)
func
(
self
*
Filter
)
SetTopics
(
topics
[]
[]
byte
)
{
self
.
to
pics
=
topics
}
func
(
self
*
Filter
)
SetMax
(
max
int
)
{
...
...
@@ -74,8 +59,8 @@ func (self *Filter) SetSkip(skip int) {
self
.
skip
=
skip
}
// Run filters
message
s with the current parameters set
func
(
self
*
Filter
)
Find
()
[]
*
state
.
Message
{
// Run filters
log
s with the current parameters set
func
(
self
*
Filter
)
Find
()
state
.
Logs
{
earliestBlock
:=
self
.
eth
.
ChainManager
()
.
CurrentBlock
()
var
earliestBlockNo
uint64
=
uint64
(
self
.
earliest
)
if
self
.
earliest
==
-
1
{
...
...
@@ -87,39 +72,39 @@ func (self *Filter) Find() []*state.Message {
}
var
(
messages
[]
*
state
.
Message
block
=
self
.
eth
.
ChainManager
()
.
GetBlockByNumber
(
latestBlockNo
)
quit
bool
logs
state
.
Logs
block
=
self
.
eth
.
ChainManager
()
.
GetBlockByNumber
(
latestBlockNo
)
quit
bool
)
for
i
:=
0
;
!
quit
&&
block
!=
nil
;
i
++
{
// Quit on latest
switch
{
case
block
.
NumberU64
()
==
earliestBlockNo
,
block
.
NumberU64
()
==
0
:
quit
=
true
case
self
.
max
<=
len
(
message
s
)
:
case
self
.
max
<=
len
(
log
s
)
:
break
}
// Use bloom filtering to see if this block is interesting given the
// current parameters
if
self
.
bloomFilter
(
block
)
{
// Get the
message
s of the block
msgs
,
err
:=
self
.
eth
.
BlockProcessor
()
.
GetMessage
s
(
block
)
// Get the
log
s of the block
logs
,
err
:=
self
.
eth
.
BlockProcessor
()
.
GetLog
s
(
block
)
if
err
!=
nil
{
chainlogger
.
Warnln
(
"err: filter get
message
s "
,
err
)
chainlogger
.
Warnln
(
"err: filter get
log
s "
,
err
)
break
}
messages
=
append
(
messages
,
self
.
FilterMessages
(
ms
gs
)
...
)
logs
=
append
(
logs
,
self
.
FilterLogs
(
lo
gs
)
...
)
}
block
=
self
.
eth
.
ChainManager
()
.
GetBlock
(
block
.
ParentHash
())
}
skip
:=
int
(
math
.
Min
(
float64
(
len
(
message
s
)),
float64
(
self
.
skip
)))
skip
:=
int
(
math
.
Min
(
float64
(
len
(
log
s
)),
float64
(
self
.
skip
)))
return
message
s
[
skip
:
]
return
log
s
[
skip
:
]
}
func
includes
(
addresses
[][]
byte
,
a
[]
byte
)
(
found
bool
)
{
...
...
@@ -132,70 +117,37 @@ func includes(addresses [][]byte, a []byte) (found bool) {
return
}
func
(
self
*
Filter
)
Filter
Messages
(
msgs
[]
*
state
.
Message
)
[]
*
state
.
Message
{
var
messages
[]
*
state
.
Message
func
(
self
*
Filter
)
Filter
Logs
(
logs
state
.
Logs
)
state
.
Logs
{
var
ret
state
.
Logs
// Filter the
message
s for interesting stuff
for
_
,
message
:=
range
ms
gs
{
if
len
(
self
.
to
)
>
0
&&
!
includes
(
self
.
to
,
message
.
To
)
{
// Filter the
log
s for interesting stuff
for
_
,
log
:=
range
lo
gs
{
if
len
(
self
.
address
)
>
0
&&
!
bytes
.
Equal
(
self
.
address
,
log
.
Address
()
)
{
continue
}
if
len
(
self
.
from
)
>
0
&&
!
includes
(
self
.
from
,
message
.
From
)
{
continue
}
var
match
bool
if
len
(
self
.
Altered
)
==
0
{
match
=
true
}
for
_
,
accountChange
:=
range
self
.
Altered
{
if
len
(
accountChange
.
Address
)
>
0
&&
bytes
.
Compare
(
message
.
To
,
accountChange
.
Address
)
!=
0
{
for
_
,
topic
:=
range
self
.
topics
{
if
!
includes
(
log
.
Topics
(),
topic
)
{
continue
}
if
len
(
accountChange
.
StateAddress
)
>
0
&&
!
includes
(
message
.
ChangedAddresses
,
accountChange
.
StateAddress
)
{
continue
}
match
=
true
break
}
if
!
match
{
continue
}
messages
=
append
(
messages
,
message
)
ret
=
append
(
ret
,
log
)
}
return
messages
return
ret
}
func
(
self
*
Filter
)
bloomFilter
(
block
*
types
.
Block
)
bool
{
var
fromIncluded
,
toIncluded
bool
if
len
(
self
.
from
)
>
0
{
for
_
,
from
:=
range
self
.
from
{
if
types
.
BloomLookup
(
block
.
Bloom
(),
from
)
||
bytes
.
Equal
(
block
.
Coinbase
(),
from
)
{
fromIncluded
=
true
break
}
}
}
else
{
fromIncluded
=
true
if
len
(
self
.
address
)
>
0
&&
!
types
.
BloomLookup
(
block
.
Bloom
(),
self
.
address
)
{
return
false
}
if
len
(
self
.
to
)
>
0
{
for
_
,
to
:=
range
self
.
to
{
if
types
.
BloomLookup
(
block
.
Bloom
(),
ethutil
.
U256
(
new
(
big
.
Int
)
.
Add
(
ethutil
.
Big1
,
ethutil
.
BigD
(
to
)))
.
Bytes
())
||
bytes
.
Equal
(
block
.
Coinbase
(),
to
)
{
toIncluded
=
true
break
}
for
_
,
topic
:=
range
self
.
topics
{
if
!
types
.
BloomLookup
(
block
.
Bloom
(),
topic
)
{
return
false
}
}
else
{
toIncluded
=
true
}
return
fromIncluded
&&
toIncluded
return
true
}
event/filter/old_filter.go
View file @
f3e78c8f
...
...
@@ -77,13 +77,13 @@ out:
}
self
.
filterMu
.
RUnlock
()
case
state
.
Message
s
:
case
state
.
Log
s
:
self
.
filterMu
.
RLock
()
for
_
,
filter
:=
range
self
.
filters
{
if
filter
.
Message
Callback
!=
nil
{
msgs
:=
filter
.
Filter
Message
s
(
event
)
if
filter
.
Logs
Callback
!=
nil
{
msgs
:=
filter
.
Filter
Log
s
(
event
)
if
len
(
msgs
)
>
0
{
filter
.
Message
Callback
(
msgs
)
filter
.
Logs
Callback
(
msgs
)
}
}
}
...
...
ui/filter.go
View file @
f3e78c8f
...
...
@@ -28,14 +28,9 @@ func NewFilterFromMap(object map[string]interface{}, eth core.EthManager) *core.
filter
.
SetLatestBlock
(
val
.
Int
())
}
if
object
[
"to"
]
!=
nil
{
val
:=
ethutil
.
NewValue
(
object
[
"to"
])
filter
.
AddTo
(
fromHex
(
val
.
Str
()))
}
if
object
[
"from"
]
!=
nil
{
val
:=
ethutil
.
NewValue
(
object
[
"from"
])
filter
.
AddFrom
(
fromHex
(
val
.
Str
()))
if
object
[
"address"
]
!=
nil
{
val
:=
ethutil
.
NewValue
(
object
[
"address"
])
filter
.
SetAddress
(
fromHex
(
val
.
Str
()))
}
if
object
[
"max"
]
!=
nil
{
...
...
@@ -48,8 +43,8 @@ func NewFilterFromMap(object map[string]interface{}, eth core.EthManager) *core.
filter
.
SetSkip
(
int
(
val
.
Uint
()))
}
if
object
[
"
altered
"
]
!=
nil
{
filter
.
Altered
=
makeAltered
(
object
[
"altered"
]
)
if
object
[
"
topics
"
]
!=
nil
{
filter
.
SetTopics
(
MakeTopics
(
object
[
"topics"
])
)
}
return
filter
...
...
@@ -70,16 +65,13 @@ func mapToAccountChange(m map[string]interface{}) (d core.AccountChange) {
// data can come in in the following formats:
// ["aabbccdd", {id: "ccddee", at: "11223344"}], "aabbcc", {id: "ccddee", at: "1122"}
func
makeAltered
(
v
interface
{})
(
d
[]
core
.
AccountChang
e
)
{
func
MakeTopics
(
v
interface
{})
(
d
[][]
byt
e
)
{
if
str
,
ok
:=
v
.
(
string
);
ok
{
d
=
append
(
d
,
core
.
AccountChange
{
fromHex
(
str
),
nil
})
}
else
if
obj
,
ok
:=
v
.
(
map
[
string
]
interface
{});
ok
{
d
=
append
(
d
,
mapToAccountChange
(
obj
))
}
else
if
slice
,
ok
:=
v
.
([]
interface
{});
ok
{
d
=
append
(
d
,
fromHex
(
str
))
}
else
if
slice
,
ok
:=
v
.
([]
string
);
ok
{
for
_
,
item
:=
range
slice
{
d
=
append
(
d
,
makeAltered
(
item
)
...
)
d
=
append
(
d
,
fromHex
(
item
)
)
}
}
return
}
ui/qt/filter.go
View file @
f3e78c8f
...
...
@@ -9,24 +9,21 @@ import (
func
NewFilterFromMap
(
object
map
[
string
]
interface
{},
eth
core
.
EthManager
)
*
core
.
Filter
{
filter
:=
ui
.
NewFilterFromMap
(
object
,
eth
)
if
object
[
"
altered
"
]
!=
nil
{
filter
.
Altered
=
makeAltered
(
object
[
"altered"
]
)
if
object
[
"
topics
"
]
!=
nil
{
filter
.
SetTopics
(
makeTopics
(
object
[
"topics"
])
)
}
return
filter
}
func
make
Altered
(
v
interface
{})
(
d
[]
core
.
AccountChang
e
)
{
func
make
Topics
(
v
interface
{})
(
d
[][]
byt
e
)
{
if
qList
,
ok
:=
v
.
(
*
qml
.
List
);
ok
{
var
s
[]
interface
{}
var
s
[]
string
qList
.
Convert
(
&
s
)
d
=
makeAltered
(
s
)
}
else
if
qMap
,
ok
:=
v
.
(
*
qml
.
Map
);
ok
{
var
m
map
[
string
]
interface
{}
qMap
.
Convert
(
&
m
)
d
=
makeAltered
(
m
)
d
=
ui
.
MakeTopics
(
s
)
}
else
if
str
,
ok
:=
v
.
(
string
);
ok
{
d
=
ui
.
MakeTopics
(
str
)
}
return
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment