From 97cfd7a8fc6e86b51602dc4ab8520cc684334437 Mon Sep 17 00:00:00 2001 From: noot Date: Wed, 12 May 2021 15:41:58 -0400 Subject: [PATCH 1/6] add pre-runtime digest before calling initialize block --- lib/babe/build.go | 5 +---- lib/babe/build_test.go | 9 +++++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/babe/build.go b/lib/babe/build.go index b59488ce14..1d974b4881 100644 --- a/lib/babe/build.go +++ b/lib/babe/build.go @@ -49,7 +49,7 @@ func (b *Service) buildBlock(parent *types.Header, slot Slot) (*types.Block, err // create new block header number := big.NewInt(0).Add(parent.Number, big.NewInt(1)) - header, err := types.NewHeader(parent.Hash(), common.Hash{}, common.Hash{}, number, types.NewEmptyDigest()) + header, err := types.NewHeader(parent.Hash(), common.Hash{}, common.Hash{}, number, types.Digest{preDigest}) if err != nil { return nil, err } @@ -87,9 +87,6 @@ func (b *Service) buildBlock(parent *types.Header, slot Slot) (*types.Block, err header.ParentHash = parent.Hash() header.Number.Add(parent.Number, big.NewInt(1)) - // add BABE header to digest - header.Digest = append(header.Digest, preDigest) - // create seal and add to digest seal, err := b.buildBlockSeal(header) if err != nil { diff --git a/lib/babe/build_test.go b/lib/babe/build_test.go index 839a9f432d..db0ca677d5 100644 --- a/lib/babe/build_test.go +++ b/lib/babe/build_test.go @@ -131,12 +131,17 @@ func TestBuildBlock_ok(t *testing.T) { } // remove seal from built block, since we can't predict the signature - block.Header.Digest = block.Header.Digest[:1] + //block.Header.Digest = block.Header.Digest[:1] require.Equal(t, expectedBlockHeader.ParentHash, block.Header.ParentHash) require.Equal(t, expectedBlockHeader.Number, block.Header.Number) require.NotEqual(t, block.Header.StateRoot, emptyHash) require.NotEqual(t, block.Header.ExtrinsicsRoot, emptyHash) - require.Equal(t, expectedBlockHeader.Digest, block.Header.Digest) + require.Equal(t, 3, len(block.Header.Digest)) + require.Equal(t, preDigest, block.Header.Digest[0]) + require.Equal(t, types.PreRuntimeDigestType, block.Header.Digest[0].Type()) + require.Equal(t, types.ConsensusDigestType, block.Header.Digest[1].Type()) + require.Equal(t, types.SealDigestType, block.Header.Digest[2].Type()) + require.Equal(t, types.NextEpochDataType, block.Header.Digest[1].(*types.ConsensusDigest).DataType()) // confirm block body is correct extsRes, err := block.Body.AsExtrinsics() From f1d2d4c3893d221dbc3f8abb17d62e958c1fa219 Mon Sep 17 00:00:00 2001 From: noot Date: Wed, 12 May 2021 15:42:55 -0400 Subject: [PATCH 2/6] cleanup --- lib/babe/build_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/babe/build_test.go b/lib/babe/build_test.go index db0ca677d5..156f60fde6 100644 --- a/lib/babe/build_test.go +++ b/lib/babe/build_test.go @@ -130,8 +130,6 @@ func TestBuildBlock_ok(t *testing.T) { Digest: types.Digest{preDigest}, } - // remove seal from built block, since we can't predict the signature - //block.Header.Digest = block.Header.Digest[:1] require.Equal(t, expectedBlockHeader.ParentHash, block.Header.ParentHash) require.Equal(t, expectedBlockHeader.Number, block.Header.Number) require.NotEqual(t, block.Header.StateRoot, emptyHash) From 01d365d7cd9d6254dab2ddc1d4852877e9d9e18f Mon Sep 17 00:00:00 2001 From: noot Date: Wed, 12 May 2021 18:34:16 -0400 Subject: [PATCH 3/6] remove execute_block hack, fixes sync --- lib/runtime/wasmer/exports.go | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/lib/runtime/wasmer/exports.go b/lib/runtime/wasmer/exports.go index a5c21699ad..ba5863d0f5 100644 --- a/lib/runtime/wasmer/exports.go +++ b/lib/runtime/wasmer/exports.go @@ -148,7 +148,6 @@ func (in *Instance) FinalizeBlock() (*types.Header, error) { func (in *Instance) ExecuteBlock(block *types.Block) ([]byte, error) { // copy block since we're going to modify it b := block.DeepCopy() - b.Header.Digest = types.NewEmptyDigest() if in.version == nil { var err error @@ -158,17 +157,14 @@ func (in *Instance) ExecuteBlock(block *types.Block) ([]byte, error) { } } - // TODO: hack since substrate node_runtime can't seem to handle BABE pre-runtime digests - // with type prefix (ie Primary, Secondary...) - if bytes.Equal(in.version.SpecName(), []byte("kusama")) || bytes.Equal(in.version.SpecName(), []byte("polkadot")) { - // remove seal digest only - for _, d := range block.Header.Digest { - if d.Type() == types.SealDigestType { - continue - } - - b.Header.Digest = append(b.Header.Digest, d) + // remove seal digest only + b.Header.Digest = types.NewEmptyDigest() + for _, d := range block.Header.Digest { + if d.Type() == types.SealDigestType { + continue } + + b.Header.Digest = append(b.Header.Digest, d) } bdEnc, err := b.Encode() From f714a715538124efb7b3d1056d3dca895a9adb92 Mon Sep 17 00:00:00 2001 From: noot Date: Wed, 12 May 2021 18:41:24 -0400 Subject: [PATCH 4/6] fix test --- lib/runtime/wasmer/exports_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/runtime/wasmer/exports_test.go b/lib/runtime/wasmer/exports_test.go index 5dccac02da..cc2870ba2f 100644 --- a/lib/runtime/wasmer/exports_test.go +++ b/lib/runtime/wasmer/exports_test.go @@ -453,6 +453,7 @@ func TestInstance_ExecuteBlock_NodeRuntime(t *testing.T) { require.NoError(t, err) instance.SetContextStorage(parentState) + block.Header.Digest = types.NewEmptyDigest() _, err = instance.ExecuteBlock(block) require.NoError(t, err) } From 746ba7a6b42b9507a751dac446f6a804f16db2fe Mon Sep 17 00:00:00 2001 From: noot Date: Thu, 13 May 2021 09:58:36 -0400 Subject: [PATCH 5/6] add types.NewDigest --- dot/types/digest.go | 5 +++++ lib/babe/build.go | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/dot/types/digest.go b/dot/types/digest.go index 44cfd35ce9..fc25e33a70 100644 --- a/dot/types/digest.go +++ b/dot/types/digest.go @@ -34,6 +34,11 @@ func NewEmptyDigest() Digest { return []DigestItem{} } +// NewDigest returns a new Digest from the given DigestItems +func NewDigest(items ...DigestItem) Digest { + return Digest(items) +} + // Encode returns the SCALE encoded digest func (d *Digest) Encode() ([]byte, error) { enc, err := scale.Encode(big.NewInt(int64(len(*d)))) diff --git a/lib/babe/build.go b/lib/babe/build.go index 1d974b4881..3274de1073 100644 --- a/lib/babe/build.go +++ b/lib/babe/build.go @@ -49,7 +49,7 @@ func (b *Service) buildBlock(parent *types.Header, slot Slot) (*types.Block, err // create new block header number := big.NewInt(0).Add(parent.Number, big.NewInt(1)) - header, err := types.NewHeader(parent.Hash(), common.Hash{}, common.Hash{}, number, types.Digest{preDigest}) + header, err := types.NewHeader(parent.Hash(), common.Hash{}, common.Hash{}, number, types.NewDigest(preDigest)) if err != nil { return nil, err } From 7a87c65abd5d6ffd8520d66d39e22694e3b2398d Mon Sep 17 00:00:00 2001 From: noot <36753753+noot@users.noreply.github.com> Date: Thu, 13 May 2021 10:32:37 -0400 Subject: [PATCH 6/6] Update dot/types/digest.go Co-authored-by: Arijit Das --- dot/types/digest.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dot/types/digest.go b/dot/types/digest.go index fc25e33a70..b2e66f716a 100644 --- a/dot/types/digest.go +++ b/dot/types/digest.go @@ -36,7 +36,7 @@ func NewEmptyDigest() Digest { // NewDigest returns a new Digest from the given DigestItems func NewDigest(items ...DigestItem) Digest { - return Digest(items) + return items } // Encode returns the SCALE encoded digest