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
cab7e600
Commit
cab7e600
authored
Nov 19, 2014
by
obscuren
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Increased coverage
parent
0f460ad2
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
92 additions
and
49 deletions
+92
-49
cache.go
ptrie/cache.go
+42
-0
trie.go
ptrie/trie.go
+11
-48
trie_test.go
ptrie/trie_test.go
+39
-1
No files found.
ptrie/cache.go
0 → 100644
View file @
cab7e600
package
ptrie
type
Backend
interface
{
Get
([]
byte
)
[]
byte
Set
([]
byte
,
[]
byte
)
}
type
Cache
struct
{
store
map
[
string
][]
byte
backend
Backend
}
func
NewCache
(
backend
Backend
)
*
Cache
{
return
&
Cache
{
make
(
map
[
string
][]
byte
),
backend
}
}
func
(
self
*
Cache
)
Get
(
key
[]
byte
)
[]
byte
{
data
:=
self
.
store
[
string
(
key
)]
if
data
==
nil
{
data
=
self
.
backend
.
Get
(
key
)
}
return
data
}
func
(
self
*
Cache
)
Set
(
key
[]
byte
,
data
[]
byte
)
{
self
.
store
[
string
(
key
)]
=
data
}
func
(
self
*
Cache
)
Flush
()
{
for
k
,
v
:=
range
self
.
store
{
self
.
backend
.
Set
([]
byte
(
k
),
v
)
}
// This will eventually grow too large. We'd could
// do a make limit on storage and push out not-so-popular nodes.
//self.Reset()
}
func
(
self
*
Cache
)
Reset
()
{
self
.
store
=
make
(
map
[
string
][]
byte
)
}
ptrie/trie.go
View file @
cab7e600
...
...
@@ -10,47 +10,6 @@ import (
"github.com/ethereum/go-ethereum/trie"
)
type
Backend
interface
{
Get
([]
byte
)
[]
byte
Set
([]
byte
,
[]
byte
)
}
type
Cache
struct
{
store
map
[
string
][]
byte
backend
Backend
}
func
NewCache
(
backend
Backend
)
*
Cache
{
return
&
Cache
{
make
(
map
[
string
][]
byte
),
backend
}
}
func
(
self
*
Cache
)
Get
(
key
[]
byte
)
[]
byte
{
data
:=
self
.
store
[
string
(
key
)]
if
data
==
nil
{
data
=
self
.
backend
.
Get
(
key
)
}
return
data
}
func
(
self
*
Cache
)
Set
(
key
[]
byte
,
data
[]
byte
)
{
self
.
store
[
string
(
key
)]
=
data
}
func
(
self
*
Cache
)
Flush
()
{
for
k
,
v
:=
range
self
.
store
{
self
.
backend
.
Set
([]
byte
(
k
),
v
)
}
// This will eventually grow too large. We'd could
// do a make limit on storage and push out not-so-popular nodes.
//self.Reset()
}
func
(
self
*
Cache
)
Reset
()
{
self
.
store
=
make
(
map
[
string
][]
byte
)
}
type
Trie
struct
{
mu
sync
.
Mutex
root
Node
...
...
@@ -83,14 +42,17 @@ func (self *Trie) Root() []byte { return self.Hash() }
func
(
self
*
Trie
)
Hash
()
[]
byte
{
var
hash
[]
byte
if
self
.
root
!=
nil
{
t
:=
self
.
root
.
Hash
()
if
byts
,
ok
:=
t
.
([]
byte
);
ok
{
hash
=
byts
}
else
{
hash
=
crypto
.
Sha3
(
ethutil
.
Encode
(
self
.
root
.
RlpData
()))
}
hash
=
self
.
root
.
Hash
()
.
([]
byte
)
/*
t := self.root.Hash()
if byts, ok := t.([]byte); ok {
hash = byts
} else {
hash = crypto.Sha3(ethutil.Encode(self.root.RlpData()))
}
*/
}
else
{
hash
=
crypto
.
Sha3
(
ethutil
.
Encode
(
self
.
root
))
hash
=
crypto
.
Sha3
(
ethutil
.
Encode
(
""
))
}
if
!
bytes
.
Equal
(
hash
,
self
.
roothash
)
{
...
...
@@ -107,6 +69,7 @@ func (self *Trie) Commit() {
self
.
cache
.
Flush
()
}
// Reset should only be called if the trie has been hashed
func
(
self
*
Trie
)
Reset
()
{
self
.
cache
.
Reset
()
...
...
ptrie/trie_test.go
View file @
cab7e600
...
...
@@ -5,6 +5,7 @@ import (
"fmt"
"testing"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethutil"
)
...
...
@@ -18,6 +19,15 @@ func NewEmpty() *Trie {
return
New
(
nil
,
make
(
Db
))
}
func
TestEmptyTrie
(
t
*
testing
.
T
)
{
trie
:=
NewEmpty
()
res
:=
trie
.
Hash
()
exp
:=
crypto
.
Sha3
(
ethutil
.
Encode
(
""
))
if
!
bytes
.
Equal
(
res
,
exp
)
{
t
.
Errorf
(
"expected %x got %x"
,
exp
,
res
)
}
}
func
TestInsert
(
t
*
testing
.
T
)
{
trie
:=
NewEmpty
()
...
...
@@ -62,6 +72,34 @@ func TestGet(t *testing.T) {
func
TestDelete
(
t
*
testing
.
T
)
{
trie
:=
NewEmpty
()
vals
:=
[]
struct
{
k
,
v
string
}{
{
"do"
,
"verb"
},
{
"ether"
,
"wookiedoo"
},
{
"horse"
,
"stallion"
},
{
"shaman"
,
"horse"
},
{
"doge"
,
"coin"
},
{
"ether"
,
""
},
{
"dog"
,
"puppy"
},
{
"shaman"
,
""
},
}
for
_
,
val
:=
range
vals
{
if
val
.
v
!=
""
{
trie
.
UpdateString
(
val
.
k
,
val
.
v
)
}
else
{
trie
.
DeleteString
(
val
.
k
)
}
}
hash
:=
trie
.
Hash
()
exp
:=
ethutil
.
Hex2Bytes
(
"5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84"
)
if
!
bytes
.
Equal
(
hash
,
exp
)
{
t
.
Errorf
(
"expected %x got %x"
,
exp
,
hash
)
}
}
func
TestEmptyValues
(
t
*
testing
.
T
)
{
trie
:=
NewEmpty
()
vals
:=
[]
struct
{
k
,
v
string
}{
{
"do"
,
"verb"
},
{
"ether"
,
"wookiedoo"
},
...
...
@@ -142,7 +180,7 @@ func TestReset(t *testing.T) {
}
}
// Not actual test
// Not a
n a
ctual test
func
TestOutput
(
t
*
testing
.
T
)
{
t
.
Skip
()
...
...
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