Skip to content

Commit

Permalink
Address TODOs
Browse files Browse the repository at this point in the history
  • Loading branch information
qdm12 committed Nov 29, 2021
1 parent 209f326 commit f78d45b
Show file tree
Hide file tree
Showing 8 changed files with 26 additions and 87 deletions.
11 changes: 4 additions & 7 deletions lib/trie/branch/children.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,8 @@ package branch

// ChildrenBitmap returns the 16 bit bitmap
// of the children in the branch.
func (b *Branch) ChildrenBitmap() uint16 {
var bitmap uint16
var i uint
for i = 0; i < 16; i++ {
func (b *Branch) ChildrenBitmap() (bitmap uint16) {
for i := uint(0); i < 16; i++ {
if b.Children[i] != nil {
bitmap = bitmap | 1<<i
}
Expand All @@ -18,9 +16,8 @@ func (b *Branch) ChildrenBitmap() uint16 {

// NumChildren returns the total number of children
// in the branch.
func (b *Branch) NumChildren() int {
var i, count int
for i = 0; i < 16; i++ {
func (b *Branch) NumChildren() (count int) {
for i := 0; i < 16; i++ {
if b.Children[i] != nil {
count++
}
Expand Down
9 changes: 1 addition & 8 deletions lib/trie/branch/decode.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,6 @@ var (
// children are known to be with an empty leaf. The children nodes hashes are then used to
// find other values using the persistent database.
func Decode(reader io.Reader, header byte) (branch *Branch, err error) {
if header == 0 { // TODO remove this is taken care of by the caller
header, err = decode.ReadNextByte(reader)
if err != nil {
return nil, fmt.Errorf("%w: %s", ErrReadHeaderByte, err)
}
}

nodeType := header >> 6
if nodeType != 2 && nodeType != 3 {
return nil, fmt.Errorf("%w: %d", ErrNodeTypeIsNotABranch, nodeType)
Expand Down Expand Up @@ -81,7 +74,7 @@ func Decode(reader io.Reader, header byte) (branch *Branch, err error) {
}
}

branch.Dirty = true // TODO move as soon as it gets modified?
branch.Dirty = true

return branch, nil
}
36 changes: 11 additions & 25 deletions lib/trie/branch/decode_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,60 +44,50 @@ func Test_Decode(t *testing.T) {
errWrapped error
errMessage string
}{
"no data with header 0": {
reader: bytes.NewBuffer(nil),
errWrapped: ErrReadHeaderByte,
errMessage: "cannot read header byte: EOF",
},
"no data with header 1": {
reader: bytes.NewBuffer(nil),
header: 1,
errWrapped: ErrNodeTypeIsNotABranch,
errMessage: "node type is not a branch: 0",
},
"first byte as 0 header 0": {
reader: bytes.NewBuffer([]byte{0}),
header: 65,
errWrapped: ErrNodeTypeIsNotABranch,
errMessage: "node type is not a branch: 0",
errMessage: "node type is not a branch: 1",
},
"key decoding error": {
reader: bytes.NewBuffer([]byte{
129, // node type 2 and key length 1
// missing key data byte
}),
header: 129, // node type 2 and key length 1
errWrapped: decode.ErrReadKeyData,
errMessage: "cannot decode key: cannot read key data: EOF",
},
"children bitmap read error": {
reader: bytes.NewBuffer([]byte{
129, // node type 2 and key length 1
9, // key data
9, // key data
// missing children bitmap 2 bytes
}),
header: 129, // node type 2 and key length 1
errWrapped: ErrReadChildrenBitmap,
errMessage: "cannot read children bitmap: EOF",
},
"children decoding error": {
reader: bytes.NewBuffer([]byte{
129, // node type 2 and key length 1
9, // key data
0, 4, // children bitmap
// missing children scale encoded data
}),
header: 129, // node type 2 and key length 1
errWrapped: ErrDecodeChildHash,
errMessage: "cannot decode child hash: at index 10: EOF",
},
"success node type 2": {
reader: bytes.NewBuffer(
concatByteSlices([][]byte{
{
129, // node type 2 and key length 1
9, // key data
0, 4, // children bitmap
},
scaleEncodeBytes(t, 1, 2, 3, 4, 5), // child hash
}),
),
header: 129, // node type 2 and key length 1
branch: &Branch{
Key: []byte{9},
Children: [16]node.Node{
Expand All @@ -113,29 +103,25 @@ func Test_Decode(t *testing.T) {
"value decoding error for node type 3": {
reader: bytes.NewBuffer(
concatByteSlices([][]byte{
{
193, // node type 3 and key length 1
9, // key data
},
{9}, // key data
{0, 4}, // children bitmap
// missing encoded branch value
}),
),
header: 193, // node type 3 and key length 1
errWrapped: ErrDecodeValue,
errMessage: "cannot decode value: EOF",
},
"success node type 3": {
reader: bytes.NewBuffer(
concatByteSlices([][]byte{
{
193, // node type 3 and key length 1
9, // key data
},
{9}, // key data
{0, 4}, // children bitmap
scaleEncodeBytes(t, 7, 8, 9), // branch value
scaleEncodeBytes(t, 1, 2, 3, 4, 5), // child hash
}),
),
header: 193, // node type 3 and key length 1
branch: &Branch{
Key: []byte{9},
Value: []byte{7, 8, 9},
Expand Down
4 changes: 0 additions & 4 deletions lib/trie/branch/encode.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,6 @@ import (
// and then SCALE encodes it. This is used to encode children
// nodes of branches.
func (b *Branch) ScaleEncodeHash() (encoding []byte, err error) {
// if b == nil { // TODO remove
// panic("Should write 0 to buffer")
// }

buffer := pools.DigestBuffers.Get().(*bytes.Buffer)
buffer.Reset()
defer pools.DigestBuffers.Put(buffer)
Expand Down
1 change: 0 additions & 1 deletion lib/trie/encodedecode_test/branch_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ func Test_Branch_Encode_Decode(t *testing.T) {
Key: []byte{5},
Children: [16]node.Node{
&leaf.Leaf{
// TODO key and value are nil here?? Why?
Hash: []byte{0x41, 0x9, 0x4, 0xa},
},
},
Expand Down
11 changes: 2 additions & 9 deletions lib/trie/leaf/decode.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,7 @@ var (
)

// Decode reads and decodes from a reader with the encoding specified in lib/trie/encode/doc.go.
func Decode(r io.Reader, header byte) (leaf *Leaf, err error) { // TODO return leaf
if header == 0 { // TODO remove this is taken care of by the caller
header, err = decode.ReadNextByte(r)
if err != nil {
return nil, fmt.Errorf("%w: %s", ErrReadHeaderByte, err)
}
}

func Decode(r io.Reader, header byte) (leaf *Leaf, err error) {
nodeType := header >> 6
if nodeType != 1 {
return nil, fmt.Errorf("%w: %d", ErrNodeTypeIsNotALeaf, nodeType)
Expand All @@ -51,7 +44,7 @@ func Decode(r io.Reader, header byte) (leaf *Leaf, err error) { // TODO return l
leaf.Value = value
}

leaf.Dirty = true // TODO move this as soon as it gets modified
leaf.Dirty = true

return leaf, nil
}
28 changes: 8 additions & 20 deletions lib/trie/leaf/decode_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,45 +42,35 @@ func Test_Decode(t *testing.T) {
errWrapped error
errMessage string
}{
"no data with header 0": {
reader: bytes.NewBuffer(nil),
errWrapped: ErrReadHeaderByte,
errMessage: "cannot read header byte: EOF",
},
"no data with header 1": {
reader: bytes.NewBuffer(nil),
header: 1,
errWrapped: ErrNodeTypeIsNotALeaf,
errMessage: "node type is not a leaf: 0",
},
"first byte as 0 header 0": {
reader: bytes.NewBuffer([]byte{0}),
errWrapped: ErrNodeTypeIsNotALeaf,
errMessage: "node type is not a leaf: 0",
},
"key decoding error": {
reader: bytes.NewBuffer([]byte{
65, // node type 1 and key length 1
// missing key data byte
}),
header: 65, // node type 1 and key length 1
errWrapped: decode.ErrReadKeyData,
errMessage: "cannot decode key: cannot read key data: EOF",
},
"value decoding error": {
reader: bytes.NewBuffer([]byte{
65, // node type 1 and key length 1
9, // key data
9, // key data
// missing value data
}),
header: 65, // node type 1 and key length 1
errWrapped: ErrDecodeValue,
errMessage: "cannot decode value: EOF",
},
"zero value": {
reader: bytes.NewBuffer([]byte{
65, // node type 1 and key length 1
9, // key data
0, // missing value data
9, // key data
0, // missing value data
}),
header: 65, // node type 1 and key length 1
leaf: &Leaf{
Key: []byte{9},
Dirty: true,
Expand All @@ -89,13 +79,11 @@ func Test_Decode(t *testing.T) {
"success": {
reader: bytes.NewBuffer(
concatByteSlices([][]byte{
{
65, // node type 1 and key length 1
9, // key data
},
{9}, // key data
scaleEncodeBytes(t, 1, 2, 3, 4, 5), // value data
}),
),
header: 65, // node type 1 and key length 1
leaf: &Leaf{
Key: []byte{9},
Value: []byte{1, 2, 3, 4, 5},
Expand Down
13 changes: 0 additions & 13 deletions lib/trie/leaf/encode.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,15 +86,6 @@ func (l *Leaf) EncodeAndHash() (encoding, hash []byte, err error) {
// The encoding has the following format:
// NodeHeader | Extra partial key length | Partial Key | Value
func (l *Leaf) Encode(buffer encode.Buffer) (err error) {
// if l == nil {
// // TODO remove if not needed
// _, err := buffer.Write([]byte{0})
// if err != nil {
// return fmt.Errorf("cannot write nil encoding to buffer: %w", err)
// }
// return nil
// }

l.encodingMu.RLock()
if !l.Dirty && l.Encoding != nil {
_, err = buffer.Write(l.Encoding)
Expand Down Expand Up @@ -145,10 +136,6 @@ func (l *Leaf) Encode(buffer encode.Buffer) (err error) {
// and then SCALE encodes it. This is used to encode children
// nodes of branches.
func (l *Leaf) ScaleEncodeHash() (b []byte, err error) {
// if l == nil { // TODO remove
// panic("Should write 0 to buffer")
// }

buffer := pools.DigestBuffers.Get().(*bytes.Buffer)
buffer.Reset()
defer pools.DigestBuffers.Put(buffer)
Expand Down

0 comments on commit f78d45b

Please sign in to comment.