b2ee59024f
* Make diffing work across versions. * Start porting more chainwatch logic.
128 lines
2.6 KiB
Go
128 lines
2.6 KiB
Go
package miner
|
|
|
|
import (
|
|
"github.com/filecoin-project/go-state-types/abi"
|
|
"github.com/filecoin-project/lotus/chain/actors/adt"
|
|
cbg "github.com/whyrusleeping/cbor-gen"
|
|
)
|
|
|
|
func DiffPreCommits(pre, cur State) (*PreCommitChanges, error) {
|
|
results := new(PreCommitChanges)
|
|
|
|
prep, err := pre.precommits()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
curp, err := cur.precommits()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = adt.DiffAdtMap(prep, curp, &preCommitDiffer{results, pre, cur})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return results, nil
|
|
}
|
|
|
|
type preCommitDiffer struct {
|
|
Results *PreCommitChanges
|
|
pre, after State
|
|
}
|
|
|
|
func (m *preCommitDiffer) AsKey(key string) (abi.Keyer, error) {
|
|
sector, err := abi.ParseUIntKey(key)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return abi.UIntKey(sector), nil
|
|
}
|
|
|
|
func (m *preCommitDiffer) Add(key string, val *cbg.Deferred) error {
|
|
sp, err := m.after.decodeSectorPreCommitOnChainInfo(val)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
m.Results.Added = append(m.Results.Added, sp)
|
|
return nil
|
|
}
|
|
|
|
func (m *preCommitDiffer) Modify(key string, from, to *cbg.Deferred) error {
|
|
return nil
|
|
}
|
|
|
|
func (m *preCommitDiffer) Remove(key string, val *cbg.Deferred) error {
|
|
sp, err := m.pre.decodeSectorPreCommitOnChainInfo(val)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
m.Results.Removed = append(m.Results.Removed, sp)
|
|
return nil
|
|
}
|
|
|
|
func DiffSectors(pre, cur State) (*SectorChanges, error) {
|
|
results := new(SectorChanges)
|
|
|
|
pres, err := pre.sectors()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
curs, err := cur.sectors()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = adt.DiffAdtArray(pres, curs, §orDiffer{results, pre, cur})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return results, nil
|
|
}
|
|
|
|
type sectorDiffer struct {
|
|
Results *SectorChanges
|
|
pre, after State
|
|
}
|
|
|
|
func (m *sectorDiffer) Add(key uint64, val *cbg.Deferred) error {
|
|
si, err := m.after.decodeSectorOnChainInfo(val)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
m.Results.Added = append(m.Results.Added, si)
|
|
return nil
|
|
}
|
|
|
|
func (m *sectorDiffer) Modify(key uint64, from, to *cbg.Deferred) error {
|
|
siFrom, err := m.pre.decodeSectorOnChainInfo(from)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
siTo, err := m.after.decodeSectorOnChainInfo(to)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if siFrom.Expiration != siTo.Expiration {
|
|
m.Results.Extended = append(m.Results.Extended, SectorExtensions{
|
|
From: siFrom,
|
|
To: siTo,
|
|
})
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (m *sectorDiffer) Remove(key uint64, val *cbg.Deferred) error {
|
|
si, err := m.pre.decodeSectorOnChainInfo(val)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
m.Results.Removed = append(m.Results.Removed, si)
|
|
return nil
|
|
}
|