From 3a9ba4bec0ac59a34fb9cfceda0e7e71c84b034c Mon Sep 17 00:00:00 2001 From: shahnawaz-creator <117025384+shahnawaz-creator@users.noreply.github.com> Date: Tue, 12 Sep 2023 18:16:55 +0530 Subject: [PATCH 01/14] Updated self hosted macos-runner & windows-runner (#517) * Updated self hosted macos-runner & windows-runner * updated self hosted runners --- .github/workflows/build-zbox.yaml | 4 ++-- .github/workflows/build-zboxcli.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-zbox.yaml b/.github/workflows/build-zbox.yaml index 72ce8650..fc375400 100644 --- a/.github/workflows/build-zbox.yaml +++ b/.github/workflows/build-zbox.yaml @@ -64,7 +64,7 @@ jobs: build-windows: name: Build-windows - runs-on: windows-latest + runs-on: windows-runner steps: - name: Setup go 1.20 uses: actions/setup-go@v2 @@ -112,7 +112,7 @@ jobs: build-macos: name: Build-macos - runs-on: macos-latest + runs-on: macos-runner steps: - name: Setup go 1.20 diff --git a/.github/workflows/build-zboxcli.yml b/.github/workflows/build-zboxcli.yml index 00e76904..85ebcaee 100644 --- a/.github/workflows/build-zboxcli.yml +++ b/.github/workflows/build-zboxcli.yml @@ -95,7 +95,7 @@ jobs: build-windows: name: Build-windows - runs-on: windows-latest + runs-on: windows-runner steps: - name: Setup go 1.20 uses: actions/setup-go@v2 @@ -122,7 +122,7 @@ jobs: build-macos: name: Build-macos - runs-on: macos-latest + runs-on: macos-runner steps: - name: Setup go 1.20 From 083282f40db84d4066d2498c98d72669a3e419d4 Mon Sep 17 00:00:00 2001 From: peterlimg <54137706+peterlimg@users.noreply.github.com> Date: Sat, 7 Oct 2023 12:58:14 +1100 Subject: [PATCH 02/14] Fix upload --web-streaming (#527) * Fix upload --web-streaming Update gosdk to use correct ffmpeg commands * Fix tests * fix(gomod): upgraded gosdk with latest sprint-1.11 * chore(gomod): go mod tidy --------- Co-authored-by: Lz --- go.mod | 7 ++++--- go.sum | 18 ++++++++++-------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index ad1747c5..42ec9b1d 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.18 require ( github.com/0chain/errors v1.0.3 - github.com/0chain/gosdk v1.8.18-0.20230901213317-53d640a9b7f9 + github.com/0chain/gosdk v1.10.1-0.20231006191003-5990f59200aa github.com/icza/bitio v1.1.0 github.com/olekukonko/tablewriter v0.0.5 github.com/spf13/cobra v1.6.0 @@ -43,6 +43,7 @@ require ( github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/philhofer/fwd v1.1.2-0.20210722190033-5c56ac6d0bb9 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/remeh/sizedwaitgroup v1.0.0 // indirect github.com/rivo/uniseg v0.4.3 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/shopspring/decimal v1.3.1 // indirect @@ -63,8 +64,8 @@ require ( go.uber.org/zap v1.24.0 // indirect golang.org/x/crypto v0.6.0 // indirect golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect + golang.org/x/sys v0.7.0 // indirect + golang.org/x/text v0.8.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index ea784d36..ee5326b6 100644 --- a/go.sum +++ b/go.sum @@ -40,8 +40,8 @@ github.com/0chain/common v0.0.6-0.20230127095721-8df4d1d72565 h1:z+DtCR8mBsjPnEs github.com/0chain/common v0.0.6-0.20230127095721-8df4d1d72565/go.mod h1:UyDC8Qyl5z9lGkCnf9RHJPMektnFX8XtCJZHXCCVj8E= github.com/0chain/errors v1.0.3 h1:QQZPFxTfnMcRdt32DXbzRQIfGWmBsKoEdszKQDb0rRM= github.com/0chain/errors v1.0.3/go.mod h1:xymD6nVgrbgttWwkpSCfLLEJbFO6iHGQwk/yeSuYkIc= -github.com/0chain/gosdk v1.8.18-0.20230901213317-53d640a9b7f9 h1:GHTdYTmhNY9genBkNWLXdn3Z1yCtcbSNkcIFaKrqBRU= -github.com/0chain/gosdk v1.8.18-0.20230901213317-53d640a9b7f9/go.mod h1:3NKNYzmnMIYqZwwwOgZwMmTW1DT1ZUAmKyVPmYQOiT4= +github.com/0chain/gosdk v1.10.1-0.20231006191003-5990f59200aa h1:JqE6zBu41TXgB2Spl+P90e2K6i0vSIGECVFppulsiC4= +github.com/0chain/gosdk v1.10.1-0.20231006191003-5990f59200aa/go.mod h1:6Co9xV9/jeS9Bdi0L3fISOnKbrm0qPTzRtBhIdB/yqY= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Luzifer/go-openssl/v3 v3.1.0 h1:QqKqo6kYXGGUsvtUoCpRZm8lHw+jDfhbzr36gVj+/gw= @@ -150,8 +150,8 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -200,7 +200,7 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T github.com/herumi/bls-go-binary v1.31.0 h1:L1goQ2tMtGgpXCg5AwHAdJQpLs/pfnWWEc3Wog6OhmI= github.com/herumi/bls-go-binary v1.31.0/go.mod h1:O4Vp1AfR4raRGwFeQpr9X/PQtncEicMoOe6BQt1oX0Y= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= -github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= +github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c h1:DZfsyhDK1hnSS5lH8l+JggqzEleHteTYfutAiVlSUM8= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -270,6 +270,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= +github.com/remeh/sizedwaitgroup v1.0.0 h1:VNGGFwNo/R5+MJBf6yrsr110p0m4/OX4S3DCy7Kyl5E= +github.com/remeh/sizedwaitgroup v1.0.0/go.mod h1:3j2R4OIe/SeS6YDhICBy22RWjJC5eNCJ1V+9+NVNYlo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -500,8 +502,8 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -509,8 +511,8 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From bf176ad0502bafa1c532da595c6bb91dbb644577 Mon Sep 17 00:00:00 2001 From: Yaroslav Svitlytskyi <53532703+YarikRevich@users.noreply.github.com> Date: Sun, 8 Oct 2023 02:42:14 +0200 Subject: [PATCH 03/14] feature: added all provider for stake pool related commands (#526) --- cmd/stakepool.go | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/cmd/stakepool.go b/cmd/stakepool.go index 07360c57..e3fca963 100644 --- a/cmd/stakepool.go +++ b/cmd/stakepool.go @@ -201,7 +201,19 @@ var spLock = &cobra.Command{ err error ) - if flags.Changed("blobber_id") { + if flags.Changed("miner_id") { + if providerID, err = flags.GetString("miner_id"); err != nil { + log.Fatalf("invalid 'miner_id' flag: %v", err) + } else { + providerType = sdk.ProviderMiner + } + } else if flags.Changed("sharder_id") { + if providerID, err = flags.GetString("sharder_id"); err != nil { + log.Fatalf("invalid 'sharder_id' flag: %v", err) + } else { + providerType = sdk.ProviderSharder + } + } else if flags.Changed("blobber_id") { if providerID, err = flags.GetString("blobber_id"); err != nil { log.Fatalf("invalid 'blobber_id' flag: %v", err) } else { @@ -213,10 +225,14 @@ var spLock = &cobra.Command{ } else { providerType = sdk.ProviderValidator } - } - - if providerType == 0 || providerID == "" { - log.Fatal("missing flag: one of 'blobber_id' or 'validator_id' is required") + } else if flags.Changed("authorizer_id") { + if providerID, err = flags.GetString("authorizer_id"); err != nil { + log.Fatalf("invalid 'authorizer_id' flag: %v", err) + } else { + providerType = sdk.ProviderAuthorizer + } + } else if providerType == 0 || providerID == "" { + log.Fatal("missing flag: one of 'miner_id', 'sharder_id', 'blobber_id', 'validator_id', 'authorizer_id' is required") } if !flags.Changed("tokens") { @@ -303,10 +319,11 @@ func init() { rootCmd.AddCommand(spLock) rootCmd.AddCommand(spUnlock) - spInfo.PersistentFlags().String("blobber_id", "", - "for given blobber") - spInfo.PersistentFlags().String("validator_id", "", - "for given validator") + spInfo.PersistentFlags().String("miner_id", "", "for given miner") + spInfo.PersistentFlags().String("sharder_id", "", "for given sharder") + spInfo.PersistentFlags().String("blobber_id", "", "for given blobber") + spInfo.PersistentFlags().String("validator_id", "", "for given validator") + spInfo.PersistentFlags().String("authorizer_id", "", "for given authorizer") spInfo.PersistentFlags().Bool("json", false, "(default false) pass this option to print response as json data") spUserInfo.PersistentFlags().Bool("json", false, "(default false) pass this option to print response as json data") @@ -315,15 +332,21 @@ func init() { spUserInfo.PersistentFlags().Int("offset", 0, "pass this option to skip the number of rows before beginning") spUserInfo.PersistentFlags().String("client_id", "", "pass for given client") + spLock.PersistentFlags().String("miner_id", "", "for given miner") + spLock.PersistentFlags().String("sharder_id", "", "for given sharder") spLock.PersistentFlags().String("blobber_id", "", "for given blobber") spLock.PersistentFlags().String("validator_id", "", "for given validator") + spLock.PersistentFlags().String("authorizer_id", "", "for given authorizer") spLock.PersistentFlags().Float64("tokens", 0.0, "tokens to lock, required") spLock.PersistentFlags().Float64("fee", 0.0, "transaction fee, default 0") spLock.MarkFlagRequired("tokens") + spUnlock.PersistentFlags().String("miner_id", "", "for given miner") + spUnlock.PersistentFlags().String("sharder_id", "", "for given sharder") spUnlock.PersistentFlags().String("blobber_id", "", "for given blobber") spUnlock.PersistentFlags().String("validator_id", "", "for given validator") + spUnlock.PersistentFlags().String("authorizer_id", "", "for given authorizer") spUnlock.PersistentFlags().Float64("fee", 0.0, "transaction fee, default 0") spUnlock.MarkFlagRequired("tokens") } From b763773ab81529d7a3f7274d34f9a670132d2b81 Mon Sep 17 00:00:00 2001 From: Hitenjain14 Date: Mon, 9 Oct 2023 16:33:02 +0530 Subject: [PATCH 04/14] update gosdk for list optimization --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 42ec9b1d..b8610308 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.18 require ( github.com/0chain/errors v1.0.3 - github.com/0chain/gosdk v1.10.1-0.20231006191003-5990f59200aa + github.com/0chain/gosdk v1.10.1-0.20231009105530-b8cad2487e2a github.com/icza/bitio v1.1.0 github.com/olekukonko/tablewriter v0.0.5 github.com/spf13/cobra v1.6.0 diff --git a/go.sum b/go.sum index ee5326b6..44293b6f 100644 --- a/go.sum +++ b/go.sum @@ -40,8 +40,8 @@ github.com/0chain/common v0.0.6-0.20230127095721-8df4d1d72565 h1:z+DtCR8mBsjPnEs github.com/0chain/common v0.0.6-0.20230127095721-8df4d1d72565/go.mod h1:UyDC8Qyl5z9lGkCnf9RHJPMektnFX8XtCJZHXCCVj8E= github.com/0chain/errors v1.0.3 h1:QQZPFxTfnMcRdt32DXbzRQIfGWmBsKoEdszKQDb0rRM= github.com/0chain/errors v1.0.3/go.mod h1:xymD6nVgrbgttWwkpSCfLLEJbFO6iHGQwk/yeSuYkIc= -github.com/0chain/gosdk v1.10.1-0.20231006191003-5990f59200aa h1:JqE6zBu41TXgB2Spl+P90e2K6i0vSIGECVFppulsiC4= -github.com/0chain/gosdk v1.10.1-0.20231006191003-5990f59200aa/go.mod h1:6Co9xV9/jeS9Bdi0L3fISOnKbrm0qPTzRtBhIdB/yqY= +github.com/0chain/gosdk v1.10.1-0.20231009105530-b8cad2487e2a h1:qwmRwk+uN1B63t1OYbOzwxdexLyZKo9Xjq1pvmaLMFo= +github.com/0chain/gosdk v1.10.1-0.20231009105530-b8cad2487e2a/go.mod h1:6Co9xV9/jeS9Bdi0L3fISOnKbrm0qPTzRtBhIdB/yqY= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Luzifer/go-openssl/v3 v3.1.0 h1:QqKqo6kYXGGUsvtUoCpRZm8lHw+jDfhbzr36gVj+/gw= From 45152b041e7b73fd827b550d2a7112bedf1f7985 Mon Sep 17 00:00:00 2001 From: dabasov Date: Mon, 9 Oct 2023 21:48:17 +0300 Subject: [PATCH 05/14] updated gosdk --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b8610308..4895d9a4 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.18 require ( github.com/0chain/errors v1.0.3 - github.com/0chain/gosdk v1.10.1-0.20231009105530-b8cad2487e2a + github.com/0chain/gosdk v1.10.1-0.20231009155148-2f6b57548450 github.com/icza/bitio v1.1.0 github.com/olekukonko/tablewriter v0.0.5 github.com/spf13/cobra v1.6.0 diff --git a/go.sum b/go.sum index 44293b6f..d4a9980d 100644 --- a/go.sum +++ b/go.sum @@ -40,8 +40,8 @@ github.com/0chain/common v0.0.6-0.20230127095721-8df4d1d72565 h1:z+DtCR8mBsjPnEs github.com/0chain/common v0.0.6-0.20230127095721-8df4d1d72565/go.mod h1:UyDC8Qyl5z9lGkCnf9RHJPMektnFX8XtCJZHXCCVj8E= github.com/0chain/errors v1.0.3 h1:QQZPFxTfnMcRdt32DXbzRQIfGWmBsKoEdszKQDb0rRM= github.com/0chain/errors v1.0.3/go.mod h1:xymD6nVgrbgttWwkpSCfLLEJbFO6iHGQwk/yeSuYkIc= -github.com/0chain/gosdk v1.10.1-0.20231009105530-b8cad2487e2a h1:qwmRwk+uN1B63t1OYbOzwxdexLyZKo9Xjq1pvmaLMFo= -github.com/0chain/gosdk v1.10.1-0.20231009105530-b8cad2487e2a/go.mod h1:6Co9xV9/jeS9Bdi0L3fISOnKbrm0qPTzRtBhIdB/yqY= +github.com/0chain/gosdk v1.10.1-0.20231009155148-2f6b57548450 h1:v997C2HUfq63KRtid8T0yUPssVnmxsAI8Oah2dVivJo= +github.com/0chain/gosdk v1.10.1-0.20231009155148-2f6b57548450/go.mod h1:6Co9xV9/jeS9Bdi0L3fISOnKbrm0qPTzRtBhIdB/yqY= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Luzifer/go-openssl/v3 v3.1.0 h1:QqKqo6kYXGGUsvtUoCpRZm8lHw+jDfhbzr36gVj+/gw= From bfa3aa4b0fa2554e4afd867fe53a75daec3c53c3 Mon Sep 17 00:00:00 2001 From: Kishan Dhakan Date: Tue, 17 Oct 2023 02:50:23 +0530 Subject: [PATCH 06/14] update gosdk --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4895d9a4..112778c5 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.18 require ( github.com/0chain/errors v1.0.3 - github.com/0chain/gosdk v1.10.1-0.20231009155148-2f6b57548450 + github.com/0chain/gosdk v1.10.1-0.20231016103614-0f61a49368d5 github.com/icza/bitio v1.1.0 github.com/olekukonko/tablewriter v0.0.5 github.com/spf13/cobra v1.6.0 diff --git a/go.sum b/go.sum index d4a9980d..72f07bd7 100644 --- a/go.sum +++ b/go.sum @@ -40,8 +40,8 @@ github.com/0chain/common v0.0.6-0.20230127095721-8df4d1d72565 h1:z+DtCR8mBsjPnEs github.com/0chain/common v0.0.6-0.20230127095721-8df4d1d72565/go.mod h1:UyDC8Qyl5z9lGkCnf9RHJPMektnFX8XtCJZHXCCVj8E= github.com/0chain/errors v1.0.3 h1:QQZPFxTfnMcRdt32DXbzRQIfGWmBsKoEdszKQDb0rRM= github.com/0chain/errors v1.0.3/go.mod h1:xymD6nVgrbgttWwkpSCfLLEJbFO6iHGQwk/yeSuYkIc= -github.com/0chain/gosdk v1.10.1-0.20231009155148-2f6b57548450 h1:v997C2HUfq63KRtid8T0yUPssVnmxsAI8Oah2dVivJo= -github.com/0chain/gosdk v1.10.1-0.20231009155148-2f6b57548450/go.mod h1:6Co9xV9/jeS9Bdi0L3fISOnKbrm0qPTzRtBhIdB/yqY= +github.com/0chain/gosdk v1.10.1-0.20231016103614-0f61a49368d5 h1:NfSSkZBcjI/QOi97gP3/V4qPFUGl/jJWO+utx/wvZt8= +github.com/0chain/gosdk v1.10.1-0.20231016103614-0f61a49368d5/go.mod h1:6Co9xV9/jeS9Bdi0L3fISOnKbrm0qPTzRtBhIdB/yqY= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Luzifer/go-openssl/v3 v3.1.0 h1:QqKqo6kYXGGUsvtUoCpRZm8lHw+jDfhbzr36gVj+/gw= From 929172b93acbb77f75f90aa72992999d174e13d6 Mon Sep 17 00:00:00 2001 From: Hitenjain14 <57557631+Hitenjain14@users.noreply.github.com> Date: Wed, 18 Oct 2023 15:20:31 +0530 Subject: [PATCH 07/14] fix wait when using multiupload (#533) --- cmd/update.go | 5 ----- cmd/upload.go | 4 ---- 2 files changed, 9 deletions(-) diff --git a/cmd/update.go b/cmd/update.go index a6071799..229a9dc4 100644 --- a/cmd/update.go +++ b/cmd/update.go @@ -53,11 +53,6 @@ var updateCmd = &cobra.Command{ PrintError("Update failed.", err) os.Exit(1) } - - wg.Wait() - if !statusBar.success { - os.Exit(1) - } }, } diff --git a/cmd/upload.go b/cmd/upload.go index 420267e8..0e5b5643 100644 --- a/cmd/upload.go +++ b/cmd/upload.go @@ -67,10 +67,6 @@ var uploadCmd = &cobra.Command{ PrintError("Upload failed.", err) os.Exit(1) } - wg.Wait() - if !statusBar.success { - os.Exit(1) - } }, } From 657858dab53f4d47bf32c35157abff720d832688 Mon Sep 17 00:00:00 2001 From: Manohar Reddy Date: Sun, 22 Oct 2023 13:23:42 +0200 Subject: [PATCH 08/14] use msys2 to build windows binaries (#524) * debug windows builds * start builds on PRs * remove un-used targets * fix syntax error * run only windows * printend * remove set GITHUB_ENV * install make * install choco * set choco install path * build-windows * install zip * also include dll files in the zip file * comment out upload-release-action git action * also install unzip * cleanup release * cleanup workspace * overwrite current files while unzipping * add back gosdk.yaml * use .yml extension * actions checkout * use docker to build linux binary * lsb_release print --- .github/workflows/build-zbox.yaml | 215 ++++++++---------- .github/workflows/gosdk.yml | 6 +- ...{build-zboxcli.yml => release-zboxcli.yml} | 51 ++++- Makefile | 6 +- README.md | 81 ++++--- 5 files changed, 177 insertions(+), 182 deletions(-) rename .github/workflows/{build-zboxcli.yml => release-zboxcli.yml} (74%) diff --git a/.github/workflows/build-zbox.yaml b/.github/workflows/build-zbox.yaml index fc375400..9f9b9201 100644 --- a/.github/workflows/build-zbox.yaml +++ b/.github/workflows/build-zbox.yaml @@ -3,10 +3,12 @@ on: push: branches: - master - - dev + - sprint* - staging tags: - 'v*.*.*' + pull_request: + workflow_dispatch: jobs: build-linux: @@ -24,136 +26,101 @@ jobs: - name: Setup go 1.20 uses: actions/setup-go@v2 with: - go-version: '1.20' # The Go version to download (if necessary) and use. - - - name: Set GITHUB_ENV - run: | - echo "BRANCH=$(echo ${GITHUB_REF#refs/heads/})" >> $GITHUB_ENV - - if [[ "${{github.base_ref}}" == "master" || "${{github.ref}}" == "refs/heads/master" ]]; then - echo "TAG=v0.0.0-master" >> $GITHUB_ENV - elif [[ "${{github.base_ref}}" == "dev" || "${{github.ref}}" == "refs/heads/dev" ]]; then - echo "TAG=v0.0.0-dev" >> $GITHUB_ENV - elif [[ "${{github.base_ref}}" == "staging" || "${{github.ref}}" == "refs/heads/staging" ]]; then - echo "TAG=v0.0.0-staging" >> $GITHUB_ENV - else - echo "TAG=$(echo ${GITHUB_REF#refs/tags/})" >> $GITHUB_ENV - fi - - - name: Install - run: make install - - - name: Zip release - run: tar -czvf zbox-linux.tar.gz ./zbox - - - name: Upload binaries to release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: zbox-linux.tar.gz - tag: ${{ env.TAG }} - overwrite: true - file_glob: true - - - name: 'Upload Artifact' - uses: actions/upload-artifact@v2 - with: - name: zbox-linux - path: zbox - retention-days: 5 - - build-windows: - name: Build-windows - runs-on: windows-runner - steps: - - name: Setup go 1.20 - uses: actions/setup-go@v2 - with: - go-version: '1.20' # The Go version to download (if necessary) and use. - - - name: Checkout - uses: actions/checkout@v2 - - - name: Set GITHUB_ENV - run: | - IF ( "${{github.base_ref}}" -eq "master" -OR "${{github.ref}}" -eq "refs/heads/master" ){ - echo "TAG=v0.0.0-master" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf-8 -Append - } ElseIf ( "${{github.base_ref}}" -eq "dev" -OR "${{github.ref}}" -eq "refs/heads/dev" ){ - echo "TAG=v0.0.0-dev" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf-8 -Append - } ElseIf ( "${{github.base_ref}}" -eq "staging" -OR "${{github.ref}}" -eq "refs/heads/staging" ){ - echo "TAG=v0.0.0-staging" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf-8 -Append - } ELSE { - echo "TAG=${{github.ref}}" | %{$_ -replace('refs/tags/', '')} | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf-8 -Append - } + go-version: '1.20' - name: Install - run: make install - - - name: Zip release run: | - copy zbox zbox.exe - 7z a zbox-windows.zip zbox.exe - - - name: Upload binaries to release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: zbox-windows.zip - tag: ${{ env.TAG }} - overwrite: true - file_glob: true + lsb_release -a + docker run -v $PWD:/app -w /app golang:1.20 sh -c "make install" - name: 'Upload Artifact' uses: actions/upload-artifact@v2 with: - name: zbox-windows + name: zbox-linux path: zbox retention-days: 5 - build-macos: - name: Build-macos - runs-on: macos-runner - steps: - - - name: Setup go 1.20 - uses: actions/setup-go@v2 - with: - go-version: '1.20' # The Go version to download (if necessary) and use. - - - name: Checkout - uses: actions/checkout@v2 - - - name: Set GITHUB_ENV - run: | - echo "BRANCH=$(echo ${GITHUB_REF#refs/heads/})" >> $GITHUB_ENV - - if [[ "${{github.base_ref}}" == "master" || "${{github.ref}}" == "refs/heads/master" ]]; then - echo "TAG=v0.0.0-master" >> $GITHUB_ENV - elif [[ "${{github.base_ref}}" == "dev" || "${{github.ref}}" == "refs/heads/dev" ]]; then - echo "TAG=v0.0.0-dev" >> $GITHUB_ENV - elif [[ "${{github.base_ref}}" == "staging" || "${{github.ref}}" == "refs/heads/staging" ]]; then - echo "TAG=v0.0.0-dev" >> $GITHUB_ENV - else - echo "TAG=$(echo ${GITHUB_REF#refs/tags/})" >> $GITHUB_ENV - fi - - - name: Install - run: make install - - name: Zip release - run: tar -czvf zbox-macos.tar.gz ./zbox - - - name: Upload binaries to release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: zbox-macos.tar.gz - tag: ${{ env.TAG }} - overwrite: true - file_glob: true - - - name: 'Upload Artifact' - uses: actions/upload-artifact@v2 - with: - name: zbox-macos - path: zbox - retention-days: 5 + # build-windows: + # name: Build-windows + # runs-on: windows-runner + # defaults: + # run: + # shell: msys2 {0} + # strategy: + # matrix: + # sys: [ MINGW64 ] + # steps: + # - uses: msys2/setup-msys2@v2 + # with: + # msystem: ${{matrix.sys}} + + # - name: Install libraries + # run: | + # echo 'Y'| pacman -S base-devel git gcc make + + # - name: Install Clang and Go for MINGW64 + # run: | + # echo 'y'| pacman -S mingw-w64-x86_64-clang mingw-w64-x86_64-go zip unzip + + # - name: Set environment variables + # run: | + # export GOROOT=/mingw64/lib/go + # export GOPATH=/mingw64 + # export PATH=$PATH:$GOROOT/bin + # export PATH=$PATH:/usr/bin/7z + + # # use clang as a default compiler for CGO + # go env -w "CC=/mingw64/bin/clang.exe" + + # - name: Checkout + # uses: actions/checkout@v2 + + # - name: Install + # run: make install + + # - name: Zip release + # run: | + # # download dll files + # wget https://github.com/0chain/zboxcli/files/11840033/windows.dll.s.zip + # unzip -o windows.dll.s.zip + # cp zbox zbox.exe + # zip zbox-windows.zip zbox.exe libgcc_s_seh-1.dll libstdc++-6.dll libwinpthread-1.dll + + # - name: 'Upload Artifact' + # uses: actions/upload-artifact@v2 + # with: + # name: zbox-windows.zip + # path: zbox-windows.zip + # retention-days: 5 + + # - name: cleanup workspace + # run: | + # rm -Recurse ${{github.workspace}}\* + # shell: powershell + + # build-macos: + # name: Build-macos + # runs-on: macos-runner + # steps: + + # - name: Setup go 1.20 + # uses: actions/setup-go@v2 + # with: + # go-version: '1.20' # The Go version to download (if necessary) and use. + + # - name: Checkout + # uses: actions/checkout@v2 + + # - name: Install + # run: make install + + # - name: 'Upload Artifact' + # uses: actions/upload-artifact@v2 + # with: + # name: zbox-macos + # path: zbox + # retention-days: 5 + + # - name: cleanup workspace + # run: | + # rm -rf ./* diff --git a/.github/workflows/gosdk.yml b/.github/workflows/gosdk.yml index 8fafaec7..f6d34867 100644 --- a/.github/workflows/gosdk.yml +++ b/.github/workflows/gosdk.yml @@ -8,7 +8,7 @@ on: workflow_dispatch: inputs: gosdk: - description: 'The version of 0Chain GoSDK' + description: 'The 0Chain GoSDK version or branch' required: true jobs: @@ -18,7 +18,7 @@ jobs: - name: Setup go 1.20 uses: actions/setup-go@v2 with: - go-version: '1.20' + go-version: '1.20' - name: Checkout uses: actions/checkout@v1 @@ -44,4 +44,4 @@ jobs: see full changelog on https://github.com/0chain/gosdk/releases/tag/${{ github.event.inputs.gosdk }} draft: false reviewers: cnlangzi - labels: GoSDK \ No newline at end of file + labels: GoSDK diff --git a/.github/workflows/build-zboxcli.yml b/.github/workflows/release-zboxcli.yml similarity index 74% rename from .github/workflows/build-zboxcli.yml rename to .github/workflows/release-zboxcli.yml index 85ebcaee..2018f50b 100644 --- a/.github/workflows/build-zboxcli.yml +++ b/.github/workflows/release-zboxcli.yml @@ -1,4 +1,4 @@ -name: BUILD-ZBOXCLI +name: RELEASE-ZBOXCLI on: workflow_dispatch: @@ -96,11 +96,34 @@ jobs: build-windows: name: Build-windows runs-on: windows-runner + defaults: + run: + shell: msys2 {0} + strategy: + matrix: + sys: [ MINGW64 ] steps: - - name: Setup go 1.20 - uses: actions/setup-go@v2 + - uses: msys2/setup-msys2@v2 with: - go-version: '1.20' # The Go version to download (if necessary) and use. + msystem: ${{matrix.sys}} + + - name: Install libraries + run: | + echo 'Y'| pacman -S base-devel git gcc make + + - name: Install Clang and Go for MINGW64 + run: | + echo 'y'| pacman -S mingw-w64-x86_64-clang mingw-w64-x86_64-go zip unzip + + - name: Set environment variables + run: | + export GOROOT=/mingw64/lib/go + export GOPATH=/mingw64 + export PATH=$PATH:$GOROOT/bin + export PATH=$PATH:/usr/bin/7z + + # use clang as a default compiler for CGO + go env -w "CC=/mingw64/bin/clang.exe" - name: Checkout uses: actions/checkout@v2 @@ -110,16 +133,24 @@ jobs: - name: Zip release run: | - copy zbox zbox.exe - 7z a zbox-windows.zip zbox.exe + # download dll files + wget https://github.com/0chain/zboxcli/files/11840033/windows.dll.s.zip + unzip -o windows.dll.s.zip + cp zbox zbox.exe + zip zbox-windows.zip zbox.exe libgcc_s_seh-1.dll libstdc++-6.dll libwinpthread-1.dll - name: 'Upload Artifact' uses: actions/upload-artifact@v2 with: - name: zbox-windows - path: zbox + name: zbox-windows.zip + path: zbox-windows.zip retention-days: 5 + - name: cleanup workspace + run: | + rm -Recurse ${{github.workspace}}\* + shell: powershell + build-macos: name: Build-macos runs-on: macos-runner @@ -145,3 +176,7 @@ jobs: name: zbox-macos path: zbox retention-days: 5 + + - name: cleanup workspace + run: | + rm -rf ./* diff --git a/Makefile b/Makefile index ca37a3d4..0f137aa5 100644 --- a/Makefile +++ b/Makefile @@ -11,13 +11,9 @@ GOMODCORE := $(GOMODBASE)/zcncore VERSION_FILE := $(ROOT_DIR)/core/version/version.go MAJOR_VERSION := "1.0" -PLATFORMOS := $(shell uname | tr "[:upper:]" "[:lower:]") - include _util/printer.mk -.PHONY: install-all herumi-all gosdk-all show - -default: help show +default: help #GO BUILD SDK gomod-download: diff --git a/README.md b/README.md index abeac9b6..18170137 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ # zbox - a CLI for Züs dStorage -zbox is a command line interface (CLI) tool to understand the capabilities of Züs dStorage and prototype your app. The utility is built using Züs [GoSDK](https://github.com/0chain/gosdk) . +zbox is a command line interface (CLI) tool to understand the capabilities of Züs dStorage and prototype your app. The utility is built using Züs [GoSDK](https://github.com/0chain/gosdk) . ![zboxcli architecture diagram](https://github.com/0chain/zboxcli/assets/65766301/5aeadfaf-e259-4524-bf31-1d1a2f39c563) - [zbox - a CLI for Züs dStorage](#zbox---a-cli-for-züs-dstorage) - [Züs Overview](#züs-overview) - - [Installation Guides](#installation-instructions) - - [Install on Linux Windows Mac](#build-instructions-for-linux-windows-mac) + - [Installation Instructions](#installation-instructions) + - [Build Instructions for Linux Windows Mac](#build-instructions-for-linux-windows-mac) - [Other Platform Builds](#other-platform-builds) - [Use custom miner/sharder](#use-custom-minersharder) - [Running zbox](#running-zbox) @@ -17,22 +17,19 @@ zbox is a command line interface (CLI) tool to understand the capabilities of Z - [Create new allocation](#create-new-allocation) - [Free storage allocation](#free-storage-allocation) - [Update allocation](#update-allocation) - - [Forbid allocation](#forbid-allocation) + - [Forbid Allocation](#forbid-allocation) - [Cancel allocation](#cancel-allocation) - [Finalise allocation](#finalise-allocation) - - [Get Allocation Info](#get) - [List blobbers](#list-blobbers) - [Detailed blobber information](#detailed-blobber-information) - [List all files](#list-all-files) - [List owner's allocations](#list-owners-allocations) - [Update blobber settings](#update-blobber-settings) - - [Update Validator settings](#update-validator-settings) - - [Get Version](#get-version) - - [List all Validators](#list-all-validators) + - [Update Validator Settings](#update-validator-settings) + - [List All Validators](#list-all-validators) - [Get Validator Configuration](#get-validator-configuration) - [Kill Blobber](#kill-blobber) - [Kill Validator](#kill-validator) - - [Uploading and Managing files](#uploading-and-managing-files) - [Upload](#upload) - [Create Directory](#create-directory) @@ -49,16 +46,15 @@ zbox is a command line interface (CLI) tool to understand the capabilities of Z - [Sync](#sync) - [Get differences](#get-differences) - [Get wallet](#get-wallet) + - [Get](#get) - [Get metadata](#get-metadata) - [Rename](#rename) - [Stats](#stats) - [Repair](#repair) - [Rollback](#rollback) - [Sign data](#sign-data) - - [Download cost](#download-cost) - - [Upload cost](#upload-cost) - [Streaming](#streaming) - - [How it works](#how-it-works) + - [How it works:](#how-it-works) - [Usage](#usage) - [Lock and Unlock Tokens](#lock-and-unlock-tokens) - [Challenge pool information](#challenge-pool-information) @@ -75,7 +71,8 @@ zbox is a command line interface (CLI) tool to understand the capabilities of Z - [Write pool info](#write-pool-info) - [Lock tokens into write pool](#lock-tokens-into-write-pool) - [Unlock tokens from write pool](#unlock-tokens-from-write-pool) - + - [Download cost](#download-cost) + - [Upload cost](#upload-cost) - [Troubleshooting](#troubleshooting) ## Züs Overview @@ -127,7 +124,7 @@ Note: This is helpful for the Mac OS users running local cluster and having trou ## Running zbox -When you run the `./zbox` command in terminal with no arguments, it will list all the available commands and the global flags.For working of specific command check [commands](#commands) section. +When you run the `./zbox` command in terminal with no arguments, it will list all the available commands and the global flags.For working of specific command check [commands](#commands) section. ``` Usage: @@ -438,12 +435,12 @@ Allocation Updated with txID : b84185dae620bbba8386286726f1efcd20d2516bcf1a44821 ``` To test functionality try uploading file to allocation. You should get the following response : ``` -Upload failed. this options for this file is not permitted for this allocation: +Upload failed. this options for this file is not permitted for this allocation: file_option_not_permitted. ``` -To Unforbid an operation after forbiding: +To Unforbid an operation after forbiding: -Sample Command: +Sample Command: ``` ./zbox updateallocation --allocation $ALLOC --forbid_upload false ``` @@ -650,7 +647,7 @@ Update blobber read price ``` ### Update Validator Settings -Use `./zbox validator-update ` to update a validator's configuration settings. +Use `./zbox validator-update ` to update a validator's configuration settings. | Parameter | Required | Description | default | Valid values | | -------------- | -------- | ------------------------------------------- | ------- | ------------ | @@ -711,19 +708,19 @@ settings: #### Get Validator Configuration -`./zbox validator-info` command is used to get a particular validator configuration . Here are the parameters for the command . +`./zbox validator-info` command is used to get a particular validator configuration . Here are the parameters for the command . -| Parameter | Required | Description -| ------------------ | -------- | ----------------------------------------- -| --validator_id | yes | id of validator whose configuration has to be fetched -| --json | optional | Print Response as json data -| --help | no | Provide information about the command +| Parameter | Required | Description +| ------------------ | -------- | ----------------------------------------- +| --validator_id | yes | id of validator whose configuration has to be fetched +| --json | optional | Print Response as json data +| --help | no | Provide information about the command Sample Command : ``` ./zbox validator-info --validator_id f82ab34a98406b8757f11513361752bab9cb679a5cb130b81 ``` -Sample Response : +Sample Response : ``` id: f82ab34a98406b8757f11513361752bab9cb679a5cb130b81a4e86cec50eefc3 url: https://demo2.zus.network/validator01 @@ -742,32 +739,32 @@ settings: #### Kill Blobber `./zbox kill-blobber` command deactivates a blobber to avoid storage of data . Required parameters are : -| Parameter | Required | Description -| ------------------ | -------- | ----------------------------------------- -| --blobber_id | yes | Blobber Id to kill a specific blobber.Can be retrieved using [List blobbers](#list-blobbers). -| --json | optional | Print Response as json data -| --help | no | Provide information about the command - +| Parameter | Required | Description +| ------------------ | -------- | ----------------------------------------- +| --blobber_id | yes | Blobber Id to kill a specific blobber.Can be retrieved using [List blobbers](#list-blobbers). +| --json | optional | Print Response as json data +| --help | no | Provide information about the command + Sample Command : ``` ./zbox kill-blobber --id $BLOBBER_ID --wallet $CHAIN_OWNER_WALLET ``` Note : Kill Blobber command should be evoked from chain owner wallet only -Sample Response : +Sample Response : ``` killed blobber $BLOBBER_ID ``` - + #### Kill Validator -`./zbox kill-validator` command deactivates a specific validator available on the network. Required parameters are : +`./zbox kill-validator` command deactivates a specific validator available on the network. Required parameters are : -| Parameter | Required | Description -| ------------------ | -------- | ----------------------------------------- -| --validator_id | yes | Validator Id to kill a specific blobber.Can be retrieved using [List all Validators](#list-all-validators). -| --json | optional | Print Response as json data -| --help | no | Provide information about the command +| Parameter | Required | Description +| ------------------ | -------- | ----------------------------------------- +| --validator_id | yes | Validator Id to kill a specific blobber.Can be retrieved using [List all Validators](#list-all-validators). +| --json | optional | Print Response as json data +| --help | no | Provide information about the command Sample Command : @@ -856,7 +853,7 @@ Status completed callback. Type = video/fmp4. Name = raw.samplevideo.mp4 ``` #### Create Directory -`./zbox createdir` command is used to create directory on allocation for storing files. +`./zbox createdir` command is used to create directory on allocation for storing files. | Parameter | Description | Valid Values | | ------------ | ------------------------------------------ | ------------ | @@ -1620,7 +1617,7 @@ Repair file completed, Total files repaired: 0 ``` #### Rollback -Use `./zbox rollback` to rollback to a previous state of allocation. This is helpful when you want to rollback to previous version of files you updated on allocation using [Update allocation.](#update-allocation) +Use `./zbox rollback` to rollback to a previous state of allocation. This is helpful when you want to rollback to previous version of files you updated on allocation using [Update allocation.](#update-allocation) | Parameter | Description | Valid Values | | ------------ | ----------------------------------- | ------------ | @@ -1630,7 +1627,7 @@ Use `./zbox rollback` to rollback to a previous state of allocation. This is hel Sample Command: ``` -./zbox rollback --allocation $ALLOCATION_ID +./zbox rollback --allocation $ALLOCATION_ID ``` Sample Response: From 7ea4f32ece0c6a949cad98033ccda45728c68eed Mon Sep 17 00:00:00 2001 From: devyetii Date: Tue, 31 Oct 2023 08:45:07 +0200 Subject: [PATCH 09/14] Revert "Merge pull request #498 from 0chain/hm90121-patch-1" This reverts commit 33f24ae058aa71a0593a674f4f3ddd5f2cf73733, reversing changes made to 46d31120494b6cafe82e90f3c0772631e0d12391. --- README.md | 99 +++------------------ documents/uml.md | 43 --------- documents/zboxcli architecture diagram.png | Bin 65906 -> 0 bytes 3 files changed, 14 insertions(+), 128 deletions(-) delete mode 100644 documents/zboxcli architecture diagram.png diff --git a/README.md b/README.md index 18170137..8ad19811 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ zbox is a command line interface (CLI) tool to understand the capabilities of Züs dStorage and prototype your app. The utility is built using Züs [GoSDK](https://github.com/0chain/gosdk) . -![zboxcli architecture diagram](https://github.com/0chain/zboxcli/assets/65766301/5aeadfaf-e259-4524-bf31-1d1a2f39c563) +![Storage](https://user-images.githubusercontent.com/65766301/120052450-0ab66700-c043-11eb-91ab-1f7aa69e133a.png) - [zbox - a CLI for Züs dStorage](#zbox---a-cli-for-züs-dstorage) - [Züs Overview](#züs-overview) @@ -32,7 +32,6 @@ zbox is a command line interface (CLI) tool to understand the capabilities of Z - [Kill Validator](#kill-validator) - [Uploading and Managing files](#uploading-and-managing-files) - [Upload](#upload) - - [Create Directory](#create-directory) - [Stream](#stream) - [Feed](#feed) - [Download](#download) @@ -51,7 +50,6 @@ zbox is a command line interface (CLI) tool to understand the capabilities of Z - [Rename](#rename) - [Stats](#stats) - [Repair](#repair) - - [Rollback](#rollback) - [Sign data](#sign-data) - [Streaming](#streaming) - [How it works:](#how-it-works) @@ -206,29 +204,25 @@ Flags: ### Global Flags -Global Flags are parameters in zbox that can be used with any command to override the default configuration. zbox supports the following global parameters. +Global Flags are parameters in zbox that can be used with any command to override the default configuration.zbox supports the following global parameters. -| Flags | Description | Usage | -| -------------------------- | ------------------------------------------------------------ | ------------------------------------------------ | -| --config string | Specify a zbox configuration file (default is [$HOME/.zcn/config.yaml](#zcnconfigyaml)) | zbox [command] --config config1.yaml | -| --configDir string | Specify a zbox configuration directory (default is $HOME/.zcn) | zbox [command] --configDir /$HOME/.zcn2 | -| --fee float | Transaction fee for the given transaction(if unset, it will be set to blockchain min fee) | zbox[command] --fee 0.5 | -| --h, --help | Gives more information about a particular command. | zbox [command] --help | +| Flags | Description | Usage | +| -------------------------- | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ | +| --config string | Specify a zbox configuration file (default is [$HOME/.zcn/config.yaml](#zcnconfigyaml)) | zbox [command] --config config1.yaml | +| --configDir string | Specify a zbox configuration directory (default is $HOME/.zcn) | zbox [command] --configDir /$HOME/.zcn2 | +| -h, --help | Gives more information about a particular command. | zbox [command] --help | | --network string | Specify a network file to overwrite the network details(default is [$HOME/.zcn/network.yaml](#zcnnetworkyaml)) | zbox [command] --network network1.yaml | -| --silent | (default false) Do not show interactive sdk logs (shown by default) | zbox [command] --verbose | -| --wallet string | Specify a wallet file or 2nd wallet (default is $HOME/.zcn/wallet.json) | zbox [command] --wallet wallet2.json | -| --wallet_client_id string | Specify a wallet client id (By default client_id specified in $HOME/.zcn/wallet.json is used) | zbox [command] --wallet_client_id | -| --wallet_client_key string | Specify a wallet client_key (By default client_key specified in $HOME/.zcn/wallet.json is used) | zbox [command] --wallet_client_key < client_key> | -| --withNonce int | nonce that will be used in transaction (default is 0) | zbox [command] --withNonce 1 | - - +| --verbose | Provides additional details as to what the particular command is doing. | zbox [command] --verbose | +| --wallet string | Specify a wallet file or 2nd wallet (default is $HOME/.zcn/wallet.json) | zbox [command] --wallet wallet2.json | +| --wallet_client_id string | Specify a wallet client id (By default client_id specified in $HOME/.zcn/wallet.json is used) | zbox [command] --wallet_client_id | +| --wallet_client_key string | Specify a wallet client_key (By default client_key specified in $HOME/.zcn/wallet.json is used) | zbox [command] --wallet_client_key < client_key> | ## Commands Note in this document, we will only show the commands for particular functionalities, the response will vary depending on your usage and may not be provided in all places. To get a more descriptive view of all the zbox functionalities check zbox cli -documentation at https://docs.zus.network/guides/zbox-cli. +documentation at docs.0chain.net. ### Creating and Managing Allocations @@ -424,7 +418,7 @@ Here are the operations: | --forbid_upload | specify if users cannot upload to this allocation | -Here is a sample command for --forbid_upload. Other parameters can be done the same way. +Here is a sample command for --forbid_upload .Other parameters can be done the same way. ``` ./zbox updateallocation --allocation $ALLOC --forbid_upload @@ -438,12 +432,6 @@ To test functionality try uploading file to allocation. You should get the follo Upload failed. this options for this file is not permitted for this allocation: file_option_not_permitted. ``` -To Unforbid an operation after forbiding: - -Sample Command: -``` -./zbox updateallocation --allocation $ALLOC --forbid_upload false -``` #### Cancel allocation `alloc-cancel` immediately return all remaining tokens from challenge pool back to the @@ -645,28 +633,10 @@ Update blobber read price ``` ./zbox bl-update --blobber_id 0ece681f6b00221c5567865b56040eaab23795a843ed629ce71fb340a5566ba3 --read_price 0.1 ``` -### Update Validator Settings - -Use `./zbox validator-update ` to update a validator's configuration settings. - -| Parameter | Required | Description | default | Valid values | -| -------------- | -------- | ------------------------------------------- | ------- | ------------ | -| validator_id | yes | id of validator of which to update settings | | string | -| num_delegates | no | update maximum number of delegates | | int | -| max_stake | no | update maximum stake | | float | -| min_stake | no | update minimum stake | | float | -| service_charge | no | update service charge | | float | - -Sample Command: -**Update validator max stake** - -``` -./zbox validator-update --validator_id f82ab34a98406b8757f11513361752bab9cb679a5cb130b81a4e86cec50eefc3 --max_stake 7.5 -``` Get Version -Use `./zbox version` to get the version of Zbox and GoSDK. +The version of Zbox and Gosdk can be fetched using the ./zbox version command. ``` ./zbox version @@ -851,28 +821,6 @@ Response: 15691733 / 15691733 [=====================================================================================] 100.00% 32s Status completed callback. Type = video/fmp4. Name = raw.samplevideo.mp4 ``` -#### Create Directory - -`./zbox createdir` command is used to create directory on allocation for storing files. - -| Parameter | Description | Valid Values | -| ------------ | ------------------------------------------ | ------------ | -| --allocation | Provide Allocation ID | string | -| --dirname | Provide Directory Name and absolute path . | string | -| --h,--help | help for createdir | int | - -Sample Command: - -``` -./zbox createdir --allocation $ALLOCATION_ID --dirname /photos -``` -Sample Response: - -``` -/photos directory created -``` - -**Note:** To verify whether directory is created successfully run [List all files](#list-all-files) command. #### Stream @@ -1615,26 +1563,7 @@ Response: ``` Repair file completed, Total files repaired: 0 ``` -#### Rollback - -Use `./zbox rollback` to rollback to a previous state of allocation. This is helpful when you want to rollback to previous version of files you updated on allocation using [Update allocation.](#update-allocation) - -| Parameter | Description | Valid Values | -| ------------ | ----------------------------------- | ------------ | -| --allocation | Provide Allocation ID for rollback. | string | -| --h,--help | help for rollback | int | - -Sample Command: - -``` -./zbox rollback --allocation $ALLOCATION_ID -``` -Sample Response: - -``` -Rollback successful -``` #### Sign data `sign-data` uses the information from your wallet to sign the input data string diff --git a/documents/uml.md b/documents/uml.md index ac019800..678922e1 100644 --- a/documents/uml.md +++ b/documents/uml.md @@ -1,46 +1,3 @@ -```puml -title Architecture -@startuml -card "<&terminal> zboxcli" as cli - -folder filesystem { - file "\~/.zcn/config.yaml" as config - file "\~/.zcn/wallet.json" as wallet -} - -cloud " Züs network" { - - node blobbers [ - Blobber1 - === - Blobber2 - === - ... - ] - node "miners" as miners - node "0dns" as 0dns - node "sharders" as sharders -} - -cli ---> config: Fetch -cli ---> wallet: Read -cli ---> 0dns: discover nodes -cli ---> miners: Send Transactions -cli ---> sharders: Verify Transactions, Get data -cli ---> blobbers: Upload, Download, and Share files - -note bottom of config: required zbox config -note bottom of wallet: contains secret key -note bottom of miners: processes transactions -note bottom of sharders: holds blockchain data -note bottom of 0dns: serves the latest miner and sharder node details -note bottom of blobbers: Stores data of any size and provide a single source of truth for that data - - -@enduml - -``` - ```puml title Add collaborator boundary zbox diff --git a/documents/zboxcli architecture diagram.png b/documents/zboxcli architecture diagram.png deleted file mode 100644 index 80ab96cb83be2e6e772e9f1676f9e9ccb6b063ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65906 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 Date: Fri, 8 Sep 2023 15:23:19 +0100 Subject: [PATCH 10/14] Merge pull request #498 from 0chain/hm90121-patch-1 Update README.md --- README.md | 110 ++++++++++++++++----- documents/uml.md | 43 ++++++++ documents/zboxcli architecture diagram.png | Bin 0 -> 65906 bytes 3 files changed, 131 insertions(+), 22 deletions(-) create mode 100644 documents/zboxcli architecture diagram.png diff --git a/README.md b/README.md index 67ebecea..036178b0 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ # zbox - a CLI for Züs dStorage -zbox is a command line interface (CLI) tool to understand the capabilities of Züs dStorage and prototype your app. The utility is built using Züs [GoSDK](https://github.com/0chain/gosdk) . -![Storage](https://user-images.githubusercontent.com/65766301/120052450-0ab66700-c043-11eb-91ab-1f7aa69e133a.png) +zbox is a command line interface (CLI) tool to understand the capabilities of Züs dStorage and prototype your app. The utility is built using Züs [GoSDK](https://github.com/0chain/gosdk) . + +![zboxcli architecture diagram](https://github.com/0chain/zboxcli/assets/65766301/5aeadfaf-e259-4524-bf31-1d1a2f39c563) - [zbox - a CLI for Züs dStorage](#zbox---a-cli-for-züs-dstorage) - [Züs Overview](#züs-overview) @@ -26,17 +27,16 @@ zbox is a command line interface (CLI) tool to understand the capabilities of Z - [List all files](#list-all-files) - [List owner's allocations](#list-owners-allocations) - [Update blobber settings](#update-blobber-settings) - - [List All Validators](#list-all-validators) + - [Update Validator settings](#update-validator-settings) + - [Get Version](#get-version) + - [List all Validators](#list-all-validators) - [Get Validator Configuration](#get-validator-configuration) - [Kill Blobber](#kill-blobber) - [Kill Validator](#kill-validator) - [Uploading and Managing files](#uploading-and-managing-files) - [Upload](#upload) - - [Upload file with no encryption](#upload-file-with-no-encryption) - - [Upload file with encryption](#upload-file-with-encryption) - - [Upload file with web-streaming](#upload-file-with-web-streaming) - - [Multi Upload](#multi-upload) - - [Live Streaming](#live-streaming) + - [Create Directory](#create-directory) + - [Stream](#stream) - [Feed](#feed) - [Stream](#stream) - [Download](#download) @@ -59,9 +59,10 @@ zbox is a command line interface (CLI) tool to understand the capabilities of Z - [Rename](#rename) - [Stats](#stats) - [Repair](#repair) + - [Rollback](#rollback) - [Sign data](#sign-data) - [Streaming](#streaming) - - [How it works:](#how-it-works) + - [How it works](#how-it-works) - [Usage](#usage) - [Lock and Unlock Tokens](#lock-and-unlock-tokens) - [Challenge pool information](#challenge-pool-information) @@ -213,25 +214,29 @@ Flags: ### Global Flags -Global Flags are parameters in zbox that can be used with any command to override the default configuration.zbox supports the following global parameters. +Global Flags are parameters in zbox that can be used with any command to override the default configuration. zbox supports the following global parameters. -| Flags | Description | Usage | -| -------------------------- | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ | -| --config string | Specify a zbox configuration file (default is [$HOME/.zcn/config.yaml](#zcnconfigyaml)) | zbox [command] --config config1.yaml | -| --configDir string | Specify a zbox configuration directory (default is $HOME/.zcn) | zbox [command] --configDir /$HOME/.zcn2 | -| -h, --help | Gives more information about a particular command. | zbox [command] --help | +| Flags | Description | Usage | +| -------------------------- | ------------------------------------------------------------ | ------------------------------------------------ | +| --config string | Specify a zbox configuration file (default is [$HOME/.zcn/config.yaml](#zcnconfigyaml)) | zbox [command] --config config1.yaml | +| --configDir string | Specify a zbox configuration directory (default is $HOME/.zcn) | zbox [command] --configDir /$HOME/.zcn2 | +| --fee float | Transaction fee for the given transaction(if unset, it will be set to blockchain min fee) | zbox[command] --fee 0.5 | +| --h, --help | Gives more information about a particular command. | zbox [command] --help | | --network string | Specify a network file to overwrite the network details(default is [$HOME/.zcn/network.yaml](#zcnnetworkyaml)) | zbox [command] --network network1.yaml | -| --verbose | Provides additional details as to what the particular command is doing. | zbox [command] --silent | -| --wallet string | Specify a wallet file or 2nd wallet (default is $HOME/.zcn/wallet.json) | zbox [command] --wallet wallet2.json | -| --wallet_client_id string | Specify a wallet client id (By default client_id specified in $HOME/.zcn/wallet.json is used) | zbox [command] --wallet_client_id | -| --wallet_client_key string | Specify a wallet client_key (By default client_key specified in $HOME/.zcn/wallet.json is used) | zbox [command] --wallet_client_key < client_key> | +| --silent | (default false) Do not show interactive sdk logs (shown by default) | zbox [command] --verbose | +| --wallet string | Specify a wallet file or 2nd wallet (default is $HOME/.zcn/wallet.json) | zbox [command] --wallet wallet2.json | +| --wallet_client_id string | Specify a wallet client id (By default client_id specified in $HOME/.zcn/wallet.json is used) | zbox [command] --wallet_client_id | +| --wallet_client_key string | Specify a wallet client_key (By default client_key specified in $HOME/.zcn/wallet.json is used) | zbox [command] --wallet_client_key < client_key> | +| --withNonce int | nonce that will be used in transaction (default is 0) | zbox [command] --withNonce 1 | + + ## Commands Note in this document, we will only show the commands for particular functionalities, the response will vary depending on your usage and may not be provided in all places. To get a more descriptive view of all the zbox functionalities check zbox cli -documentation at docs.zus.network. +documentation at https://docs.zus.network/guides/zbox-cli. ### Creating and Managing Allocations @@ -423,7 +428,8 @@ Here are the operations: | --forbid_rename | specify if the users cannot rename objects in this allocation | | --forbid_upload | specify if users cannot upload to this allocation | -Here is a sample command for --forbid_upload .Other parameters can be done the same way. + +Here is a sample command for --forbid_upload. Other parameters can be done the same way. ``` ./zbox updateallocation --allocation $ALLOC --forbid_upload @@ -697,10 +703,28 @@ Update blobber read price ``` ./zbox bl-update --blobber_id 0ece681f6b00221c5567865b56040eaab23795a843ed629ce71fb340a5566ba3 --read_price 0.1 ``` +### Update Validator Settings + +Use `./zbox validator-update ` to update a validator's configuration settings. + +| Parameter | Required | Description | default | Valid values | +| -------------- | -------- | ------------------------------------------- | ------- | ------------ | +| validator_id | yes | id of validator of which to update settings | | string | +| num_delegates | no | update maximum number of delegates | | int | +| max_stake | no | update maximum stake | | float | +| min_stake | no | update minimum stake | | float | +| service_charge | no | update service charge | | float | + +Sample Command: + +**Update validator max stake** +``` +./zbox validator-update --validator_id f82ab34a98406b8757f11513361752bab9cb679a5cb130b81a4e86cec50eefc3 --max_stake 7.5 +``` Get Version -The version of Zbox and Gosdk can be fetched using the `./zbox version` command. +Use `./zbox version` to get the version of Zbox and GoSDK. ``` ./zbox version @@ -884,6 +908,29 @@ Response: 15691733 / 15691733 [=====================================================================================] 100.00% 32s Status completed callback. Type = video/fmp4. Name = raw.samplevideo.mp4 ``` +#### Create Directory + +`./zbox createdir` command is used to create directory on allocation for storing files. + +| Parameter | Description | Valid Values | +| ------------ | ------------------------------------------ | ------------ | +| --allocation | Provide Allocation ID | string | +| --dirname | Provide Directory Name and absolute path . | string | +| --h,--help | help for createdir | int | + +Sample Command: + +``` +./zbox createdir --allocation $ALLOCATION_ID --dirname /photos +``` +Sample Response: + +``` +/photos directory created +``` + +**Note:** To verify whether directory is created successfully run [List all files](#list-all-files) command. + ##### Multi Upload Use `./zbox upload ` to upload multiple files to allocation at once via json file. @@ -1730,7 +1777,26 @@ Response: ``` Repair file completed, Total files repaired: 0 ``` +#### Rollback + +Use `./zbox rollback` to rollback to a previous state of allocation. This is helpful when you want to rollback to previous version of files you updated on allocation using [Update allocation.](#update-allocation) +| Parameter | Description | Valid Values | +| ------------ | ----------------------------------- | ------------ | +| --allocation | Provide Allocation ID for rollback. | string | +| --h,--help | help for rollback | int | + +Sample Command: + +``` +./zbox rollback --allocation $ALLOCATION_ID +``` + +Sample Response: + +``` +Rollback successful +``` #### Sign data `sign-data` uses the information from your wallet to sign the input data string diff --git a/documents/uml.md b/documents/uml.md index 678922e1..ac019800 100644 --- a/documents/uml.md +++ b/documents/uml.md @@ -1,3 +1,46 @@ +```puml +title Architecture +@startuml +card "<&terminal> zboxcli" as cli + +folder filesystem { + file "\~/.zcn/config.yaml" as config + file "\~/.zcn/wallet.json" as wallet +} + +cloud " Züs network" { + + node blobbers [ + Blobber1 + === + Blobber2 + === + ... + ] + node "miners" as miners + node "0dns" as 0dns + node "sharders" as sharders +} + +cli ---> config: Fetch +cli ---> wallet: Read +cli ---> 0dns: discover nodes +cli ---> miners: Send Transactions +cli ---> sharders: Verify Transactions, Get data +cli ---> blobbers: Upload, Download, and Share files + +note bottom of config: required zbox config +note bottom of wallet: contains secret key +note bottom of miners: processes transactions +note bottom of sharders: holds blockchain data +note bottom of 0dns: serves the latest miner and sharder node details +note bottom of blobbers: Stores data of any size and provide a single source of truth for that data + + +@enduml + +``` + ```puml title Add collaborator boundary zbox diff --git a/documents/zboxcli architecture diagram.png b/documents/zboxcli architecture diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..80ab96cb83be2e6e772e9f1676f9e9ccb6b063ab GIT binary patch literal 65906 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 Date: Wed, 1 Nov 2023 03:36:47 +0530 Subject: [PATCH 11/14] Remove download from single blobber (#543) --- cmd/download.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/cmd/download.go b/cmd/download.go index 35dfb9c5..0a7be942 100644 --- a/cmd/download.go +++ b/cmd/download.go @@ -151,15 +151,8 @@ var downloadCmd = &cobra.Command{ os.Exit(1) } - var blobberID string - if fflags.Changed("blobber_id") { - blobberID = cmd.Flag("blobber_id").Value.String() - } - if thumbnail { errE = allocationObj.DownloadThumbnail(localPath, remotePath, verifyDownload, statusBar, true) - } else if blobberID != "" { - errE = allocationObj.DownloadFromBlobber(blobberID, localPath, remotePath, statusBar) } else { if startBlock != 0 || endBlock != 0 { errE = allocationObj.DownloadFileByBlock(localPath, remotePath, startBlock, endBlock, numBlocks, verifyDownload, statusBar, true) @@ -246,7 +239,6 @@ func init() { downloadCmd.PersistentFlags().String("allocation", "", "Allocation ID") downloadCmd.PersistentFlags().String("remotepath", "", "Remote path to download") downloadCmd.PersistentFlags().String("localpath", "", "Local path of file to download") - downloadCmd.PersistentFlags().String("blobber_id", "", "to download the data shard present in that blobber") downloadCmd.PersistentFlags().String("authticket", "", "Auth ticket fot the file to download if you dont own it") downloadCmd.PersistentFlags().String("lookuphash", "", "The remote lookuphash of the object retrieved from the list") downloadCmd.PersistentFlags().String("multidownloadjson", "", "A JSON file containing multi download options") From 76bf9e884def2bf9e99dd5e93046fbe01512e626 Mon Sep 17 00:00:00 2001 From: Jayash Satolia <73050737+Jayashsatolia403@users.noreply.github.com> Date: Wed, 1 Nov 2023 15:07:25 +0530 Subject: [PATCH 12/14] Fix download (#544) --- cmd/download.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/cmd/download.go b/cmd/download.go index 0a7be942..1a2ffe88 100644 --- a/cmd/download.go +++ b/cmd/download.go @@ -182,12 +182,7 @@ var downloadCmd = &cobra.Command{ os.Exit(1) } if !statusBar.success { - // status bar always returns failure when downloading from sigle blobber. Hence returning the zero exit status - if fflags.Changed("blobber_id") { - os.Exit(0) - } else { - os.Exit(1) - } + os.Exit(1) } }, From b492db2679c9322e78607408d7eab5a643658995 Mon Sep 17 00:00:00 2001 From: dabasov Date: Wed, 1 Nov 2023 12:10:09 +0200 Subject: [PATCH 13/14] updated gosdk --- go.mod | 3 ++- go.sum | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4895d9a4..205529f2 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.18 require ( github.com/0chain/errors v1.0.3 - github.com/0chain/gosdk v1.10.1-0.20231009155148-2f6b57548450 + github.com/0chain/gosdk v1.10.1-0.20231031062218-5a85b2b91102 github.com/icza/bitio v1.1.0 github.com/olekukonko/tablewriter v0.0.5 github.com/spf13/cobra v1.6.0 @@ -67,6 +67,7 @@ require ( golang.org/x/sys v0.7.0 // indirect golang.org/x/text v0.8.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index d4a9980d..ea16c421 100644 --- a/go.sum +++ b/go.sum @@ -40,8 +40,8 @@ github.com/0chain/common v0.0.6-0.20230127095721-8df4d1d72565 h1:z+DtCR8mBsjPnEs github.com/0chain/common v0.0.6-0.20230127095721-8df4d1d72565/go.mod h1:UyDC8Qyl5z9lGkCnf9RHJPMektnFX8XtCJZHXCCVj8E= github.com/0chain/errors v1.0.3 h1:QQZPFxTfnMcRdt32DXbzRQIfGWmBsKoEdszKQDb0rRM= github.com/0chain/errors v1.0.3/go.mod h1:xymD6nVgrbgttWwkpSCfLLEJbFO6iHGQwk/yeSuYkIc= -github.com/0chain/gosdk v1.10.1-0.20231009155148-2f6b57548450 h1:v997C2HUfq63KRtid8T0yUPssVnmxsAI8Oah2dVivJo= -github.com/0chain/gosdk v1.10.1-0.20231009155148-2f6b57548450/go.mod h1:6Co9xV9/jeS9Bdi0L3fISOnKbrm0qPTzRtBhIdB/yqY= +github.com/0chain/gosdk v1.10.1-0.20231031062218-5a85b2b91102 h1:xb3pgOMIfApo6LMSuTHuNjM11oLRegq0Sq3jJvY4z80= +github.com/0chain/gosdk v1.10.1-0.20231031062218-5a85b2b91102/go.mod h1:d3YLgnSKvEtZ6I9taIQotb6xcMvUKvd01JnkXS+O1jk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Luzifer/go-openssl/v3 v3.1.0 h1:QqKqo6kYXGGUsvtUoCpRZm8lHw+jDfhbzr36gVj+/gw= @@ -668,6 +668,8 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= From 4983d96b0588286a3848f9a808cff944e1238bea Mon Sep 17 00:00:00 2001 From: Jayash Satolia Date: Fri, 3 Nov 2023 01:53:26 +0530 Subject: [PATCH 14/14] Revert "Merge branch 'sprint-1.11' into update-readme-staging" This reverts commit 806149541fc73d843ed11b93750c34fe9e2fa920, reversing changes made to 4e92da1e9b162358db4e83e72102362f51bd3012. --- .github/workflows/build-zbox.yaml | 214 ++++++++++-------- ...{release-zboxcli.yml => build-zboxcli.yml} | 51 +---- .github/workflows/gosdk.yml | 6 +- Makefile | 6 +- cmd/download.go | 15 +- cmd/stakepool.go | 41 +--- cmd/update.go | 5 + cmd/upload.go | 4 + go.mod | 8 +- go.sum | 20 +- 10 files changed, 183 insertions(+), 187 deletions(-) rename .github/workflows/{release-zboxcli.yml => build-zboxcli.yml} (74%) diff --git a/.github/workflows/build-zbox.yaml b/.github/workflows/build-zbox.yaml index 9f9b9201..c8f0d663 100644 --- a/.github/workflows/build-zbox.yaml +++ b/.github/workflows/build-zbox.yaml @@ -3,11 +3,10 @@ on: push: branches: - master - - sprint* + - dev - staging tags: - 'v*.*.*' - pull_request: workflow_dispatch: jobs: @@ -26,12 +25,36 @@ jobs: - name: Setup go 1.20 uses: actions/setup-go@v2 with: - go-version: '1.20' + go-version: '1.20' # The Go version to download (if necessary) and use. - - name: Install + - name: Set GITHUB_ENV run: | - lsb_release -a - docker run -v $PWD:/app -w /app golang:1.20 sh -c "make install" + echo "BRANCH=$(echo ${GITHUB_REF#refs/heads/})" >> $GITHUB_ENV + + if [[ "${{github.base_ref}}" == "master" || "${{github.ref}}" == "refs/heads/master" ]]; then + echo "TAG=v0.0.0-master" >> $GITHUB_ENV + elif [[ "${{github.base_ref}}" == "dev" || "${{github.ref}}" == "refs/heads/dev" ]]; then + echo "TAG=v0.0.0-dev" >> $GITHUB_ENV + elif [[ "${{github.base_ref}}" == "staging" || "${{github.ref}}" == "refs/heads/staging" ]]; then + echo "TAG=v0.0.0-staging" >> $GITHUB_ENV + else + echo "TAG=$(echo ${GITHUB_REF#refs/tags/})" >> $GITHUB_ENV + fi + + - name: Install + run: make install + + - name: Zip release + run: tar -czvf zbox-linux.tar.gz ./zbox + + - name: Upload binaries to release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: zbox-linux.tar.gz + tag: ${{ env.TAG }} + overwrite: true + file_glob: true - name: 'Upload Artifact' uses: actions/upload-artifact@v2 @@ -40,87 +63,98 @@ jobs: path: zbox retention-days: 5 - # build-windows: - # name: Build-windows - # runs-on: windows-runner - # defaults: - # run: - # shell: msys2 {0} - # strategy: - # matrix: - # sys: [ MINGW64 ] - # steps: - # - uses: msys2/setup-msys2@v2 - # with: - # msystem: ${{matrix.sys}} - - # - name: Install libraries - # run: | - # echo 'Y'| pacman -S base-devel git gcc make - - # - name: Install Clang and Go for MINGW64 - # run: | - # echo 'y'| pacman -S mingw-w64-x86_64-clang mingw-w64-x86_64-go zip unzip - - # - name: Set environment variables - # run: | - # export GOROOT=/mingw64/lib/go - # export GOPATH=/mingw64 - # export PATH=$PATH:$GOROOT/bin - # export PATH=$PATH:/usr/bin/7z - - # # use clang as a default compiler for CGO - # go env -w "CC=/mingw64/bin/clang.exe" - - # - name: Checkout - # uses: actions/checkout@v2 - - # - name: Install - # run: make install - - # - name: Zip release - # run: | - # # download dll files - # wget https://github.com/0chain/zboxcli/files/11840033/windows.dll.s.zip - # unzip -o windows.dll.s.zip - # cp zbox zbox.exe - # zip zbox-windows.zip zbox.exe libgcc_s_seh-1.dll libstdc++-6.dll libwinpthread-1.dll - - # - name: 'Upload Artifact' - # uses: actions/upload-artifact@v2 - # with: - # name: zbox-windows.zip - # path: zbox-windows.zip - # retention-days: 5 - - # - name: cleanup workspace - # run: | - # rm -Recurse ${{github.workspace}}\* - # shell: powershell - - # build-macos: - # name: Build-macos - # runs-on: macos-runner - # steps: - - # - name: Setup go 1.20 - # uses: actions/setup-go@v2 - # with: - # go-version: '1.20' # The Go version to download (if necessary) and use. - - # - name: Checkout - # uses: actions/checkout@v2 - - # - name: Install - # run: make install - - # - name: 'Upload Artifact' - # uses: actions/upload-artifact@v2 - # with: - # name: zbox-macos - # path: zbox - # retention-days: 5 - - # - name: cleanup workspace - # run: | - # rm -rf ./* + build-windows: + name: Build-windows + runs-on: windows-runner + steps: + - name: Setup go 1.20 + uses: actions/setup-go@v2 + with: + go-version: '1.20' # The Go version to download (if necessary) and use. + + - name: Checkout + uses: actions/checkout@v2 + + - name: Set GITHUB_ENV + run: | + IF ( "${{github.base_ref}}" -eq "master" -OR "${{github.ref}}" -eq "refs/heads/master" ){ + echo "TAG=v0.0.0-master" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf-8 -Append + } ElseIf ( "${{github.base_ref}}" -eq "dev" -OR "${{github.ref}}" -eq "refs/heads/dev" ){ + echo "TAG=v0.0.0-dev" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf-8 -Append + } ElseIf ( "${{github.base_ref}}" -eq "staging" -OR "${{github.ref}}" -eq "refs/heads/staging" ){ + echo "TAG=v0.0.0-staging" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf-8 -Append + } ELSE { + echo "TAG=${{github.ref}}" | %{$_ -replace('refs/tags/', '')} | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf-8 -Append + } + + - name: Install + run: make install + + - name: Zip release + run: | + copy zbox zbox.exe + 7z a zbox-windows.zip zbox.exe + + - name: Upload binaries to release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: zbox-windows.zip + tag: ${{ env.TAG }} + overwrite: true + file_glob: true + + - name: 'Upload Artifact' + uses: actions/upload-artifact@v2 + with: + name: zbox-windows + path: zbox + retention-days: 5 + + build-macos: + name: Build-macos + runs-on: macos-runner + steps: + + - name: Setup go 1.20 + uses: actions/setup-go@v2 + with: + go-version: '1.20' # The Go version to download (if necessary) and use. + + - name: Checkout + uses: actions/checkout@v2 + + - name: Set GITHUB_ENV + run: | + echo "BRANCH=$(echo ${GITHUB_REF#refs/heads/})" >> $GITHUB_ENV + + if [[ "${{github.base_ref}}" == "master" || "${{github.ref}}" == "refs/heads/master" ]]; then + echo "TAG=v0.0.0-master" >> $GITHUB_ENV + elif [[ "${{github.base_ref}}" == "dev" || "${{github.ref}}" == "refs/heads/dev" ]]; then + echo "TAG=v0.0.0-dev" >> $GITHUB_ENV + elif [[ "${{github.base_ref}}" == "staging" || "${{github.ref}}" == "refs/heads/staging" ]]; then + echo "TAG=v0.0.0-dev" >> $GITHUB_ENV + else + echo "TAG=$(echo ${GITHUB_REF#refs/tags/})" >> $GITHUB_ENV + fi + + - name: Install + run: make install + - name: Zip release + run: tar -czvf zbox-macos.tar.gz ./zbox + + - name: Upload binaries to release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: zbox-macos.tar.gz + tag: ${{ env.TAG }} + overwrite: true + file_glob: true + + - name: 'Upload Artifact' + uses: actions/upload-artifact@v2 + with: + name: zbox-macos + path: zbox + retention-days: 5 diff --git a/.github/workflows/release-zboxcli.yml b/.github/workflows/build-zboxcli.yml similarity index 74% rename from .github/workflows/release-zboxcli.yml rename to .github/workflows/build-zboxcli.yml index 2018f50b..85ebcaee 100644 --- a/.github/workflows/release-zboxcli.yml +++ b/.github/workflows/build-zboxcli.yml @@ -1,4 +1,4 @@ -name: RELEASE-ZBOXCLI +name: BUILD-ZBOXCLI on: workflow_dispatch: @@ -96,34 +96,11 @@ jobs: build-windows: name: Build-windows runs-on: windows-runner - defaults: - run: - shell: msys2 {0} - strategy: - matrix: - sys: [ MINGW64 ] steps: - - uses: msys2/setup-msys2@v2 + - name: Setup go 1.20 + uses: actions/setup-go@v2 with: - msystem: ${{matrix.sys}} - - - name: Install libraries - run: | - echo 'Y'| pacman -S base-devel git gcc make - - - name: Install Clang and Go for MINGW64 - run: | - echo 'y'| pacman -S mingw-w64-x86_64-clang mingw-w64-x86_64-go zip unzip - - - name: Set environment variables - run: | - export GOROOT=/mingw64/lib/go - export GOPATH=/mingw64 - export PATH=$PATH:$GOROOT/bin - export PATH=$PATH:/usr/bin/7z - - # use clang as a default compiler for CGO - go env -w "CC=/mingw64/bin/clang.exe" + go-version: '1.20' # The Go version to download (if necessary) and use. - name: Checkout uses: actions/checkout@v2 @@ -133,24 +110,16 @@ jobs: - name: Zip release run: | - # download dll files - wget https://github.com/0chain/zboxcli/files/11840033/windows.dll.s.zip - unzip -o windows.dll.s.zip - cp zbox zbox.exe - zip zbox-windows.zip zbox.exe libgcc_s_seh-1.dll libstdc++-6.dll libwinpthread-1.dll + copy zbox zbox.exe + 7z a zbox-windows.zip zbox.exe - name: 'Upload Artifact' uses: actions/upload-artifact@v2 with: - name: zbox-windows.zip - path: zbox-windows.zip + name: zbox-windows + path: zbox retention-days: 5 - - name: cleanup workspace - run: | - rm -Recurse ${{github.workspace}}\* - shell: powershell - build-macos: name: Build-macos runs-on: macos-runner @@ -176,7 +145,3 @@ jobs: name: zbox-macos path: zbox retention-days: 5 - - - name: cleanup workspace - run: | - rm -rf ./* diff --git a/.github/workflows/gosdk.yml b/.github/workflows/gosdk.yml index f6d34867..8fafaec7 100644 --- a/.github/workflows/gosdk.yml +++ b/.github/workflows/gosdk.yml @@ -8,7 +8,7 @@ on: workflow_dispatch: inputs: gosdk: - description: 'The 0Chain GoSDK version or branch' + description: 'The version of 0Chain GoSDK' required: true jobs: @@ -18,7 +18,7 @@ jobs: - name: Setup go 1.20 uses: actions/setup-go@v2 with: - go-version: '1.20' + go-version: '1.20' - name: Checkout uses: actions/checkout@v1 @@ -44,4 +44,4 @@ jobs: see full changelog on https://github.com/0chain/gosdk/releases/tag/${{ github.event.inputs.gosdk }} draft: false reviewers: cnlangzi - labels: GoSDK + labels: GoSDK \ No newline at end of file diff --git a/Makefile b/Makefile index 0f137aa5..ca37a3d4 100644 --- a/Makefile +++ b/Makefile @@ -11,9 +11,13 @@ GOMODCORE := $(GOMODBASE)/zcncore VERSION_FILE := $(ROOT_DIR)/core/version/version.go MAJOR_VERSION := "1.0" +PLATFORMOS := $(shell uname | tr "[:upper:]" "[:lower:]") + include _util/printer.mk -default: help +.PHONY: install-all herumi-all gosdk-all show + +default: help show #GO BUILD SDK gomod-download: diff --git a/cmd/download.go b/cmd/download.go index 1a2ffe88..35dfb9c5 100644 --- a/cmd/download.go +++ b/cmd/download.go @@ -151,8 +151,15 @@ var downloadCmd = &cobra.Command{ os.Exit(1) } + var blobberID string + if fflags.Changed("blobber_id") { + blobberID = cmd.Flag("blobber_id").Value.String() + } + if thumbnail { errE = allocationObj.DownloadThumbnail(localPath, remotePath, verifyDownload, statusBar, true) + } else if blobberID != "" { + errE = allocationObj.DownloadFromBlobber(blobberID, localPath, remotePath, statusBar) } else { if startBlock != 0 || endBlock != 0 { errE = allocationObj.DownloadFileByBlock(localPath, remotePath, startBlock, endBlock, numBlocks, verifyDownload, statusBar, true) @@ -182,7 +189,12 @@ var downloadCmd = &cobra.Command{ os.Exit(1) } if !statusBar.success { - os.Exit(1) + // status bar always returns failure when downloading from sigle blobber. Hence returning the zero exit status + if fflags.Changed("blobber_id") { + os.Exit(0) + } else { + os.Exit(1) + } } }, @@ -234,6 +246,7 @@ func init() { downloadCmd.PersistentFlags().String("allocation", "", "Allocation ID") downloadCmd.PersistentFlags().String("remotepath", "", "Remote path to download") downloadCmd.PersistentFlags().String("localpath", "", "Local path of file to download") + downloadCmd.PersistentFlags().String("blobber_id", "", "to download the data shard present in that blobber") downloadCmd.PersistentFlags().String("authticket", "", "Auth ticket fot the file to download if you dont own it") downloadCmd.PersistentFlags().String("lookuphash", "", "The remote lookuphash of the object retrieved from the list") downloadCmd.PersistentFlags().String("multidownloadjson", "", "A JSON file containing multi download options") diff --git a/cmd/stakepool.go b/cmd/stakepool.go index e3fca963..07360c57 100644 --- a/cmd/stakepool.go +++ b/cmd/stakepool.go @@ -201,19 +201,7 @@ var spLock = &cobra.Command{ err error ) - if flags.Changed("miner_id") { - if providerID, err = flags.GetString("miner_id"); err != nil { - log.Fatalf("invalid 'miner_id' flag: %v", err) - } else { - providerType = sdk.ProviderMiner - } - } else if flags.Changed("sharder_id") { - if providerID, err = flags.GetString("sharder_id"); err != nil { - log.Fatalf("invalid 'sharder_id' flag: %v", err) - } else { - providerType = sdk.ProviderSharder - } - } else if flags.Changed("blobber_id") { + if flags.Changed("blobber_id") { if providerID, err = flags.GetString("blobber_id"); err != nil { log.Fatalf("invalid 'blobber_id' flag: %v", err) } else { @@ -225,14 +213,10 @@ var spLock = &cobra.Command{ } else { providerType = sdk.ProviderValidator } - } else if flags.Changed("authorizer_id") { - if providerID, err = flags.GetString("authorizer_id"); err != nil { - log.Fatalf("invalid 'authorizer_id' flag: %v", err) - } else { - providerType = sdk.ProviderAuthorizer - } - } else if providerType == 0 || providerID == "" { - log.Fatal("missing flag: one of 'miner_id', 'sharder_id', 'blobber_id', 'validator_id', 'authorizer_id' is required") + } + + if providerType == 0 || providerID == "" { + log.Fatal("missing flag: one of 'blobber_id' or 'validator_id' is required") } if !flags.Changed("tokens") { @@ -319,11 +303,10 @@ func init() { rootCmd.AddCommand(spLock) rootCmd.AddCommand(spUnlock) - spInfo.PersistentFlags().String("miner_id", "", "for given miner") - spInfo.PersistentFlags().String("sharder_id", "", "for given sharder") - spInfo.PersistentFlags().String("blobber_id", "", "for given blobber") - spInfo.PersistentFlags().String("validator_id", "", "for given validator") - spInfo.PersistentFlags().String("authorizer_id", "", "for given authorizer") + spInfo.PersistentFlags().String("blobber_id", "", + "for given blobber") + spInfo.PersistentFlags().String("validator_id", "", + "for given validator") spInfo.PersistentFlags().Bool("json", false, "(default false) pass this option to print response as json data") spUserInfo.PersistentFlags().Bool("json", false, "(default false) pass this option to print response as json data") @@ -332,21 +315,15 @@ func init() { spUserInfo.PersistentFlags().Int("offset", 0, "pass this option to skip the number of rows before beginning") spUserInfo.PersistentFlags().String("client_id", "", "pass for given client") - spLock.PersistentFlags().String("miner_id", "", "for given miner") - spLock.PersistentFlags().String("sharder_id", "", "for given sharder") spLock.PersistentFlags().String("blobber_id", "", "for given blobber") spLock.PersistentFlags().String("validator_id", "", "for given validator") - spLock.PersistentFlags().String("authorizer_id", "", "for given authorizer") spLock.PersistentFlags().Float64("tokens", 0.0, "tokens to lock, required") spLock.PersistentFlags().Float64("fee", 0.0, "transaction fee, default 0") spLock.MarkFlagRequired("tokens") - spUnlock.PersistentFlags().String("miner_id", "", "for given miner") - spUnlock.PersistentFlags().String("sharder_id", "", "for given sharder") spUnlock.PersistentFlags().String("blobber_id", "", "for given blobber") spUnlock.PersistentFlags().String("validator_id", "", "for given validator") - spUnlock.PersistentFlags().String("authorizer_id", "", "for given authorizer") spUnlock.PersistentFlags().Float64("fee", 0.0, "transaction fee, default 0") spUnlock.MarkFlagRequired("tokens") } diff --git a/cmd/update.go b/cmd/update.go index 229a9dc4..a6071799 100644 --- a/cmd/update.go +++ b/cmd/update.go @@ -53,6 +53,11 @@ var updateCmd = &cobra.Command{ PrintError("Update failed.", err) os.Exit(1) } + + wg.Wait() + if !statusBar.success { + os.Exit(1) + } }, } diff --git a/cmd/upload.go b/cmd/upload.go index 0e5b5643..420267e8 100644 --- a/cmd/upload.go +++ b/cmd/upload.go @@ -67,6 +67,10 @@ var uploadCmd = &cobra.Command{ PrintError("Upload failed.", err) os.Exit(1) } + wg.Wait() + if !statusBar.success { + os.Exit(1) + } }, } diff --git a/go.mod b/go.mod index 205529f2..ad1747c5 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.18 require ( github.com/0chain/errors v1.0.3 - github.com/0chain/gosdk v1.10.1-0.20231031062218-5a85b2b91102 + github.com/0chain/gosdk v1.8.18-0.20230901213317-53d640a9b7f9 github.com/icza/bitio v1.1.0 github.com/olekukonko/tablewriter v0.0.5 github.com/spf13/cobra v1.6.0 @@ -43,7 +43,6 @@ require ( github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/philhofer/fwd v1.1.2-0.20210722190033-5c56ac6d0bb9 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/remeh/sizedwaitgroup v1.0.0 // indirect github.com/rivo/uniseg v0.4.3 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/shopspring/decimal v1.3.1 // indirect @@ -64,10 +63,9 @@ require ( go.uber.org/zap v1.24.0 // indirect golang.org/x/crypto v0.6.0 // indirect golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.7.0 // indirect - golang.org/x/text v0.8.0 // indirect + golang.org/x/sys v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index ea16c421..ea784d36 100644 --- a/go.sum +++ b/go.sum @@ -40,8 +40,8 @@ github.com/0chain/common v0.0.6-0.20230127095721-8df4d1d72565 h1:z+DtCR8mBsjPnEs github.com/0chain/common v0.0.6-0.20230127095721-8df4d1d72565/go.mod h1:UyDC8Qyl5z9lGkCnf9RHJPMektnFX8XtCJZHXCCVj8E= github.com/0chain/errors v1.0.3 h1:QQZPFxTfnMcRdt32DXbzRQIfGWmBsKoEdszKQDb0rRM= github.com/0chain/errors v1.0.3/go.mod h1:xymD6nVgrbgttWwkpSCfLLEJbFO6iHGQwk/yeSuYkIc= -github.com/0chain/gosdk v1.10.1-0.20231031062218-5a85b2b91102 h1:xb3pgOMIfApo6LMSuTHuNjM11oLRegq0Sq3jJvY4z80= -github.com/0chain/gosdk v1.10.1-0.20231031062218-5a85b2b91102/go.mod h1:d3YLgnSKvEtZ6I9taIQotb6xcMvUKvd01JnkXS+O1jk= +github.com/0chain/gosdk v1.8.18-0.20230901213317-53d640a9b7f9 h1:GHTdYTmhNY9genBkNWLXdn3Z1yCtcbSNkcIFaKrqBRU= +github.com/0chain/gosdk v1.8.18-0.20230901213317-53d640a9b7f9/go.mod h1:3NKNYzmnMIYqZwwwOgZwMmTW1DT1ZUAmKyVPmYQOiT4= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Luzifer/go-openssl/v3 v3.1.0 h1:QqKqo6kYXGGUsvtUoCpRZm8lHw+jDfhbzr36gVj+/gw= @@ -150,8 +150,8 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -200,7 +200,7 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T github.com/herumi/bls-go-binary v1.31.0 h1:L1goQ2tMtGgpXCg5AwHAdJQpLs/pfnWWEc3Wog6OhmI= github.com/herumi/bls-go-binary v1.31.0/go.mod h1:O4Vp1AfR4raRGwFeQpr9X/PQtncEicMoOe6BQt1oX0Y= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= -github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c h1:DZfsyhDK1hnSS5lH8l+JggqzEleHteTYfutAiVlSUM8= +github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -270,8 +270,6 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= -github.com/remeh/sizedwaitgroup v1.0.0 h1:VNGGFwNo/R5+MJBf6yrsr110p0m4/OX4S3DCy7Kyl5E= -github.com/remeh/sizedwaitgroup v1.0.0/go.mod h1:3j2R4OIe/SeS6YDhICBy22RWjJC5eNCJ1V+9+NVNYlo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -502,8 +500,8 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -511,8 +509,8 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -668,8 +666,6 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= -gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=