Skip to content

Commit c1b26d3

Browse files
authored
fix(lib/babe): add pre-runtime digest before calling initialize_block (#1581)
1 parent 1328c80 commit c1b26d3

File tree

5 files changed

+20
-18
lines changed

5 files changed

+20
-18
lines changed

dot/types/digest.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ func NewEmptyDigest() Digest {
3434
return []DigestItem{}
3535
}
3636

37+
// NewDigest returns a new Digest from the given DigestItems
38+
func NewDigest(items ...DigestItem) Digest {
39+
return items
40+
}
41+
3742
// Encode returns the SCALE encoded digest
3843
func (d *Digest) Encode() ([]byte, error) {
3944
enc, err := scale.Encode(big.NewInt(int64(len(*d))))

lib/babe/build.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func (b *Service) buildBlock(parent *types.Header, slot Slot) (*types.Block, err
4949

5050
// create new block header
5151
number := big.NewInt(0).Add(parent.Number, big.NewInt(1))
52-
header, err := types.NewHeader(parent.Hash(), common.Hash{}, common.Hash{}, number, types.NewEmptyDigest())
52+
header, err := types.NewHeader(parent.Hash(), common.Hash{}, common.Hash{}, number, types.NewDigest(preDigest))
5353
if err != nil {
5454
return nil, err
5555
}
@@ -87,9 +87,6 @@ func (b *Service) buildBlock(parent *types.Header, slot Slot) (*types.Block, err
8787
header.ParentHash = parent.Hash()
8888
header.Number.Add(parent.Number, big.NewInt(1))
8989

90-
// add BABE header to digest
91-
header.Digest = append(header.Digest, preDigest)
92-
9390
// create seal and add to digest
9491
seal, err := b.buildBlockSeal(header)
9592
if err != nil {

lib/babe/build_test.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,13 +130,16 @@ func TestBuildBlock_ok(t *testing.T) {
130130
Digest: types.Digest{preDigest},
131131
}
132132

133-
// remove seal from built block, since we can't predict the signature
134-
block.Header.Digest = block.Header.Digest[:1]
135133
require.Equal(t, expectedBlockHeader.ParentHash, block.Header.ParentHash)
136134
require.Equal(t, expectedBlockHeader.Number, block.Header.Number)
137135
require.NotEqual(t, block.Header.StateRoot, emptyHash)
138136
require.NotEqual(t, block.Header.ExtrinsicsRoot, emptyHash)
139-
require.Equal(t, expectedBlockHeader.Digest, block.Header.Digest)
137+
require.Equal(t, 3, len(block.Header.Digest))
138+
require.Equal(t, preDigest, block.Header.Digest[0])
139+
require.Equal(t, types.PreRuntimeDigestType, block.Header.Digest[0].Type())
140+
require.Equal(t, types.ConsensusDigestType, block.Header.Digest[1].Type())
141+
require.Equal(t, types.SealDigestType, block.Header.Digest[2].Type())
142+
require.Equal(t, types.NextEpochDataType, block.Header.Digest[1].(*types.ConsensusDigest).DataType())
140143

141144
// confirm block body is correct
142145
extsRes, err := block.Body.AsExtrinsics()

lib/runtime/wasmer/exports.go

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,6 @@ func (in *Instance) FinalizeBlock() (*types.Header, error) {
148148
func (in *Instance) ExecuteBlock(block *types.Block) ([]byte, error) {
149149
// copy block since we're going to modify it
150150
b := block.DeepCopy()
151-
b.Header.Digest = types.NewEmptyDigest()
152151

153152
if in.version == nil {
154153
var err error
@@ -158,17 +157,14 @@ func (in *Instance) ExecuteBlock(block *types.Block) ([]byte, error) {
158157
}
159158
}
160159

161-
// TODO: hack since substrate node_runtime can't seem to handle BABE pre-runtime digests
162-
// with type prefix (ie Primary, Secondary...)
163-
if bytes.Equal(in.version.SpecName(), []byte("kusama")) || bytes.Equal(in.version.SpecName(), []byte("polkadot")) {
164-
// remove seal digest only
165-
for _, d := range block.Header.Digest {
166-
if d.Type() == types.SealDigestType {
167-
continue
168-
}
169-
170-
b.Header.Digest = append(b.Header.Digest, d)
160+
// remove seal digest only
161+
b.Header.Digest = types.NewEmptyDigest()
162+
for _, d := range block.Header.Digest {
163+
if d.Type() == types.SealDigestType {
164+
continue
171165
}
166+
167+
b.Header.Digest = append(b.Header.Digest, d)
172168
}
173169

174170
bdEnc, err := b.Encode()

lib/runtime/wasmer/exports_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,7 @@ func TestInstance_ExecuteBlock_NodeRuntime(t *testing.T) {
453453
require.NoError(t, err)
454454
instance.SetContextStorage(parentState)
455455

456+
block.Header.Digest = types.NewEmptyDigest()
456457
_, err = instance.ExecuteBlock(block)
457458
require.NoError(t, err)
458459
}

0 commit comments

Comments
 (0)