aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorobscuren <obscuren@obscura.com>2013-12-28 22:17:26 +0800
committerobscuren <obscuren@obscura.com>2013-12-28 22:17:26 +0800
commit95d877f701371108dc18967319d1f7b4e6763caf (patch)
tree31e00c66a27d57600624e84cc230d6bae047cce0
parentbb8afba20a56552cef71681f72fb192bcda88c1d (diff)
downloadgo-tangerine-95d877f701371108dc18967319d1f7b4e6763caf.tar
go-tangerine-95d877f701371108dc18967319d1f7b4e6763caf.tar.gz
go-tangerine-95d877f701371108dc18967319d1f7b4e6763caf.tar.bz2
go-tangerine-95d877f701371108dc18967319d1f7b4e6763caf.tar.lz
go-tangerine-95d877f701371108dc18967319d1f7b4e6763caf.tar.xz
go-tangerine-95d877f701371108dc18967319d1f7b4e6763caf.tar.zst
go-tangerine-95d877f701371108dc18967319d1f7b4e6763caf.zip
Fixed rlp encoding
-rw-r--r--rlp.go12
-rw-r--r--rlp_test.go21
2 files changed, 32 insertions, 1 deletions
diff --git a/rlp.go b/rlp.go
index 2c04317ae..bc3b6a151 100644
--- a/rlp.go
+++ b/rlp.go
@@ -41,25 +41,34 @@ func FromBin(data []byte) uint64 {
}
func Decode(data []byte, pos int) (interface{}, int) {
+ if pos > len(data)-1 {
+ panic(fmt.Sprintf("index out of range %d for data %q, l = %d", pos, data, len(data)))
+ }
+
char := int(data[pos])
slice := make([]interface{}, 0)
switch {
case char < 24:
return data[pos], pos + 1
+
case char < 56:
b := int(data[pos]) - 23
return FromBin(data[pos+1 : pos+1+b]), pos + 1 + b
+
case char < 64:
b := int(data[pos]) - 55
b2 := int(FromBin(data[pos+1 : pos+1+b]))
return FromBin(data[pos+1+b : pos+1+b+b2]), pos+1+b+b2
+
case char < 120:
b := int(data[pos]) - 64
return data[pos+1:pos+1+b], pos+1+b
+
case char < 128:
b := int(data[pos]) - 119
b2 := int(FromBin(data[pos+1 : pos+1+b]))
return data[pos+1+b : pos+1+b+b2], pos+1+b+b2
+
case char < 184:
b := int(data[pos]) - 128
pos++
@@ -70,6 +79,7 @@ func Decode(data []byte, pos int) (interface{}, int) {
slice = append(slice, obj)
}
return slice, pos
+
case char < 192:
b := int(data[pos]) - 183
//b2 := int(FromBin(data[pos+1 : pos+1+b])) (ref implementation has an unused variable)
@@ -122,7 +132,7 @@ func Encode(object interface{}) []byte {
case []byte:
// Cast the byte slice to a string
- buff.Write(Encode(string(t)))
+ //buff.Write(Encode(string(t)))
case []interface{}, []string:
// Inline function for writing the slice header
diff --git a/rlp_test.go b/rlp_test.go
index ae8dcced4..6a34aecbc 100644
--- a/rlp_test.go
+++ b/rlp_test.go
@@ -27,6 +27,27 @@ func TestEncode(t *testing.T) {
fmt.Printf("raw: %v encoded: %q == %v\n", dec, slice, strs)
}
+func TestMultiEncode(t *testing.T) {
+ inter := []interface{}{
+ []interface{}{
+ "1","2","3",
+ },
+ []string{
+ "string",
+ "string2",
+ "\x86A0J1234567890A\x00B20A0\x82F395843F657986",
+ "\x86A0J1234567890A\x00B20A0\x8cF395843F657986I335612448F524099H16716881A0H13114947G2039362G1507139H16719697G1048387E65360",
+ },
+ "test",
+ }
+
+ bytes := Encode(inter)
+ fmt.Printf("%q\n", bytes)
+
+ dec, _ := Decode(bytes, 0)
+ fmt.Println(dec)
+}
+
func BenchmarkEncodeDecode(b *testing.B) {
for i := 0; i < b.N; i++ {
bytes := Encode([]string{"dog", "god", "cat"})