From 3308f25136e7ab3a96d59c0307844db36095f089 Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Sat, 3 Aug 2024 18:29:30 +1000 Subject: [PATCH] feat!: LegacyActorTree vs ActorTree, use HAMT v4 with generics Ref: https://github.com/filecoin-project/go-hamt-ipld/pull/122 --- builtin/actor_tree.go | 175 ++++++++++++++++++-- builtin/v10/migration/top.go | 4 +- builtin/v11/migration/top.go | 2 +- builtin/v12/migration/top.go | 2 +- builtin/v13/migration/top.go | 2 +- builtin/v8/check.go | 2 +- builtin/v9/check.go | 2 +- builtin/v9/migration/test/migration_test.go | 4 +- builtin/v9/migration/test/miner_test.go | 8 +- builtin/v9/migration/test/util.go | 4 +- builtin/v9/migration/top.go | 4 +- go.mod | 13 +- go.sum | 27 +-- 13 files changed, 197 insertions(+), 52 deletions(-) diff --git a/builtin/actor_tree.go b/builtin/actor_tree.go index b4565317..d063e73f 100644 --- a/builtin/actor_tree.go +++ b/builtin/actor_tree.go @@ -1,17 +1,20 @@ package builtin import ( + "crypto/sha256" + "github.com/filecoin-project/go-address" + hamt "github.com/filecoin-project/go-hamt-ipld/v4" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" + "github.com/filecoin-project/go-state-types/builtin/v14/util/adt" "github.com/ipfs/go-cid" "golang.org/x/xerrors" ) -type ActorTree interface { +type LegacyActorTree interface { GetStore() adt.Store - + GetMap() *adt.Map Flush() (cid.Cid, error) GetActorV4(addr address.Address) (*ActorV4, bool, error) GetActorV5(addr address.Address) (*ActorV5, bool, error) @@ -22,7 +25,19 @@ type ActorTree interface { ForEachKey(fn func(addr address.Address) error) error } -var _ ActorTree = (*actorTree)(nil) +type ActorTree interface { + GetStore() adt.Store + Flush() (cid.Cid, error) + GetActorV5(addr address.Address) (*ActorV5, bool, error) + SetActorV5(addr address.Address, actor *ActorV5) error + ForEachV5(fn func(addr address.Address, actor *ActorV5) error) error + ForEachKey(fn func(addr address.Address) error) error +} + +var _ LegacyActorTree = (*legacyActorTree)(nil) +var _ ActorTree = (*legacyActorTree)(nil) + +// var _ ActorTree = (*actorTree)(nil) // Value type of the top level of the state tree. // Represents the on-chain state of a single actor. @@ -43,47 +58,173 @@ type ActorV5 struct { DelegatedAddress *address.Address // Delegated (f4) actor address } +func (a *ActorV5) Equals(o *ActorV5) bool { + if a == nil && o == nil { + return true + } + if a == nil || o == nil { + return false + } + return a.Code == o.Code && + a.Head == o.Head && + a.CallSeqNum == o.CallSeqNum && + a.Balance.Equals(o.Balance) && + ((a.DelegatedAddress == nil && o.DelegatedAddress == nil) || (a.DelegatedAddress != nil && o.DelegatedAddress != nil && *a.DelegatedAddress == *o.DelegatedAddress)) +} + +func (a *ActorV5) New() *ActorV5 { + return new(ActorV5) +} + // A specialization of a map of ID-addresses to actor heads. type actorTree struct { + Map *hamt.Node[*ActorV5] + LastRoot cid.Cid + Store adt.Store +} + +// Initializes a new, empty state tree backed by a store. +func NewTree(store adt.Store) (ActorTree, error) { + nd, err := hamt.NewNode[*ActorV5]( + store, + hamt.UseHashFunction(func(input []byte) []byte { + res := sha256.Sum256(input) + return res[:] + }), + hamt.UseTreeBitWidth(DefaultHamtBitwidth), + ) + if err != nil { + return nil, err + } + return &actorTree{ + Map: nd, + LastRoot: cid.Undef, + Store: store, + }, nil +} + +// Loads a tree from a root CID and store. +func LoadTree(store adt.Store, root cid.Cid) (ActorTree, error) { + nd, err := hamt.LoadNode[*ActorV5]( + store.Context(), + store, + root, + hamt.UseHashFunction(func(input []byte) []byte { + res := sha256.Sum256(input) + return res[:] + }), + hamt.UseTreeBitWidth(DefaultHamtBitwidth), + ) + if err != nil { + return nil, err + } + return &actorTree{ + Map: nd, + LastRoot: root, + Store: store, + }, nil +} + +func (t *actorTree) GetStore() adt.Store { + return t.Store +} + +// Writes the tree root node to the store, and returns its CID. +func (t *actorTree) Flush() (cid.Cid, error) { + if err := t.Map.Flush(t.Store.Context()); err != nil { + return cid.Undef, xerrors.Errorf("failed to flush map root: %w", err) + } + c, err := t.Store.Put(t.Store.Context(), t.Map) + if err != nil { + return cid.Undef, xerrors.Errorf("writing map root object: %w", err) + } + t.LastRoot = c + return c, nil +} + +func (t *actorTree) GetActorV5(addr address.Address) (*ActorV5, bool, error) { + if addr.Protocol() != address.ID { + return nil, false, xerrors.Errorf("non-ID address %v invalid as actor key", addr) + } + if addr.Protocol() != address.ID { + return nil, false, xerrors.Errorf("non-ID address %v invalid as actor key", addr) + } + return t.Map.Find(t.Store.Context(), abi.AddrKey(addr).Key()) +} + +func (t *actorTree) SetActorV5(addr address.Address, actor *ActorV5) error { + if addr.Protocol() != address.ID { + return xerrors.Errorf("non-ID address %v invalid as actor key", addr) + } + return t.Map.Set(t.Store.Context(), abi.AddrKey(addr).Key(), actor) +} + +func (t *actorTree) ForEachV5(fn func(addr address.Address, actor *ActorV5) error) error { + return t.Map.ForEach(t.Store.Context(), func(key string, val *ActorV5) error { + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return fn(addr, val) + }) +} + +// Traverses all keys in the tree, without decoding the actor states. +func (t *actorTree) ForEachKey(fn func(addr address.Address) error) error { + return t.Map.ForEach(t.Store.Context(), func(key string, _ *ActorV5) error { + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return fn(addr) + }) +} + +// A specialization of a map of ID-addresses to actor heads. +type legacyActorTree struct { Map *adt.Map Store adt.Store } // Initializes a new, empty state tree backed by a store. -func NewTree(store adt.Store) (ActorTree, error) { +func NewLegacyTree(store adt.Store) (LegacyActorTree, error) { emptyMap, err := adt.MakeEmptyMap(store, DefaultHamtBitwidth) if err != nil { return nil, err } - return &actorTree{ + return &legacyActorTree{ Map: emptyMap, Store: store, }, nil } // Loads a tree from a root CID and store. -func LoadTree(s adt.Store, r cid.Cid) (ActorTree, error) { +func LoadLegacyTree(s adt.Store, r cid.Cid) (LegacyActorTree, error) { m, err := adt.AsMap(s, r, DefaultHamtBitwidth) if err != nil { return nil, err } - return &actorTree{ + return &legacyActorTree{ Map: m, Store: s, }, nil } -func (t *actorTree) GetStore() adt.Store { +func (t *legacyActorTree) GetStore() adt.Store { return t.Store } +func (t *legacyActorTree) GetMap() *adt.Map { + return t.Map +} + // Writes the tree root node to the store, and returns its CID. -func (t *actorTree) Flush() (cid.Cid, error) { +func (t *legacyActorTree) Flush() (cid.Cid, error) { return t.Map.Root() } // Loads the state associated with an address. -func (t *actorTree) GetActorV4(addr address.Address) (*ActorV4, bool, error) { +func (t *legacyActorTree) GetActorV4(addr address.Address) (*ActorV4, bool, error) { if addr.Protocol() != address.ID { return nil, false, xerrors.Errorf("non-ID address %v invalid as actor key", addr) } @@ -92,7 +233,7 @@ func (t *actorTree) GetActorV4(addr address.Address) (*ActorV4, bool, error) { return &actor, found, err } -func (t *actorTree) GetActorV5(addr address.Address) (*ActorV5, bool, error) { +func (t *legacyActorTree) GetActorV5(addr address.Address) (*ActorV5, bool, error) { if addr.Protocol() != address.ID { return nil, false, xerrors.Errorf("non-ID address %v invalid as actor key", addr) } @@ -102,14 +243,14 @@ func (t *actorTree) GetActorV5(addr address.Address) (*ActorV5, bool, error) { } // Sets the state associated with an address, overwriting if it already present. -func (t *actorTree) SetActorV4(addr address.Address, actor *ActorV4) error { +func (t *legacyActorTree) SetActorV4(addr address.Address, actor *ActorV4) error { if addr.Protocol() != address.ID { return xerrors.Errorf("non-ID address %v invalid as actor key", addr) } return t.Map.Put(abi.AddrKey(addr), actor) } -func (t *actorTree) SetActorV5(addr address.Address, actor *ActorV5) error { +func (t *legacyActorTree) SetActorV5(addr address.Address, actor *ActorV5) error { if addr.Protocol() != address.ID { return xerrors.Errorf("non-ID address %v invalid as actor key", addr) } @@ -117,7 +258,7 @@ func (t *actorTree) SetActorV5(addr address.Address, actor *ActorV5) error { } // Traverses all entries in the tree. -func (t *actorTree) ForEachV4(fn func(addr address.Address, actor *ActorV4) error) error { +func (t *legacyActorTree) ForEachV4(fn func(addr address.Address, actor *ActorV4) error) error { var val ActorV4 return t.Map.ForEach(&val, func(key string) error { addr, err := address.NewFromBytes([]byte(key)) @@ -128,7 +269,7 @@ func (t *actorTree) ForEachV4(fn func(addr address.Address, actor *ActorV4) erro }) } -func (t *actorTree) ForEachV5(fn func(addr address.Address, actor *ActorV5) error) error { +func (t *legacyActorTree) ForEachV5(fn func(addr address.Address, actor *ActorV5) error) error { var val ActorV5 return t.Map.ForEach(&val, func(key string) error { addr, err := address.NewFromBytes([]byte(key)) @@ -140,7 +281,7 @@ func (t *actorTree) ForEachV5(fn func(addr address.Address, actor *ActorV5) erro } // Traverses all keys in the tree, without decoding the actor states. -func (t *actorTree) ForEachKey(fn func(addr address.Address) error) error { +func (t *legacyActorTree) ForEachKey(fn func(addr address.Address) error) error { return t.Map.ForEach(nil, func(key string) error { addr, err := address.NewFromBytes([]byte(key)) if err != nil { diff --git a/builtin/v10/migration/top.go b/builtin/v10/migration/top.go index 7713ca93..71705cb9 100644 --- a/builtin/v10/migration/top.go +++ b/builtin/v10/migration/top.go @@ -33,11 +33,11 @@ func MigrateStateTree(ctx context.Context, store cbor.IpldStore, newManifestCID adtStore := adt9.WrapStore(ctx, store) // Load input and output state trees - actorsIn, err := builtin.LoadTree(adtStore, actorsRootIn) + actorsIn, err := builtin.LoadLegacyTree(adtStore, actorsRootIn) if err != nil { return cid.Undef, xerrors.Errorf("loading state tree: %w", err) } - actorsOut, err := builtin.NewTree(adtStore) + actorsOut, err := builtin.NewLegacyTree(adtStore) if err != nil { return cid.Undef, xerrors.Errorf("creating new state tree: %w", err) } diff --git a/builtin/v11/migration/top.go b/builtin/v11/migration/top.go index fb456e38..12fb5aea 100644 --- a/builtin/v11/migration/top.go +++ b/builtin/v11/migration/top.go @@ -26,7 +26,7 @@ func MigrateStateTree(ctx context.Context, store cbor.IpldStore, newManifestCID adtStore := adt10.WrapStore(ctx, store) // Load input and output state trees - actorsIn, err := builtin.LoadTree(adtStore, actorsRootIn) + actorsIn, err := builtin.LoadLegacyTree(adtStore, actorsRootIn) if err != nil { return cid.Undef, xerrors.Errorf("loading state tree: %w", err) } diff --git a/builtin/v12/migration/top.go b/builtin/v12/migration/top.go index b6344cbd..55084ccb 100644 --- a/builtin/v12/migration/top.go +++ b/builtin/v12/migration/top.go @@ -25,7 +25,7 @@ func MigrateStateTree(ctx context.Context, store cbor.IpldStore, newManifestCID adtStore := adt11.WrapStore(ctx, store) // Load input and output state trees - actorsIn, err := builtin.LoadTree(adtStore, actorsRootIn) + actorsIn, err := builtin.LoadLegacyTree(adtStore, actorsRootIn) if err != nil { return cid.Undef, xerrors.Errorf("loading state tree: %w", err) } diff --git a/builtin/v13/migration/top.go b/builtin/v13/migration/top.go index 96e68077..325f1a23 100644 --- a/builtin/v13/migration/top.go +++ b/builtin/v13/migration/top.go @@ -27,7 +27,7 @@ func MigrateStateTree(ctx context.Context, store cbor.IpldStore, newManifestCID adtStore := adt13.WrapStore(ctx, store) // Load input and output state trees - actorsIn, err := builtin.LoadTree(adtStore, actorsRootIn) + actorsIn, err := builtin.LoadLegacyTree(adtStore, actorsRootIn) if err != nil { return cid.Undef, xerrors.Errorf("loading state tree: %w", err) } diff --git a/builtin/v8/check.go b/builtin/v8/check.go index 3ffa2471..d09124c3 100644 --- a/builtin/v8/check.go +++ b/builtin/v8/check.go @@ -28,7 +28,7 @@ import ( // Within this code, Go errors are not expected, but are often converted to messages so that execution // can continue to find more errors rather than fail with no insight. // Only errors thar are particularly troublesome to recover from should propagate as Go errors. -func CheckStateInvariants(tree builtin.ActorTree, priorEpoch abi.ChainEpoch, actorCodes map[string]cid.Cid) (*builtin.MessageAccumulator, error) { +func CheckStateInvariants(tree builtin.LegacyActorTree, priorEpoch abi.ChainEpoch, actorCodes map[string]cid.Cid) (*builtin.MessageAccumulator, error) { acc := &builtin.MessageAccumulator{} totalFIl := big.Zero() var initSummary *init_.StateSummary diff --git a/builtin/v9/check.go b/builtin/v9/check.go index a9942507..07eb6b66 100644 --- a/builtin/v9/check.go +++ b/builtin/v9/check.go @@ -30,7 +30,7 @@ import ( // Within this code, Go errors are not expected, but are often converted to messages so that execution // can continue to find more errors rather than fail with no insight. // Only errors thar are particularly troublesome to recover from should propagate as Go errors. -func CheckStateInvariants(tree builtin.ActorTree, priorEpoch abi.ChainEpoch, actorCodes map[string]cid.Cid) (*builtin.MessageAccumulator, error) { +func CheckStateInvariants(tree builtin.LegacyActorTree, priorEpoch abi.ChainEpoch, actorCodes map[string]cid.Cid) (*builtin.MessageAccumulator, error) { acc := &builtin.MessageAccumulator{} totalFIl := big.Zero() var initSummary *init_.StateSummary diff --git a/builtin/v9/migration/test/migration_test.go b/builtin/v9/migration/test/migration_test.go index e5e60845..82b815a3 100644 --- a/builtin/v9/migration/test/migration_test.go +++ b/builtin/v9/migration/test/migration_test.go @@ -26,7 +26,7 @@ func TestMigration(t *testing.T) { startRoot := makeInputTree(ctx, t, adtStore) - oldStateTree, err := builtin.LoadTree(adtStore, startRoot) + oldStateTree, err := builtin.LoadLegacyTree(adtStore, startRoot) require.NoError(t, err) oldSystemActor, found, err := oldStateTree.GetActorV4(builtin.SystemActorAddr) @@ -60,7 +60,7 @@ func TestMigration(t *testing.T) { // check that the system actor state was correctly updated - newStateTree, err := builtin.LoadTree(adtStore, cacheRoot) + newStateTree, err := builtin.LoadLegacyTree(adtStore, cacheRoot) require.NoError(t, err) newSystemActor, found, err := newStateTree.GetActorV4(builtin.SystemActorAddr) diff --git a/builtin/v9/migration/test/miner_test.go b/builtin/v9/migration/test/miner_test.go index 49de35e9..fc0b29a4 100644 --- a/builtin/v9/migration/test/miner_test.go +++ b/builtin/v9/migration/test/miner_test.go @@ -32,7 +32,7 @@ func TestMinerMigration(t *testing.T) { startRoot := makeInputTree(ctx, t, adtStore) - oldStateTree, err := builtin.LoadTree(adtStore, startRoot) + oldStateTree, err := builtin.LoadLegacyTree(adtStore, startRoot) require.NoError(t, err) oldSystemActor, found, err := oldStateTree.GetActorV4(builtin.SystemActorAddr) @@ -237,7 +237,7 @@ func TestMinerMigration(t *testing.T) { // check that the actor states were correctly updated - newStateTree, err := builtin.LoadTree(adtStore, cacheRoot) + newStateTree, err := builtin.LoadLegacyTree(adtStore, cacheRoot) require.NoError(t, err) // miner 1 is just empty precommits @@ -324,7 +324,7 @@ func TestFip0029MinerMigration(t *testing.T) { startRoot := makeInputTree(ctx, t, adtStore) - oldStateTree, err := builtin.LoadTree(adtStore, startRoot) + oldStateTree, err := builtin.LoadLegacyTree(adtStore, startRoot) require.NoError(t, err) oldSystemActor, found, err := oldStateTree.GetActorV4(builtin.SystemActorAddr) @@ -386,7 +386,7 @@ func TestFip0029MinerMigration(t *testing.T) { // check that the actor states were correctly updated - newStateTree, err := builtin.LoadTree(adtStore, cacheRoot) + newStateTree, err := builtin.LoadLegacyTree(adtStore, cacheRoot) require.NoError(t, err) newMinerActor, ok, err := newStateTree.GetActorV4(addr) diff --git a/builtin/v9/migration/test/util.go b/builtin/v9/migration/test/util.go index 868ad836..23437da8 100644 --- a/builtin/v9/migration/test/util.go +++ b/builtin/v9/migration/test/util.go @@ -67,7 +67,7 @@ func makeTestManifest(t *testing.T, store adt.Store, prefix string) (cid.Cid, ci } func makeInputTree(ctx context.Context, t *testing.T, store adt.Store) cid.Cid { - tree, err := builtin.NewTree(store) + tree, err := builtin.NewLegacyTree(store) require.NoError(t, err, "failed to create empty actors tree") manifestCid, manifestDataCid := makeTestManifest(t, store, "fil/8/") @@ -139,7 +139,7 @@ func makeInputTree(ctx context.Context, t *testing.T, store adt.Store) cid.Cid { return root } -func initializeActor(ctx context.Context, t testing.TB, tree builtin.ActorTree, store adt.Store, state cbor.Marshaler, code cid.Cid, a address.Address, balance abi.TokenAmount) { +func initializeActor(ctx context.Context, t testing.TB, tree builtin.LegacyActorTree, store adt.Store, state cbor.Marshaler, code cid.Cid, a address.Address, balance abi.TokenAmount) { stateCID, err := store.Put(ctx, state) require.NoError(t, err) actor := &builtin.ActorV4{ diff --git a/builtin/v9/migration/top.go b/builtin/v9/migration/top.go index 860fe4a5..b11b4934 100644 --- a/builtin/v9/migration/top.go +++ b/builtin/v9/migration/top.go @@ -101,11 +101,11 @@ func MigrateStateTree(ctx context.Context, store cbor.IpldStore, newManifestCID } // Load input and output state trees - actorsIn, err := builtin.LoadTree(adtStore, actorsRootIn) + actorsIn, err := builtin.LoadLegacyTree(adtStore, actorsRootIn) if err != nil { return cid.Undef, err } - actorsOut, err := builtin.NewTree(adtStore) + actorsOut, err := builtin.NewLegacyTree(adtStore) if err != nil { return cid.Undef, err } diff --git a/go.mod b/go.mod index 714de735..9b4dbe9a 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/filecoin-project/go-bitfield v0.2.4 github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20220905160352-62059082a837 github.com/filecoin-project/go-hamt-ipld/v3 v3.4.0 + github.com/filecoin-project/go-hamt-ipld/v4 v4.0.0-20240803092811-1295558c39ec github.com/ipfs/go-block-format v0.2.0 github.com/ipfs/go-cid v0.4.1 github.com/ipfs/go-ipld-cbor v0.1.0 @@ -30,16 +31,16 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/filecoin-project/go-commp-utils v0.1.3 // indirect github.com/filecoin-project/go-fil-commcid v0.1.0 // indirect - github.com/ipfs/go-ipfs-util v0.0.2 // indirect - github.com/ipfs/go-ipld-format v0.5.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/ipfs/go-ipfs-util v0.0.3 // indirect + github.com/ipfs/go-ipld-format v0.6.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/mr-tron/base58 v1.2.0 // indirect - github.com/multiformats/go-base32 v0.0.3 // indirect - github.com/multiformats/go-base36 v0.1.0 // indirect + github.com/multiformats/go-base32 v0.1.0 // indirect + github.com/multiformats/go-base36 v0.2.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/polydawn/refmt v0.89.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect golang.org/x/sys v0.22.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - lukechampine.com/blake3 v1.1.6 // indirect + lukechampine.com/blake3 v1.3.0 // indirect ) diff --git a/go.sum b/go.sum index 6d84febf..e63e1f22 100644 --- a/go.sum +++ b/go.sum @@ -26,6 +26,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-hamt-ipld/v3 v3.4.0 h1:nYs6OPUF8KbZ3E8o9p9HJnQaE8iugjHR5WYVMcicDJc= github.com/filecoin-project/go-hamt-ipld/v3 v3.4.0/go.mod h1:s0qiHRhFyrgW0SvdQMSJFQxNa4xEIG5XvqCBZUEgcbc= +github.com/filecoin-project/go-hamt-ipld/v4 v4.0.0-20240803092811-1295558c39ec h1:iuCyqify0N6O2OJ9WuA14qLg04ICPCL0iZmiwyzcmHI= +github.com/filecoin-project/go-hamt-ipld/v4 v4.0.0-20240803092811-1295558c39ec/go.mod h1:yYwUIWtxrMOCoMKVmsKCh7eXurFdyaFtQL6aAhVYb34= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= @@ -59,15 +61,15 @@ github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= -github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= -github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= +github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0= +github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.1.0 h1:dx0nS0kILVivGhfWuB6dUpMa/LAwElHPw1yOGYopoYs= github.com/ipfs/go-ipld-cbor v0.1.0/go.mod h1:U2aYlmVrJr2wsUBU67K4KgepApSZddGRDWBYR0H4sCk= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= -github.com/ipfs/go-ipld-format v0.5.0 h1:WyEle9K96MSrvr47zZHKKcDxJ/vlpET6PSiQsAFO+Ds= -github.com/ipfs/go-ipld-format v0.5.0/go.mod h1:ImdZqJQaEouMjCvqCe0ORUS+uoBmf7Hf+EO/jh+nk3M= +github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten1F5U= +github.com/ipfs/go-ipld-format v0.6.0/go.mod h1:g4QVMTn3marU3qXchwjpKPKgJv+zF+OlaKMyhJ4LHPg= github.com/ipfs/go-log v1.0.4 h1:6nLQdX4W8P9yZZFH7mO+X/PzjN8Laozm/lMJ6esdgzY= github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= @@ -82,9 +84,8 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= -github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -104,10 +105,12 @@ github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjW github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= +github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= +github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= +github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= +github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= @@ -210,7 +213,7 @@ golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -243,8 +246,8 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= -lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= +lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE= +lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/golex v1.0.0 h1:wWpDlbK8ejRfSyi0frMyhilD3JBvtcx2AdGDnU+JtsE=