From d9b9845150d84b96d481b5b0b449a042bccd4936 Mon Sep 17 00:00:00 2001 From: noot Date: Thu, 30 Jan 2020 17:09:15 -0500 Subject: [PATCH 1/7] add test --- codec/decode_test.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/codec/decode_test.go b/codec/decode_test.go index 641b29b9f1..393d266c64 100644 --- a/codec/decode_test.go +++ b/codec/decode_test.go @@ -508,3 +508,35 @@ func TestDecodeArrays(t *testing.T) { } } } + +func TestDecodeEmptyArray(t *testing.T) { + expected := &struct { + Number *big.Int + Digest [][]byte + }{ + big.NewInt(9), + [][]byte{{0xa, 0xb, 0xc, 0xd}}, + } + + testStruct := &struct { + Number *big.Int + Digest [][]byte + }{ + big.NewInt(0), + [][]byte{}, // empty!!! + } + + enc, err := Encode(expected) + if err != nil { + t.Fatal(err) + } + + output, err := Decode(enc, testStruct) + if err != nil { + t.Fatal(err) + } + + if !reflect.DeepEqual(output, expected) { + t.Fatalf("Fail: got %v expected %v", output, expected) + } +} From 19de7250b68654a1f67d78a76c987b6b42672889 Mon Sep 17 00:00:00 2001 From: noot Date: Fri, 31 Jan 2020 14:05:38 -0500 Subject: [PATCH 2/7] fix DecodeArray to allocate new slice --- codec/decode.go | 20 +++++++++++++------- codec/decode_test.go | 4 ++-- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/codec/decode.go b/codec/decode.go index bc6495ce23..14c2cb0ada 100644 --- a/codec/decode.go +++ b/codec/decode.go @@ -325,10 +325,6 @@ func (sd *Decoder) DecodeArray(t interface{}) (interface{}, error) { v = reflect.ValueOf(t) } - if v.Len() == 0 { - return t, nil - } - var err error var o interface{} @@ -341,10 +337,12 @@ func (sd *Decoder) DecodeArray(t interface{}) (interface{}, error) { return t, nil } + sl := reflect.MakeSlice(v.Type(), int(length), 1024) + for i := 0; i < int(length); i++ { - arrayValue := v.Index(i) + arrayValue := sl.Index(i) - switch v.Index(i).Interface().(type) { + switch sl.Index(i).Interface().(type) { case []byte: o, err = sd.DecodeByteArray() if err != nil { @@ -371,7 +369,7 @@ func (sd *Decoder) DecodeArray(t interface{}) (interface{}, error) { } } - return t, err + return sl.Interface(), err } // DecodeTuple accepts a byte array representing the SCALE encoded tuple and an interface. This interface should be a pointer @@ -415,6 +413,14 @@ func (sd *Decoder) DecodeTuple(t interface{}) (interface{}, error) { // get the pointer to the value and set the value ptr := fieldValue.(*[]byte) *ptr = o.([]byte) + case [][]byte: + o, err = sd.DecodeArray([][]byte{}) + if err != nil { + break + } + + ptr := fieldValue.(*[][]byte) + *ptr = o.([][]byte) case int8: o, err = sd.DecodeFixedWidthInt(int8(0)) if err != nil { diff --git a/codec/decode_test.go b/codec/decode_test.go index 393d266c64..e81fddeae5 100644 --- a/codec/decode_test.go +++ b/codec/decode_test.go @@ -515,7 +515,7 @@ func TestDecodeEmptyArray(t *testing.T) { Digest [][]byte }{ big.NewInt(9), - [][]byte{{0xa, 0xb, 0xc, 0xd}}, + [][]byte{{0xa, 0xb, 0xc, 0xd}, {0xe, 0xf}}, } testStruct := &struct { @@ -523,7 +523,7 @@ func TestDecodeEmptyArray(t *testing.T) { Digest [][]byte }{ big.NewInt(0), - [][]byte{}, // empty!!! + [][]byte{}, } enc, err := Encode(expected) From 1842efeca9d219e8ea7ed3add01b135cfac8ec79 Mon Sep 17 00:00:00 2001 From: noot Date: Fri, 31 Jan 2020 14:41:22 -0500 Subject: [PATCH 3/7] fix tests --- codec/decode.go | 9 ++++++++- codec/decode_test.go | 1 - 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/codec/decode.go b/codec/decode.go index 14c2cb0ada..9848f99517 100644 --- a/codec/decode.go +++ b/codec/decode.go @@ -337,7 +337,7 @@ func (sd *Decoder) DecodeArray(t interface{}) (interface{}, error) { return t, nil } - sl := reflect.MakeSlice(v.Type(), int(length), 1024) + sl := reflect.MakeSlice(v.Type(), int(length), int(length)) for i := 0; i < int(length); i++ { arrayValue := sl.Index(i) @@ -369,6 +369,13 @@ func (sd *Decoder) DecodeArray(t interface{}) (interface{}, error) { } } + switch t.(type) { + case [][]byte: + copy(t.([][]byte), sl.Interface().([][]byte)) + case [][32]byte: + copy(t.([][32]byte), sl.Interface().([][32]byte)) + } + return sl.Interface(), err } diff --git a/codec/decode_test.go b/codec/decode_test.go index e81fddeae5..7f01263b2a 100644 --- a/codec/decode_test.go +++ b/codec/decode_test.go @@ -317,7 +317,6 @@ var decodeTupleTests = []decodeTupleTest{ } var decodeArrayTests = []decodeArrayTest{ - {val: []byte{}, t: [][]byte{}, output: [][]byte{}}, {val: []byte{0x00}, t: []int{}, output: []int{}}, {val: []byte{0x04, 0x04}, t: make([]int, 1), output: []int{1}}, {val: []byte{0x10, 0x04, 0x08, 0x0c, 0x10}, t: make([]int, 4), output: []int{1, 2, 3, 4}}, From 4463923f34d570c1745a33e3f543de7507683595 Mon Sep 17 00:00:00 2001 From: noot Date: Fri, 31 Jan 2020 14:42:52 -0500 Subject: [PATCH 4/7] update DecodePtrIntArray --- codec/decode_ptr.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/codec/decode_ptr.go b/codec/decode_ptr.go index d2be79700e..4b3c60064b 100644 --- a/codec/decode_ptr.go +++ b/codec/decode_ptr.go @@ -193,20 +193,21 @@ func (sd *Decoder) DecodePtrBool(output interface{}) error { // DecodePtrIntArray decodes a byte array to an array of ints func (sd *Decoder) DecodePtrIntArray(t interface{}) error { - _, err := sd.DecodeInteger() + length, err := sd.DecodeInteger() if err != nil { return err } - for i := range t.([]int) { - //var temp int64 - //var err error + sl := make([]int, length) + for i := range sl { temp, err := sd.DecodeInteger() - t.([]int)[i] = int(temp) + sl[i] = int(temp) if err != nil { break } } + + copy(t.([]int), sl) return nil } From 909f66efbf06880e61569a3f86356cec6a9a75a9 Mon Sep 17 00:00:00 2001 From: noot Date: Fri, 31 Jan 2020 15:15:51 -0500 Subject: [PATCH 5/7] fix test --- core/service_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/service_test.go b/core/service_test.go index 5611737376..592c33cc24 100644 --- a/core/service_test.go +++ b/core/service_test.go @@ -103,7 +103,7 @@ func TestValidateTransaction(t *testing.T) { // https://github.com/paritytech/substrate/blob/ea2644a235f4b189c8029b9c9eac9d4df64ee91e/core/test-runtime/src/system.rs#L190 expected := &transaction.Validity{ Priority: 69, - Requires: [][]byte{{}}, + Requires: [][]byte{}, // https://github.com/paritytech/substrate/blob/ea2644a235f4b189c8029b9c9eac9d4df64ee91e/core/test-runtime/src/system.rs#L173 Provides: [][]byte{{146, 157, 61, 99, 63, 98, 30, 242, 128, 49, 150, 90, 140, 165, 187, 249}}, Longevity: 64, From a66a2136e2c66f3b603ef125de28d6728a7f5d44 Mon Sep 17 00:00:00 2001 From: noot Date: Fri, 31 Jan 2020 15:40:51 -0500 Subject: [PATCH 6/7] fix babe tests --- consensus/babe/babe.go | 8 ++++---- consensus/babe/runtime.go | 13 +++++++------ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/consensus/babe/babe.go b/consensus/babe/babe.go index b1cc6cefa6..dcc64f516b 100644 --- a/consensus/babe/babe.go +++ b/consensus/babe/babe.go @@ -274,7 +274,7 @@ func (b *Session) buildBlock(parent *types.Header, slot Slot) (*types.Block, err // initialize block encodedHeader, err := scale.Encode(parent) if err != nil { - return nil, err + return nil, fmt.Errorf("cannot encode header: %s", err) } err = b.initializeBlock(encodedHeader) if err != nil { @@ -284,13 +284,13 @@ func (b *Session) buildBlock(parent *types.Header, slot Slot) (*types.Block, err // add block inherents err = b.buildBlockInherents(slot) if err != nil { - return nil, err + return nil, fmt.Errorf("cannot build inherents: %s", err) } // add block extrinsics included, err := b.buildBlockExtrinsics(slot) if err != nil { - return nil, err + return nil, fmt.Errorf("cannot build extrisnics: %s", err) } // finalize block @@ -298,7 +298,7 @@ func (b *Session) buildBlock(parent *types.Header, slot Slot) (*types.Block, err block, err := b.finalizeBlock() if err != nil { b.addToQueue(included) - return nil, err + return nil, fmt.Errorf("cannot finalize block: %s", err) } block.Header.Number.Add(parent.Number, big.NewInt(1)) diff --git a/consensus/babe/runtime.go b/consensus/babe/runtime.go index f4f5f94393..ebae7e55aa 100644 --- a/consensus/babe/runtime.go +++ b/consensus/babe/runtime.go @@ -64,11 +64,12 @@ func (b *Session) finalizeBlock() (*types.Block, error) { return nil, err } - bh := &types.Block{ - Header: new(types.Header), - Body: new(types.Body), - } - + // TODO: finalize block actually returns a header, not a block. need to update this function + // as well as buildBlock + bh := new(types.Header) _, err = scale.Decode(data, bh) - return bh, err + return &types.Block{ + Header: bh, + Body: nil, + }, err } From 42ac62a94cd0740f5d1521bdceabbb6d2db0edc7 Mon Sep 17 00:00:00 2001 From: noot Date: Fri, 31 Jan 2020 16:06:34 -0500 Subject: [PATCH 7/7] fix test --- p2p/message_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/p2p/message_test.go b/p2p/message_test.go index 2dfb23868c..064743ef51 100644 --- a/p2p/message_test.go +++ b/p2p/message_test.go @@ -499,7 +499,7 @@ func TestDecodeBlockAnnounceMessage(t *testing.T) { Number: big.NewInt(1), StateRoot: stateRoot, ExtrinsicsRoot: extrinsicsRoot, - Digest: nil, + Digest: [][]byte{}, } if !reflect.DeepEqual(bhm, expected) {