153 lines
3.0 KiB
Go
153 lines
3.0 KiB
Go
package init
|
|
|
|
import (
|
|
"bytes"
|
|
|
|
"github.com/filecoin-project/go-address"
|
|
"github.com/filecoin-project/go-state-types/abi"
|
|
typegen "github.com/whyrusleeping/cbor-gen"
|
|
|
|
"github.com/filecoin-project/lotus/chain/actors/adt"
|
|
)
|
|
|
|
func DiffAddressMap(pre, cur State) (*AddressMapChanges, error) {
|
|
prem, err := pre.addressMap()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
curm, err := cur.addressMap()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
preRoot, err := prem.Root()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
curRoot, err := curm.Root()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
results := new(AddressMapChanges)
|
|
// no change.
|
|
if curRoot.Equals(preRoot) {
|
|
return results, nil
|
|
}
|
|
|
|
err = adt.DiffAdtMap(prem, curm, &addressMapDiffer{results, pre, cur})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return results, nil
|
|
}
|
|
|
|
type addressMapDiffer struct {
|
|
Results *AddressMapChanges
|
|
pre, adter State
|
|
}
|
|
|
|
type AddressMapChanges struct {
|
|
Added []AddressPair
|
|
Modified []AddressChange
|
|
Removed []AddressPair
|
|
}
|
|
|
|
func (i *addressMapDiffer) AsKey(key string) (abi.Keyer, error) {
|
|
addr, err := address.NewFromBytes([]byte(key))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return abi.AddrKey(addr), nil
|
|
}
|
|
|
|
func (i *addressMapDiffer) Add(key string, val *typegen.Deferred) error {
|
|
pkAddr, err := address.NewFromBytes([]byte(key))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
id := new(typegen.CborInt)
|
|
if err := id.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil {
|
|
return err
|
|
}
|
|
idAddr, err := address.NewIDAddress(uint64(*id))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
i.Results.Added = append(i.Results.Added, AddressPair{
|
|
ID: idAddr,
|
|
PK: pkAddr,
|
|
})
|
|
return nil
|
|
}
|
|
|
|
func (i *addressMapDiffer) Modify(key string, from, to *typegen.Deferred) error {
|
|
pkAddr, err := address.NewFromBytes([]byte(key))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
fromID := new(typegen.CborInt)
|
|
if err := fromID.UnmarshalCBOR(bytes.NewReader(from.Raw)); err != nil {
|
|
return err
|
|
}
|
|
fromIDAddr, err := address.NewIDAddress(uint64(*fromID))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
toID := new(typegen.CborInt)
|
|
if err := toID.UnmarshalCBOR(bytes.NewReader(to.Raw)); err != nil {
|
|
return err
|
|
}
|
|
toIDAddr, err := address.NewIDAddress(uint64(*toID))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
i.Results.Modified = append(i.Results.Modified, AddressChange{
|
|
From: AddressPair{
|
|
ID: fromIDAddr,
|
|
PK: pkAddr,
|
|
},
|
|
To: AddressPair{
|
|
ID: toIDAddr,
|
|
PK: pkAddr,
|
|
},
|
|
})
|
|
return nil
|
|
}
|
|
|
|
func (i *addressMapDiffer) Remove(key string, val *typegen.Deferred) error {
|
|
pkAddr, err := address.NewFromBytes([]byte(key))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
id := new(typegen.CborInt)
|
|
if err := id.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil {
|
|
return err
|
|
}
|
|
idAddr, err := address.NewIDAddress(uint64(*id))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
i.Results.Removed = append(i.Results.Removed, AddressPair{
|
|
ID: idAddr,
|
|
PK: pkAddr,
|
|
})
|
|
return nil
|
|
}
|
|
|
|
type AddressChange struct {
|
|
From AddressPair
|
|
To AddressPair
|
|
}
|
|
|
|
type AddressPair struct {
|
|
ID address.Address
|
|
PK address.Address
|
|
}
|