forked from mirror/go-ethereum
parent
34d62c380e
commit
79eaa6f2ba
@ -1,63 +0,0 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"math" |
||||
"bytes" |
||||
) |
||||
|
||||
func ToBinary(x int, bytes int) string { |
||||
if bytes == 0 { |
||||
return "" |
||||
} else { |
||||
return ToBinary(int(x / 256), bytes - 1) + string(x % 256) |
||||
} |
||||
} |
||||
|
||||
func NumToVarInt(x int) string { |
||||
if x < 253 { |
||||
return string(x) |
||||
} else if x < int(math.Pow(2,16)) { |
||||
return string(253) + ToBinary(x, 2) |
||||
} else if x < int(math.Pow(2,32)) { |
||||
return string(253) + ToBinary(x, 4) |
||||
} else { |
||||
return string(253) + ToBinary(x, 8) |
||||
} |
||||
} |
||||
|
||||
func RlpEncode(object interface{}) string { |
||||
if str, ok := object.(string); ok { |
||||
return "\x00" + NumToVarInt(len(str)) + str |
||||
} else if num, ok := object.(uint32); ok { |
||||
return RlpEncode(Uitoa(num)) |
||||
} else if byt, ok := object.([]byte); ok { |
||||
return RlpEncode(string(byt)) |
||||
} else if slice, ok := object.([]interface{}); ok { |
||||
var buffer bytes.Buffer |
||||
for _, val := range slice { |
||||
if v, ok := val.(string); ok { |
||||
buffer.WriteString(RlpEncode(v)) |
||||
} else { |
||||
buffer.WriteString(RlpEncode(val)) |
||||
} |
||||
} |
||||
|
||||
return "\x01" + RlpEncode(len(buffer.String())) + buffer.String() |
||||
} else if slice, ok := object.([]string); ok { |
||||
|
||||
// FIXME this isn't dry. Fix this
|
||||
var buffer bytes.Buffer |
||||
for _, val := range slice { |
||||
buffer.WriteString(RlpEncode(val)) |
||||
} |
||||
return "\x01" + RlpEncode(len(buffer.String())) + buffer.String() |
||||
} |
||||
|
||||
return "" |
||||
} |
||||
|
||||
type RlpSerializer interface { |
||||
MarshalRlp() []byte |
||||
UnmarshalRlp([]byte) |
||||
} |
||||
|
@ -1,20 +0,0 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"testing" |
||||
"fmt" |
||||
) |
||||
|
||||
func TestRlpEncode(t *testing.T) { |
||||
strRes := "\x00\x03dog" |
||||
str := RlpEncode("dog") |
||||
if str != strRes { |
||||
t.Error(fmt.Sprintf("Expected %q, got %q", strRes, str)) |
||||
} |
||||
|
||||
sliceRes := "\x01\x00\x03dog\x00\x03god\x00\x03cat" |
||||
slice := RlpEncode([]string{"dog", "god", "cat"}) |
||||
if slice != sliceRes { |
||||
t.Error(fmt.Sprintf("Expected %q, got %q", sliceRes, slice)) |
||||
} |
||||
} |
Loading…
Reference in new issue