aboutsummaryrefslogtreecommitdiffstats
path: root/ethtrie/encoding.go
diff options
context:
space:
mode:
authorzelig <viktor.tron@gmail.com>2014-06-29 23:26:58 +0800
committerzelig <viktor.tron@gmail.com>2014-06-29 23:26:58 +0800
commit707d413761927f5ad95298e666e297b820ad0901 (patch)
tree347ffb4f9e1c6694cf1d2b1d5892e297c98d2e94 /ethtrie/encoding.go
parent4be3521727698141512eb6454121302bd3b9cc6d (diff)
downloadgo-tangerine-707d413761927f5ad95298e666e297b820ad0901.tar
go-tangerine-707d413761927f5ad95298e666e297b820ad0901.tar.gz
go-tangerine-707d413761927f5ad95298e666e297b820ad0901.tar.bz2
go-tangerine-707d413761927f5ad95298e666e297b820ad0901.tar.lz
go-tangerine-707d413761927f5ad95298e666e297b820ad0901.tar.xz
go-tangerine-707d413761927f5ad95298e666e297b820ad0901.tar.zst
go-tangerine-707d413761927f5ad95298e666e297b820ad0901.zip
refactor ethutil/trie to ethtrie
Diffstat (limited to 'ethtrie/encoding.go')
-rw-r--r--ethtrie/encoding.go76
1 files changed, 76 insertions, 0 deletions
diff --git a/ethtrie/encoding.go b/ethtrie/encoding.go
new file mode 100644
index 000000000..c9c391110
--- /dev/null
+++ b/ethtrie/encoding.go
@@ -0,0 +1,76 @@
+package ethtrie
+
+import (
+ "bytes"
+ "encoding/hex"
+ "strings"
+)
+
+func CompactEncode(hexSlice []int) string {
+ terminator := 0
+ if hexSlice[len(hexSlice)-1] == 16 {
+ terminator = 1
+ }
+
+ if terminator == 1 {
+ hexSlice = hexSlice[:len(hexSlice)-1]
+ }
+
+ oddlen := len(hexSlice) % 2
+ flags := 2*terminator + oddlen
+ if oddlen != 0 {
+ hexSlice = append([]int{flags}, hexSlice...)
+ } else {
+ hexSlice = append([]int{flags, 0}, hexSlice...)
+ }
+
+ var buff bytes.Buffer
+ for i := 0; i < len(hexSlice); i += 2 {
+ buff.WriteByte(byte(16*hexSlice[i] + hexSlice[i+1]))
+ }
+
+ return buff.String()
+}
+
+func CompactDecode(str string) []int {
+ base := CompactHexDecode(str)
+ base = base[:len(base)-1]
+ if base[0] >= 2 {
+ base = append(base, 16)
+ }
+ if base[0]%2 == 1 {
+ base = base[1:]
+ } else {
+ base = base[2:]
+ }
+
+ return base
+}
+
+func CompactHexDecode(str string) []int {
+ base := "0123456789abcdef"
+ hexSlice := make([]int, 0)
+
+ enc := hex.EncodeToString([]byte(str))
+ for _, v := range enc {
+ hexSlice = append(hexSlice, strings.IndexByte(base, byte(v)))
+ }
+ hexSlice = append(hexSlice, 16)
+
+ return hexSlice
+}
+
+func DecodeCompact(key []int) string {
+ base := "0123456789abcdef"
+ var str string
+
+ for _, v := range key {
+ if v < 16 {
+ str += string(base[v])
+ }
+ }
+
+ res, _ := hex.DecodeString(str)
+
+ return string(res)
+}