stateless: decode witness+block

This commit is contained in:
Jared Wasinger 2023-12-16 00:07:00 +08:00
parent bbb8cc6bc1
commit a32c8408bf
2 changed files with 36 additions and 10 deletions

View file

@ -55,13 +55,11 @@ func stateless(ctx *cli.Context) error {
panic("block witness required") panic("block witness required")
} }
f, err := os.Open(blockWitnessPath) b, err := os.ReadFile(blockWitnessPath)
if err != nil { if err != nil {
panic(err) panic(err)
} }
var b []byte
f.Read(b)
block, witness, err := state.DecodeWitnessRLP(b) block, witness, err := state.DecodeWitnessRLP(b)
if err != nil { if err != nil {
panic(err) panic(err)

View file

@ -40,7 +40,7 @@ type encodedWitness struct {
} }
func (e *encodedWitness) ToWitness() *Witness { func (e *encodedWitness) ToWitness() *Witness {
var res Witness res := NewWitness()
res.root = e.root res.root = e.root
for i := 0; i < len(e.codes); i++ { for i := 0; i < len(e.codes); i++ {
res.codes[e.codeHashes[i]] = e.codes[i] res.codes[e.codeHashes[i]] = e.codes[i]
@ -55,13 +55,43 @@ func (e *encodedWitness) ToWitness() *Witness {
for i, blockNum := range e.blockNums { for i, blockNum := range e.blockNums {
res.blockHashes[blockNum] = e.blockHashes[i] res.blockHashes[blockNum] = e.blockHashes[i]
} }
return &res return res
} }
func DecodeWitnessRLP(b []byte) (*types.Block, *Witness, error) { func DecodeWitnessRLP(b []byte) (*types.Block, *Witness, error) {
var res encodedWitness var res encodedWitness
if err := rlp.DecodeBytes(b, &res); err != nil { stream := rlp.NewStream(bytes.NewBuffer(b), 1_000_000)
return nil, nil, err _, err := stream.List()
if err != nil {
panic(err)
}
err = res.block.DecodeRLP(stream)
if err != nil {
panic(err)
}
if err = stream.Decode(&res.root); err != nil {
panic(err)
}
if err = stream.Decode(&res.owners); err != nil {
panic(err)
}
if err = stream.Decode(&res.allPaths); err != nil {
panic(err)
}
if err = stream.Decode(&res.allNodes); err != nil {
panic(err)
}
if err = stream.Decode(&res.blockNums); err != nil {
panic(err)
}
if err = stream.Decode(&res.blockHashes); err != nil {
panic(err)
}
if err = stream.Decode(&res.codeHashes); err != nil {
panic(err)
}
if err = stream.Decode(&res.codes); err != nil {
panic(err)
} }
return &res.block, res.ToWitness(), nil return &res.block, res.ToWitness(), nil
} }
@ -103,9 +133,7 @@ func (w *Witness) EncodeRLP() []byte {
} }
l := eb.List() l := eb.List()
w.block.EncodeRLP(eb) w.block.EncodeRLP(eb)
if err := rlp.Encode(eb, root); err != nil { eb.WriteBytes(root[:])
panic(err)
}
if err := rlp.Encode(eb, owners); err != nil { if err := rlp.Encode(eb, owners); err != nil {
panic(err) panic(err)
} }