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
7baa5977
Commit
7baa5977
authored
Aug 06, 2015
by
Jeffrey Wilcke
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1594 from ebuchman/trie_hex_fix
faster hex-prefix codec and string -> []byte
parents
82ef26f6
c1d51654
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
30 additions
and
39 deletions
+30
-39
encoding.go
trie/encoding.go
+17
-26
encoding_test.go
trie/encoding_test.go
+5
-5
iterator.go
trie/iterator.go
+1
-1
shortnode.go
trie/shortnode.go
+2
-2
trie.go
trie/trie.go
+5
-5
No files found.
trie/encoding.go
View file @
7baa5977
...
@@ -18,11 +18,9 @@ package trie
...
@@ -18,11 +18,9 @@ package trie
import
(
import
(
"bytes"
"bytes"
"encoding/hex"
"strings"
)
)
func
CompactEncode
(
hexSlice
[]
byte
)
string
{
func
CompactEncode
(
hexSlice
[]
byte
)
[]
byte
{
terminator
:=
0
terminator
:=
0
if
hexSlice
[
len
(
hexSlice
)
-
1
]
==
16
{
if
hexSlice
[
len
(
hexSlice
)
-
1
]
==
16
{
terminator
=
1
terminator
=
1
...
@@ -45,10 +43,10 @@ func CompactEncode(hexSlice []byte) string {
...
@@ -45,10 +43,10 @@ func CompactEncode(hexSlice []byte) string {
buff
.
WriteByte
(
byte
(
16
*
hexSlice
[
i
]
+
hexSlice
[
i
+
1
]))
buff
.
WriteByte
(
byte
(
16
*
hexSlice
[
i
]
+
hexSlice
[
i
+
1
]))
}
}
return
buff
.
String
()
return
buff
.
Bytes
()
}
}
func
CompactDecode
(
str
string
)
[]
byte
{
func
CompactDecode
(
str
[]
byte
)
[]
byte
{
base
:=
CompactHexDecode
(
str
)
base
:=
CompactHexDecode
(
str
)
base
=
base
[
:
len
(
base
)
-
1
]
base
=
base
[
:
len
(
base
)
-
1
]
if
base
[
0
]
>=
2
{
if
base
[
0
]
>=
2
{
...
@@ -63,30 +61,23 @@ func CompactDecode(str string) []byte {
...
@@ -63,30 +61,23 @@ func CompactDecode(str string) []byte {
return
base
return
base
}
}
func
CompactHexDecode
(
str
string
)
[]
byte
{
func
CompactHexDecode
(
str
[]
byte
)
[]
byte
{
base
:=
"0123456789abcdef"
var
nibbles
[]
byte
var
hexSlice
[]
byte
enc
:=
hex
.
EncodeToString
([]
byte
(
str
))
for
_
,
b
:=
range
str
{
for
_
,
v
:=
range
enc
{
nibbles
=
append
(
nibbles
,
b
/
16
)
hexSlice
=
append
(
hexSlice
,
byte
(
strings
.
IndexByte
(
base
,
byte
(
v
)))
)
nibbles
=
append
(
nibbles
,
b
%
16
)
}
}
hexSlice
=
append
(
hexSlice
,
16
)
nibbles
=
append
(
nibbles
,
16
)
return
nibbles
return
hexSlice
}
}
func
DecodeCompact
(
key
[]
byte
)
string
{
// assumes key is odd length
const
base
=
"0123456789abcdef"
func
DecodeCompact
(
key
[]
byte
)
[]
byte
{
var
str
string
var
res
[]
byte
for
i
:=
0
;
i
<
len
(
key
)
-
1
;
i
+=
2
{
for
_
,
v
:=
range
key
{
v1
,
v0
:=
key
[
i
],
key
[
i
+
1
]
if
v
<
16
{
res
=
append
(
res
,
v1
*
16
+
v0
)
str
+=
string
(
base
[
v
])
}
}
}
return
res
res
,
_
:=
hex
.
DecodeString
(
str
)
return
string
(
res
)
}
}
trie/encoding_test.go
View file @
7baa5977
...
@@ -48,28 +48,28 @@ func (s *TrieEncodingSuite) TestCompactEncode(c *checker.C) {
...
@@ -48,28 +48,28 @@ func (s *TrieEncodingSuite) TestCompactEncode(c *checker.C) {
func
(
s
*
TrieEncodingSuite
)
TestCompactHexDecode
(
c
*
checker
.
C
)
{
func
(
s
*
TrieEncodingSuite
)
TestCompactHexDecode
(
c
*
checker
.
C
)
{
exp
:=
[]
byte
{
7
,
6
,
6
,
5
,
7
,
2
,
6
,
2
,
16
}
exp
:=
[]
byte
{
7
,
6
,
6
,
5
,
7
,
2
,
6
,
2
,
16
}
res
:=
CompactHexDecode
(
"verb"
)
res
:=
CompactHexDecode
(
[]
byte
(
"verb"
)
)
c
.
Assert
(
res
,
checker
.
DeepEquals
,
exp
)
c
.
Assert
(
res
,
checker
.
DeepEquals
,
exp
)
}
}
func
(
s
*
TrieEncodingSuite
)
TestCompactDecode
(
c
*
checker
.
C
)
{
func
(
s
*
TrieEncodingSuite
)
TestCompactDecode
(
c
*
checker
.
C
)
{
// odd compact decode
// odd compact decode
exp
:=
[]
byte
{
1
,
2
,
3
,
4
,
5
}
exp
:=
[]
byte
{
1
,
2
,
3
,
4
,
5
}
res
:=
CompactDecode
(
"
\x11\x23\x45
"
)
res
:=
CompactDecode
(
[]
byte
(
"
\x11\x23\x45
"
)
)
c
.
Assert
(
res
,
checker
.
DeepEquals
,
exp
)
c
.
Assert
(
res
,
checker
.
DeepEquals
,
exp
)
// even compact decode
// even compact decode
exp
=
[]
byte
{
0
,
1
,
2
,
3
,
4
,
5
}
exp
=
[]
byte
{
0
,
1
,
2
,
3
,
4
,
5
}
res
=
CompactDecode
(
"
\x00\x01\x23\x45
"
)
res
=
CompactDecode
(
[]
byte
(
"
\x00\x01\x23\x45
"
)
)
c
.
Assert
(
res
,
checker
.
DeepEquals
,
exp
)
c
.
Assert
(
res
,
checker
.
DeepEquals
,
exp
)
// even terminated compact decode
// even terminated compact decode
exp
=
[]
byte
{
0
,
15
,
1
,
12
,
11
,
8
/*term*/
,
16
}
exp
=
[]
byte
{
0
,
15
,
1
,
12
,
11
,
8
/*term*/
,
16
}
res
=
CompactDecode
(
"
\x20\x0f\x1c\xb8
"
)
res
=
CompactDecode
(
[]
byte
(
"
\x20\x0f\x1c\xb8
"
)
)
c
.
Assert
(
res
,
checker
.
DeepEquals
,
exp
)
c
.
Assert
(
res
,
checker
.
DeepEquals
,
exp
)
// even terminated compact decode
// even terminated compact decode
exp
=
[]
byte
{
15
,
1
,
12
,
11
,
8
/*term*/
,
16
}
exp
=
[]
byte
{
15
,
1
,
12
,
11
,
8
/*term*/
,
16
}
res
=
CompactDecode
(
"
\x3f\x1c\xb8
"
)
res
=
CompactDecode
(
[]
byte
(
"
\x3f\x1c\xb8
"
)
)
c
.
Assert
(
res
,
checker
.
DeepEquals
,
exp
)
c
.
Assert
(
res
,
checker
.
DeepEquals
,
exp
)
}
}
trie/iterator.go
View file @
7baa5977
...
@@ -41,7 +41,7 @@ func (self *Iterator) Next() bool {
...
@@ -41,7 +41,7 @@ func (self *Iterator) Next() bool {
self
.
Key
=
make
([]
byte
,
32
)
self
.
Key
=
make
([]
byte
,
32
)
}
}
key
:=
RemTerm
(
CompactHexDecode
(
s
tring
(
self
.
Key
)
))
key
:=
RemTerm
(
CompactHexDecode
(
s
elf
.
Key
))
k
:=
self
.
next
(
self
.
trie
.
root
,
key
,
isIterStart
)
k
:=
self
.
next
(
self
.
trie
.
root
,
key
,
isIterStart
)
self
.
Key
=
[]
byte
(
DecodeCompact
(
k
))
self
.
Key
=
[]
byte
(
DecodeCompact
(
k
))
...
...
trie/shortnode.go
View file @
7baa5977
...
@@ -26,7 +26,7 @@ type ShortNode struct {
...
@@ -26,7 +26,7 @@ type ShortNode struct {
}
}
func
NewShortNode
(
t
*
Trie
,
key
[]
byte
,
value
Node
)
*
ShortNode
{
func
NewShortNode
(
t
*
Trie
,
key
[]
byte
,
value
Node
)
*
ShortNode
{
return
&
ShortNode
{
t
,
[]
byte
(
CompactEncode
(
key
)
),
value
,
false
}
return
&
ShortNode
{
t
,
CompactEncode
(
key
),
value
,
false
}
}
}
func
(
self
*
ShortNode
)
Value
()
Node
{
func
(
self
*
ShortNode
)
Value
()
Node
{
self
.
value
=
self
.
trie
.
trans
(
self
.
value
)
self
.
value
=
self
.
trie
.
trans
(
self
.
value
)
...
@@ -49,7 +49,7 @@ func (self *ShortNode) Hash() interface{} {
...
@@ -49,7 +49,7 @@ func (self *ShortNode) Hash() interface{} {
}
}
func
(
self
*
ShortNode
)
Key
()
[]
byte
{
func
(
self
*
ShortNode
)
Key
()
[]
byte
{
return
CompactDecode
(
s
tring
(
self
.
key
)
)
return
CompactDecode
(
s
elf
.
key
)
}
}
func
(
self
*
ShortNode
)
setDirty
(
dirty
bool
)
{
func
(
self
*
ShortNode
)
setDirty
(
dirty
bool
)
{
...
...
trie/trie.go
View file @
7baa5977
...
@@ -69,7 +69,7 @@ func (self *Trie) Iterator() *Iterator {
...
@@ -69,7 +69,7 @@ func (self *Trie) Iterator() *Iterator {
func
(
self
*
Trie
)
Copy
()
*
Trie
{
func
(
self
*
Trie
)
Copy
()
*
Trie
{
cpy
:=
make
([]
byte
,
32
)
cpy
:=
make
([]
byte
,
32
)
copy
(
cpy
,
self
.
roothash
)
copy
(
cpy
,
self
.
roothash
)
// NOTE: cpy isn't being used anywhere?
trie
:=
New
(
nil
,
nil
)
trie
:=
New
(
nil
,
nil
)
trie
.
cache
=
self
.
cache
.
Copy
()
trie
.
cache
=
self
.
cache
.
Copy
()
if
self
.
root
!=
nil
{
if
self
.
root
!=
nil
{
...
@@ -131,7 +131,7 @@ func (self *Trie) Update(key, value []byte) Node {
...
@@ -131,7 +131,7 @@ func (self *Trie) Update(key, value []byte) Node {
self
.
mu
.
Lock
()
self
.
mu
.
Lock
()
defer
self
.
mu
.
Unlock
()
defer
self
.
mu
.
Unlock
()
k
:=
CompactHexDecode
(
string
(
key
)
)
k
:=
CompactHexDecode
(
key
)
if
len
(
value
)
!=
0
{
if
len
(
value
)
!=
0
{
node
:=
NewValueNode
(
self
,
value
)
node
:=
NewValueNode
(
self
,
value
)
...
@@ -149,7 +149,7 @@ func (self *Trie) Get(key []byte) []byte {
...
@@ -149,7 +149,7 @@ func (self *Trie) Get(key []byte) []byte {
self
.
mu
.
Lock
()
self
.
mu
.
Lock
()
defer
self
.
mu
.
Unlock
()
defer
self
.
mu
.
Unlock
()
k
:=
CompactHexDecode
(
string
(
key
)
)
k
:=
CompactHexDecode
(
key
)
n
:=
self
.
get
(
self
.
root
,
k
)
n
:=
self
.
get
(
self
.
root
,
k
)
if
n
!=
nil
{
if
n
!=
nil
{
...
@@ -164,7 +164,7 @@ func (self *Trie) Delete(key []byte) Node {
...
@@ -164,7 +164,7 @@ func (self *Trie) Delete(key []byte) Node {
self
.
mu
.
Lock
()
self
.
mu
.
Lock
()
defer
self
.
mu
.
Unlock
()
defer
self
.
mu
.
Unlock
()
k
:=
CompactHexDecode
(
string
(
key
)
)
k
:=
CompactHexDecode
(
key
)
self
.
root
=
self
.
delete
(
self
.
root
,
k
)
self
.
root
=
self
.
delete
(
self
.
root
,
k
)
return
self
.
root
return
self
.
root
...
@@ -336,7 +336,7 @@ func (self *Trie) mknode(value *common.Value) Node {
...
@@ -336,7 +336,7 @@ func (self *Trie) mknode(value *common.Value) Node {
case
2
:
case
2
:
// A value node may consists of 2 bytes.
// A value node may consists of 2 bytes.
if
value
.
Get
(
0
)
.
Len
()
!=
0
{
if
value
.
Get
(
0
)
.
Len
()
!=
0
{
key
:=
CompactDecode
(
string
(
value
.
Get
(
0
)
.
Bytes
()
))
key
:=
CompactDecode
(
value
.
Get
(
0
)
.
Bytes
(
))
if
key
[
len
(
key
)
-
1
]
==
16
{
if
key
[
len
(
key
)
-
1
]
==
16
{
return
NewShortNode
(
self
,
key
,
NewValueNode
(
self
,
value
.
Get
(
1
)
.
Bytes
()))
return
NewShortNode
(
self
,
key
,
NewValueNode
(
self
,
value
.
Get
(
1
)
.
Bytes
()))
}
else
{
}
else
{
...
...
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