From 50f39832bc3ad55cebf6cef2b9196553b63d768b Mon Sep 17 00:00:00 2001 From: Patrick O'Grady Date: Wed, 19 Jan 2022 15:10:37 -0800 Subject: [PATCH 01/13] add basic support --- chain/storage.go | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/chain/storage.go b/chain/storage.go index d8e18bd6..ec152277 100644 --- a/chain/storage.go +++ b/chain/storage.go @@ -36,6 +36,10 @@ import ( // -> [raw space] // 0x6/ (space pruning queue) // -> [raw space] +// 0x7/ (balance) +// -> [owner]=> balance +// 0x8/ (owned spaces) +// -> [owner]/[space]=> nil const ( blockPrefix = 0x0 @@ -45,7 +49,8 @@ const ( keyPrefix = 0x4 expiryPrefix = 0x5 pruningPrefix = 0x6 - balancePrefx = 0x7 + balancePrefix = 0x7 + ownedPrefix = 0x8 shortIDLen = 20 @@ -142,12 +147,23 @@ func PrefixPruningKey(expired uint64, rspace ids.ShortID) (k []byte) { // [balancePrefix] + [delimiter] + [address] func PrefixBalanceKey(address common.Address) (k []byte) { k = make([]byte, 2+common.AddressLength) - k[0] = balancePrefx + k[0] = balancePrefix k[1] = parser.ByteDelimiter copy(k[2:], address[:]) return } +// [ownedPrefix] + [delimiter] + [address] + [delimiter] + [space] +func PrefixOwnedKey(address common.Address, space []byte) (k []byte) { + k = make([]byte, 2+common.AddressLength+1+len(space)) + k[0] = ownedPrefix + k[1] = parser.ByteDelimiter + copy(k[2:], address[:]) + k[2+common.AddressLength] = parser.ByteDelimiter + copy(k[2+common.AddressLength+1:], space) + return +} + const specificTimeKeyLen = 2 + 8 + 1 + shortIDLen // [expiry/pruningPrefix] + [delimiter] + [timestamp] + [delimiter] + [rawSpace] @@ -676,3 +692,24 @@ func ApplyReward( log.Debug("skipping reward: no valid space") return common.Address{}, false, nil } + +func GetAllOwned(db database.Database, owner common.Address) (spaces []string, err error) { + baseKey := PrefixOwnedKey(owner, nil) + cursor := db.NewIteratorWithStart(baseKey) + spaces = []string{} + for cursor.Next() { + curKey := cursor.Key() + if bytes.Compare(baseKey, curKey) < -1 { // startKey < curKey; continue search + continue + } + if !bytes.Contains(curKey, baseKey) { // curKey does not contain base key; end search + break + } + + spaces = append(spaces, + // [ownedPrefix] + [delimiter] + [address] + [delimiter] + [space] + string(curKey[2+common.AddressLength+1:]), + ) + } + return spaces, nil +} From a6827cf3d221cdabd590048bee78835e2586ada2 Mon Sep 17 00:00:00 2001 From: Patrick O'Grady Date: Wed, 19 Jan 2022 15:22:16 -0800 Subject: [PATCH 02/13] remove owned during pruning --- chain/move_tx.go | 2 +- chain/storage.go | 35 ++++++++++++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/chain/move_tx.go b/chain/move_tx.go index 9011aea0..3d86b6e9 100644 --- a/chain/move_tx.go +++ b/chain/move_tx.go @@ -51,7 +51,7 @@ func (m *MoveTx) Execute(c *TransactionContext) error { i.Owner = m.To // Update space - if err := MoveSpaceInfo(c.Database, []byte(m.Space), i); err != nil { + if err := MoveSpaceInfo(c.Database, c.Sender, []byte(m.Space), i); err != nil { return err } return nil diff --git a/chain/storage.go b/chain/storage.go index ec152277..12f28562 100644 --- a/chain/storage.go +++ b/chain/storage.go @@ -421,16 +421,29 @@ func ExpireNext(db database.Database, rparent int64, rcurrent int64, bootstrappe // [space] spc := cursor.Value() + // Update owned prefix + // TODO: could encode this with [cursor.Value()] to make faster + info, exists, err := GetSpaceInfo(db, spc) + if err != nil { + return err + } + if !exists { + return ErrSpaceMissing + } + if err := db.Delete(PrefixOwnedKey(info.Owner, spc)); err != nil { + return err + } + // [infoPrefix] + [delimiter] + [space] k := SpaceInfoKey(spc) if err := db.Delete(k); err != nil { return err } + expired, rspc, err := extractSpecificTimeKey(curKey) if err != nil { return err } - if bootstrapped { // [pruningPrefix] + [delimiter] + [timestamp] + [delimiter] + [rawSpace] k = PrefixPruningKey(expired, rspc) @@ -503,12 +516,18 @@ func HasSpaceKey(db database.KeyValueReader, space []byte, key []byte) (bool, er } func PutSpaceInfo(db database.KeyValueWriter, space []byte, i *SpaceInfo, lastExpiry uint64) error { + // If [RawSpace] is empty, this is a new space. if i.RawSpace == ids.ShortEmpty { rspace, err := RawSpace(space, i.Created) if err != nil { return err } i.RawSpace = rspace + + // Only store the owner on creation + if err := db.Put(PrefixOwnedKey(i.Owner, space), nil); err != nil { + return err + } } if lastExpiry > 0 { // [expiryPrefix] + [delimiter] + [timestamp] + [delimiter] + [rawSpace] @@ -533,14 +552,24 @@ func PutSpaceInfo(db database.KeyValueWriter, space []byte, i *SpaceInfo, lastEx // MoveSpaceInfo should only be used if the expiry isn't changing and // [SpaceInfo] is already in the database. -func MoveSpaceInfo(db database.KeyValueReaderWriter, space []byte, i *SpaceInfo) error { +func MoveSpaceInfo( + db database.KeyValueReaderWriter, oldOwner common.Address, + space []byte, i *SpaceInfo, +) error { // [infoPrefix] + [delimiter] + [space] k := SpaceInfoKey(space) b, err := Marshal(i) if err != nil { return err } - return db.Put(k, b) + if err := db.Put(k, b); err != nil { + return err + } + // Updated owned prefix + if err := db.Delete(PrefixOwnedKey(oldOwner, space)); err != nil { + return err + } + return db.Put(PrefixOwnedKey(i.Owner, space), nil) } type ValueMeta struct { From c9ef4cc9fc346adb862101b97efeda5b990f03ed Mon Sep 17 00:00:00 2001 From: Patrick O'Grady Date: Wed, 19 Jan 2022 15:27:29 -0800 Subject: [PATCH 03/13] update client --- client/client.go | 16 ++++++++++++++++ vm/public_service.go | 17 +++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/client/client.go b/client/client.go index 46607582..7c4589be 100644 --- a/client/client.go +++ b/client/client.go @@ -61,6 +61,8 @@ type Client interface { // Recent actions on the network (sorted from recent to oldest) RecentActivity() ([]*chain.Activity, error) + // All spaces owned by a given address + Owned(owner common.Address) ([]string, error) } // New creates a new client object. @@ -290,3 +292,17 @@ func (cli *client) RecentActivity() (activity []*chain.Activity, err error) { } return resp.Activity, nil } + +func (cli *client) Owned(addr common.Address) (spaces []string, err error) { + resp := new(vm.OwnedReply) + if err = cli.req.SendRequest( + "owned", + &vm.OwnedArgs{ + Address: addr, + }, + resp, + ); err != nil { + return nil, err + } + return resp.Spaces, nil +} diff --git a/vm/public_service.go b/vm/public_service.go index a442d170..951f08d3 100644 --- a/vm/public_service.go +++ b/vm/public_service.go @@ -339,3 +339,20 @@ func (svc *PublicService) RecentActivity(_ *http.Request, _ *struct{}, reply *Re reply.Activity = activity return nil } + +type OwnedArgs struct { + Address common.Address `serialize:"true" json:"address"` +} + +type OwnedReply struct { + Spaces []string `serialize:"true" json:"spaces"` +} + +func (svc *PublicService) Owned(_ *http.Request, args *OwnedArgs, reply *OwnedReply) error { + spaces, err := chain.GetAllOwned(svc.vm.db, args.Address) + if err != nil { + return err + } + reply.Spaces = spaces + return nil +} From b0d494c0a61cfd3012bc7cf7167e8290c626d035 Mon Sep 17 00:00:00 2001 From: Patrick O'Grady Date: Wed, 19 Jan 2022 15:33:56 -0800 Subject: [PATCH 04/13] update CLI --- README.md | 15 +++++++++++++++ cmd/spacescli/cmd/owned.go | 35 +++++++++++++++++++++++++++++++++++ cmd/spacescli/cmd/root.go | 1 + 3 files changed, 51 insertions(+) create mode 100644 cmd/spacescli/cmd/owned.go diff --git a/README.md b/README.md index 1df93886..0d14a094 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,7 @@ Available Commands: lifeline Extends the life of a given space move Transfers a space to another address network View information about this instance of the SpacesVM + owned Fetches all owned spaces for the address associated with the private key resolve Reads a value at space/key resolve-file Reads a file at space/key and saves it to disk set Writes a key-value pair for the given space @@ -400,6 +401,20 @@ transfer {timestamp,sender,txId,type,to,units} reward {timestamp,txId,type,to,units} ``` +#### spacesvm.owned +``` +<<< POST +{ + "jsonrpc": "2.0", + "method": "spacesvm.owned", + "params":{ + "address": + }, + "id": 1 +} +>>> {"spaces":[]} +``` + ### Advanced Public Endpoints (`/public`) #### spacesvm.suggestedRawFee diff --git a/cmd/spacescli/cmd/owned.go b/cmd/spacescli/cmd/owned.go new file mode 100644 index 00000000..8c47e1e0 --- /dev/null +++ b/cmd/spacescli/cmd/owned.go @@ -0,0 +1,35 @@ +// Copyright (C) 2019-2021, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +package cmd + +import ( + "github.com/ethereum/go-ethereum/crypto" + "github.com/fatih/color" + "github.com/spf13/cobra" + + "github.com/ava-labs/spacesvm/client" +) + +var ownedCmd = &cobra.Command{ + Use: "owned [options]", + Short: "Fetches all owned spaces for the address associated with the private key", + RunE: ownedFunc, +} + +func ownedFunc(cmd *cobra.Command, args []string) error { + priv, err := crypto.LoadECDSA(privateKeyFile) + if err != nil { + return err + } + sender := crypto.PubkeyToAddress(priv.PublicKey) + + cli := client.New(uri, requestTimeout) + spaces, err := cli.Owned(sender) + if err != nil { + return err + } + + color.Green("address %s owns %+v", sender.Hex(), spaces) + return nil +} diff --git a/cmd/spacescli/cmd/root.go b/cmd/spacescli/cmd/root.go index 2a9527cb..4813c36a 100644 --- a/cmd/spacescli/cmd/root.go +++ b/cmd/spacescli/cmd/root.go @@ -53,6 +53,7 @@ func init() { resolveFileCmd, deleteFileCmd, networkCmd, + ownedCmd, ) rootCmd.PersistentFlags().StringVar( From 6c9ef2f542243cf11a159885b3271770b7934890 Mon Sep 17 00:00:00 2001 From: Patrick O'Grady Date: Wed, 19 Jan 2022 15:46:16 -0800 Subject: [PATCH 05/13] add integration tests --- tests/integration/integration_test.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/integration/integration_test.go b/tests/integration/integration_test.go index 62e72bc3..bacee971 100644 --- a/tests/integration/integration_test.go +++ b/tests/integration/integration_test.go @@ -254,6 +254,13 @@ var _ = ginkgo.Describe("Tx Types", func() { gomega.Ω(len(activity)).To(gomega.Equal(0)) }) + ginkgo.It("ensure nothing owned yet", func() { + spaces, err := instances[0].cli.Owned(sender) + gomega.Ω(err).To(gomega.BeNil()) + + gomega.Ω(len(spaces)).To(gomega.Equal(0)) + }) + ginkgo.It("get currently accepted block ID", func() { for _, inst := range instances { cli := inst.cli @@ -307,6 +314,13 @@ var _ = ginkgo.Describe("Tx Types", func() { gomega.Ω(lastAccepted).To(gomega.Equal(blk.ID())) }) + ginkgo.By("ensure something owned", func() { + spaces, err := instances[1].cli.Owned(sender) + gomega.Ω(err).To(gomega.BeNil()) + + gomega.Ω(spaces).To(gomega.Equal([]string{space})) + }) + ginkgo.By("extend time with lifeline", func() { lifelineTx := &chain.LifelineTx{ BaseTx: &chain.BaseTx{}, @@ -365,6 +379,13 @@ var _ = ginkgo.Describe("Tx Types", func() { expectBlkAccept(instances[0]) }) + ginkgo.By("ensure everything owned", func() { + spaces, err := instances[0].cli.Owned(sender) + gomega.Ω(err).To(gomega.BeNil()) + + gomega.Ω(spaces).To(gomega.ContainElements(strings.Repeat("a", parser.MaxIdentifierSize), strings.Repeat("b", parser.MaxIdentifierSize))) + }) + ginkgo.By("check space after ClaimTx has been accepted", func() { pf, values, err := instances[0].cli.Info(space) gomega.Ω(err).To(gomega.BeNil()) From 8c6d46dfd0aa9396a961fe2acedfffaf93c5078b Mon Sep 17 00:00:00 2001 From: Patrick O'Grady Date: Wed, 19 Jan 2022 15:51:13 -0800 Subject: [PATCH 06/13] add unit test --- chain/claim_tx_test.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/chain/claim_tx_test.go b/chain/claim_tx_test.go index 724c1a46..8145babd 100644 --- a/chain/claim_tx_test.go +++ b/chain/claim_tx_test.go @@ -118,6 +118,20 @@ func TestClaimTx(t *testing.T) { } // Cleanup DB after all txs submitted + senderSpaces, err := GetAllOwned(db, sender) + if err != nil { + t.Fatal(err) + } + if len(senderSpaces) != 0 { + t.Fatalf("sender owned spaces should = 0, found %d", len(senderSpaces)) + } + sender2Spaces, err := GetAllOwned(db, sender2) + if err != nil { + t.Fatal(err) + } + if len(sender2Spaces) != 1 { + t.Fatalf("sender2 owned spaces should = 1, found %d", len(sender2Spaces)) + } if err := ExpireNext(db, 0, ClaimReward*10, true); err != nil { t.Fatal(err) } @@ -135,4 +149,18 @@ func TestClaimTx(t *testing.T) { if exists { t.Fatal("space should not exist") } + senderSpaces, err = GetAllOwned(db, sender) + if err != nil { + t.Fatal(err) + } + if len(senderSpaces) != 0 { + t.Fatal("owned spaces should be empty") + } + sender2Spaces, err = GetAllOwned(db, sender2) + if err != nil { + t.Fatal(err) + } + if len(sender2Spaces) != 0 { + t.Fatal("owned spaces should be empty") + } } From ee7091b0ab1ca3966b4a37afc5b9c27f48be49a4 Mon Sep 17 00:00:00 2001 From: Patrick O'Grady Date: Wed, 19 Jan 2022 16:03:52 -0800 Subject: [PATCH 07/13] speed up expire --- chain/storage.go | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/chain/storage.go b/chain/storage.go index 12f28562..1b9281a7 100644 --- a/chain/storage.go +++ b/chain/storage.go @@ -418,24 +418,18 @@ func ExpireNext(db database.Database, rparent int64, rcurrent int64, bootstrappe return err } - // [space] - spc := cursor.Value() + // [owner] + [space] + expiryValue := cursor.Value() + owner := common.BytesToAddress(expiryValue[:common.AddressLength]) + space := expiryValue[common.AddressLength:] // Update owned prefix - // TODO: could encode this with [cursor.Value()] to make faster - info, exists, err := GetSpaceInfo(db, spc) - if err != nil { - return err - } - if !exists { - return ErrSpaceMissing - } - if err := db.Delete(PrefixOwnedKey(info.Owner, spc)); err != nil { + if err := db.Delete(PrefixOwnedKey(owner, space)); err != nil { return err } // [infoPrefix] + [delimiter] + [space] - k := SpaceInfoKey(spc) + k := SpaceInfoKey(space) if err := db.Delete(k); err != nil { return err } @@ -457,7 +451,7 @@ func ExpireNext(db database.Database, rparent int64, rcurrent int64, bootstrappe return err } } - log.Debug("space expired", "space", string(spc)) + log.Debug("space expired", "space", string(space)) } return nil } @@ -515,6 +509,13 @@ func HasSpaceKey(db database.KeyValueReader, space []byte, key []byte) (bool, er return db.Has(k) } +func ExpiryDataValue(address common.Address, space []byte) (v []byte) { + v = make([]byte, common.AddressLength+len(space)) + copy(v, address[:]) + copy(v[common.AddressLength:], space) + return v +} + func PutSpaceInfo(db database.KeyValueWriter, space []byte, i *SpaceInfo, lastExpiry uint64) error { // If [RawSpace] is empty, this is a new space. if i.RawSpace == ids.ShortEmpty { @@ -538,7 +539,7 @@ func PutSpaceInfo(db database.KeyValueWriter, space []byte, i *SpaceInfo, lastEx } // [expiryPrefix] + [delimiter] + [timestamp] + [delimiter] + [rawSpace] k := PrefixExpiryKey(i.Expiry, i.RawSpace) - if err := db.Put(k, space); err != nil { + if err := db.Put(k, ExpiryDataValue(i.Owner, space)); err != nil { return err } // [infoPrefix] + [delimiter] + [space] @@ -569,7 +570,11 @@ func MoveSpaceInfo( if err := db.Delete(PrefixOwnedKey(oldOwner, space)); err != nil { return err } - return db.Put(PrefixOwnedKey(i.Owner, space), nil) + if err := db.Put(PrefixOwnedKey(i.Owner, space), nil); err != nil { + return err + } + k = PrefixExpiryKey(i.Expiry, i.RawSpace) + return db.Put(k, ExpiryDataValue(i.Owner, space)) } type ValueMeta struct { From 8b80860290cb4b2a2ca88c7c8b614a925ed9269a Mon Sep 17 00:00:00 2001 From: Patrick O'Grady Date: Wed, 19 Jan 2022 16:05:09 -0800 Subject: [PATCH 08/13] linter --- chain/storage.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/storage.go b/chain/storage.go index 1b9281a7..98010dbf 100644 --- a/chain/storage.go +++ b/chain/storage.go @@ -554,7 +554,7 @@ func PutSpaceInfo(db database.KeyValueWriter, space []byte, i *SpaceInfo, lastEx // MoveSpaceInfo should only be used if the expiry isn't changing and // [SpaceInfo] is already in the database. func MoveSpaceInfo( - db database.KeyValueReaderWriter, oldOwner common.Address, + db database.KeyValueWriter, oldOwner common.Address, space []byte, i *SpaceInfo, ) error { // [infoPrefix] + [delimiter] + [space] From fd02808cd7fa74b96c2e6576da10d9effa61d3b1 Mon Sep 17 00:00:00 2001 From: Patrick O'Grady Date: Wed, 19 Jan 2022 16:10:19 -0800 Subject: [PATCH 09/13] linter --- README.md | 14 ++++++++++++-- tests/integration/integration_test.go | 5 ++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0d14a094..76a05538 100644 --- a/README.md +++ b/README.md @@ -41,15 +41,23 @@ You could build... ### Wallet Support: `eth_typedSignedData` TODO: Insert image of signing using MM +### Reserved Spaces +address space is reserved + +### Content Addressing +SpacesVM verifies that values associated with keys that are length 66 (0x + hex-encoded keccak256 hash) are valid hashes. + ### Fee Mechanisms Claim Desirability + Decay Rate FeeUnits vs Load Units vs Expiry Units (per action) -Expiry Rate vs Units ### Space Rewards Lottery allocation X% of fee -### Genesis Allocation +One could easily modify this repository to instead send rewards to +beneficiaries chosen by whoever produces a block. + +### Genesis Allocation -> public beta only Airdrop `10,000 SPC` for anyone who has interacted with C-Chain more than twice. @@ -153,6 +161,8 @@ type Client interface { // Recent actions on the network (sorted from recent to oldest) RecentActivity() ([]*chain.Activity, error) + // All spaces owned by a given address + Owned(owner common.Address) ([]string, error) } ``` diff --git a/tests/integration/integration_test.go b/tests/integration/integration_test.go index bacee971..2d842113 100644 --- a/tests/integration/integration_test.go +++ b/tests/integration/integration_test.go @@ -383,7 +383,10 @@ var _ = ginkgo.Describe("Tx Types", func() { spaces, err := instances[0].cli.Owned(sender) gomega.Ω(err).To(gomega.BeNil()) - gomega.Ω(spaces).To(gomega.ContainElements(strings.Repeat("a", parser.MaxIdentifierSize), strings.Repeat("b", parser.MaxIdentifierSize))) + gomega.Ω(spaces).To(gomega.ContainElements( + strings.Repeat("a", parser.MaxIdentifierSize), + strings.Repeat("b", parser.MaxIdentifierSize), + )) }) ginkgo.By("check space after ClaimTx has been accepted", func() { From 05857b9a3d20759f619c7d03a3818a69ad8e2e9d Mon Sep 17 00:00:00 2001 From: Patrick O'Grady Date: Wed, 19 Jan 2022 16:21:15 -0800 Subject: [PATCH 10/13] move pkg --- cmd/{spacescli => spaces-cli}/cmd/activity.go | 0 cmd/{spacescli => spaces-cli}/cmd/claim.go | 0 cmd/{spacescli => spaces-cli}/cmd/common.go | 0 cmd/{spacescli => spaces-cli}/cmd/create.go | 0 cmd/{spacescli => spaces-cli}/cmd/delete-file.go | 0 cmd/{spacescli => spaces-cli}/cmd/delete.go | 0 cmd/{spacescli => spaces-cli}/cmd/genesis.go | 0 cmd/{spacescli => spaces-cli}/cmd/info.go | 0 cmd/{spacescli => spaces-cli}/cmd/lifeline.go | 0 cmd/{spacescli => spaces-cli}/cmd/move.go | 0 cmd/{spacescli => spaces-cli}/cmd/network.go | 0 cmd/{spacescli => spaces-cli}/cmd/owned.go | 0 cmd/{spacescli => spaces-cli}/cmd/resolve-file.go | 0 cmd/{spacescli => spaces-cli}/cmd/resolve.go | 0 cmd/{spacescli => spaces-cli}/cmd/root.go | 0 cmd/{spacescli => spaces-cli}/cmd/set-file.go | 0 cmd/{spacescli => spaces-cli}/cmd/set.go | 0 cmd/{spacescli => spaces-cli}/cmd/transfer.go | 0 cmd/{spacescli => spaces-cli}/main.go | 2 +- 19 files changed, 1 insertion(+), 1 deletion(-) rename cmd/{spacescli => spaces-cli}/cmd/activity.go (100%) rename cmd/{spacescli => spaces-cli}/cmd/claim.go (100%) rename cmd/{spacescli => spaces-cli}/cmd/common.go (100%) rename cmd/{spacescli => spaces-cli}/cmd/create.go (100%) rename cmd/{spacescli => spaces-cli}/cmd/delete-file.go (100%) rename cmd/{spacescli => spaces-cli}/cmd/delete.go (100%) rename cmd/{spacescli => spaces-cli}/cmd/genesis.go (100%) rename cmd/{spacescli => spaces-cli}/cmd/info.go (100%) rename cmd/{spacescli => spaces-cli}/cmd/lifeline.go (100%) rename cmd/{spacescli => spaces-cli}/cmd/move.go (100%) rename cmd/{spacescli => spaces-cli}/cmd/network.go (100%) rename cmd/{spacescli => spaces-cli}/cmd/owned.go (100%) rename cmd/{spacescli => spaces-cli}/cmd/resolve-file.go (100%) rename cmd/{spacescli => spaces-cli}/cmd/resolve.go (100%) rename cmd/{spacescli => spaces-cli}/cmd/root.go (100%) rename cmd/{spacescli => spaces-cli}/cmd/set-file.go (100%) rename cmd/{spacescli => spaces-cli}/cmd/set.go (100%) rename cmd/{spacescli => spaces-cli}/cmd/transfer.go (100%) rename cmd/{spacescli => spaces-cli}/main.go (87%) diff --git a/cmd/spacescli/cmd/activity.go b/cmd/spaces-cli/cmd/activity.go similarity index 100% rename from cmd/spacescli/cmd/activity.go rename to cmd/spaces-cli/cmd/activity.go diff --git a/cmd/spacescli/cmd/claim.go b/cmd/spaces-cli/cmd/claim.go similarity index 100% rename from cmd/spacescli/cmd/claim.go rename to cmd/spaces-cli/cmd/claim.go diff --git a/cmd/spacescli/cmd/common.go b/cmd/spaces-cli/cmd/common.go similarity index 100% rename from cmd/spacescli/cmd/common.go rename to cmd/spaces-cli/cmd/common.go diff --git a/cmd/spacescli/cmd/create.go b/cmd/spaces-cli/cmd/create.go similarity index 100% rename from cmd/spacescli/cmd/create.go rename to cmd/spaces-cli/cmd/create.go diff --git a/cmd/spacescli/cmd/delete-file.go b/cmd/spaces-cli/cmd/delete-file.go similarity index 100% rename from cmd/spacescli/cmd/delete-file.go rename to cmd/spaces-cli/cmd/delete-file.go diff --git a/cmd/spacescli/cmd/delete.go b/cmd/spaces-cli/cmd/delete.go similarity index 100% rename from cmd/spacescli/cmd/delete.go rename to cmd/spaces-cli/cmd/delete.go diff --git a/cmd/spacescli/cmd/genesis.go b/cmd/spaces-cli/cmd/genesis.go similarity index 100% rename from cmd/spacescli/cmd/genesis.go rename to cmd/spaces-cli/cmd/genesis.go diff --git a/cmd/spacescli/cmd/info.go b/cmd/spaces-cli/cmd/info.go similarity index 100% rename from cmd/spacescli/cmd/info.go rename to cmd/spaces-cli/cmd/info.go diff --git a/cmd/spacescli/cmd/lifeline.go b/cmd/spaces-cli/cmd/lifeline.go similarity index 100% rename from cmd/spacescli/cmd/lifeline.go rename to cmd/spaces-cli/cmd/lifeline.go diff --git a/cmd/spacescli/cmd/move.go b/cmd/spaces-cli/cmd/move.go similarity index 100% rename from cmd/spacescli/cmd/move.go rename to cmd/spaces-cli/cmd/move.go diff --git a/cmd/spacescli/cmd/network.go b/cmd/spaces-cli/cmd/network.go similarity index 100% rename from cmd/spacescli/cmd/network.go rename to cmd/spaces-cli/cmd/network.go diff --git a/cmd/spacescli/cmd/owned.go b/cmd/spaces-cli/cmd/owned.go similarity index 100% rename from cmd/spacescli/cmd/owned.go rename to cmd/spaces-cli/cmd/owned.go diff --git a/cmd/spacescli/cmd/resolve-file.go b/cmd/spaces-cli/cmd/resolve-file.go similarity index 100% rename from cmd/spacescli/cmd/resolve-file.go rename to cmd/spaces-cli/cmd/resolve-file.go diff --git a/cmd/spacescli/cmd/resolve.go b/cmd/spaces-cli/cmd/resolve.go similarity index 100% rename from cmd/spacescli/cmd/resolve.go rename to cmd/spaces-cli/cmd/resolve.go diff --git a/cmd/spacescli/cmd/root.go b/cmd/spaces-cli/cmd/root.go similarity index 100% rename from cmd/spacescli/cmd/root.go rename to cmd/spaces-cli/cmd/root.go diff --git a/cmd/spacescli/cmd/set-file.go b/cmd/spaces-cli/cmd/set-file.go similarity index 100% rename from cmd/spacescli/cmd/set-file.go rename to cmd/spaces-cli/cmd/set-file.go diff --git a/cmd/spacescli/cmd/set.go b/cmd/spaces-cli/cmd/set.go similarity index 100% rename from cmd/spacescli/cmd/set.go rename to cmd/spaces-cli/cmd/set.go diff --git a/cmd/spacescli/cmd/transfer.go b/cmd/spaces-cli/cmd/transfer.go similarity index 100% rename from cmd/spacescli/cmd/transfer.go rename to cmd/spaces-cli/cmd/transfer.go diff --git a/cmd/spacescli/main.go b/cmd/spaces-cli/main.go similarity index 87% rename from cmd/spacescli/main.go rename to cmd/spaces-cli/main.go index 3bd9602e..f28538f3 100644 --- a/cmd/spacescli/main.go +++ b/cmd/spaces-cli/main.go @@ -9,7 +9,7 @@ import ( "github.com/fatih/color" - "github.com/ava-labs/spacesvm/cmd/spacescli/cmd" + "github.com/ava-labs/spacesvm/cmd/spaces-cli/cmd" ) func main() { From 1559b66690aea451ef7029f6bda420c87fd01d60 Mon Sep 17 00:00:00 2001 From: Patrick O'Grady Date: Wed, 19 Jan 2022 16:27:41 -0800 Subject: [PATCH 11/13] add VM ID --- README.md | 11 ++++++++--- scripts/build.sh | 35 +++++++++++++++-------------------- scripts/run.sh | 4 ++-- tests/runner/main.go | 2 +- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 76a05538..983584d1 100644 --- a/README.md +++ b/README.md @@ -75,9 +75,14 @@ TODO: insert try spaces image + link Hooked up to public beta ### spaces-cli -_To build the CLI, run `./scripts/build.sh`. It will be placed in `./build/spaces-cli` and -`$GOBIN/spaces-cli`._ +#### Install +```bash +git clone https://github.com/ava-labs/spacesvm.git; +cd spacesvm; +go install -v ./cmd/spaces-cli; +``` +#### Usage ``` SpacesVM CLI @@ -113,7 +118,7 @@ Flags: Use "spaces-cli [command] --help" for more information about a command. ``` -#### Uploading Files +##### Uploading Files ``` spaces-cli set-file patrick ~/Downloads/computer.gif -> patrick/6fe5a52f52b34fb1e07ba90bad47811c645176d0d49ef0c7a7b4b22013f676c8 spaces-cli resolve-file patrick/6fe5a52f52b34fb1e07ba90bad47811c645176d0d49ef0c7a7b4b22013f676c8 computer_copy.gif diff --git a/scripts/build.sh b/scripts/build.sh index b383ae3b..637e6ede 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -12,29 +12,24 @@ fi # Load the constants # Set the PATHS GOPATH="$(go env GOPATH)" -GOBIN="$(go env GOBIN)" -VM=${VM:-false} -if [[ ${VM} == true ]]; then - # Set default binary directory location - binary_directory="$GOPATH/src/github.com/ava-labs/avalanchego/build/plugins" - name="tGas3T58KzdjLHhBDMnH2TvrddhqTji5iZAMZ3RXs2NLpSnhH" +# Set default binary directory location +binary_directory="$GOPATH/src/github.com/ava-labs/avalanchego/build/plugins" +name="sqja3uK17MJxfC7AN8nGadBw9JK5BcrsNwNynsqP5Gih8M5Bm" - if [[ $# -eq 1 ]]; then - binary_directory=$1 - elif [[ $# -eq 2 ]]; then - binary_directory=$1 - name=$2 - elif [[ $# -ne 0 ]]; then - echo "Invalid arguments to build spacesvm. Requires either no arguments (default) or one arguments to specify binary location." - exit 1 - fi - - # Build spacesvm, which is run as a subprocess - echo "Building spacesvm in $binary_directory/$name" - go build -o "$binary_directory/$name" ./cmd/spacesvm +if [[ $# -eq 1 ]]; then + binary_directory=$1 +elif [[ $# -eq 2 ]]; then + binary_directory=$1 + name=$2 +elif [[ $# -ne 0 ]]; then + echo "Invalid arguments to build spacesvm. Requires either no arguments (default) or one arguments to specify binary location." + exit 1 fi +# Build spacesvm, which is run as a subprocess +echo "Building spacesvm in $binary_directory/$name" +go build -o "$binary_directory/$name" ./cmd/spacesvm + mkdir -p ./build go build -o ./build/spaces-cli ./cmd/spacescli -cp ./build/spaces-cli $GOBIN/spaces-cli diff --git a/scripts/run.sh b/scripts/run.sh index cb1ac5b4..9161826f 100755 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -58,7 +58,7 @@ find /tmp/avalanchego-v${VERSION} echo "building spacesvm" go build \ --o /tmp/avalanchego-v${VERSION}/plugins/tGas3T58KzdjLHhBDMnH2TvrddhqTji5iZAMZ3RXs2NLpSnhH \ +-o /tmp/avalanchego-v${VERSION}/plugins/sqja3uK17MJxfC7AN8nGadBw9JK5BcrsNwNynsqP5Gih8M5Bm \ ./cmd/spacesvm find /tmp/avalanchego-v${VERSION} @@ -101,7 +101,7 @@ fi echo "launch local test cluster in the background" /tmp/runner \ --avalanchego-path=/tmp/avalanchego-v${VERSION}/avalanchego \ ---vm-id=tGas3T58KzdjLHhBDMnH2TvrddhqTji5iZAMZ3RXs2NLpSnhH \ +--vm-id=sqja3uK17MJxfC7AN8nGadBw9JK5BcrsNwNynsqP5Gih8M5Bm \ --vm-genesis-path=/tmp/spacesvm.genesis \ --output-path=/tmp/avalanchego-v${VERSION}/output.yaml 2> /dev/null & PID=${!} diff --git a/tests/runner/main.go b/tests/runner/main.go index fb34aac6..add27b93 100644 --- a/tests/runner/main.go +++ b/tests/runner/main.go @@ -50,7 +50,7 @@ var ( outputPath string ) -const defaultVMID = "tGas3T58KzdjLHhBDMnH2TvrddhqTji5iZAMZ3RXs2NLpSnhH" +const defaultVMID = "sqja3uK17MJxfC7AN8nGadBw9JK5BcrsNwNynsqP5Gih8M5Bm" func init() { rootCmd.PersistentFlags().StringVar( From afd87813f3f60687121c442656c98b47255c0b7f Mon Sep 17 00:00:00 2001 From: Patrick O'Grady Date: Wed, 19 Jan 2022 16:29:07 -0800 Subject: [PATCH 12/13] fix paths --- .goreleaser.yml | 2 +- scripts/build.sh | 2 +- scripts/run.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index 49423781..249deb0c 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -1,7 +1,7 @@ # ref. https://goreleaser.com/customization/build/ builds: - id: spaces-cli - main: ./cmd/spacescli + main: ./cmd/spaces-cli binary: spaces-cli flags: - -v diff --git a/scripts/build.sh b/scripts/build.sh index 637e6ede..f80065d8 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -32,4 +32,4 @@ echo "Building spacesvm in $binary_directory/$name" go build -o "$binary_directory/$name" ./cmd/spacesvm mkdir -p ./build -go build -o ./build/spaces-cli ./cmd/spacescli +go build -o ./build/spaces-cli ./cmd/spaces-cli diff --git a/scripts/run.sh b/scripts/run.sh index 9161826f..231508ff 100755 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -63,7 +63,7 @@ go build \ find /tmp/avalanchego-v${VERSION} echo "building spaces-cli" -go build -v -o /tmp/spaces-cli ./cmd/spacescli +go build -v -o /tmp/spaces-cli ./cmd/spaces-cli echo "creating allocations file" cat < /tmp/allocations.json From 1a170d32a2cfb0553e5e51bfcd93d2c81763a1a8 Mon Sep 17 00:00:00 2001 From: Patrick O'Grady Date: Wed, 19 Jan 2022 16:30:25 -0800 Subject: [PATCH 13/13] small nits --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 983584d1..5d2598ef 100644 --- a/README.md +++ b/README.md @@ -460,7 +460,7 @@ _Can use this to get the current fee rate._ ``` ## Running the VM -To build the VM, run `VM=true ./scripts/build.sh`. +To build the VM, run `./scripts/build.sh`. ### Joining the public beta Put spacesvm binary in plugins dir @@ -485,7 +485,7 @@ and creates a `spacesvm` genesis file. To build and run E2E tests, you need to s See [`tests/e2e`](tests/e2e) and [`tests/runner`](tests/runner) to see how it's set up and how its client requests are made: ```bash -# to startup a cluster +# to startup a local cluster (good for development) cd ${HOME}/go/src/github.com/ava-labs/spacesvm ./scripts/run.sh 1.7.4