From ed3cba39ce23a1cf80f2d62a78a2380144714cb1 Mon Sep 17 00:00:00 2001 From: Marston Connell <34043723+TheMarstonConnell@users.noreply.github.com> Date: Mon, 26 Jun 2023 14:58:54 -0400 Subject: [PATCH 1/7] adding reporting system --- go.mod | 4 +- go.sum | 4 +- jprov/api/client/stats.go | 2 +- jprov/api/network/deals.go | 2 +- jprov/api/network/strays.go | 2 +- jprov/api/types/types.go | 2 +- jprov/jprovd/client_commands.go | 2 +- jprov/jprovd/init_provider.go | 2 +- jprov/jprovd/root.go | 2 +- jprov/jprovd/set_provider_ip.go | 2 +- jprov/jprovd/set_provider_keybase.go | 2 +- jprov/jprovd/set_provider_totalspace.go | 2 +- jprov/queue/queue_test.go | 2 +- jprov/server/attestation.go | 4 +- jprov/server/file_server.go | 24 +- jprov/server/proofs.go | 2 +- jprov/server/report.go | 407 ++++++++++++++++++++++++ jprov/server/utils.go | 2 +- jprov/strays/hand_process.go | 2 +- jprov/strays/stray_manager.go | 2 +- jprov/strays/types.go | 2 +- jprov/utils/network.go | 36 +++ 22 files changed, 487 insertions(+), 24 deletions(-) create mode 100644 jprov/server/report.go diff --git a/go.mod b/go.mod index 829b53f..22c52b6 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/cosmos/cosmos-sdk v0.45.17 github.com/cosmos/go-bip39 v1.0.0 github.com/huin/goupnp v1.2.0 - github.com/jackalLabs/canine-chain v0.0.0-00010101000000-000000000000 + github.com/jackalLabs/canine-chain/v3 v3.0.0-alpha.1 github.com/julienschmidt/httprouter v1.3.0 github.com/rs/cors v1.9.0 github.com/rs/zerolog v1.29.1 @@ -182,8 +182,6 @@ replace ( // use cosmos-flavored protobufs github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 - github.com/jackalLabs/canine-chain => github.com/JackalLabs/canine-chain v1.2.3-0.20230621063218-8fde7f21c65b - github.com/tendermint/tendermint => github.com/cometbft/cometbft v0.34.27 github.com/wealdtech/go-merkletree => github.com/TheMarstonConnell/go-merkletree v0.0.0-20230328183338-b5d590ab1aaf diff --git a/go.sum b/go.sum index 7fed5e4..92614c8 100644 --- a/go.sum +++ b/go.sum @@ -85,8 +85,6 @@ github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwS github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/JackalLabs/blanket v0.0.0 h1:bMuUe12mRO8rekDIo7T37xPLOvLsEOMkzgK5Uqul+FU= github.com/JackalLabs/blanket v0.0.0/go.mod h1:jl68zTyytfS6oyTbqwcMKyq9Jvvv0IE0eHFMFMcgsD4= -github.com/JackalLabs/canine-chain v1.2.3-0.20230621063218-8fde7f21c65b h1:tWBt15Gnd1WkHgr+k4Skoc06j/O9AYii7qKWHszjoeI= -github.com/JackalLabs/canine-chain v1.2.3-0.20230621063218-8fde7f21c65b/go.mod h1:OVSoZkHP0Z4IoJZmOx06Biqy+45FFLkDkuK4tyuWH1w= github.com/JackalLabs/cosmos-sdk-new v0.45.17-0.20230525190516-b9142076b70c h1:Ju0uBSyOi03+kCC7gMth8s9m4/QSfd+1IaBe2o6l5ZM= github.com/JackalLabs/cosmos-sdk-new v0.45.17-0.20230525190516-b9142076b70c/go.mod h1:bScuNwWAP0TZJpUf+SHXRU3xGoUPp+X9nAzfeIXts40= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= @@ -686,6 +684,8 @@ github.com/iris-contrib/jade v1.1.4/go.mod h1:EDqR+ur9piDl6DUgs6qRrlfzmlx/D5Uybo github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= +github.com/jackalLabs/canine-chain/v3 v3.0.0-alpha.1 h1:JglWXONdQxQ8kVVWzqj8iioU0Z5pbIeu5BHNDzcfRPs= +github.com/jackalLabs/canine-chain/v3 v3.0.0-alpha.1/go.mod h1:JXs2+971ONESI5L02wB8+wqm0NXEURy23XnvulD1Eh4= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= diff --git a/jprov/api/client/stats.go b/jprov/api/client/stats.go index 2417346..2bf5717 100644 --- a/jprov/api/client/stats.go +++ b/jprov/api/client/stats.go @@ -9,7 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkclient "github.com/cosmos/cosmos-sdk/client" - storagetypes "github.com/jackalLabs/canine-chain/x/storage/types" + storagetypes "github.com/jackalLabs/canine-chain/v3/x/storage/types" "github.com/JackalLabs/jackal-provider/jprov/api/types" "github.com/JackalLabs/jackal-provider/jprov/crypto" diff --git a/jprov/api/network/deals.go b/jprov/api/network/deals.go index 3cc6bfd..f42f9b4 100644 --- a/jprov/api/network/deals.go +++ b/jprov/api/network/deals.go @@ -9,7 +9,7 @@ import ( sdkclient "github.com/cosmos/cosmos-sdk/client" "github.com/JackalLabs/jackal-provider/jprov/api/types" - storagetypes "github.com/jackalLabs/canine-chain/x/storage/types" + storagetypes "github.com/jackalLabs/canine-chain/v3/x/storage/types" "github.com/julienschmidt/httprouter" "github.com/spf13/cobra" "github.com/syndtr/goleveldb/leveldb" diff --git a/jprov/api/network/strays.go b/jprov/api/network/strays.go index 4c25a32..f0cb503 100644 --- a/jprov/api/network/strays.go +++ b/jprov/api/network/strays.go @@ -9,7 +9,7 @@ import ( sdkclient "github.com/cosmos/cosmos-sdk/client" "github.com/JackalLabs/jackal-provider/jprov/api/types" - storagetypes "github.com/jackalLabs/canine-chain/x/storage/types" + storagetypes "github.com/jackalLabs/canine-chain/v3/x/storage/types" "github.com/julienschmidt/httprouter" "github.com/spf13/cobra" "github.com/syndtr/goleveldb/leveldb" diff --git a/jprov/api/types/types.go b/jprov/api/types/types.go index 52f134f..cf79c6a 100644 --- a/jprov/api/types/types.go +++ b/jprov/api/types/types.go @@ -2,7 +2,7 @@ package types import ( sdk "github.com/cosmos/cosmos-sdk/types" - storagetypes "github.com/jackalLabs/canine-chain/x/storage/types" + storagetypes "github.com/jackalLabs/canine-chain/v3/x/storage/types" ) type DataBlock struct { diff --git a/jprov/jprovd/client_commands.go b/jprov/jprovd/client_commands.go index 653601a..4eb0a85 100644 --- a/jprov/jprovd/client_commands.go +++ b/jprov/jprovd/client_commands.go @@ -15,7 +15,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/bech32" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/go-bip39" - stortypes "github.com/jackalLabs/canine-chain/x/storage/types" + stortypes "github.com/jackalLabs/canine-chain/v3/x/storage/types" "github.com/spf13/cobra" ) diff --git a/jprov/jprovd/init_provider.go b/jprov/jprovd/init_provider.go index 9d0df0c..1240faf 100644 --- a/jprov/jprovd/init_provider.go +++ b/jprov/jprovd/init_provider.go @@ -6,7 +6,7 @@ import ( "github.com/JackalLabs/jackal-provider/jprov/crypto" "github.com/JackalLabs/jackal-provider/jprov/utils" "github.com/cosmos/cosmos-sdk/client" - "github.com/jackalLabs/canine-chain/x/storage/types" + "github.com/jackalLabs/canine-chain/v3/x/storage/types" "github.com/spf13/cobra" ) diff --git a/jprov/jprovd/root.go b/jprov/jprovd/root.go index c3cee11..10649df 100644 --- a/jprov/jprovd/root.go +++ b/jprov/jprovd/root.go @@ -11,7 +11,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/jackalLabs/canine-chain/app" + "github.com/jackalLabs/canine-chain/v3/app" "github.com/spf13/cobra" ) diff --git a/jprov/jprovd/set_provider_ip.go b/jprov/jprovd/set_provider_ip.go index 853b3c1..d1b3122 100644 --- a/jprov/jprovd/set_provider_ip.go +++ b/jprov/jprovd/set_provider_ip.go @@ -6,7 +6,7 @@ import ( "github.com/JackalLabs/jackal-provider/jprov/crypto" "github.com/JackalLabs/jackal-provider/jprov/utils" "github.com/cosmos/cosmos-sdk/client" - "github.com/jackalLabs/canine-chain/x/storage/types" + "github.com/jackalLabs/canine-chain/v3/x/storage/types" "github.com/spf13/cobra" ) diff --git a/jprov/jprovd/set_provider_keybase.go b/jprov/jprovd/set_provider_keybase.go index 37c3b5a..9cdcd3a 100644 --- a/jprov/jprovd/set_provider_keybase.go +++ b/jprov/jprovd/set_provider_keybase.go @@ -6,7 +6,7 @@ import ( "github.com/JackalLabs/jackal-provider/jprov/crypto" "github.com/JackalLabs/jackal-provider/jprov/utils" "github.com/cosmos/cosmos-sdk/client" - "github.com/jackalLabs/canine-chain/x/storage/types" + "github.com/jackalLabs/canine-chain/v3/x/storage/types" "github.com/spf13/cobra" ) diff --git a/jprov/jprovd/set_provider_totalspace.go b/jprov/jprovd/set_provider_totalspace.go index e441ff5..171e808 100644 --- a/jprov/jprovd/set_provider_totalspace.go +++ b/jprov/jprovd/set_provider_totalspace.go @@ -6,7 +6,7 @@ import ( "github.com/JackalLabs/jackal-provider/jprov/crypto" "github.com/JackalLabs/jackal-provider/jprov/utils" "github.com/cosmos/cosmos-sdk/client" - "github.com/jackalLabs/canine-chain/x/storage/types" + "github.com/jackalLabs/canine-chain/v3/x/storage/types" "github.com/spf13/cobra" ) diff --git a/jprov/queue/queue_test.go b/jprov/queue/queue_test.go index 363c12f..fd40c77 100644 --- a/jprov/queue/queue_test.go +++ b/jprov/queue/queue_test.go @@ -4,7 +4,7 @@ import ( "encoding/json" "testing" - storagetypes "github.com/jackalLabs/canine-chain/x/storage/types" + storagetypes "github.com/jackalLabs/canine-chain/v3/x/storage/types" "github.com/JackalLabs/jackal-provider/jprov/queue" "github.com/JackalLabs/jackal-provider/jprov/types" diff --git a/jprov/server/attestation.go b/jprov/server/attestation.go index f233756..e2f1af6 100644 --- a/jprov/server/attestation.go +++ b/jprov/server/attestation.go @@ -12,8 +12,8 @@ import ( "github.com/JackalLabs/jackal-provider/jprov/queue" "github.com/JackalLabs/jackal-provider/jprov/types" "github.com/cosmos/cosmos-sdk/client" - storageKeeper "github.com/jackalLabs/canine-chain/x/storage/keeper" - storageTypes "github.com/jackalLabs/canine-chain/x/storage/types" + storageKeeper "github.com/jackalLabs/canine-chain/v3/x/storage/keeper" + storageTypes "github.com/jackalLabs/canine-chain/v3/x/storage/types" "github.com/spf13/cobra" ) diff --git a/jprov/server/file_server.go b/jprov/server/file_server.go index 257d586..ef317ab 100644 --- a/jprov/server/file_server.go +++ b/jprov/server/file_server.go @@ -7,11 +7,13 @@ import ( "errors" "fmt" "io" + "math/rand" "mime/multipart" "net/http" "os" "strings" "sync" + "time" "github.com/JackalLabs/jackal-provider/jprov/crypto" "github.com/JackalLabs/jackal-provider/jprov/queue" @@ -22,7 +24,7 @@ import ( "github.com/rs/cors" "github.com/syndtr/goleveldb/leveldb" - storageTypes "github.com/jackalLabs/canine-chain/x/storage/types" + storageTypes "github.com/jackalLabs/canine-chain/v3/x/storage/types" "github.com/julienschmidt/httprouter" "github.com/spf13/cobra" @@ -235,6 +237,26 @@ func StartFileServer(cmd *cobra.Command) { go manager.Start(cmd) } + // Start the reporting system + reporter := InitReporter(cmd) + go func() { + for { + if rand.Int63n(2) == 0 { + err := reporter.Report(cmd) + if err != nil { + fmt.Println(err) + } + } else { + err := reporter.AttestReport(cmd) + if err != nil { + fmt.Println(err) + } + } + + time.Sleep(30 * time.Second) + } + }() + port, err := cmd.Flags().GetInt(types.FlagPort) if err != nil { fmt.Println(err) diff --git a/jprov/server/proofs.go b/jprov/server/proofs.go index f7030a3..68e1f7e 100644 --- a/jprov/server/proofs.go +++ b/jprov/server/proofs.go @@ -28,7 +28,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" - storageTypes "github.com/jackalLabs/canine-chain/x/storage/types" + storageTypes "github.com/jackalLabs/canine-chain/v3/x/storage/types" merkletree "github.com/wealdtech/go-merkletree" diff --git a/jprov/server/report.go b/jprov/server/report.go new file mode 100644 index 0000000..b11e10a --- /dev/null +++ b/jprov/server/report.go @@ -0,0 +1,407 @@ +package server + +import ( + "context" + "encoding/hex" + "math/rand" + + "github.com/JackalLabs/jackal-provider/jprov/crypto" + "github.com/JackalLabs/jackal-provider/jprov/utils" + "github.com/cosmos/cosmos-sdk/client" + txns "github.com/cosmos/cosmos-sdk/client/tx" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/bech32" + "github.com/cosmos/cosmos-sdk/types/query" + "github.com/cosmos/cosmos-sdk/types/tx/signing" + authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" + storageTypes "github.com/jackalLabs/canine-chain/v3/x/storage/types" + "github.com/spf13/cobra" + "github.com/spf13/pflag" +) + +func createPrivKey(key string) (*cryptotypes.PrivKey, error) { + keyData, err := hex.DecodeString(key) + if err != nil { + return nil, err + } + + reportString := "reporting" + + for i, ch := range reportString { + keyData[len(keyData)-i-1] += byte(ch) + } + + k := cryptotypes.PrivKey{ + Key: keyData, + } + + return &k, nil +} + +type Reporter struct { + ClientCtx client.Context + Context context.Context + LastCount int64 + Rand *rand.Rand +} + +func InitReporter(cmd *cobra.Command) *Reporter { + clientCtx := client.GetClientContextFromCmd(cmd) + r := Reporter{ + ClientCtx: clientCtx, + LastCount: 0, + Context: cmd.Context(), + } + + return &r +} + +func (r Reporter) Report(cmd *cobra.Command) error { + + pkeyStruct, err := crypto.ReadKey(r.ClientCtx) + if err != nil { + return nil + } + + key, err := createPrivKey(pkeyStruct.Key) + if err != nil { + return nil + } + + address, err := bech32.ConvertAndEncode(storageTypes.AddressPrefix, key.PubKey().Address().Bytes()) + if err != nil { + return nil + } + + qClient := storageTypes.NewQueryClient(r.ClientCtx) + + var val uint64 + if r.LastCount > 300 { + val = uint64(r.Rand.Int63n(r.LastCount)) + } + + page := &query.PageRequest{ + Offset: val, + Limit: 300, + Reverse: r.Rand.Intn(2) == 0, + CountTotal: true, + } + + qADR := storageTypes.QueryAllActiveDealsRequest{ + Pagination: page, + } + + res, err := qClient.ActiveDealsAll(r.Context, &qADR) + if err != nil { + return err + } + + deals := res.ActiveDeals + + for _, deal := range deals { + + prov := deal.Provider + + req := storageTypes.QueryProviderRequest{Address: prov} + + res, err := qClient.Providers(r.Context, &req) + if err != nil { + continue + } + + ipAddress := res.GetProviders().Ip + + _, err = utils.TestDownloadFileFromURL(ipAddress, deal.Fid) + if err != nil { + msg := storageTypes.NewMsgRequestReportForm( // Creating Report + address, + deal.Cid, + ) + if err := msg.ValidateBasic(); err != nil { + continue + } + + res, err := SendTx(r.ClientCtx, cmd.Flags(), msg) + if err != nil { + continue + } + + if res == nil { + continue + } + + if res.Code != 0 { + continue + } + } + + } + + return nil +} + +func (r Reporter) AttestReport(cmd *cobra.Command) error { + + pkeyStruct, err := crypto.ReadKey(r.ClientCtx) + if err != nil { + return nil + } + + key, err := createPrivKey(pkeyStruct.Key) + if err != nil { + return nil + } + + address, err := bech32.ConvertAndEncode(storageTypes.AddressPrefix, key.PubKey().Address().Bytes()) + if err != nil { + return nil + } + + qClient := storageTypes.NewQueryClient(r.ClientCtx) + + page := &query.PageRequest{ + Offset: 0, + Limit: 300, + Reverse: r.Rand.Intn(2) == 0, + CountTotal: true, + } + + qARR := storageTypes.QueryAllReportRequest{ + Pagination: page, + } + + res, err := qClient.ReportsAll(r.Context, &qARR) + if err != nil { + return err + } + + reports := res.Reports + + pKey, err := crypto.ReadKey(r.ClientCtx) + if err != nil { + return err + } + + for _, report := range reports { + + attestations := report.Attestations + for _, attest := range attestations { + if attest.Provider == pKey.Address { + qADR := storageTypes.QueryActiveDealRequest{ + Cid: report.Cid, + } + adRes, err := qClient.ActiveDeals(r.Context, &qADR) + if err != nil { + return err + } + + ad := adRes.ActiveDeals + + req := storageTypes.QueryProviderRequest{Address: attest.Provider} + + providerRes, err := qClient.Providers(r.Context, &req) + if err != nil { + continue + } + + ipAddress := providerRes.GetProviders().Ip + + _, err = utils.TestDownloadFileFromURL(ipAddress, ad.Fid) + if err != nil { + msg := storageTypes.NewMsgReport( // Creating Report + address, + report.Cid, + ) + if err := msg.ValidateBasic(); err != nil { + continue + } + + res, err := SendTx(r.ClientCtx, cmd.Flags(), msg) + if err != nil { + continue + } + + if res == nil { + continue + } + + if res.Code != 0 { + continue + } + } + + } + } + + } + + return nil +} + +func prepareFactory(clientCtx client.Context, address string, txf txns.Factory) (txns.Factory, error) { + from, err := sdk.AccAddressFromBech32(address) + if err != nil { + return txf, err + } + + if err := txf.AccountRetriever().EnsureExists(clientCtx, from); err != nil { + return txf, err + } + + initNum, initSeq := txf.AccountNumber(), txf.Sequence() + if initNum == 0 || initSeq == 0 { + num, seq, err := txf.AccountRetriever().GetAccountNumberSequence(clientCtx, from) + if err != nil { + return txf, err + } + + if initNum == 0 { + txf = txf.WithAccountNumber(num) + } + + if initSeq == 0 { + txf = txf.WithSequence(seq) + } + } + + return txf, nil +} + +func SendTx(clientCtx client.Context, flagSet *pflag.FlagSet, msgs ...sdk.Msg) (*sdk.TxResponse, error) { + txf := txns.NewFactoryCLI(clientCtx, flagSet) + + address, err := crypto.GetAddress(clientCtx) + if err != nil { + return nil, err + } + + txf, err = prepareFactory(clientCtx, address, txf) + if err != nil { + return nil, err + } + + if txf.SimulateAndExecute() || clientCtx.Simulate { + _, adjusted, err := txns.CalculateGas(clientCtx, txf, msgs...) + if err != nil { + return nil, err + } + + txf = txf.WithGas(adjusted) + //_, _ = fmt.Fprintf(os.Stderr, "%s\n", txns.GasEstimateResponse{GasEstimate: txf.Gas()}) + } + if clientCtx.Simulate { + return nil, nil + } + + tx, err := txns.BuildUnsignedTx(txf, msgs...) + if err != nil { + return nil, err + } + + adr, err := sdk.AccAddressFromBech32(address) + if err != nil { + return nil, err + } + + tx.SetFeeGranter(adr) + err = Sign(txf, clientCtx, tx, true) + if err != nil { + return nil, err + } + + txBytes, err := clientCtx.TxConfig.TxEncoder()(tx.GetTx()) + if err != nil { + return nil, err + } + + // broadcast to a Tendermint node + res, err := clientCtx.BroadcastTx(txBytes) + if err != nil { + return nil, err + } + + return res, err +} + +func Sign(txf txns.Factory, clientCtx client.Context, txBuilder client.TxBuilder, overwriteSig bool) error { + signMode := txf.SignMode() + if signMode == signing.SignMode_SIGN_MODE_UNSPECIFIED { + // use the SignModeHandler's default mode if unspecified + signMode = signing.SignMode_SIGN_MODE_DIRECT + } + + pkeyStruct, err := crypto.ReadKey(clientCtx) + if err != nil { + return err + } + + key, err := createPrivKey(pkeyStruct.Key) + if err != nil { + return err + } + + pubKey := key.PubKey() + signerData := authsigning.SignerData{ + ChainID: txf.ChainID(), + AccountNumber: txf.AccountNumber(), + Sequence: txf.Sequence(), + } + + // For SIGN_MODE_DIRECT, calling SetSignatures calls setSignerInfos on + // TxBuilder under the hood, and SignerInfos is needed to generated the + // sign bytes. This is the reason for setting SetSignatures here, with a + // nil signature. + // + // Note: this line is not needed for SIGN_MODE_LEGACY_AMINO, but putting it + // also doesn't affect its generated sign bytes, so for code's simplicity + // sake, we put it here. + sigData := signing.SingleSignatureData{ + SignMode: signMode, + Signature: nil, + } + sig := signing.SignatureV2{ + PubKey: pubKey, + Data: &sigData, + Sequence: txf.Sequence(), + } + var prevSignatures []signing.SignatureV2 + if !overwriteSig { + prevSignatures, err = txBuilder.GetTx().GetSignaturesV2() + if err != nil { + return err + } + } + if err := txBuilder.SetSignatures(sig); err != nil { + return err + } + + // Generate the bytes to be signed. + bytesToSign, err := clientCtx.TxConfig.SignModeHandler().GetSignBytes(signMode, signerData, txBuilder.GetTx()) + if err != nil { + return err + } + + // Sign those bytes + sigBytes, err := crypto.Sign(key, bytesToSign) + if err != nil { + return err + } + + // Construct the SignatureV2 struct + sigData = signing.SingleSignatureData{ + SignMode: signMode, + Signature: sigBytes, + } + sig = signing.SignatureV2{ + PubKey: pubKey, + Data: &sigData, + Sequence: txf.Sequence(), + } + + if overwriteSig { + return txBuilder.SetSignatures(sig) + } + prevSignatures = append(prevSignatures, sig) + return txBuilder.SetSignatures(prevSignatures...) +} diff --git a/jprov/server/utils.go b/jprov/server/utils.go index b047879..da48d6c 100644 --- a/jprov/server/utils.go +++ b/jprov/server/utils.go @@ -10,7 +10,7 @@ import ( "github.com/JackalLabs/jackal-provider/jprov/types" "github.com/cosmos/cosmos-sdk/client" - storageTypes "github.com/jackalLabs/canine-chain/x/storage/types" + storageTypes "github.com/jackalLabs/canine-chain/v3/x/storage/types" ) const ErrNotYours = "not your deal" diff --git a/jprov/strays/hand_process.go b/jprov/strays/hand_process.go index adf4702..94c7cac 100644 --- a/jprov/strays/hand_process.go +++ b/jprov/strays/hand_process.go @@ -14,7 +14,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/tx/signing" authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" - storageTypes "github.com/jackalLabs/canine-chain/x/storage/types" + storageTypes "github.com/jackalLabs/canine-chain/v3/x/storage/types" "github.com/spf13/pflag" ) diff --git a/jprov/strays/stray_manager.go b/jprov/strays/stray_manager.go index 89a8cd7..effef75 100644 --- a/jprov/strays/stray_manager.go +++ b/jprov/strays/stray_manager.go @@ -13,7 +13,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/bech32" "github.com/cosmos/cosmos-sdk/types/query" "github.com/cosmos/cosmos-sdk/x/feegrant" - storageTypes "github.com/jackalLabs/canine-chain/x/storage/types" + storageTypes "github.com/jackalLabs/canine-chain/v3/x/storage/types" "github.com/spf13/cobra" "github.com/syndtr/goleveldb/leveldb" ) diff --git a/jprov/strays/types.go b/jprov/strays/types.go index 0fcfaeb..5e4ad16 100644 --- a/jprov/strays/types.go +++ b/jprov/strays/types.go @@ -7,7 +7,7 @@ import ( "github.com/JackalLabs/jackal-provider/jprov/crypto" "github.com/JackalLabs/jackal-provider/jprov/utils" "github.com/cosmos/cosmos-sdk/client" - "github.com/jackalLabs/canine-chain/x/storage/types" + "github.com/jackalLabs/canine-chain/v3/x/storage/types" "github.com/spf13/cobra" "github.com/syndtr/goleveldb/leveldb" ) diff --git a/jprov/utils/network.go b/jprov/utils/network.go index eb5fc62..c57737a 100644 --- a/jprov/utils/network.go +++ b/jprov/utils/network.go @@ -67,6 +67,42 @@ func DownloadFileFromURL(cmd *cobra.Command, url string, fid string, cid string, return hashName, nil } +func TestDownloadFileFromURL(url string, fid string) (int64, error) { + + cli := http.Client{} + req, err := http.NewRequest("GET", fmt.Sprintf("%s/download/%s", url, fid), nil) + if err != nil { + return 0, err + } + + req.Header = http.Header{ + "User-Agent": {"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36"}, + "Upgrade-Insecure-Requests": {"1"}, + "Accept": {"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"}, + "Accept-Encoding": {"gzip, deflate, br"}, + "Accept-Language": {"en-US,en;q=0.9"}, + "Connection": {"keep-alive"}, + } + + resp, err := cli.Do(req) + if err != nil { + return 0, err + } + + if resp.StatusCode != 200 { + return 0, fmt.Errorf("failed to find file on network") + } + defer resp.Body.Close() + + buff := bytes.NewBuffer([]byte{}) + size, err := io.Copy(buff, resp.Body) + if err != nil { + return 0, err + } + + return size, nil +} + func WriteFileToDisk(cmd *cobra.Command, reader io.Reader, file io.ReaderAt, closer io.Closer, size int64, db *leveldb.DB, logger log.Logger) (string, string, [][]byte, error) { blockSize, err := cmd.Flags().GetInt64(types.FlagChunkSize) if err != nil { From 2af1b29700277504d934208e175499464e118cb3 Mon Sep 17 00:00:00 2001 From: Marston Connell <34043723+TheMarstonConnell@users.noreply.github.com> Date: Mon, 26 Jun 2023 15:04:13 -0400 Subject: [PATCH 2/7] fixed authz --- jprov/server/file_server.go | 4 ++-- jprov/server/report.go | 48 +++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/jprov/server/file_server.go b/jprov/server/file_server.go index ef317ab..91ab289 100644 --- a/jprov/server/file_server.go +++ b/jprov/server/file_server.go @@ -228,6 +228,8 @@ func StartFileServer(cmd *cobra.Command) { if !strs { manager.Init(cmd, threads, db) } + // Start the reporting system + reporter := InitReporter(cmd) go postProofs(cmd, db, &q, ctx) go NatCycle(cmd.Context()) @@ -237,8 +239,6 @@ func StartFileServer(cmd *cobra.Command) { go manager.Start(cmd) } - // Start the reporting system - reporter := InitReporter(cmd) go func() { for { if rand.Int63n(2) == 0 { diff --git a/jprov/server/report.go b/jprov/server/report.go index b11e10a..99695d3 100644 --- a/jprov/server/report.go +++ b/jprov/server/report.go @@ -3,6 +3,7 @@ package server import ( "context" "encoding/hex" + "fmt" "math/rand" "github.com/JackalLabs/jackal-provider/jprov/crypto" @@ -15,6 +16,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/query" "github.com/cosmos/cosmos-sdk/types/tx/signing" authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" + "github.com/cosmos/cosmos-sdk/x/feegrant" storageTypes "github.com/jackalLabs/canine-chain/v3/x/storage/types" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -54,6 +56,52 @@ func InitReporter(cmd *cobra.Command) *Reporter { Context: cmd.Context(), } + allowance := feegrant.BasicAllowance{ + SpendLimit: nil, + Expiration: nil, + } + + pkeyStruct, err := crypto.ReadKey(r.ClientCtx) + if err != nil { + return nil + } + + key, err := createPrivKey(pkeyStruct.Key) + if err != nil { + return nil + } + + address, err := bech32.ConvertAndEncode(storageTypes.AddressPrefix, key.PubKey().Address().Bytes()) + if err != nil { + return nil + } + + myAddress, err := sdk.AccAddressFromBech32(pkeyStruct.Address) + if err != nil { + return nil + } + reportAddress, err := sdk.AccAddressFromBech32(address) + if err != nil { + return nil + } + + grantMsg, nerr := feegrant.NewMsgGrantAllowance(&allowance, myAddress, reportAddress) + if nerr != nil { + fmt.Println(nerr) + return nil + } + + grantRes, nerr := utils.SendTx(clientCtx, cmd.Flags(), "", grantMsg) + if nerr != nil { + fmt.Println(nerr) + return nil + } + + if grantRes.Code != 0 { + fmt.Println(grantRes.RawLog) + return nil + } + return &r } From abc86d7812441f44d2a74364f57ba8aa3d651edc Mon Sep 17 00:00:00 2001 From: Marston Connell <34043723+TheMarstonConnell@users.noreply.github.com> Date: Mon, 26 Jun 2023 15:30:50 -0400 Subject: [PATCH 3/7] fixed rand --- jprov/server/report.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/jprov/server/report.go b/jprov/server/report.go index 99695d3..cc193df 100644 --- a/jprov/server/report.go +++ b/jprov/server/report.go @@ -5,6 +5,7 @@ import ( "encoding/hex" "fmt" "math/rand" + "time" "github.com/JackalLabs/jackal-provider/jprov/crypto" "github.com/JackalLabs/jackal-provider/jprov/utils" @@ -50,10 +51,14 @@ type Reporter struct { func InitReporter(cmd *cobra.Command) *Reporter { clientCtx := client.GetClientContextFromCmd(cmd) + + randy := rand.New(rand.NewSource(time.Now().UnixNano())) + r := Reporter{ ClientCtx: clientCtx, LastCount: 0, Context: cmd.Context(), + Rand: randy, } allowance := feegrant.BasicAllowance{ From 908c5c293dd644b8b729cbfde5aa488169fa1fea Mon Sep 17 00:00:00 2001 From: Marston Connell <34043723+TheMarstonConnell@users.noreply.github.com> Date: Mon, 26 Jun 2023 17:26:21 -0400 Subject: [PATCH 4/7] account sequence mismatch --- jprov/server/report.go | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/jprov/server/report.go b/jprov/server/report.go index cc193df..158a099 100644 --- a/jprov/server/report.go +++ b/jprov/server/report.go @@ -111,19 +111,24 @@ func InitReporter(cmd *cobra.Command) *Reporter { } func (r Reporter) Report(cmd *cobra.Command) error { + fmt.Println("Attempting to report bad actors...") + defer fmt.Println("Done report!") pkeyStruct, err := crypto.ReadKey(r.ClientCtx) if err != nil { + fmt.Println(err) return nil } key, err := createPrivKey(pkeyStruct.Key) if err != nil { + fmt.Println(err) return nil } address, err := bech32.ConvertAndEncode(storageTypes.AddressPrefix, key.PubKey().Address().Bytes()) if err != nil { + fmt.Println(err) return nil } @@ -147,6 +152,7 @@ func (r Reporter) Report(cmd *cobra.Command) error { res, err := qClient.ActiveDealsAll(r.Context, &qADR) if err != nil { + fmt.Println(err) return err } @@ -160,6 +166,7 @@ func (r Reporter) Report(cmd *cobra.Command) error { res, err := qClient.Providers(r.Context, &req) if err != nil { + fmt.Println(err) continue } @@ -172,11 +179,13 @@ func (r Reporter) Report(cmd *cobra.Command) error { deal.Cid, ) if err := msg.ValidateBasic(); err != nil { + fmt.Println(err) continue } res, err := SendTx(r.ClientCtx, cmd.Flags(), msg) if err != nil { + fmt.Println(err) continue } @@ -195,7 +204,8 @@ func (r Reporter) Report(cmd *cobra.Command) error { } func (r Reporter) AttestReport(cmd *cobra.Command) error { - + fmt.Println("Attempting to attest to reports...") + defer fmt.Println("Done attesting to reports!") pkeyStruct, err := crypto.ReadKey(r.ClientCtx) if err != nil { return nil @@ -324,7 +334,17 @@ func prepareFactory(clientCtx client.Context, address string, txf txns.Factory) func SendTx(clientCtx client.Context, flagSet *pflag.FlagSet, msgs ...sdk.Msg) (*sdk.TxResponse, error) { txf := txns.NewFactoryCLI(clientCtx, flagSet) - address, err := crypto.GetAddress(clientCtx) + pkeyStruct, err := crypto.ReadKey(clientCtx) + if err != nil { + return nil, err + } + + key, err := createPrivKey(pkeyStruct.Key) + if err != nil { + return nil, err + } + + address, err := bech32.ConvertAndEncode(storageTypes.AddressPrefix, key.PubKey().Address().Bytes()) if err != nil { return nil, err } From bb8fb9051de7b71da1d7a5523630671db9550e91 Mon Sep 17 00:00:00 2001 From: Marston Connell <34043723+TheMarstonConnell@users.noreply.github.com> Date: Wed, 5 Jul 2023 10:56:38 -0400 Subject: [PATCH 5/7] add report flag --- jprov/jprovd/provider_commands.go | 1 + jprov/server/file_server.go | 10 +- jprov/server/report.go | 168 ++++++++++++++++++------------ jprov/types/flags.go | 1 + jprov/utils/network.go | 2 +- 5 files changed, 115 insertions(+), 67 deletions(-) diff --git a/jprov/jprovd/provider_commands.go b/jprov/jprovd/provider_commands.go index c770762..e74ea08 100644 --- a/jprov/jprovd/provider_commands.go +++ b/jprov/jprovd/provider_commands.go @@ -46,6 +46,7 @@ func StartServerCommand() *cobra.Command { cmd.Flags().Int64(types.FlagQueueInterval, 4, "The time, in seconds, between running a queue loop.") cmd.Flags().String(types.FlagProviderName, "A Storage Provider", "The name to identify this provider in block explorers.") cmd.Flags().Int64(types.FlagSleep, 250, "The time, in milliseconds, before adding another proof msg to the queue.") + cmd.Flags().Bool(types.FlagDoReport, true, "Should this provider report deals (uses gas).") return cmd } diff --git a/jprov/server/file_server.go b/jprov/server/file_server.go index 91ab289..982ccb6 100644 --- a/jprov/server/file_server.go +++ b/jprov/server/file_server.go @@ -239,15 +239,21 @@ func StartFileServer(cmd *cobra.Command) { go manager.Start(cmd) } + report, err := cmd.Flags().GetBool(types.FlagDoReport) + if err != nil { + fmt.Println(err) + return + } + go func() { for { - if rand.Int63n(2) == 0 { + if rand.Int63n(2) == 0 && report { err := reporter.Report(cmd) if err != nil { fmt.Println(err) } } else { - err := reporter.AttestReport(cmd) + err := reporter.AttestReport(&q) if err != nil { fmt.Println(err) } diff --git a/jprov/server/report.go b/jprov/server/report.go index 158a099..bd6470b 100644 --- a/jprov/server/report.go +++ b/jprov/server/report.go @@ -5,9 +5,12 @@ import ( "encoding/hex" "fmt" "math/rand" + "sync" "time" "github.com/JackalLabs/jackal-provider/jprov/crypto" + "github.com/JackalLabs/jackal-provider/jprov/queue" + "github.com/JackalLabs/jackal-provider/jprov/types" "github.com/JackalLabs/jackal-provider/jprov/utils" "github.com/cosmos/cosmos-sdk/client" txns "github.com/cosmos/cosmos-sdk/client/tx" @@ -50,6 +53,7 @@ type Reporter struct { } func InitReporter(cmd *cobra.Command) *Reporter { + fmt.Println("Initializing report system...") clientCtx := client.GetClientContextFromCmd(cmd) randy := rand.New(rand.NewSource(time.Now().UnixNano())) @@ -68,45 +72,47 @@ func InitReporter(cmd *cobra.Command) *Reporter { pkeyStruct, err := crypto.ReadKey(r.ClientCtx) if err != nil { - return nil + return &r } key, err := createPrivKey(pkeyStruct.Key) if err != nil { - return nil + return &r } address, err := bech32.ConvertAndEncode(storageTypes.AddressPrefix, key.PubKey().Address().Bytes()) if err != nil { - return nil + return &r } + fmt.Printf("Creating a fee allowance for %s from %s", address, pkeyStruct.Address) myAddress, err := sdk.AccAddressFromBech32(pkeyStruct.Address) if err != nil { - return nil + return &r } reportAddress, err := sdk.AccAddressFromBech32(address) if err != nil { - return nil + return &r } - grantMsg, nerr := feegrant.NewMsgGrantAllowance(&allowance, myAddress, reportAddress) - if nerr != nil { - fmt.Println(nerr) - return nil + grantMsg, err := feegrant.NewMsgGrantAllowance(&allowance, myAddress, reportAddress) + if err != nil { + fmt.Println(err) + return &r } - grantRes, nerr := utils.SendTx(clientCtx, cmd.Flags(), "", grantMsg) - if nerr != nil { - fmt.Println(nerr) - return nil + grantRes, err := utils.SendTx(clientCtx, cmd.Flags(), "", grantMsg) + if err != nil { + return &r } if grantRes.Code != 0 { fmt.Println(grantRes.RawLog) - return nil + return &r } + fmt.Println("Done!") + return &r } @@ -134,13 +140,8 @@ func (r Reporter) Report(cmd *cobra.Command) error { qClient := storageTypes.NewQueryClient(r.ClientCtx) - var val uint64 - if r.LastCount > 300 { - val = uint64(r.Rand.Int63n(r.LastCount)) - } - page := &query.PageRequest{ - Offset: val, + Offset: 0, Limit: 300, Reverse: r.Rand.Intn(2) == 0, CountTotal: true, @@ -162,6 +163,10 @@ func (r Reporter) Report(cmd *cobra.Command) error { prov := deal.Provider + if prov == pkeyStruct.Address { + continue + } + req := storageTypes.QueryProviderRequest{Address: prov} res, err := qClient.Providers(r.Context, &req) @@ -190,34 +195,32 @@ func (r Reporter) Report(cmd *cobra.Command) error { } if res == nil { + fmt.Println("failed to sentTx") continue } + fmt.Println(res.RawLog) + if res.Code != 0 { + fmt.Println("failed tx") continue } - } + fmt.Printf("Successfully reported %s\n", deal.Cid) + + return nil + } } return nil } -func (r Reporter) AttestReport(cmd *cobra.Command) error { +func (r Reporter) AttestReport(queue *queue.UploadQueue) error { fmt.Println("Attempting to attest to reports...") - defer fmt.Println("Done attesting to reports!") - pkeyStruct, err := crypto.ReadKey(r.ClientCtx) - if err != nil { - return nil - } - - key, err := createPrivKey(pkeyStruct.Key) - if err != nil { - return nil - } - address, err := bech32.ConvertAndEncode(storageTypes.AddressPrefix, key.PubKey().Address().Bytes()) + pkeyStruct, err := crypto.ReadKey(r.ClientCtx) if err != nil { + fmt.Println(err) return nil } @@ -236,68 +239,105 @@ func (r Reporter) AttestReport(cmd *cobra.Command) error { res, err := qClient.ReportsAll(r.Context, &qARR) if err != nil { + fmt.Println(err) return err } reports := res.Reports - pKey, err := crypto.ReadKey(r.ClientCtx) - if err != nil { - return err + if len(reports) == 0 { + fmt.Println("no reports to attest to.") } for _, report := range reports { - attestations := report.Attestations for _, attest := range attestations { - if attest.Provider == pKey.Address { + if attest.Provider == pkeyStruct.Address { + fmt.Printf("attempting to attest to %s...\n", report.Cid) + + if attest.Complete { + fmt.Println("Already completed") + continue + } + qADR := storageTypes.QueryActiveDealRequest{ Cid: report.Cid, } adRes, err := qClient.ActiveDeals(r.Context, &qADR) if err != nil { + fmt.Println(err) return err } ad := adRes.ActiveDeals - req := storageTypes.QueryProviderRequest{Address: attest.Provider} + if ad.Provider == pkeyStruct.Address { + fmt.Println("skipping reporting myself 😅") + continue + } + + req := storageTypes.QueryProviderRequest{Address: ad.Provider} providerRes, err := qClient.Providers(r.Context, &req) if err != nil { + fmt.Println(err) continue } ipAddress := providerRes.GetProviders().Ip + fmt.Printf("trying to downloading file from %s...\n", ipAddress) _, err = utils.TestDownloadFileFromURL(ipAddress, ad.Fid) - if err != nil { - msg := storageTypes.NewMsgReport( // Creating Report - address, - report.Cid, - ) - if err := msg.ValidateBasic(); err != nil { - continue - } - - res, err := SendTx(r.ClientCtx, cmd.Flags(), msg) - if err != nil { - continue - } - - if res == nil { - continue - } - - if res.Code != 0 { - continue - } + if err == nil { + fmt.Println("successfully downloaded file.") + break + } + fmt.Println("failed to download file.") + + msg := storageTypes.NewMsgReport( // Creating Report + pkeyStruct.Address, + report.Cid, + ) + if err := msg.ValidateBasic(); err != nil { + fmt.Println(err) + continue } + var wg sync.WaitGroup + wg.Add(1) + + upload := types.Upload{ + Message: msg, + Callback: &wg, + Err: nil, + Response: nil, + } + queue.Append(&upload) + wg.Wait() + + if upload.Err != nil { + fmt.Println(upload.Err) + continue + } + + if upload.Response == nil { + fmt.Println("empty response from report attestation, something is wrong") + continue + } + + fmt.Println(upload.Response.RawLog) + + if upload.Response.Code != 0 { + fmt.Println(err) + continue + } + + break + } } - } + fmt.Println("Done attesting to reports!") return nil } @@ -372,13 +412,13 @@ func SendTx(clientCtx client.Context, flagSet *pflag.FlagSet, msgs ...sdk.Msg) ( return nil, err } - adr, err := sdk.AccAddressFromBech32(address) + adr, err := sdk.AccAddressFromBech32(pkeyStruct.Address) if err != nil { return nil, err } tx.SetFeeGranter(adr) - err = Sign(txf, clientCtx, tx, true) + err = sign(txf, clientCtx, tx, true) if err != nil { return nil, err } @@ -397,7 +437,7 @@ func SendTx(clientCtx client.Context, flagSet *pflag.FlagSet, msgs ...sdk.Msg) ( return res, err } -func Sign(txf txns.Factory, clientCtx client.Context, txBuilder client.TxBuilder, overwriteSig bool) error { +func sign(txf txns.Factory, clientCtx client.Context, txBuilder client.TxBuilder, overwriteSig bool) error { signMode := txf.SignMode() if signMode == signing.SignMode_SIGN_MODE_UNSPECIFIED { // use the SignModeHandler's default mode if unspecified diff --git a/jprov/types/flags.go b/jprov/types/flags.go index ef7c6e8..e9447a6 100644 --- a/jprov/types/flags.go +++ b/jprov/types/flags.go @@ -13,4 +13,5 @@ const ( FlagQueueInterval = "queue-interval" FlagProviderName = "moniker" FlagSleep = "sleep" + FlagDoReport = "do-report" ) diff --git a/jprov/utils/network.go b/jprov/utils/network.go index c57737a..a287a77 100644 --- a/jprov/utils/network.go +++ b/jprov/utils/network.go @@ -88,11 +88,11 @@ func TestDownloadFileFromURL(url string, fid string) (int64, error) { if err != nil { return 0, err } + defer resp.Body.Close() if resp.StatusCode != 200 { return 0, fmt.Errorf("failed to find file on network") } - defer resp.Body.Close() buff := bytes.NewBuffer([]byte{}) size, err := io.Copy(buff, resp.Body) From fc25469b8c022bcabd6d3f2d4dc1766c763b039d Mon Sep 17 00:00:00 2001 From: Marston Connell <34043723+TheMarstonConnell@users.noreply.github.com> Date: Fri, 7 Jul 2023 14:31:29 -0400 Subject: [PATCH 6/7] lint --- jprov/utils/network.go | 1 - 1 file changed, 1 deletion(-) diff --git a/jprov/utils/network.go b/jprov/utils/network.go index a287a77..e9ac824 100644 --- a/jprov/utils/network.go +++ b/jprov/utils/network.go @@ -68,7 +68,6 @@ func DownloadFileFromURL(cmd *cobra.Command, url string, fid string, cid string, } func TestDownloadFileFromURL(url string, fid string) (int64, error) { - cli := http.Client{} req, err := http.NewRequest("GET", fmt.Sprintf("%s/download/%s", url, fid), nil) if err != nil { From 3758abeff025ad7f23d502805f7f246e4cf0ab65 Mon Sep 17 00:00:00 2001 From: Marston Connell <34043723+TheMarstonConnell@users.noreply.github.com> Date: Thu, 27 Jul 2023 18:37:25 -0400 Subject: [PATCH 7/7] fixing build --- jprov/testutils/testFile.go | 57 +++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 jprov/testutils/testFile.go diff --git a/jprov/testutils/testFile.go b/jprov/testutils/testFile.go new file mode 100644 index 0000000..d70a8b8 --- /dev/null +++ b/jprov/testutils/testFile.go @@ -0,0 +1,57 @@ +package testutils + +import ( + "crypto/sha256" + "encoding/hex" + "encoding/json" + "fmt" + "io" + + storagetypes "github.com/jackalLabs/canine-chain/v3/x/storage/types" + + "github.com/wealdtech/go-merkletree" + "github.com/wealdtech/go-merkletree/sha3" +) + +// File with a single block +type MerkleFile struct { + data []byte + tree merkletree.MerkleTree +} + +func NewFile(data []byte) MerkleFile { + h := sha256.New() + _, err := io.WriteString(h, fmt.Sprintf("%d%x", 0, data)) + if err != nil { + panic(err) + } + + raw := [][]byte{h.Sum(nil)} + + tree, err := merkletree.NewUsing(raw, sha3.New512(), false) + if err != nil { + panic(err) + } + + return MerkleFile{data: h.Sum(nil), tree: *tree} +} + +func (m *MerkleFile) GetProof() merkletree.Proof { + proof, err := m.tree.GenerateProof(m.data, 0) + if err != nil { + panic(err) + } + return *proof +} + +func (m *MerkleFile) GetJsonProof() []byte { + proof, err := json.Marshal(m.GetProof()) + if err != nil { + panic(err) + } + return proof +} + +func (m *MerkleFile) GenerateActiveDeal() storagetypes.ActiveDeals { + return storagetypes.ActiveDeals{Blocktoprove: "0", Merkle: hex.EncodeToString(m.tree.Root())} +}