WIP new rlp implementation
This commit is contained in:
parent
b40013ac30
commit
d5d2efbaf3
52
rlp.go
Normal file
52
rlp.go
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
_"fmt"
|
||||||
|
"bytes"
|
||||||
|
"math"
|
||||||
|
)
|
||||||
|
|
||||||
|
func EncodeSlice(slice []interface{}) []byte {
|
||||||
|
var buff bytes.Buffer
|
||||||
|
|
||||||
|
for _, val := range slice {
|
||||||
|
switch t := val.(type) {
|
||||||
|
case []interface{}, []string:
|
||||||
|
buff.Write(Encode(t))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return buff.Bytes()
|
||||||
|
}
|
||||||
|
|
||||||
|
func Encode(object interface{}) []byte {
|
||||||
|
var buff bytes.Buffer
|
||||||
|
|
||||||
|
switch t := object.(type) {
|
||||||
|
case string:
|
||||||
|
if len(t) < 56 {
|
||||||
|
buff.WriteString(string(len(t) + 64) + t)
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
|
case uint32, uint64:
|
||||||
|
var num uint64
|
||||||
|
if _num, ok := t.(uint64); ok {
|
||||||
|
num = _num
|
||||||
|
} else if _num, ok := t.(uint32); ok {
|
||||||
|
num = uint64(_num)
|
||||||
|
}
|
||||||
|
|
||||||
|
if num >= 0 && num < 24 {
|
||||||
|
buff.WriteString(string(num))
|
||||||
|
} else if num <= uint64(math.Pow(2, 256)) {
|
||||||
|
}
|
||||||
|
case []byte:
|
||||||
|
// Cast the byte slice to a string
|
||||||
|
buff.Write(Encode(string(t)))
|
||||||
|
case []interface{}:
|
||||||
|
buff.Write(EncodeSlice(t))
|
||||||
|
}
|
||||||
|
|
||||||
|
return buff.Bytes()
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user