feat: Curio - Easy Migration (#11617)
* feat: lp mig - first few steps * lp mig: default tasks * code comments * docs * lp-mig-progress * shared * comments and todos * fix: curio: rename lotus-provider to curio (#11645) * rename provider to curio * install gotext * fix lint errors, mod tidy * fix typo * fix API_INFO and add gotext to circleCI * add back gotext * add gotext after remerge * lp: channels doc * finish easy-migration TODOs * out generate * merging and more renames * avoid make-all * minor doc stuff * cu: make gen * make gen fix * make gen * tryfix * go mod tidy * minor ez migration fixes * ez setup - ui cleanups * better error message * guided setup colors * better path to saveconfigtolayer * loadconfigwithupgrades fix * readMiner oops * guided - homedir * err if miner is running * prompt error should exit * process already running, miner_id sectors in migration * dont prompt for language a second time * check miner stopped * unlock repo * render and sql oops * curio easyMig - some fixes * easyMigration runs successfully * lint * review fixes * fix backup path * fixes1 * fixes2 * fixes 3 --------- Co-authored-by: LexLuthr <88259624+LexLuthr@users.noreply.github.com> Co-authored-by: LexLuthr <lexluthr@protocol.ai>
This commit is contained in:
parent
b7faf23f89
commit
81ba6ab6f0
@ -1031,7 +1031,7 @@ workflows:
|
|||||||
requires:
|
requires:
|
||||||
- build
|
- build
|
||||||
suite: utest-unit-rest
|
suite: utest-unit-rest
|
||||||
target: "./blockstore/... ./build/... ./chain/... ./conformance/... ./gateway/... ./journal/... ./lib/... ./markets/... ./paychmgr/... ./provider/... ./tools/..."
|
target: "./blockstore/... ./build/... ./chain/... ./conformance/... ./curiosrc/... ./gateway/... ./journal/... ./lib/... ./markets/... ./paychmgr/... ./tools/..."
|
||||||
resource_class: 2xlarge
|
resource_class: 2xlarge
|
||||||
- test:
|
- test:
|
||||||
name: test-unit-storage
|
name: test-unit-storage
|
||||||
|
5
.gitignore
vendored
5
.gitignore
vendored
@ -6,7 +6,7 @@
|
|||||||
/lotus-chainwatch
|
/lotus-chainwatch
|
||||||
/lotus-shed
|
/lotus-shed
|
||||||
/lotus-sim
|
/lotus-sim
|
||||||
/lotus-provider
|
/curio
|
||||||
/lotus-townhall
|
/lotus-townhall
|
||||||
/lotus-fountain
|
/lotus-fountain
|
||||||
/lotus-stats
|
/lotus-stats
|
||||||
@ -36,6 +36,9 @@ build/paramfetch.sh
|
|||||||
/darwin
|
/darwin
|
||||||
/linux
|
/linux
|
||||||
*.snap
|
*.snap
|
||||||
|
curio
|
||||||
|
devgen.car
|
||||||
|
localnet.json
|
||||||
|
|
||||||
*-fuzz.zip
|
*-fuzz.zip
|
||||||
/chain/types/work_msg/
|
/chain/types/work_msg/
|
||||||
|
@ -109,7 +109,7 @@ COPY --from=lotus-builder /opt/filecoin/lotus-wallet /usr/local/bin/
|
|||||||
COPY --from=lotus-builder /opt/filecoin/lotus-gateway /usr/local/bin/
|
COPY --from=lotus-builder /opt/filecoin/lotus-gateway /usr/local/bin/
|
||||||
COPY --from=lotus-builder /opt/filecoin/lotus-miner /usr/local/bin/
|
COPY --from=lotus-builder /opt/filecoin/lotus-miner /usr/local/bin/
|
||||||
COPY --from=lotus-builder /opt/filecoin/lotus-worker /usr/local/bin/
|
COPY --from=lotus-builder /opt/filecoin/lotus-worker /usr/local/bin/
|
||||||
COPY --from=lotus-builder /opt/filecoin/lotus-provider /usr/local/bin/
|
COPY --from=lotus-builder /opt/filecoin/curio /usr/local/bin/
|
||||||
COPY --from=lotus-builder /opt/filecoin/lotus-stats /usr/local/bin/
|
COPY --from=lotus-builder /opt/filecoin/lotus-stats /usr/local/bin/
|
||||||
COPY --from=lotus-builder /opt/filecoin/lotus-fountain /usr/local/bin/
|
COPY --from=lotus-builder /opt/filecoin/lotus-fountain /usr/local/bin/
|
||||||
|
|
||||||
@ -118,13 +118,13 @@ RUN mkdir /var/lib/lotus
|
|||||||
RUN mkdir /var/lib/lotus-miner
|
RUN mkdir /var/lib/lotus-miner
|
||||||
RUN mkdir /var/lib/lotus-worker
|
RUN mkdir /var/lib/lotus-worker
|
||||||
RUN mkdir /var/lib/lotus-wallet
|
RUN mkdir /var/lib/lotus-wallet
|
||||||
RUN mkdir /var/lib/lotus-provider
|
RUN mkdir /var/lib/curio
|
||||||
RUN chown fc: /var/tmp/filecoin-proof-parameters
|
RUN chown fc: /var/tmp/filecoin-proof-parameters
|
||||||
RUN chown fc: /var/lib/lotus
|
RUN chown fc: /var/lib/lotus
|
||||||
RUN chown fc: /var/lib/lotus-miner
|
RUN chown fc: /var/lib/lotus-miner
|
||||||
RUN chown fc: /var/lib/lotus-worker
|
RUN chown fc: /var/lib/lotus-worker
|
||||||
RUN chown fc: /var/lib/lotus-wallet
|
RUN chown fc: /var/lib/lotus-wallet
|
||||||
RUN chown fc: /var/lib/lotus-provider
|
RUN chown fc: /var/lib/curio
|
||||||
|
|
||||||
|
|
||||||
VOLUME /var/tmp/filecoin-proof-parameters
|
VOLUME /var/tmp/filecoin-proof-parameters
|
||||||
@ -132,7 +132,7 @@ VOLUME /var/lib/lotus
|
|||||||
VOLUME /var/lib/lotus-miner
|
VOLUME /var/lib/lotus-miner
|
||||||
VOLUME /var/lib/lotus-worker
|
VOLUME /var/lib/lotus-worker
|
||||||
VOLUME /var/lib/lotus-wallet
|
VOLUME /var/lib/lotus-wallet
|
||||||
VOLUME /var/lib/lotus-provider
|
VOLUME /var/lib/curio
|
||||||
|
|
||||||
EXPOSE 1234
|
EXPOSE 1234
|
||||||
EXPOSE 2345
|
EXPOSE 2345
|
||||||
|
54
Makefile
54
Makefile
@ -66,7 +66,7 @@ CLEAN+=build/.update-modules
|
|||||||
deps: $(BUILD_DEPS)
|
deps: $(BUILD_DEPS)
|
||||||
.PHONY: deps
|
.PHONY: deps
|
||||||
|
|
||||||
build-devnets: build lotus-seed lotus-shed lotus-provider
|
build-devnets: build lotus-seed lotus-shed curio
|
||||||
.PHONY: build-devnets
|
.PHONY: build-devnets
|
||||||
|
|
||||||
debug: GOFLAGS+=-tags=debug
|
debug: GOFLAGS+=-tags=debug
|
||||||
@ -97,14 +97,14 @@ lotus-miner: $(BUILD_DEPS)
|
|||||||
.PHONY: lotus-miner
|
.PHONY: lotus-miner
|
||||||
BINS+=lotus-miner
|
BINS+=lotus-miner
|
||||||
|
|
||||||
lotus-provider: $(BUILD_DEPS)
|
curio: $(BUILD_DEPS)
|
||||||
rm -f lotus-provider
|
rm -f curio
|
||||||
$(GOCC) build $(GOFLAGS) -o lotus-provider ./cmd/lotus-provider
|
$(GOCC) build $(GOFLAGS) -o curio ./cmd/curio
|
||||||
.PHONY: lotus-provider
|
.PHONY: curio
|
||||||
BINS+=lotus-provider
|
BINS+=curio
|
||||||
|
|
||||||
lp2k: GOFLAGS+=-tags=2k
|
cu2k: GOFLAGS+=-tags=2k
|
||||||
lp2k: lotus-provider
|
cu2k: curio
|
||||||
|
|
||||||
lotus-worker: $(BUILD_DEPS)
|
lotus-worker: $(BUILD_DEPS)
|
||||||
rm -f lotus-worker
|
rm -f lotus-worker
|
||||||
@ -124,13 +124,13 @@ lotus-gateway: $(BUILD_DEPS)
|
|||||||
.PHONY: lotus-gateway
|
.PHONY: lotus-gateway
|
||||||
BINS+=lotus-gateway
|
BINS+=lotus-gateway
|
||||||
|
|
||||||
build: lotus lotus-miner lotus-worker lotus-provider
|
build: lotus lotus-miner lotus-worker curio
|
||||||
@[[ $$(type -P "lotus") ]] && echo "Caution: you have \
|
@[[ $$(type -P "lotus") ]] && echo "Caution: you have \
|
||||||
an existing lotus binary in your PATH. This may cause problems if you don't run 'sudo make install'" || true
|
an existing lotus binary in your PATH. This may cause problems if you don't run 'sudo make install'" || true
|
||||||
|
|
||||||
.PHONY: build
|
.PHONY: build
|
||||||
|
|
||||||
install: install-daemon install-miner install-worker install-provider
|
install: install-daemon install-miner install-worker install-curio
|
||||||
|
|
||||||
install-daemon:
|
install-daemon:
|
||||||
install -C ./lotus /usr/local/bin/lotus
|
install -C ./lotus /usr/local/bin/lotus
|
||||||
@ -138,8 +138,8 @@ install-daemon:
|
|||||||
install-miner:
|
install-miner:
|
||||||
install -C ./lotus-miner /usr/local/bin/lotus-miner
|
install -C ./lotus-miner /usr/local/bin/lotus-miner
|
||||||
|
|
||||||
install-provider:
|
install-curio:
|
||||||
install -C ./lotus-provider /usr/local/bin/lotus-provider
|
install -C ./curio /usr/local/bin/curio
|
||||||
|
|
||||||
install-worker:
|
install-worker:
|
||||||
install -C ./lotus-worker /usr/local/bin/lotus-worker
|
install -C ./lotus-worker /usr/local/bin/lotus-worker
|
||||||
@ -156,8 +156,8 @@ uninstall-daemon:
|
|||||||
uninstall-miner:
|
uninstall-miner:
|
||||||
rm -f /usr/local/bin/lotus-miner
|
rm -f /usr/local/bin/lotus-miner
|
||||||
|
|
||||||
uninstall-provider:
|
uninstall-curio:
|
||||||
rm -f /usr/local/bin/lotus-provider
|
rm -f /usr/local/bin/curio
|
||||||
|
|
||||||
uninstall-worker:
|
uninstall-worker:
|
||||||
rm -f /usr/local/bin/lotus-worker
|
rm -f /usr/local/bin/lotus-worker
|
||||||
@ -260,13 +260,13 @@ install-miner-service: install-miner install-daemon-service
|
|||||||
@echo "To start the service, run: 'sudo systemctl start lotus-miner'"
|
@echo "To start the service, run: 'sudo systemctl start lotus-miner'"
|
||||||
@echo "To enable the service on startup, run: 'sudo systemctl enable lotus-miner'"
|
@echo "To enable the service on startup, run: 'sudo systemctl enable lotus-miner'"
|
||||||
|
|
||||||
install-provider-service: install-provider install-daemon-service
|
install-curio-service: install-curio install-daemon-service
|
||||||
mkdir -p /etc/systemd/system
|
mkdir -p /etc/systemd/system
|
||||||
mkdir -p /var/log/lotus
|
mkdir -p /var/log/lotus
|
||||||
install -C -m 0644 ./scripts/lotus-provider.service /etc/systemd/system/lotus-provider.service
|
install -C -m 0644 ./scripts/curio.service /etc/systemd/system/curio.service
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
@echo
|
@echo
|
||||||
@echo "lotus-provider service installed. Don't forget to run 'sudo systemctl start lotus-provider' to start it and 'sudo systemctl enable lotus-provider' for it to be enabled on startup."
|
@echo "Curio service installed. Don't forget to run 'sudo systemctl start curio' to start it and 'sudo systemctl enable curio' for it to be enabled on startup."
|
||||||
|
|
||||||
install-main-services: install-miner-service
|
install-main-services: install-miner-service
|
||||||
|
|
||||||
@ -286,10 +286,10 @@ clean-miner-service:
|
|||||||
rm -f /etc/systemd/system/lotus-miner.service
|
rm -f /etc/systemd/system/lotus-miner.service
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
|
|
||||||
clean-provider-service:
|
clean-curio-service:
|
||||||
-systemctl stop lotus-provider
|
-systemctl stop curio
|
||||||
-systemctl disable lotus-provider
|
-systemctl disable curio
|
||||||
rm -f /etc/systemd/system/lotus-provider.service
|
rm -f /etc/systemd/system/curio.service
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
|
|
||||||
clean-main-services: clean-daemon-service
|
clean-main-services: clean-daemon-service
|
||||||
@ -366,7 +366,7 @@ docsgen-md-bin: api-gen actors-gen
|
|||||||
docsgen-openrpc-bin: api-gen actors-gen
|
docsgen-openrpc-bin: api-gen actors-gen
|
||||||
$(GOCC) build $(GOFLAGS) -o docgen-openrpc ./api/docgen-openrpc/cmd
|
$(GOCC) build $(GOFLAGS) -o docgen-openrpc ./api/docgen-openrpc/cmd
|
||||||
|
|
||||||
docsgen-md: docsgen-md-full docsgen-md-storage docsgen-md-worker docsgen-md-provider
|
docsgen-md: docsgen-md-full docsgen-md-storage docsgen-md-worker docsgen-md-curio
|
||||||
|
|
||||||
docsgen-md-full: docsgen-md-bin
|
docsgen-md-full: docsgen-md-bin
|
||||||
./docgen-md "api/api_full.go" "FullNode" "api" "./api" > documentation/en/api-v1-unstable-methods.md
|
./docgen-md "api/api_full.go" "FullNode" "api" "./api" > documentation/en/api-v1-unstable-methods.md
|
||||||
@ -375,8 +375,8 @@ docsgen-md-storage: docsgen-md-bin
|
|||||||
./docgen-md "api/api_storage.go" "StorageMiner" "api" "./api" > documentation/en/api-v0-methods-miner.md
|
./docgen-md "api/api_storage.go" "StorageMiner" "api" "./api" > documentation/en/api-v0-methods-miner.md
|
||||||
docsgen-md-worker: docsgen-md-bin
|
docsgen-md-worker: docsgen-md-bin
|
||||||
./docgen-md "api/api_worker.go" "Worker" "api" "./api" > documentation/en/api-v0-methods-worker.md
|
./docgen-md "api/api_worker.go" "Worker" "api" "./api" > documentation/en/api-v0-methods-worker.md
|
||||||
docsgen-md-provider: docsgen-md-bin
|
docsgen-md-curio: docsgen-md-bin
|
||||||
./docgen-md "api/api_lp.go" "Provider" "api" "./api" > documentation/en/api-v0-methods-provider.md
|
./docgen-md "api/api_curio.go" "Curio" "api" "./api" > documentation/en/api-v0-methods-curio.md
|
||||||
|
|
||||||
docsgen-openrpc: docsgen-openrpc-full docsgen-openrpc-storage docsgen-openrpc-worker docsgen-openrpc-gateway
|
docsgen-openrpc: docsgen-openrpc-full docsgen-openrpc-storage docsgen-openrpc-worker docsgen-openrpc-gateway
|
||||||
|
|
||||||
@ -401,16 +401,16 @@ gen: actors-code-gen type-gen cfgdoc-gen docsgen api-gen circleci
|
|||||||
|
|
||||||
jen: gen
|
jen: gen
|
||||||
|
|
||||||
snap: lotus lotus-miner lotus-worker lotus-provider
|
snap: lotus lotus-miner lotus-worker curio
|
||||||
snapcraft
|
snapcraft
|
||||||
# snapcraft upload ./lotus_*.snap
|
# snapcraft upload ./lotus_*.snap
|
||||||
|
|
||||||
# separate from gen because it needs binaries
|
# separate from gen because it needs binaries
|
||||||
docsgen-cli: lotus lotus-miner lotus-worker lotus-provider
|
docsgen-cli: lotus lotus-miner lotus-worker curio
|
||||||
python3 ./scripts/generate-lotus-cli.py
|
python3 ./scripts/generate-lotus-cli.py
|
||||||
./lotus config default > documentation/en/default-lotus-config.toml
|
./lotus config default > documentation/en/default-lotus-config.toml
|
||||||
./lotus-miner config default > documentation/en/default-lotus-miner-config.toml
|
./lotus-miner config default > documentation/en/default-lotus-miner-config.toml
|
||||||
./lotus-provider config default > documentation/en/default-lotus-provider-config.toml
|
./curio config default > documentation/en/default-curio-config.toml
|
||||||
.PHONY: docsgen-cli
|
.PHONY: docsgen-cli
|
||||||
|
|
||||||
print-%:
|
print-%:
|
||||||
|
@ -12,7 +12,7 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
||||||
)
|
)
|
||||||
|
|
||||||
type LotusProvider interface {
|
type Curio interface {
|
||||||
Version(context.Context) (Version, error) //perm:admin
|
Version(context.Context) (Version, error) //perm:admin
|
||||||
|
|
||||||
AllocatePieceToSector(ctx context.Context, maddr address.Address, piece PieceDealInfo, rawSize int64, source url.URL, header http.Header) (SectorOffset, error) //perm:write
|
AllocatePieceToSector(ctx context.Context, maddr address.Address, piece PieceDealInfo, rawSize int64, source url.URL, header http.Header) (SectorOffset, error) //perm:write
|
@ -15,9 +15,9 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/lib/rpcenc"
|
"github.com/filecoin-project/lotus/lib/rpcenc"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewProviderRpc creates a new http jsonrpc client.
|
// NewCurioRpc creates a new http jsonrpc client.
|
||||||
func NewProviderRpc(ctx context.Context, addr string, requestHeader http.Header) (api.LotusProvider, jsonrpc.ClientCloser, error) {
|
func NewCurioRpc(ctx context.Context, addr string, requestHeader http.Header) (api.Curio, jsonrpc.ClientCloser, error) {
|
||||||
var res v1api.LotusProviderStruct
|
var res v1api.CurioStruct
|
||||||
|
|
||||||
closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin",
|
closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin",
|
||||||
api.GetInternalStructs(&res), requestHeader, jsonrpc.WithErrors(api.RPCErrors))
|
api.GetInternalStructs(&res), requestHeader, jsonrpc.WithErrors(api.RPCErrors))
|
||||||
|
@ -456,10 +456,10 @@ func GetAPIType(name, pkg string) (i interface{}, t reflect.Type, permStruct []r
|
|||||||
i = &api.GatewayStruct{}
|
i = &api.GatewayStruct{}
|
||||||
t = reflect.TypeOf(new(struct{ api.Gateway })).Elem()
|
t = reflect.TypeOf(new(struct{ api.Gateway })).Elem()
|
||||||
permStruct = append(permStruct, reflect.TypeOf(api.GatewayStruct{}.Internal))
|
permStruct = append(permStruct, reflect.TypeOf(api.GatewayStruct{}.Internal))
|
||||||
case "Provider":
|
case "Curio":
|
||||||
i = &api.LotusProviderStruct{}
|
i = &api.CurioStruct{}
|
||||||
t = reflect.TypeOf(new(struct{ api.LotusProvider })).Elem()
|
t = reflect.TypeOf(new(struct{ api.Curio })).Elem()
|
||||||
permStruct = append(permStruct, reflect.TypeOf(api.LotusProviderStruct{}.Internal))
|
permStruct = append(permStruct, reflect.TypeOf(api.CurioStruct{}.Internal))
|
||||||
default:
|
default:
|
||||||
panic("unknown type")
|
panic("unknown type")
|
||||||
}
|
}
|
||||||
|
280
api/proxy_gen.go
280
api/proxy_gen.go
@ -115,6 +115,35 @@ type CommonNetStub struct {
|
|||||||
NetStub
|
NetStub
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type CurioStruct struct {
|
||||||
|
Internal CurioMethods
|
||||||
|
}
|
||||||
|
|
||||||
|
type CurioMethods struct {
|
||||||
|
AllocatePieceToSector func(p0 context.Context, p1 address.Address, p2 PieceDealInfo, p3 int64, p4 url.URL, p5 http.Header) (SectorOffset, error) `perm:"write"`
|
||||||
|
|
||||||
|
Shutdown func(p0 context.Context) error `perm:"admin"`
|
||||||
|
|
||||||
|
StorageAddLocal func(p0 context.Context, p1 string) error `perm:"admin"`
|
||||||
|
|
||||||
|
StorageDetachLocal func(p0 context.Context, p1 string) error `perm:"admin"`
|
||||||
|
|
||||||
|
StorageFindSector func(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 abi.SectorSize, p4 bool) ([]storiface.SectorStorageInfo, error) `perm:"admin"`
|
||||||
|
|
||||||
|
StorageInfo func(p0 context.Context, p1 storiface.ID) (storiface.StorageInfo, error) `perm:"admin"`
|
||||||
|
|
||||||
|
StorageList func(p0 context.Context) (map[storiface.ID][]storiface.Decl, error) `perm:"admin"`
|
||||||
|
|
||||||
|
StorageLocal func(p0 context.Context) (map[storiface.ID]string, error) `perm:"admin"`
|
||||||
|
|
||||||
|
StorageStat func(p0 context.Context, p1 storiface.ID) (fsutil.FsStat, error) `perm:"admin"`
|
||||||
|
|
||||||
|
Version func(p0 context.Context) (Version, error) `perm:"admin"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CurioStub struct {
|
||||||
|
}
|
||||||
|
|
||||||
type EthSubscriberStruct struct {
|
type EthSubscriberStruct struct {
|
||||||
Internal EthSubscriberMethods
|
Internal EthSubscriberMethods
|
||||||
}
|
}
|
||||||
@ -849,35 +878,6 @@ type GatewayMethods struct {
|
|||||||
type GatewayStub struct {
|
type GatewayStub struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type LotusProviderStruct struct {
|
|
||||||
Internal LotusProviderMethods
|
|
||||||
}
|
|
||||||
|
|
||||||
type LotusProviderMethods struct {
|
|
||||||
AllocatePieceToSector func(p0 context.Context, p1 address.Address, p2 PieceDealInfo, p3 int64, p4 url.URL, p5 http.Header) (SectorOffset, error) `perm:"write"`
|
|
||||||
|
|
||||||
Shutdown func(p0 context.Context) error `perm:"admin"`
|
|
||||||
|
|
||||||
StorageAddLocal func(p0 context.Context, p1 string) error `perm:"admin"`
|
|
||||||
|
|
||||||
StorageDetachLocal func(p0 context.Context, p1 string) error `perm:"admin"`
|
|
||||||
|
|
||||||
StorageFindSector func(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 abi.SectorSize, p4 bool) ([]storiface.SectorStorageInfo, error) `perm:"admin"`
|
|
||||||
|
|
||||||
StorageInfo func(p0 context.Context, p1 storiface.ID) (storiface.StorageInfo, error) `perm:"admin"`
|
|
||||||
|
|
||||||
StorageList func(p0 context.Context) (map[storiface.ID][]storiface.Decl, error) `perm:"admin"`
|
|
||||||
|
|
||||||
StorageLocal func(p0 context.Context) (map[storiface.ID]string, error) `perm:"admin"`
|
|
||||||
|
|
||||||
StorageStat func(p0 context.Context, p1 storiface.ID) (fsutil.FsStat, error) `perm:"admin"`
|
|
||||||
|
|
||||||
Version func(p0 context.Context) (Version, error) `perm:"admin"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type LotusProviderStub struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
type NetStruct struct {
|
type NetStruct struct {
|
||||||
Internal NetMethods
|
Internal NetMethods
|
||||||
}
|
}
|
||||||
@ -1488,6 +1488,116 @@ func (s *CommonStub) Version(p0 context.Context) (APIVersion, error) {
|
|||||||
return *new(APIVersion), ErrNotSupported
|
return *new(APIVersion), ErrNotSupported
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *CurioStruct) AllocatePieceToSector(p0 context.Context, p1 address.Address, p2 PieceDealInfo, p3 int64, p4 url.URL, p5 http.Header) (SectorOffset, error) {
|
||||||
|
if s.Internal.AllocatePieceToSector == nil {
|
||||||
|
return *new(SectorOffset), ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.AllocatePieceToSector(p0, p1, p2, p3, p4, p5)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CurioStub) AllocatePieceToSector(p0 context.Context, p1 address.Address, p2 PieceDealInfo, p3 int64, p4 url.URL, p5 http.Header) (SectorOffset, error) {
|
||||||
|
return *new(SectorOffset), ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CurioStruct) Shutdown(p0 context.Context) error {
|
||||||
|
if s.Internal.Shutdown == nil {
|
||||||
|
return ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.Shutdown(p0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CurioStub) Shutdown(p0 context.Context) error {
|
||||||
|
return ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CurioStruct) StorageAddLocal(p0 context.Context, p1 string) error {
|
||||||
|
if s.Internal.StorageAddLocal == nil {
|
||||||
|
return ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.StorageAddLocal(p0, p1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CurioStub) StorageAddLocal(p0 context.Context, p1 string) error {
|
||||||
|
return ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CurioStruct) StorageDetachLocal(p0 context.Context, p1 string) error {
|
||||||
|
if s.Internal.StorageDetachLocal == nil {
|
||||||
|
return ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.StorageDetachLocal(p0, p1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CurioStub) StorageDetachLocal(p0 context.Context, p1 string) error {
|
||||||
|
return ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CurioStruct) StorageFindSector(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 abi.SectorSize, p4 bool) ([]storiface.SectorStorageInfo, error) {
|
||||||
|
if s.Internal.StorageFindSector == nil {
|
||||||
|
return *new([]storiface.SectorStorageInfo), ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.StorageFindSector(p0, p1, p2, p3, p4)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CurioStub) StorageFindSector(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 abi.SectorSize, p4 bool) ([]storiface.SectorStorageInfo, error) {
|
||||||
|
return *new([]storiface.SectorStorageInfo), ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CurioStruct) StorageInfo(p0 context.Context, p1 storiface.ID) (storiface.StorageInfo, error) {
|
||||||
|
if s.Internal.StorageInfo == nil {
|
||||||
|
return *new(storiface.StorageInfo), ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.StorageInfo(p0, p1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CurioStub) StorageInfo(p0 context.Context, p1 storiface.ID) (storiface.StorageInfo, error) {
|
||||||
|
return *new(storiface.StorageInfo), ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CurioStruct) StorageList(p0 context.Context) (map[storiface.ID][]storiface.Decl, error) {
|
||||||
|
if s.Internal.StorageList == nil {
|
||||||
|
return *new(map[storiface.ID][]storiface.Decl), ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.StorageList(p0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CurioStub) StorageList(p0 context.Context) (map[storiface.ID][]storiface.Decl, error) {
|
||||||
|
return *new(map[storiface.ID][]storiface.Decl), ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CurioStruct) StorageLocal(p0 context.Context) (map[storiface.ID]string, error) {
|
||||||
|
if s.Internal.StorageLocal == nil {
|
||||||
|
return *new(map[storiface.ID]string), ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.StorageLocal(p0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CurioStub) StorageLocal(p0 context.Context) (map[storiface.ID]string, error) {
|
||||||
|
return *new(map[storiface.ID]string), ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CurioStruct) StorageStat(p0 context.Context, p1 storiface.ID) (fsutil.FsStat, error) {
|
||||||
|
if s.Internal.StorageStat == nil {
|
||||||
|
return *new(fsutil.FsStat), ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.StorageStat(p0, p1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CurioStub) StorageStat(p0 context.Context, p1 storiface.ID) (fsutil.FsStat, error) {
|
||||||
|
return *new(fsutil.FsStat), ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CurioStruct) Version(p0 context.Context) (Version, error) {
|
||||||
|
if s.Internal.Version == nil {
|
||||||
|
return *new(Version), ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.Version(p0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *CurioStub) Version(p0 context.Context) (Version, error) {
|
||||||
|
return *new(Version), ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
func (s *EthSubscriberStruct) EthSubscription(p0 context.Context, p1 jsonrpc.RawParams) error {
|
func (s *EthSubscriberStruct) EthSubscription(p0 context.Context, p1 jsonrpc.RawParams) error {
|
||||||
if s.Internal.EthSubscription == nil {
|
if s.Internal.EthSubscription == nil {
|
||||||
return ErrNotSupported
|
return ErrNotSupported
|
||||||
@ -5338,116 +5448,6 @@ func (s *GatewayStub) Web3ClientVersion(p0 context.Context) (string, error) {
|
|||||||
return "", ErrNotSupported
|
return "", ErrNotSupported
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *LotusProviderStruct) AllocatePieceToSector(p0 context.Context, p1 address.Address, p2 PieceDealInfo, p3 int64, p4 url.URL, p5 http.Header) (SectorOffset, error) {
|
|
||||||
if s.Internal.AllocatePieceToSector == nil {
|
|
||||||
return *new(SectorOffset), ErrNotSupported
|
|
||||||
}
|
|
||||||
return s.Internal.AllocatePieceToSector(p0, p1, p2, p3, p4, p5)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *LotusProviderStub) AllocatePieceToSector(p0 context.Context, p1 address.Address, p2 PieceDealInfo, p3 int64, p4 url.URL, p5 http.Header) (SectorOffset, error) {
|
|
||||||
return *new(SectorOffset), ErrNotSupported
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *LotusProviderStruct) Shutdown(p0 context.Context) error {
|
|
||||||
if s.Internal.Shutdown == nil {
|
|
||||||
return ErrNotSupported
|
|
||||||
}
|
|
||||||
return s.Internal.Shutdown(p0)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *LotusProviderStub) Shutdown(p0 context.Context) error {
|
|
||||||
return ErrNotSupported
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *LotusProviderStruct) StorageAddLocal(p0 context.Context, p1 string) error {
|
|
||||||
if s.Internal.StorageAddLocal == nil {
|
|
||||||
return ErrNotSupported
|
|
||||||
}
|
|
||||||
return s.Internal.StorageAddLocal(p0, p1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *LotusProviderStub) StorageAddLocal(p0 context.Context, p1 string) error {
|
|
||||||
return ErrNotSupported
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *LotusProviderStruct) StorageDetachLocal(p0 context.Context, p1 string) error {
|
|
||||||
if s.Internal.StorageDetachLocal == nil {
|
|
||||||
return ErrNotSupported
|
|
||||||
}
|
|
||||||
return s.Internal.StorageDetachLocal(p0, p1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *LotusProviderStub) StorageDetachLocal(p0 context.Context, p1 string) error {
|
|
||||||
return ErrNotSupported
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *LotusProviderStruct) StorageFindSector(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 abi.SectorSize, p4 bool) ([]storiface.SectorStorageInfo, error) {
|
|
||||||
if s.Internal.StorageFindSector == nil {
|
|
||||||
return *new([]storiface.SectorStorageInfo), ErrNotSupported
|
|
||||||
}
|
|
||||||
return s.Internal.StorageFindSector(p0, p1, p2, p3, p4)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *LotusProviderStub) StorageFindSector(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 abi.SectorSize, p4 bool) ([]storiface.SectorStorageInfo, error) {
|
|
||||||
return *new([]storiface.SectorStorageInfo), ErrNotSupported
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *LotusProviderStruct) StorageInfo(p0 context.Context, p1 storiface.ID) (storiface.StorageInfo, error) {
|
|
||||||
if s.Internal.StorageInfo == nil {
|
|
||||||
return *new(storiface.StorageInfo), ErrNotSupported
|
|
||||||
}
|
|
||||||
return s.Internal.StorageInfo(p0, p1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *LotusProviderStub) StorageInfo(p0 context.Context, p1 storiface.ID) (storiface.StorageInfo, error) {
|
|
||||||
return *new(storiface.StorageInfo), ErrNotSupported
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *LotusProviderStruct) StorageList(p0 context.Context) (map[storiface.ID][]storiface.Decl, error) {
|
|
||||||
if s.Internal.StorageList == nil {
|
|
||||||
return *new(map[storiface.ID][]storiface.Decl), ErrNotSupported
|
|
||||||
}
|
|
||||||
return s.Internal.StorageList(p0)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *LotusProviderStub) StorageList(p0 context.Context) (map[storiface.ID][]storiface.Decl, error) {
|
|
||||||
return *new(map[storiface.ID][]storiface.Decl), ErrNotSupported
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *LotusProviderStruct) StorageLocal(p0 context.Context) (map[storiface.ID]string, error) {
|
|
||||||
if s.Internal.StorageLocal == nil {
|
|
||||||
return *new(map[storiface.ID]string), ErrNotSupported
|
|
||||||
}
|
|
||||||
return s.Internal.StorageLocal(p0)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *LotusProviderStub) StorageLocal(p0 context.Context) (map[storiface.ID]string, error) {
|
|
||||||
return *new(map[storiface.ID]string), ErrNotSupported
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *LotusProviderStruct) StorageStat(p0 context.Context, p1 storiface.ID) (fsutil.FsStat, error) {
|
|
||||||
if s.Internal.StorageStat == nil {
|
|
||||||
return *new(fsutil.FsStat), ErrNotSupported
|
|
||||||
}
|
|
||||||
return s.Internal.StorageStat(p0, p1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *LotusProviderStub) StorageStat(p0 context.Context, p1 storiface.ID) (fsutil.FsStat, error) {
|
|
||||||
return *new(fsutil.FsStat), ErrNotSupported
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *LotusProviderStruct) Version(p0 context.Context) (Version, error) {
|
|
||||||
if s.Internal.Version == nil {
|
|
||||||
return *new(Version), ErrNotSupported
|
|
||||||
}
|
|
||||||
return s.Internal.Version(p0)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *LotusProviderStub) Version(p0 context.Context) (Version, error) {
|
|
||||||
return *new(Version), ErrNotSupported
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *NetStruct) ID(p0 context.Context) (peer.ID, error) {
|
func (s *NetStruct) ID(p0 context.Context) (peer.ID, error) {
|
||||||
if s.Internal.ID == nil {
|
if s.Internal.ID == nil {
|
||||||
return *new(peer.ID), ErrNotSupported
|
return *new(peer.ID), ErrNotSupported
|
||||||
@ -7673,10 +7673,10 @@ func (s *WorkerStub) WaitQuiet(p0 context.Context) error {
|
|||||||
var _ ChainIO = new(ChainIOStruct)
|
var _ ChainIO = new(ChainIOStruct)
|
||||||
var _ Common = new(CommonStruct)
|
var _ Common = new(CommonStruct)
|
||||||
var _ CommonNet = new(CommonNetStruct)
|
var _ CommonNet = new(CommonNetStruct)
|
||||||
|
var _ Curio = new(CurioStruct)
|
||||||
var _ EthSubscriber = new(EthSubscriberStruct)
|
var _ EthSubscriber = new(EthSubscriberStruct)
|
||||||
var _ FullNode = new(FullNodeStruct)
|
var _ FullNode = new(FullNodeStruct)
|
||||||
var _ Gateway = new(GatewayStruct)
|
var _ Gateway = new(GatewayStruct)
|
||||||
var _ LotusProvider = new(LotusProviderStruct)
|
|
||||||
var _ Net = new(NetStruct)
|
var _ Net = new(NetStruct)
|
||||||
var _ Signable = new(SignableStruct)
|
var _ Signable = new(SignableStruct)
|
||||||
var _ StorageMiner = new(StorageMinerStruct)
|
var _ StorageMiner = new(StorageMinerStruct)
|
||||||
|
@ -13,4 +13,4 @@ func PermissionedFullAPI(a FullNode) FullNode {
|
|||||||
return api.PermissionedFullAPI(a)
|
return api.PermissionedFullAPI(a)
|
||||||
}
|
}
|
||||||
|
|
||||||
type LotusProviderStruct = api.LotusProviderStruct
|
type CurioStruct = api.CurioStruct
|
||||||
|
@ -60,7 +60,7 @@ var (
|
|||||||
MinerAPIVersion0 = newVer(1, 5, 0)
|
MinerAPIVersion0 = newVer(1, 5, 0)
|
||||||
WorkerAPIVersion0 = newVer(1, 7, 0)
|
WorkerAPIVersion0 = newVer(1, 7, 0)
|
||||||
|
|
||||||
ProviderAPIVersion0 = newVer(1, 0, 0)
|
CurioAPIVersion0 = newVer(1, 0, 0)
|
||||||
)
|
)
|
||||||
|
|
||||||
//nolint:varcheck,deadcode
|
//nolint:varcheck,deadcode
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -242,7 +242,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4263"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4373"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -473,7 +473,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4274"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4384"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -572,7 +572,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4285"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4395"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -604,7 +604,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4296"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4406"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -710,7 +710,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4307"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4417"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -803,7 +803,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4318"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4428"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -887,7 +887,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4329"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4439"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -987,7 +987,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4340"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4450"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -1043,7 +1043,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4351"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4461"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -1116,7 +1116,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4362"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4472"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -1189,7 +1189,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4373"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4483"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -1236,7 +1236,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4384"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4494"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -1268,7 +1268,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4395"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4505"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -1305,7 +1305,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4417"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4527"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -1352,7 +1352,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4428"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4538"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -1392,7 +1392,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4439"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4549"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -1439,7 +1439,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4450"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4560"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -1468,7 +1468,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4461"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4571"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -1605,7 +1605,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4472"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4582"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -1634,7 +1634,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4483"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4593"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -1688,7 +1688,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4494"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4604"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -1779,7 +1779,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4505"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4615"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -1807,7 +1807,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4516"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4626"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -1897,7 +1897,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4527"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4637"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -2153,7 +2153,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4538"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4648"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -2398,7 +2398,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4549"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4659"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -2454,7 +2454,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4560"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4670"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -2501,7 +2501,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4571"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4681"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -2599,7 +2599,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4582"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4692"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -2665,7 +2665,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4593"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4703"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -2731,7 +2731,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4604"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4714"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -2840,7 +2840,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4615"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4725"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -2898,7 +2898,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4626"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4736"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -3020,7 +3020,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4637"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4747"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -3207,7 +3207,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4648"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4758"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -3411,7 +3411,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4659"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4769"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -3502,7 +3502,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4670"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4780"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -3560,7 +3560,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4681"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4791"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -3818,7 +3818,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4692"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4802"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -4093,7 +4093,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4703"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4813"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -4121,7 +4121,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4714"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4824"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -4159,7 +4159,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4725"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4835"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -4267,7 +4267,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4736"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4846"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -4305,7 +4305,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4747"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4857"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -4334,7 +4334,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4758"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4868"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -4397,7 +4397,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4769"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4879"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -4460,7 +4460,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4780"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4890"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -4505,7 +4505,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4791"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4901"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -4627,7 +4627,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4802"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4912"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -4782,7 +4782,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4813"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4923"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -4836,7 +4836,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4824"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4934"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -4890,7 +4890,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4835"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4945"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -4992,7 +4992,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4846"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4956"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -5215,7 +5215,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4857"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4967"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -5398,7 +5398,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4868"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4978"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -5592,7 +5592,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4879"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4989"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -5638,7 +5638,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4890"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5000"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -5788,7 +5788,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4901"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5011"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -5925,7 +5925,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4912"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5022"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -5993,7 +5993,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4923"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5033"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -6110,7 +6110,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4934"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5044"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -6201,7 +6201,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4945"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5055"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -6287,7 +6287,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4956"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5066"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -6314,7 +6314,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4967"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5077"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -6341,7 +6341,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4978"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5088"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -6409,7 +6409,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4989"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5099"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -6915,7 +6915,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5000"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5110"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -7012,7 +7012,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5011"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5121"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -7112,7 +7112,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5022"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5132"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -7212,7 +7212,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5033"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5143"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -7337,7 +7337,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5044"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5154"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -7446,7 +7446,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5055"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5165"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -7549,7 +7549,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5066"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5176"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -7679,7 +7679,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5077"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5187"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -7786,7 +7786,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5088"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5198"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -7847,7 +7847,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5099"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5209"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -7915,7 +7915,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5110"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5220"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -7996,7 +7996,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5121"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5231"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -8155,7 +8155,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5132"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5242"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -8248,7 +8248,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5143"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5253"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -8449,7 +8449,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5154"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5264"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -8560,7 +8560,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5165"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5275"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -8691,7 +8691,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5176"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5286"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -8777,7 +8777,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5187"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5297"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -8804,7 +8804,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5198"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5308"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -8857,7 +8857,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5209"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5319"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -8945,7 +8945,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5220"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5330"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -9396,7 +9396,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5231"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5341"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -9563,7 +9563,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5242"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5352"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -9736,7 +9736,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5253"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5363"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -9804,7 +9804,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5264"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5374"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -9872,7 +9872,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5275"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5385"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -10033,7 +10033,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5286"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5396"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -10078,7 +10078,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5308"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5418"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -10123,7 +10123,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5319"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5429"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -10150,7 +10150,7 @@
|
|||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"externalDocs": {
|
"externalDocs": {
|
||||||
"description": "Github remote link",
|
"description": "Github remote link",
|
||||||
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5330"
|
"url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5440"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
116
cli/util/api.go
116
cli/util/api.go
@ -76,10 +76,22 @@ func GetAPIInfoMulti(ctx *cli.Context, t repo.RepoType) ([]APIInfo, error) {
|
|||||||
if path == "" {
|
if path == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
return GetAPIInfoFromRepoPath(path, t)
|
||||||
|
}
|
||||||
|
for _, env := range fallbacksEnvs {
|
||||||
|
env, ok := os.LookupEnv(env)
|
||||||
|
if ok {
|
||||||
|
return ParseApiInfoMulti(env), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return []APIInfo{}, fmt.Errorf("could not determine API endpoint for node type: %v. Try setting environment variable: %s", t.Type(), primaryEnv)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAPIInfoFromRepoPath(path string, t repo.RepoType) ([]APIInfo, error) {
|
||||||
p, err := homedir.Expand(path)
|
p, err := homedir.Expand(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return []APIInfo{}, xerrors.Errorf("could not expand home dir (%s): %w", f, err)
|
return []APIInfo{}, xerrors.Errorf("could not expand home dir (%s): %w", path, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
r, err := repo.NewFS(p)
|
r, err := repo.NewFS(p)
|
||||||
@ -110,16 +122,6 @@ func GetAPIInfoMulti(ctx *cli.Context, t repo.RepoType) ([]APIInfo, error) {
|
|||||||
Addr: ma.String(),
|
Addr: ma.String(),
|
||||||
Token: token,
|
Token: token,
|
||||||
}}, nil
|
}}, nil
|
||||||
}
|
|
||||||
|
|
||||||
for _, env := range fallbacksEnvs {
|
|
||||||
env, ok := os.LookupEnv(env)
|
|
||||||
if ok {
|
|
||||||
return ParseApiInfoMulti(env), nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return []APIInfo{}, fmt.Errorf("could not determine API endpoint for node type: %v. Try setting environment variable: %s", t.Type(), primaryEnv)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetAPIInfo(ctx *cli.Context, t repo.RepoType) (APIInfo, error) {
|
func GetAPIInfo(ctx *cli.Context, t repo.RepoType) (APIInfo, error) {
|
||||||
@ -164,28 +166,6 @@ func GetRawAPIMulti(ctx *cli.Context, t repo.RepoType, version string) ([]HttpHe
|
|||||||
return httpHeads, nil
|
return httpHeads, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetRawAPIMultiV2(ctx *cli.Context, ainfoCfg []string, version string) ([]HttpHead, error) {
|
|
||||||
var httpHeads []HttpHead
|
|
||||||
|
|
||||||
if len(ainfoCfg) == 0 {
|
|
||||||
return httpHeads, xerrors.Errorf("could not get API info: none configured. \nConsider getting base.toml with './lotus-provider config get base >/tmp/base.toml' \nthen adding \n[APIs] \n ChainApiInfo = [\" result_from lotus auth api-info --perm=admin \"]\n and updating it with './lotus-provider config set /tmp/base.toml'")
|
|
||||||
}
|
|
||||||
for _, i := range ainfoCfg {
|
|
||||||
ainfo := ParseApiInfo(i)
|
|
||||||
addr, err := ainfo.DialArgs(version)
|
|
||||||
if err != nil {
|
|
||||||
return httpHeads, xerrors.Errorf("could not get DialArgs: %w", err)
|
|
||||||
}
|
|
||||||
httpHeads = append(httpHeads, HttpHead{addr: addr, header: ainfo.AuthHeader()})
|
|
||||||
}
|
|
||||||
|
|
||||||
if IsVeryVerbose {
|
|
||||||
_, _ = fmt.Fprintf(ctx.App.Writer, "using raw API %s endpoint: %s\n", version, httpHeads[0].addr)
|
|
||||||
}
|
|
||||||
|
|
||||||
return httpHeads, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetRawAPI(ctx *cli.Context, t repo.RepoType, version string) (string, http.Header, error) {
|
func GetRawAPI(ctx *cli.Context, t repo.RepoType, version string) (string, http.Header, error) {
|
||||||
heads, err := GetRawAPIMulti(ctx, t, version)
|
heads, err := GetRawAPIMulti(ctx, t, version)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -342,14 +322,14 @@ func GetFullNodeAPIV1Single(ctx *cli.Context) (v1api.FullNode, jsonrpc.ClientClo
|
|||||||
}
|
}
|
||||||
|
|
||||||
type GetFullNodeOptions struct {
|
type GetFullNodeOptions struct {
|
||||||
ethSubHandler api.EthSubscriber
|
EthSubHandler api.EthSubscriber
|
||||||
}
|
}
|
||||||
|
|
||||||
type GetFullNodeOption func(*GetFullNodeOptions)
|
type GetFullNodeOption func(*GetFullNodeOptions)
|
||||||
|
|
||||||
func FullNodeWithEthSubscribtionHandler(sh api.EthSubscriber) GetFullNodeOption {
|
func FullNodeWithEthSubscribtionHandler(sh api.EthSubscriber) GetFullNodeOption {
|
||||||
return func(opts *GetFullNodeOptions) {
|
return func(opts *GetFullNodeOptions) {
|
||||||
opts.ethSubHandler = sh
|
opts.EthSubHandler = sh
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -364,8 +344,8 @@ func GetFullNodeAPIV1(ctx *cli.Context, opts ...GetFullNodeOption) (v1api.FullNo
|
|||||||
}
|
}
|
||||||
|
|
||||||
var rpcOpts []jsonrpc.Option
|
var rpcOpts []jsonrpc.Option
|
||||||
if options.ethSubHandler != nil {
|
if options.EthSubHandler != nil {
|
||||||
rpcOpts = append(rpcOpts, jsonrpc.WithClientHandler("Filecoin", options.ethSubHandler), jsonrpc.WithClientHandlerAlias("eth_subscription", "Filecoin.EthSubscription"))
|
rpcOpts = append(rpcOpts, jsonrpc.WithClientHandler("Filecoin", options.EthSubHandler), jsonrpc.WithClientHandlerAlias("eth_subscription", "Filecoin.EthSubscription"))
|
||||||
}
|
}
|
||||||
|
|
||||||
heads, err := GetRawAPIMulti(ctx, repo.FullNode, "v1")
|
heads, err := GetRawAPIMulti(ctx, repo.FullNode, "v1")
|
||||||
@ -415,68 +395,6 @@ func GetFullNodeAPIV1(ctx *cli.Context, opts ...GetFullNodeOption) (v1api.FullNo
|
|||||||
return &v1API, finalCloser, nil
|
return &v1API, finalCloser, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetFullNodeAPIV1LotusProvider(ctx *cli.Context, ainfoCfg []string, opts ...GetFullNodeOption) (v1api.FullNode, jsonrpc.ClientCloser, error) {
|
|
||||||
if tn, ok := ctx.App.Metadata["testnode-full"]; ok {
|
|
||||||
return tn.(v1api.FullNode), func() {}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var options GetFullNodeOptions
|
|
||||||
for _, opt := range opts {
|
|
||||||
opt(&options)
|
|
||||||
}
|
|
||||||
|
|
||||||
var rpcOpts []jsonrpc.Option
|
|
||||||
if options.ethSubHandler != nil {
|
|
||||||
rpcOpts = append(rpcOpts, jsonrpc.WithClientHandler("Filecoin", options.ethSubHandler), jsonrpc.WithClientHandlerAlias("eth_subscription", "Filecoin.EthSubscription"))
|
|
||||||
}
|
|
||||||
|
|
||||||
heads, err := GetRawAPIMultiV2(ctx, ainfoCfg, "v1")
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if IsVeryVerbose {
|
|
||||||
_, _ = fmt.Fprintln(ctx.App.Writer, "using full node API v1 endpoint:", heads[0].addr)
|
|
||||||
}
|
|
||||||
|
|
||||||
var fullNodes []api.FullNode
|
|
||||||
var closers []jsonrpc.ClientCloser
|
|
||||||
|
|
||||||
for _, head := range heads {
|
|
||||||
v1api, closer, err := client.NewFullNodeRPCV1(ctx.Context, head.addr, head.header, rpcOpts...)
|
|
||||||
if err != nil {
|
|
||||||
log.Warnf("Not able to establish connection to node with addr: %s, Reason: %s", head.addr, err.Error())
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
fullNodes = append(fullNodes, v1api)
|
|
||||||
closers = append(closers, closer)
|
|
||||||
}
|
|
||||||
|
|
||||||
// When running in cluster mode and trying to establish connections to multiple nodes, fail
|
|
||||||
// if less than 2 lotus nodes are actually running
|
|
||||||
if len(heads) > 1 && len(fullNodes) < 2 {
|
|
||||||
return nil, nil, xerrors.Errorf("Not able to establish connection to more than a single node")
|
|
||||||
}
|
|
||||||
|
|
||||||
finalCloser := func() {
|
|
||||||
for _, c := range closers {
|
|
||||||
c()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var v1API api.FullNodeStruct
|
|
||||||
FullNodeProxy(fullNodes, &v1API)
|
|
||||||
|
|
||||||
v, err := v1API.Version(ctx.Context)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
if !v.APIVersion.EqMajorMinor(api.FullAPIVersion1) {
|
|
||||||
return nil, nil, xerrors.Errorf("Remote API version didn't match (expected %s, remote %s)", api.FullAPIVersion1, v.APIVersion)
|
|
||||||
}
|
|
||||||
return &v1API, finalCloser, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type GetStorageMinerOptions struct {
|
type GetStorageMinerOptions struct {
|
||||||
PreferHttp bool
|
PreferHttp bool
|
||||||
}
|
}
|
||||||
|
@ -18,8 +18,8 @@ import (
|
|||||||
|
|
||||||
"github.com/filecoin-project/lotus/api"
|
"github.com/filecoin-project/lotus/api"
|
||||||
lcli "github.com/filecoin-project/lotus/cli"
|
lcli "github.com/filecoin-project/lotus/cli"
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/deps"
|
"github.com/filecoin-project/lotus/cmd/curio/deps"
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/rpc"
|
"github.com/filecoin-project/lotus/cmd/curio/rpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
const providerEnvVar = "PROVIDER_API_INFO"
|
const providerEnvVar = "PROVIDER_API_INFO"
|
||||||
@ -177,7 +177,7 @@ var cliCmd = &cli.Command{
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
api, closer, err := rpc.GetProviderAPI(cctx)
|
api, closer, err := rpc.GetCurioAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
@ -15,7 +15,7 @@ import (
|
|||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/deps"
|
"github.com/filecoin-project/lotus/cmd/curio/deps"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
||||||
"github.com/filecoin-project/lotus/node/config"
|
"github.com/filecoin-project/lotus/node/config"
|
||||||
)
|
)
|
||||||
@ -48,7 +48,7 @@ var configDefaultCmd = &cli.Command{
|
|||||||
},
|
},
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
comment := !cctx.Bool("no-comment")
|
comment := !cctx.Bool("no-comment")
|
||||||
cfg, err := getDefaultConfig(comment)
|
cfg, err := deps.GetDefaultConfig(comment)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -58,15 +58,6 @@ var configDefaultCmd = &cli.Command{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
func getDefaultConfig(comment bool) (string, error) {
|
|
||||||
c := config.DefaultLotusProvider()
|
|
||||||
cb, err := config.ConfigUpdate(c, nil, config.Commented(comment), config.DefaultKeepUncommented(), config.NoEnv())
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return string(cb), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var configSetCmd = &cli.Command{
|
var configSetCmd = &cli.Command{
|
||||||
Name: "set",
|
Name: "set",
|
||||||
Aliases: []string{"add", "update", "create"},
|
Aliases: []string{"add", "update", "create"},
|
||||||
@ -106,12 +97,12 @@ var configSetCmd = &cli.Command{
|
|||||||
return fmt.Errorf("cannot read stream/file %w", err)
|
return fmt.Errorf("cannot read stream/file %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
lp := config.DefaultLotusProvider() // ensure it's toml
|
curioConfig := config.DefaultCurioConfig() // ensure it's toml
|
||||||
_, err = deps.LoadConfigWithUpgrades(string(bytes), lp)
|
_, err = deps.LoadConfigWithUpgrades(string(bytes), curioConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot decode file: %w", err)
|
return fmt.Errorf("cannot decode file: %w", err)
|
||||||
}
|
}
|
||||||
_ = lp
|
_ = curioConfig
|
||||||
|
|
||||||
err = setConfig(db, name, string(bytes))
|
err = setConfig(db, name, string(bytes))
|
||||||
|
|
||||||
@ -216,7 +207,7 @@ var configRmCmd = &cli.Command{
|
|||||||
var configViewCmd = &cli.Command{
|
var configViewCmd = &cli.Command{
|
||||||
Name: "interpret",
|
Name: "interpret",
|
||||||
Aliases: []string{"view", "stacked", "stack"},
|
Aliases: []string{"view", "stacked", "stack"},
|
||||||
Usage: "Interpret stacked config layers by this version of lotus-provider, with system-generated comments.",
|
Usage: "Interpret stacked config layers by this version of curio, with system-generated comments.",
|
||||||
ArgsUsage: "a list of layers to be interpreted as the final config",
|
ArgsUsage: "a list of layers to be interpreted as the final config",
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
&cli.StringSliceFlag{
|
&cli.StringSliceFlag{
|
||||||
@ -230,11 +221,11 @@ var configViewCmd = &cli.Command{
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
lp, err := deps.GetConfig(cctx, db)
|
curioConfig, err := deps.GetConfig(cctx, db)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
cb, err := config.ConfigUpdate(lp, config.DefaultLotusProvider(), config.Commented(true), config.DefaultKeepUncommented(), config.NoEnv())
|
cb, err := config.ConfigUpdate(curioConfig, config.DefaultCurioConfig(), config.Commented(true), config.DefaultKeepUncommented(), config.NoEnv())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("cannot interpret config: %w", err)
|
return xerrors.Errorf("cannot interpret config: %w", err)
|
||||||
}
|
}
|
||||||
@ -299,12 +290,12 @@ var configEditCmd = &cli.Command{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if cctx.IsSet("source") && source != layer && !cctx.Bool("no-interpret-source") {
|
if cctx.IsSet("source") && source != layer && !cctx.Bool("no-interpret-source") {
|
||||||
lp := config.DefaultLotusProvider()
|
lp := config.DefaultCurioConfig()
|
||||||
if _, err := toml.Decode(sourceConfig, lp); err != nil {
|
if _, err := toml.Decode(sourceConfig, lp); err != nil {
|
||||||
return xerrors.Errorf("parsing source config: %w", err)
|
return xerrors.Errorf("parsing source config: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
cb, err := config.ConfigUpdate(lp, config.DefaultLotusProvider(), config.Commented(true), config.DefaultKeepUncommented(), config.NoEnv())
|
cb, err := config.ConfigUpdate(lp, config.DefaultCurioConfig(), config.Commented(true), config.DefaultKeepUncommented(), config.NoEnv())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("interpreting source config: %w", err)
|
return xerrors.Errorf("interpreting source config: %w", err)
|
||||||
}
|
}
|
||||||
@ -362,9 +353,18 @@ var configEditCmd = &cli.Command{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getDefaultConfig(comment bool) (string, error) {
|
||||||
|
c := config.DefaultCurioConfig()
|
||||||
|
cb, err := config.ConfigUpdate(c, nil, config.Commented(comment), config.DefaultKeepUncommented(), config.NoEnv())
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return string(cb), nil
|
||||||
|
}
|
||||||
|
|
||||||
func diff(sourceConf, newConf string) (string, error) {
|
func diff(sourceConf, newConf string) (string, error) {
|
||||||
lpSrc := config.DefaultLotusProvider()
|
lpSrc := config.DefaultCurioConfig()
|
||||||
lpNew := config.DefaultLotusProvider()
|
lpNew := config.DefaultCurioConfig()
|
||||||
|
|
||||||
_, err := toml.Decode(sourceConf, lpSrc)
|
_, err := toml.Decode(sourceConf, lpSrc)
|
||||||
if err != nil {
|
if err != nil {
|
@ -18,7 +18,7 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/api"
|
"github.com/filecoin-project/lotus/api"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
cliutil "github.com/filecoin-project/lotus/cli/util"
|
cliutil "github.com/filecoin-project/lotus/cli/util"
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/deps"
|
"github.com/filecoin-project/lotus/cmd/curio/deps"
|
||||||
"github.com/filecoin-project/lotus/node/config"
|
"github.com/filecoin-project/lotus/node/config"
|
||||||
"github.com/filecoin-project/lotus/node/repo"
|
"github.com/filecoin-project/lotus/node/repo"
|
||||||
)
|
)
|
||||||
@ -73,7 +73,7 @@ var configNewCmd = &cli.Command{
|
|||||||
msg := "Layer " + configColor(name) + ` created. `
|
msg := "Layer " + configColor(name) + ` created. `
|
||||||
|
|
||||||
// setup config
|
// setup config
|
||||||
lpCfg := config.DefaultLotusProvider()
|
lpCfg := config.DefaultCurioConfig()
|
||||||
|
|
||||||
for _, addr := range cctx.Args().Slice() {
|
for _, addr := range cctx.Args().Slice() {
|
||||||
maddr, err := address.NewFromString(addr)
|
maddr, err := address.NewFromString(addr)
|
||||||
@ -86,7 +86,7 @@ var configNewCmd = &cli.Command{
|
|||||||
return xerrors.Errorf("Failed to get miner info: %w", err)
|
return xerrors.Errorf("Failed to get miner info: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
lpCfg.Addresses = append(lpCfg.Addresses, config.LotusProviderAddresses{
|
lpCfg.Addresses = append(lpCfg.Addresses, config.CurioAddresses{
|
||||||
PreCommitControl: nil,
|
PreCommitControl: nil,
|
||||||
CommitControl: nil,
|
CommitControl: nil,
|
||||||
TerminateControl: nil,
|
TerminateControl: nil,
|
94
cmd/curio/deps/apiinfo.go
Normal file
94
cmd/curio/deps/apiinfo.go
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
package deps
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/urfave/cli/v2"
|
||||||
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/go-jsonrpc"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/lotus/api"
|
||||||
|
"github.com/filecoin-project/lotus/api/client"
|
||||||
|
"github.com/filecoin-project/lotus/api/v1api"
|
||||||
|
cliutil "github.com/filecoin-project/lotus/cli/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
func getFullNodeAPIV1Curio(ctx *cli.Context, ainfoCfg []string, opts ...cliutil.GetFullNodeOption) (v1api.FullNode, jsonrpc.ClientCloser, error) {
|
||||||
|
if tn, ok := ctx.App.Metadata["testnode-full"]; ok {
|
||||||
|
return tn.(v1api.FullNode), func() {}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var options cliutil.GetFullNodeOptions
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(&options)
|
||||||
|
}
|
||||||
|
|
||||||
|
var rpcOpts []jsonrpc.Option
|
||||||
|
if options.EthSubHandler != nil {
|
||||||
|
rpcOpts = append(rpcOpts, jsonrpc.WithClientHandler("Filecoin", options.EthSubHandler), jsonrpc.WithClientHandlerAlias("eth_subscription", "Filecoin.EthSubscription"))
|
||||||
|
}
|
||||||
|
|
||||||
|
var httpHeads []httpHead
|
||||||
|
version := "v1"
|
||||||
|
{
|
||||||
|
if len(ainfoCfg) == 0 {
|
||||||
|
return nil, nil, xerrors.Errorf("could not get API info: none configured. \nConsider getting base.toml with './curio config get base >/tmp/base.toml' \nthen adding \n[APIs] \n ChainApiInfo = [\" result_from lotus auth api-info --perm=admin \"]\n and updating it with './curio config set /tmp/base.toml'")
|
||||||
|
}
|
||||||
|
for _, i := range ainfoCfg {
|
||||||
|
ainfo := cliutil.ParseApiInfo(i)
|
||||||
|
addr, err := ainfo.DialArgs(version)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, xerrors.Errorf("could not get DialArgs: %w", err)
|
||||||
|
}
|
||||||
|
httpHeads = append(httpHeads, httpHead{addr: addr, header: ainfo.AuthHeader()})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if cliutil.IsVeryVerbose {
|
||||||
|
_, _ = fmt.Fprintln(ctx.App.Writer, "using full node API v1 endpoint:", httpHeads[0].addr)
|
||||||
|
}
|
||||||
|
|
||||||
|
var fullNodes []api.FullNode
|
||||||
|
var closers []jsonrpc.ClientCloser
|
||||||
|
|
||||||
|
for _, head := range httpHeads {
|
||||||
|
v1api, closer, err := client.NewFullNodeRPCV1(ctx.Context, head.addr, head.header, rpcOpts...)
|
||||||
|
if err != nil {
|
||||||
|
log.Warnf("Not able to establish connection to node with addr: %s, Reason: %s", head.addr, err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
fullNodes = append(fullNodes, v1api)
|
||||||
|
closers = append(closers, closer)
|
||||||
|
}
|
||||||
|
|
||||||
|
// When running in cluster mode and trying to establish connections to multiple nodes, fail
|
||||||
|
// if less than 2 lotus nodes are actually running
|
||||||
|
if len(httpHeads) > 1 && len(fullNodes) < 2 {
|
||||||
|
return nil, nil, xerrors.Errorf("Not able to establish connection to more than a single node")
|
||||||
|
}
|
||||||
|
|
||||||
|
finalCloser := func() {
|
||||||
|
for _, c := range closers {
|
||||||
|
c()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var v1API api.FullNodeStruct
|
||||||
|
cliutil.FullNodeProxy(fullNodes, &v1API)
|
||||||
|
|
||||||
|
v, err := v1API.Version(ctx.Context)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
if !v.APIVersion.EqMajorMinor(api.FullAPIVersion1) {
|
||||||
|
return nil, nil, xerrors.Errorf("Remote API version didn't match (expected %s, remote %s)", api.FullAPIVersion1, v.APIVersion)
|
||||||
|
}
|
||||||
|
return &v1API, finalCloser, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type httpHead struct {
|
||||||
|
addr string
|
||||||
|
header http.Header
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
// Package deps provides the dependencies for the lotus provider node.
|
// Package deps provides the dependencies for the curio node.
|
||||||
package deps
|
package deps
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -9,8 +9,9 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"regexp"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/BurntSushi/toml"
|
"github.com/BurntSushi/toml"
|
||||||
@ -18,6 +19,7 @@ import (
|
|||||||
ds "github.com/ipfs/go-datastore"
|
ds "github.com/ipfs/go-datastore"
|
||||||
dssync "github.com/ipfs/go-datastore/sync"
|
dssync "github.com/ipfs/go-datastore/sync"
|
||||||
logging "github.com/ipfs/go-log/v2"
|
logging "github.com/ipfs/go-log/v2"
|
||||||
|
"github.com/samber/lo"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
@ -27,7 +29,8 @@ import (
|
|||||||
"github.com/filecoin-project/go-statestore"
|
"github.com/filecoin-project/go-statestore"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/api"
|
"github.com/filecoin-project/lotus/api"
|
||||||
cliutil "github.com/filecoin-project/lotus/cli/util"
|
curio "github.com/filecoin-project/lotus/curiosrc"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/multictladdr"
|
||||||
"github.com/filecoin-project/lotus/journal"
|
"github.com/filecoin-project/lotus/journal"
|
||||||
"github.com/filecoin-project/lotus/journal/alerting"
|
"github.com/filecoin-project/lotus/journal/alerting"
|
||||||
"github.com/filecoin-project/lotus/journal/fsjournal"
|
"github.com/filecoin-project/lotus/journal/fsjournal"
|
||||||
@ -36,17 +39,17 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/node/modules"
|
"github.com/filecoin-project/lotus/node/modules"
|
||||||
"github.com/filecoin-project/lotus/node/modules/dtypes"
|
"github.com/filecoin-project/lotus/node/modules/dtypes"
|
||||||
"github.com/filecoin-project/lotus/node/repo"
|
"github.com/filecoin-project/lotus/node/repo"
|
||||||
"github.com/filecoin-project/lotus/provider"
|
|
||||||
"github.com/filecoin-project/lotus/provider/multictladdr"
|
|
||||||
"github.com/filecoin-project/lotus/storage/paths"
|
"github.com/filecoin-project/lotus/storage/paths"
|
||||||
"github.com/filecoin-project/lotus/storage/sealer"
|
"github.com/filecoin-project/lotus/storage/sealer"
|
||||||
"github.com/filecoin-project/lotus/storage/sealer/ffiwrapper"
|
"github.com/filecoin-project/lotus/storage/sealer/ffiwrapper"
|
||||||
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
||||||
)
|
)
|
||||||
|
|
||||||
var log = logging.Logger("lotus-provider/deps")
|
var log = logging.Logger("curio/deps")
|
||||||
|
|
||||||
func MakeDB(cctx *cli.Context) (*harmonydb.DB, error) {
|
func MakeDB(cctx *cli.Context) (*harmonydb.DB, error) {
|
||||||
|
// #1 CLI opts
|
||||||
|
fromCLI := func() (*harmonydb.DB, error) {
|
||||||
dbConfig := config.HarmonyDB{
|
dbConfig := config.HarmonyDB{
|
||||||
Username: cctx.String("db-user"),
|
Username: cctx.String("db-user"),
|
||||||
Password: cctx.String("db-password"),
|
Password: cctx.String("db-password"),
|
||||||
@ -55,6 +58,71 @@ func MakeDB(cctx *cli.Context) (*harmonydb.DB, error) {
|
|||||||
Port: cctx.String("db-port"),
|
Port: cctx.String("db-port"),
|
||||||
}
|
}
|
||||||
return harmonydb.NewFromConfig(dbConfig)
|
return harmonydb.NewFromConfig(dbConfig)
|
||||||
|
}
|
||||||
|
|
||||||
|
readToml := func(path string) (*harmonydb.DB, error) {
|
||||||
|
cfg, err := config.FromFile(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if c, ok := cfg.(*config.StorageMiner); ok {
|
||||||
|
return harmonydb.NewFromConfig(c.HarmonyDB)
|
||||||
|
}
|
||||||
|
return nil, errors.New("not a miner config")
|
||||||
|
}
|
||||||
|
|
||||||
|
// #2 Try local miner config
|
||||||
|
fromMinerEnv := func() (*harmonydb.DB, error) {
|
||||||
|
v := os.Getenv("LOTUS_MINER_PATH")
|
||||||
|
if v == "" {
|
||||||
|
return nil, errors.New("no miner env")
|
||||||
|
}
|
||||||
|
return readToml(filepath.Join(v, "config.toml"))
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fromMiner := func() (*harmonydb.DB, error) {
|
||||||
|
u, err := os.UserHomeDir()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return readToml(filepath.Join(u, ".lotusminer/config.toml"))
|
||||||
|
}
|
||||||
|
fromEnv := func() (*harmonydb.DB, error) {
|
||||||
|
// #3 Try env
|
||||||
|
u, err := url.Parse(os.Getenv("CURIO_DB"))
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("no db connection string found in CURIO_DB env")
|
||||||
|
}
|
||||||
|
cfg := config.DefaultStorageMiner().HarmonyDB
|
||||||
|
if u.User.Username() != "" {
|
||||||
|
cfg.Username = u.User.Username()
|
||||||
|
}
|
||||||
|
if p, ok := u.User.Password(); ok && p != "" {
|
||||||
|
cfg.Password = p
|
||||||
|
}
|
||||||
|
if u.Hostname() != "" {
|
||||||
|
cfg.Hosts = []string{u.Hostname()}
|
||||||
|
}
|
||||||
|
if u.Port() != "" {
|
||||||
|
cfg.Port = u.Port()
|
||||||
|
}
|
||||||
|
if strings.TrimPrefix(u.Path, "/") != "" {
|
||||||
|
cfg.Database = strings.TrimPrefix(u.Path, "/")
|
||||||
|
}
|
||||||
|
|
||||||
|
return harmonydb.NewFromConfig(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, f := range []func() (*harmonydb.DB, error){fromCLI, fromMinerEnv, fromMiner, fromEnv} {
|
||||||
|
db, err := f()
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return db, nil
|
||||||
|
}
|
||||||
|
log.Error("No db connection string found. User CLI args or env var: set CURIO_DB=postgres://USER:PASSWORD@HOST:PORT/DATABASE")
|
||||||
|
return fromCLI() //in-case it's not about bad config.
|
||||||
}
|
}
|
||||||
|
|
||||||
type JwtPayload struct {
|
type JwtPayload struct {
|
||||||
@ -93,8 +161,8 @@ func GetDeps(ctx context.Context, cctx *cli.Context) (*Deps, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Deps struct {
|
type Deps struct {
|
||||||
Cfg *config.LotusProviderConfig
|
Cfg *config.CurioConfig // values
|
||||||
DB *harmonydb.DB
|
DB *harmonydb.DB // has itest capability
|
||||||
Full api.FullNode
|
Full api.FullNode
|
||||||
Verif storiface.Verifier
|
Verif storiface.Verifier
|
||||||
LW *sealer.LocalWorker
|
LW *sealer.LocalWorker
|
||||||
@ -128,7 +196,7 @@ func (deps *Deps) PopulateRemainingDeps(ctx context.Context, cctx *cli.Context,
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
if err := r.Init(repo.Provider); err != nil {
|
if err := r.Init(repo.Curio); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -156,7 +224,7 @@ func (deps *Deps) PopulateRemainingDeps(ctx context.Context, cctx *cli.Context,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if deps.As == nil {
|
if deps.As == nil {
|
||||||
deps.As, err = provider.AddressSelector(deps.Cfg.Addresses)()
|
deps.As, err = curio.AddressSelector(deps.Cfg.Addresses)()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -186,7 +254,7 @@ func (deps *Deps) PopulateRemainingDeps(ctx context.Context, cctx *cli.Context,
|
|||||||
if v := os.Getenv("FULLNODE_API_INFO"); v != "" {
|
if v := os.Getenv("FULLNODE_API_INFO"); v != "" {
|
||||||
cfgApiInfo = []string{v}
|
cfgApiInfo = []string{v}
|
||||||
}
|
}
|
||||||
deps.Full, fullCloser, err = cliutil.GetFullNodeAPIV1LotusProvider(cctx, cfgApiInfo)
|
deps.Full, fullCloser, err = getFullNodeAPIV1Curio(cctx, cfgApiInfo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -236,7 +304,7 @@ Get it with: jq .PrivateKey ~/.lotus-miner/keystore/MF2XI2BNNJ3XILLQOJUXMYLUMU`,
|
|||||||
wstates := statestore.New(dssync.MutexWrap(ds.NewMapDatastore()))
|
wstates := statestore.New(dssync.MutexWrap(ds.NewMapDatastore()))
|
||||||
|
|
||||||
// todo localWorker isn't the abstraction layer we want to use here, we probably want to go straight to ffiwrapper
|
// todo localWorker isn't the abstraction layer we want to use here, we probably want to go straight to ffiwrapper
|
||||||
// maybe with a lotus-provider specific abstraction. LocalWorker does persistent call tracking which we probably
|
// maybe with a curio specific abstraction. LocalWorker does persistent call tracking which we probably
|
||||||
// don't need (ehh.. maybe we do, the async callback system may actually work decently well with harmonytask)
|
// don't need (ehh.. maybe we do, the async callback system may actually work decently well with harmonytask)
|
||||||
deps.LW = sealer.NewLocalWorker(sealer.WorkerConfig{
|
deps.LW = sealer.NewLocalWorker(sealer.WorkerConfig{
|
||||||
MaxParallelChallengeReads: deps.Cfg.Proving.ParallelCheckLimit,
|
MaxParallelChallengeReads: deps.Cfg.Proving.ParallelCheckLimit,
|
||||||
@ -273,21 +341,30 @@ Get it with: jq .PrivateKey ~/.lotus-miner/keystore/MF2XI2BNNJ3XILLQOJUXMYLUMU`,
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var oldAddresses = regexp.MustCompile("(?i)^\\[addresses\\]$")
|
func LoadConfigWithUpgrades(text string, curioConfigWithDefaults *config.CurioConfig) (toml.MetaData, error) {
|
||||||
|
|
||||||
func LoadConfigWithUpgrades(text string, lp *config.LotusProviderConfig) (toml.MetaData, error) {
|
|
||||||
// allow migration from old config format that was limited to 1 wallet setup.
|
// allow migration from old config format that was limited to 1 wallet setup.
|
||||||
newText := oldAddresses.ReplaceAllString(text, "[[addresses]]")
|
newText := strings.Join(lo.Map(strings.Split(text, "\n"), func(line string, _ int) string {
|
||||||
|
if strings.EqualFold(line, "[addresses]") {
|
||||||
if text != newText {
|
return "[[addresses]]"
|
||||||
log.Warnw("Upgraded config!", "old", text, "new", newText)
|
}
|
||||||
|
return line
|
||||||
|
}), "\n")
|
||||||
|
meta, err := toml.Decode(newText, &curioConfigWithDefaults)
|
||||||
|
for i := range curioConfigWithDefaults.Addresses {
|
||||||
|
if curioConfigWithDefaults.Addresses[i].PreCommitControl == nil {
|
||||||
|
curioConfigWithDefaults.Addresses[i].PreCommitControl = []string{}
|
||||||
|
}
|
||||||
|
if curioConfigWithDefaults.Addresses[i].CommitControl == nil {
|
||||||
|
curioConfigWithDefaults.Addresses[i].CommitControl = []string{}
|
||||||
|
}
|
||||||
|
if curioConfigWithDefaults.Addresses[i].TerminateControl == nil {
|
||||||
|
curioConfigWithDefaults.Addresses[i].TerminateControl = []string{}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
meta, err := toml.Decode(newText, &lp)
|
|
||||||
return meta, err
|
return meta, err
|
||||||
}
|
}
|
||||||
func GetConfig(cctx *cli.Context, db *harmonydb.DB) (*config.LotusProviderConfig, error) {
|
func GetConfig(cctx *cli.Context, db *harmonydb.DB) (*config.CurioConfig, error) {
|
||||||
lp := config.DefaultLotusProvider()
|
curioConfig := config.DefaultCurioConfig()
|
||||||
have := []string{}
|
have := []string{}
|
||||||
layers := append([]string{"base"}, cctx.StringSlice("layers")...) // Always stack on top of "base" layer
|
layers := append([]string{"base"}, cctx.StringSlice("layers")...) // Always stack on top of "base" layer
|
||||||
for _, layer := range layers {
|
for _, layer := range layers {
|
||||||
@ -298,26 +375,35 @@ func GetConfig(cctx *cli.Context, db *harmonydb.DB) (*config.LotusProviderConfig
|
|||||||
return nil, fmt.Errorf("missing layer '%s' ", layer)
|
return nil, fmt.Errorf("missing layer '%s' ", layer)
|
||||||
}
|
}
|
||||||
if layer == "base" {
|
if layer == "base" {
|
||||||
return nil, errors.New(`lotus-provider defaults to a layer named 'base'.
|
return nil, errors.New(`curio defaults to a layer named 'base'.
|
||||||
Either use 'migrate' command or edit a base.toml and upload it with: lotus-provider config set base.toml`)
|
Either use 'migrate' command or edit a base.toml and upload it with: curio config set base.toml`)
|
||||||
}
|
}
|
||||||
return nil, fmt.Errorf("could not read layer '%s': %w", layer, err)
|
return nil, fmt.Errorf("could not read layer '%s': %w", layer, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
meta, err := LoadConfigWithUpgrades(text, lp)
|
meta, err := LoadConfigWithUpgrades(text, curioConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return lp, fmt.Errorf("could not read layer, bad toml %s: %w", layer, err)
|
return curioConfig, fmt.Errorf("could not read layer, bad toml %s: %w", layer, err)
|
||||||
}
|
}
|
||||||
for _, k := range meta.Keys() {
|
for _, k := range meta.Keys() {
|
||||||
have = append(have, strings.Join(k, " "))
|
have = append(have, strings.Join(k, " "))
|
||||||
}
|
}
|
||||||
log.Infow("Using layer", "layer", layer, "config", lp)
|
log.Infow("Using layer", "layer", layer, "config", curioConfig)
|
||||||
}
|
}
|
||||||
_ = have // FUTURE: verify that required fields are here.
|
_ = have // FUTURE: verify that required fields are here.
|
||||||
// If config includes 3rd-party config, consider JSONSchema as a way that
|
// If config includes 3rd-party config, consider JSONSchema as a way that
|
||||||
// 3rd-parties can dynamically include config requirements and we can
|
// 3rd-parties can dynamically include config requirements and we can
|
||||||
// validate the config. Because of layering, we must validate @ startup.
|
// validate the config. Because of layering, we must validate @ startup.
|
||||||
return lp, nil
|
return curioConfig, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetDefaultConfig(comment bool) (string, error) {
|
||||||
|
c := config.DefaultCurioConfig()
|
||||||
|
cb, err := config.ConfigUpdate(c, nil, config.Commented(comment), config.DefaultKeepUncommented(), config.NoEnv())
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return string(cb), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetDepsCLI(ctx context.Context, cctx *cli.Context) (*Deps, error) {
|
func GetDepsCLI(ctx context.Context, cctx *cli.Context) (*Deps, error) {
|
||||||
@ -331,7 +417,7 @@ func GetDepsCLI(ctx context.Context, cctx *cli.Context) (*Deps, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
full, fullCloser, err := cliutil.GetFullNodeAPIV1LotusProvider(cctx, cfg.Apis.ChainApiInfo)
|
full, fullCloser, err := getFullNodeAPIV1Curio(cctx, cfg.Apis.ChainApiInfo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
590
cmd/curio/guidedsetup/guidedsetup.go
Normal file
590
cmd/curio/guidedsetup/guidedsetup.go
Normal file
@ -0,0 +1,590 @@
|
|||||||
|
// guidedSetup for migration from lotus-miner to Curio
|
||||||
|
//
|
||||||
|
// IF STRINGS CHANGED {
|
||||||
|
// follow instructions at ../internal/translations/translations.go
|
||||||
|
// }
|
||||||
|
package guidedsetup
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"encoding/base64"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"math/bits"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"path"
|
||||||
|
"reflect"
|
||||||
|
"strings"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/BurntSushi/toml"
|
||||||
|
"github.com/charmbracelet/lipgloss"
|
||||||
|
"github.com/manifoldco/promptui"
|
||||||
|
"github.com/mitchellh/go-homedir"
|
||||||
|
"github.com/samber/lo"
|
||||||
|
"github.com/urfave/cli/v2"
|
||||||
|
"golang.org/x/text/language"
|
||||||
|
"golang.org/x/text/message"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/go-address"
|
||||||
|
"github.com/filecoin-project/go-jsonrpc"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/lotus/api"
|
||||||
|
"github.com/filecoin-project/lotus/api/v0api"
|
||||||
|
"github.com/filecoin-project/lotus/build"
|
||||||
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
cliutil "github.com/filecoin-project/lotus/cli/util"
|
||||||
|
_ "github.com/filecoin-project/lotus/cmd/curio/internal/translations"
|
||||||
|
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
||||||
|
"github.com/filecoin-project/lotus/node/config"
|
||||||
|
"github.com/filecoin-project/lotus/node/repo"
|
||||||
|
)
|
||||||
|
|
||||||
|
// URL to upload user-selected fields to help direct developer's focus.
|
||||||
|
const DeveloperFocusRequestURL = "https://curiostorage.org/cgi-bin/savedata.php"
|
||||||
|
|
||||||
|
var GuidedsetupCmd = &cli.Command{
|
||||||
|
Name: "guided-setup",
|
||||||
|
Usage: "Run the guided setup for migrating from lotus-miner to Curio",
|
||||||
|
Flags: []cli.Flag{
|
||||||
|
&cli.StringFlag{ // for cliutil.GetFullNodeAPI
|
||||||
|
Name: "repo",
|
||||||
|
EnvVars: []string{"LOTUS_PATH"},
|
||||||
|
Hidden: true,
|
||||||
|
Value: "~/.lotus",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Action: func(cctx *cli.Context) (err error) {
|
||||||
|
T, say := SetupLanguage()
|
||||||
|
setupCtrlC(say)
|
||||||
|
|
||||||
|
say(header, "This interactive tool migrates lotus-miner to Curio in 5 minutes.")
|
||||||
|
say(notice, "Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.")
|
||||||
|
|
||||||
|
// Run the migration steps
|
||||||
|
migrationData := MigrationData{
|
||||||
|
T: T,
|
||||||
|
say: say,
|
||||||
|
selectTemplates: &promptui.SelectTemplates{
|
||||||
|
Help: T("Use the arrow keys to navigate: ↓ ↑ → ← "),
|
||||||
|
},
|
||||||
|
cctx: cctx,
|
||||||
|
}
|
||||||
|
for _, step := range migrationSteps {
|
||||||
|
step(&migrationData)
|
||||||
|
}
|
||||||
|
for _, closer := range migrationData.closers {
|
||||||
|
closer()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupCtrlC(say func(style lipgloss.Style, key message.Reference, a ...interface{})) {
|
||||||
|
c := make(chan os.Signal, 1)
|
||||||
|
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
|
||||||
|
go func() {
|
||||||
|
<-c
|
||||||
|
say(notice, "Ctrl+C pressed in Terminal")
|
||||||
|
os.Exit(2)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
header = lipgloss.NewStyle().
|
||||||
|
Align(lipgloss.Left).
|
||||||
|
Foreground(lipgloss.Color("#00FF00")).
|
||||||
|
Background(lipgloss.Color("#242424")).
|
||||||
|
BorderStyle(lipgloss.NormalBorder()).
|
||||||
|
Width(60).Margin(1)
|
||||||
|
|
||||||
|
notice = lipgloss.NewStyle().
|
||||||
|
Align(lipgloss.Left).
|
||||||
|
Bold(true).
|
||||||
|
Foreground(lipgloss.Color("#CCCCCC")).
|
||||||
|
Background(lipgloss.Color("#333300")).MarginBottom(1)
|
||||||
|
|
||||||
|
green = lipgloss.NewStyle().
|
||||||
|
Align(lipgloss.Left).
|
||||||
|
Foreground(lipgloss.Color("#00FF00")).
|
||||||
|
Background(lipgloss.Color("#000000"))
|
||||||
|
|
||||||
|
plain = lipgloss.NewStyle().Align(lipgloss.Left)
|
||||||
|
|
||||||
|
section = lipgloss.NewStyle().
|
||||||
|
Align(lipgloss.Left).
|
||||||
|
Foreground(lipgloss.Color("#000000")).
|
||||||
|
Background(lipgloss.Color("#FFFFFF")).
|
||||||
|
Underline(true)
|
||||||
|
|
||||||
|
code = lipgloss.NewStyle().
|
||||||
|
Align(lipgloss.Left).
|
||||||
|
Foreground(lipgloss.Color("#00FF00")).
|
||||||
|
Background(lipgloss.Color("#f8f9fa"))
|
||||||
|
)
|
||||||
|
|
||||||
|
func SetupLanguage() (func(key message.Reference, a ...interface{}) string, func(style lipgloss.Style, key message.Reference, a ...interface{})) {
|
||||||
|
langText := "en"
|
||||||
|
problem := false
|
||||||
|
if len(os.Getenv("LANG")) > 1 {
|
||||||
|
langText = os.Getenv("LANG")[:2]
|
||||||
|
} else {
|
||||||
|
problem = true
|
||||||
|
}
|
||||||
|
|
||||||
|
lang, err := language.Parse(langText)
|
||||||
|
if err != nil {
|
||||||
|
lang = language.English
|
||||||
|
problem = true
|
||||||
|
fmt.Println("Error parsing language")
|
||||||
|
}
|
||||||
|
|
||||||
|
langs := message.DefaultCatalog.Languages()
|
||||||
|
have := lo.SliceToMap(langs, func(t language.Tag) (string, bool) { return t.String(), true })
|
||||||
|
if _, ok := have[lang.String()]; !ok {
|
||||||
|
lang = language.English
|
||||||
|
problem = true
|
||||||
|
}
|
||||||
|
if problem {
|
||||||
|
_ = os.Setenv("LANG", "en-US") // for later users of this function
|
||||||
|
notice.Copy().AlignHorizontal(lipgloss.Right).
|
||||||
|
Render("$LANG=" + langText + " unsupported. Available: " + strings.Join(lo.Keys(have), ", "))
|
||||||
|
fmt.Println("Defaulting to English. Please reach out to the Curio team if you would like to have additional language support.")
|
||||||
|
}
|
||||||
|
return func(key message.Reference, a ...interface{}) string {
|
||||||
|
return message.NewPrinter(lang).Sprintf(key, a...)
|
||||||
|
}, func(sty lipgloss.Style, key message.Reference, a ...interface{}) {
|
||||||
|
msg := message.NewPrinter(lang).Sprintf(key, a...)
|
||||||
|
fmt.Println(sty.Render(msg))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type migrationStep func(*MigrationData)
|
||||||
|
|
||||||
|
var migrationSteps = []migrationStep{
|
||||||
|
readMinerConfig, // Tells them to be on the miner machine
|
||||||
|
yugabyteConnect, // Miner is updated
|
||||||
|
configToDB, // work on base configuration migration.
|
||||||
|
verifySectors, // Verify the sectors are in the database
|
||||||
|
doc,
|
||||||
|
oneLastThing,
|
||||||
|
complete,
|
||||||
|
}
|
||||||
|
|
||||||
|
type MigrationData struct {
|
||||||
|
T func(key message.Reference, a ...interface{}) string
|
||||||
|
say func(style lipgloss.Style, key message.Reference, a ...interface{})
|
||||||
|
selectTemplates *promptui.SelectTemplates
|
||||||
|
MinerConfigPath string
|
||||||
|
MinerConfig *config.StorageMiner
|
||||||
|
DB *harmonydb.DB
|
||||||
|
MinerID address.Address
|
||||||
|
full v0api.FullNode
|
||||||
|
cctx *cli.Context
|
||||||
|
closers []jsonrpc.ClientCloser
|
||||||
|
}
|
||||||
|
|
||||||
|
func complete(d *MigrationData) {
|
||||||
|
stepCompleted(d, d.T("Lotus-Miner to Curio Migration."))
|
||||||
|
d.say(plain, "Try the web interface with %s for further guided improvements.", "--layers=gui")
|
||||||
|
d.say(plain, "You can now migrate your market node (%s), if applicable.", "Boost")
|
||||||
|
}
|
||||||
|
func configToDB(d *MigrationData) {
|
||||||
|
d.say(section, "Migrating lotus-miner config.toml to Curio in-database configuration.")
|
||||||
|
|
||||||
|
{
|
||||||
|
var closer jsonrpc.ClientCloser
|
||||||
|
var err error
|
||||||
|
d.full, closer, err = cliutil.GetFullNodeAPI(d.cctx)
|
||||||
|
d.closers = append(d.closers, closer)
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Error getting API: %s", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ainfo, err := cliutil.GetAPIInfo(d.cctx, repo.FullNode)
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "could not get API info for FullNode: %w", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
token, err := d.full.AuthNew(context.Background(), api.AllPermissions)
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Error getting token: %s", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
chainApiInfo := fmt.Sprintf("%s:%s", string(token), ainfo.Addr)
|
||||||
|
|
||||||
|
d.MinerID, err = SaveConfigToLayer(d.MinerConfigPath, "", false, chainApiInfo)
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Error saving config to layer: %s. Aborting Migration", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// bucket returns the power's 4 highest bits (rounded down).
|
||||||
|
func bucket(power *api.MinerPower) uint64 {
|
||||||
|
rawQAP := power.TotalPower.QualityAdjPower.Uint64()
|
||||||
|
magnitude := lo.Max([]int{bits.Len64(rawQAP), 5})
|
||||||
|
|
||||||
|
// shifting erases resolution so we cannot distinguish SPs of similar scales.
|
||||||
|
return rawQAP >> (uint64(magnitude) - 4) << (uint64(magnitude - 4))
|
||||||
|
}
|
||||||
|
|
||||||
|
type uploadType int
|
||||||
|
|
||||||
|
const uploadTypeIndividual uploadType = 0
|
||||||
|
const uploadTypeAggregate uploadType = 1
|
||||||
|
|
||||||
|
// const uploadTypeHint uploadType = 2
|
||||||
|
const uploadTypeNothing uploadType = 3
|
||||||
|
|
||||||
|
func oneLastThing(d *MigrationData) {
|
||||||
|
d.say(section, "The Curio team wants to improve the software you use. Tell the team you're using `%s`.", "curio")
|
||||||
|
i, _, err := (&promptui.Select{
|
||||||
|
Label: d.T("Select what you want to share with the Curio team."),
|
||||||
|
Items: []string{
|
||||||
|
d.T("Individual Data: Miner ID, Curio version, chain (%s or %s). Signed.", "mainnet", "calibration"),
|
||||||
|
d.T("Aggregate-Anonymous: version, chain, and Miner power (bucketed)."),
|
||||||
|
d.T("Hint: I am someone running Curio on whichever chain."),
|
||||||
|
d.T("Nothing.")},
|
||||||
|
Templates: d.selectTemplates,
|
||||||
|
}).Run()
|
||||||
|
preference := uploadType(i)
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Aborting remaining steps.", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
if preference != uploadTypeNothing {
|
||||||
|
msgMap := map[string]any{
|
||||||
|
"domain": "curio-newuser",
|
||||||
|
"net": build.BuildTypeString(),
|
||||||
|
}
|
||||||
|
if preference == uploadTypeIndividual || preference == uploadTypeAggregate {
|
||||||
|
// articles of incorporation
|
||||||
|
power, err := d.full.StateMinerPower(context.Background(), d.MinerID, types.EmptyTSK)
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Error getting miner power: %s", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
msgMap["version"] = build.BuildVersion
|
||||||
|
msgMap["net"] = build.BuildType
|
||||||
|
msgMap["power"] = map[uploadType]uint64{
|
||||||
|
uploadTypeIndividual: power.MinerPower.QualityAdjPower.Uint64(),
|
||||||
|
uploadTypeAggregate: bucket(power)}[preference]
|
||||||
|
|
||||||
|
if preference == uploadTypeIndividual { // Sign it
|
||||||
|
msgMap["miner_id"] = d.MinerID
|
||||||
|
msg, err := json.Marshal(msgMap)
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Error marshalling message: %s", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
mi, err := d.full.StateMinerInfo(context.Background(), d.MinerID, types.EmptyTSK)
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Error getting miner info: %s", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
sig, err := d.full.WalletSign(context.Background(), mi.Worker, msg)
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Error signing message: %s", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
msgMap["signature"] = base64.StdEncoding.EncodeToString(sig.Data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
msg, err := json.Marshal(msgMap)
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Error marshalling message: %s", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := http.DefaultClient.Post(DeveloperFocusRequestURL, "application/json", bytes.NewReader(msg))
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Error sending message: %s", err.Error())
|
||||||
|
}
|
||||||
|
if resp != nil {
|
||||||
|
defer func() { _ = resp.Body.Close() }()
|
||||||
|
if resp.StatusCode != 200 {
|
||||||
|
b, err := io.ReadAll(resp.Body)
|
||||||
|
if err == nil {
|
||||||
|
d.say(notice, "Error sending message: Status %s, Message: ", resp.Status, string(b))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
stepCompleted(d, d.T("Message sent."))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func doc(d *MigrationData) {
|
||||||
|
d.say(plain, "Documentation: ")
|
||||||
|
d.say(plain, "The '%s' layer stores common configuration. All curio instances can include it in their %s argument.", "base", "--layers")
|
||||||
|
d.say(plain, "You can add other layers for per-machine configuration changes.")
|
||||||
|
|
||||||
|
d.say(plain, "Filecoin %s channels: %s and %s", "Slack", "#fil-curio-help", "#fil-curio-dev")
|
||||||
|
|
||||||
|
d.say(plain, "Start multiple Curio instances with the '%s' layer to redundancy.", "post")
|
||||||
|
//d.say(plain, "Point your browser to your web GUI to complete setup with %s and advanced featues.", "Boost")
|
||||||
|
d.say(plain, "One database can serve multiple miner IDs: Run a migration for each lotus-miner.")
|
||||||
|
}
|
||||||
|
|
||||||
|
func verifySectors(d *MigrationData) {
|
||||||
|
var i []int
|
||||||
|
var lastError string
|
||||||
|
fmt.Println()
|
||||||
|
d.say(section, "Please start (or restart) %s now that database credentials are in %s.", "lotus-miner", "config.toml")
|
||||||
|
d.say(notice, "Waiting for %s to write sectors into Yugabyte.", "lotus-miner")
|
||||||
|
|
||||||
|
mid, err := address.IDFromAddress(d.MinerID)
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Error interpreting miner ID: %s: ID: %s", err.Error(), d.MinerID.String())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
for {
|
||||||
|
err := d.DB.Select(context.Background(), &i, `
|
||||||
|
SELECT count(*) FROM sector_location WHERE miner_id=$1`, mid)
|
||||||
|
if err != nil {
|
||||||
|
if err.Error() != lastError {
|
||||||
|
d.say(notice, "Error verifying sectors: %s", err.Error())
|
||||||
|
lastError = err.Error()
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if i[0] > 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
fmt.Print(".")
|
||||||
|
time.Sleep(5 * time.Second)
|
||||||
|
}
|
||||||
|
d.say(plain, "The sectors are in the database. The database is ready for %s.", "Curio")
|
||||||
|
d.say(notice, "Now shut down lotus-miner and move the systems to %s.", "Curio")
|
||||||
|
|
||||||
|
_, err = (&promptui.Prompt{Label: d.T("Press return to continue")}).Run()
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Aborting migration.")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
stepCompleted(d, d.T("Sectors verified. %d sector locations found.", i))
|
||||||
|
}
|
||||||
|
|
||||||
|
func yugabyteConnect(d *MigrationData) {
|
||||||
|
harmonyCfg := config.DefaultStorageMiner().HarmonyDB //copy the config to a local variable
|
||||||
|
if d.MinerConfig != nil {
|
||||||
|
harmonyCfg = d.MinerConfig.HarmonyDB //copy the config to a local variable
|
||||||
|
}
|
||||||
|
var err error
|
||||||
|
d.DB, err = harmonydb.NewFromConfig(harmonyCfg)
|
||||||
|
if err == nil {
|
||||||
|
goto yugabyteConnected
|
||||||
|
}
|
||||||
|
for {
|
||||||
|
i, _, err := (&promptui.Select{
|
||||||
|
Label: d.T("Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)"),
|
||||||
|
Items: []string{
|
||||||
|
d.T("Host: %s", strings.Join(harmonyCfg.Hosts, ",")),
|
||||||
|
d.T("Port: %s", harmonyCfg.Port),
|
||||||
|
d.T("Username: %s", harmonyCfg.Username),
|
||||||
|
d.T("Password: %s", harmonyCfg.Password),
|
||||||
|
d.T("Database: %s", harmonyCfg.Database),
|
||||||
|
d.T("Continue to connect and update schema.")},
|
||||||
|
Size: 6,
|
||||||
|
Templates: d.selectTemplates,
|
||||||
|
}).Run()
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Database config error occurred, abandoning migration: %s ", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
switch i {
|
||||||
|
case 0:
|
||||||
|
host, err := (&promptui.Prompt{
|
||||||
|
Label: d.T("Enter the Yugabyte database host(s)"),
|
||||||
|
}).Run()
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "No host provided")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
harmonyCfg.Hosts = strings.Split(host, ",")
|
||||||
|
case 1, 2, 3, 4:
|
||||||
|
val, err := (&promptui.Prompt{
|
||||||
|
Label: d.T("Enter the Yugabyte database %s", []string{"port", "username", "password", "database"}[i-1]),
|
||||||
|
}).Run()
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "No value provided")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
switch i {
|
||||||
|
case 1:
|
||||||
|
harmonyCfg.Port = val
|
||||||
|
case 2:
|
||||||
|
harmonyCfg.Username = val
|
||||||
|
case 3:
|
||||||
|
harmonyCfg.Password = val
|
||||||
|
case 4:
|
||||||
|
harmonyCfg.Database = val
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
case 5:
|
||||||
|
d.DB, err = harmonydb.NewFromConfig(harmonyCfg)
|
||||||
|
if err != nil {
|
||||||
|
if err.Error() == "^C" {
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
d.say(notice, "Error connecting to Yugabyte database: %s", err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
goto yugabyteConnected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
yugabyteConnected:
|
||||||
|
d.say(plain, "Connected to Yugabyte. Schema is current.")
|
||||||
|
if !reflect.DeepEqual(harmonyCfg, d.MinerConfig.HarmonyDB) || !d.MinerConfig.Subsystems.EnableSectorIndexDB {
|
||||||
|
d.MinerConfig.HarmonyDB = harmonyCfg
|
||||||
|
d.MinerConfig.Subsystems.EnableSectorIndexDB = true
|
||||||
|
|
||||||
|
d.say(plain, "Enabling Sector Indexing in the database.")
|
||||||
|
buf, err := config.ConfigUpdate(d.MinerConfig, config.DefaultStorageMiner())
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Error encoding config.toml: %s", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
_, err = (&promptui.Prompt{
|
||||||
|
Label: d.T("Press return to update %s with Yugabyte info. A Backup file will be written to that folder before changes are made.", "config.toml")}).Run()
|
||||||
|
if err != nil {
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
p, err := homedir.Expand(d.MinerConfigPath)
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Error expanding path: %s", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
tomlPath := path.Join(p, "config.toml")
|
||||||
|
stat, err := os.Stat(tomlPath)
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Error reading filemode of config.toml: %s", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
fBackup, err := os.CreateTemp(p, "config-backup-*.toml")
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Error creating backup file: %s", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
fBackupContents, err := os.ReadFile(tomlPath)
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Error reading config.toml: %s", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
_, err = fBackup.Write(fBackupContents)
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Error writing backup file: %s", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
err = fBackup.Close()
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Error closing backup file: %s", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
filemode := stat.Mode()
|
||||||
|
err = os.WriteFile(path.Join(p, "config.toml"), buf, filemode)
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Error writing config.toml: %s", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
d.say(section, "Restart Lotus Miner. ")
|
||||||
|
}
|
||||||
|
stepCompleted(d, d.T("Connected to Yugabyte"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func readMinerConfig(d *MigrationData) {
|
||||||
|
d.say(plain, "To start, ensure your sealing pipeline is drained and shut-down lotus-miner.")
|
||||||
|
|
||||||
|
verifyPath := func(dir string) (*config.StorageMiner, error) {
|
||||||
|
cfg := config.DefaultStorageMiner()
|
||||||
|
dir, err := homedir.Expand(dir)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
_, err = toml.DecodeFile(path.Join(dir, "config.toml"), &cfg)
|
||||||
|
return cfg, err
|
||||||
|
}
|
||||||
|
|
||||||
|
dirs := map[string]*config.StorageMiner{"~/.lotusminer": nil, "~/.lotus-miner-local-net": nil}
|
||||||
|
if v := os.Getenv("LOTUS_MINER_PATH"); v != "" {
|
||||||
|
dirs[v] = nil
|
||||||
|
}
|
||||||
|
for dir := range dirs {
|
||||||
|
cfg, err := verifyPath(dir)
|
||||||
|
if err != nil {
|
||||||
|
delete(dirs, dir)
|
||||||
|
}
|
||||||
|
dirs[dir] = cfg
|
||||||
|
}
|
||||||
|
|
||||||
|
var otherPath bool
|
||||||
|
if len(dirs) > 0 {
|
||||||
|
_, str, err := (&promptui.Select{
|
||||||
|
Label: d.T("Select the location of your lotus-miner config directory?"),
|
||||||
|
Items: append(lo.Keys(dirs), d.T("Other")),
|
||||||
|
Templates: d.selectTemplates,
|
||||||
|
}).Run()
|
||||||
|
if err != nil {
|
||||||
|
if err.Error() == "^C" {
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
otherPath = true
|
||||||
|
} else {
|
||||||
|
if str == d.T("Other") {
|
||||||
|
otherPath = true
|
||||||
|
} else {
|
||||||
|
d.MinerConfigPath = str
|
||||||
|
d.MinerConfig = dirs[str]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if otherPath {
|
||||||
|
minerPathEntry:
|
||||||
|
str, err := (&promptui.Prompt{
|
||||||
|
Label: d.T("Enter the path to the configuration directory used by %s", "lotus-miner"),
|
||||||
|
}).Run()
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "No path provided, abandoning migration ")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
cfg, err := verifyPath(str)
|
||||||
|
if err != nil {
|
||||||
|
d.say(notice, "Cannot read the config.toml file in the provided directory, Error: %s", err.Error())
|
||||||
|
goto minerPathEntry
|
||||||
|
}
|
||||||
|
d.MinerConfigPath = str
|
||||||
|
d.MinerConfig = cfg
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to lock Miner repo to verify that lotus-miner is not running
|
||||||
|
{
|
||||||
|
r, err := repo.NewFS(d.MinerConfigPath)
|
||||||
|
if err != nil {
|
||||||
|
d.say(plain, "Could not create repo from directory: %s. Aborting migration", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
lr, err := r.Lock(repo.StorageMiner)
|
||||||
|
if err != nil {
|
||||||
|
d.say(plain, "Could not lock miner repo. Your miner must be stopped: %s\n Aborting migration", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
_ = lr.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
stepCompleted(d, d.T("Read Miner Config"))
|
||||||
|
}
|
||||||
|
func stepCompleted(d *MigrationData, step string) {
|
||||||
|
fmt.Print(green.Render("✔ "))
|
||||||
|
d.say(plain, "Step Complete: %s\n", step)
|
||||||
|
}
|
264
cmd/curio/guidedsetup/shared.go
Normal file
264
cmd/curio/guidedsetup/shared.go
Normal file
@ -0,0 +1,264 @@
|
|||||||
|
package guidedsetup
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"encoding/base64"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/BurntSushi/toml"
|
||||||
|
"github.com/ipfs/go-datastore"
|
||||||
|
"github.com/samber/lo"
|
||||||
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/go-address"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/lotus/cmd/curio/deps"
|
||||||
|
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
||||||
|
"github.com/filecoin-project/lotus/node/config"
|
||||||
|
"github.com/filecoin-project/lotus/node/modules"
|
||||||
|
"github.com/filecoin-project/lotus/node/repo"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
FlagMinerRepo = "miner-repo"
|
||||||
|
)
|
||||||
|
|
||||||
|
const FlagMinerRepoDeprecation = "storagerepo"
|
||||||
|
|
||||||
|
func SaveConfigToLayer(minerRepoPath, layerName string, overwrite bool, chainApiInfo string) (minerAddress address.Address, err error) {
|
||||||
|
_, say := SetupLanguage()
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
r, err := repo.NewFS(minerRepoPath)
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ok, err := r.Exists()
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !ok {
|
||||||
|
return minerAddress, fmt.Errorf("repo not initialized at: %s", minerRepoPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
lr, err := r.LockRO(repo.StorageMiner)
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, fmt.Errorf("locking repo: %w", err)
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
err = lr.Close()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("error closing repo: ", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
cfgNode, err := lr.Config()
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, fmt.Errorf("getting node config: %w", err)
|
||||||
|
}
|
||||||
|
smCfg := cfgNode.(*config.StorageMiner)
|
||||||
|
|
||||||
|
db, err := harmonydb.NewFromConfig(smCfg.HarmonyDB)
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, fmt.Errorf("could not reach the database. Ensure the Miner config toml's HarmonyDB entry"+
|
||||||
|
" is setup to reach Yugabyte correctly: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var titles []string
|
||||||
|
err = db.Select(ctx, &titles, `SELECT title FROM harmony_config WHERE LENGTH(config) > 0`)
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, fmt.Errorf("miner cannot reach the db. Ensure the config toml's HarmonyDB entry"+
|
||||||
|
" is setup to reach Yugabyte correctly: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy over identical settings:
|
||||||
|
|
||||||
|
buf, err := os.ReadFile(path.Join(lr.Path(), "config.toml"))
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, fmt.Errorf("could not read config.toml: %w", err)
|
||||||
|
}
|
||||||
|
curioCfg := config.DefaultCurioConfig()
|
||||||
|
|
||||||
|
ensureEmptyArrays(curioCfg)
|
||||||
|
_, err = deps.LoadConfigWithUpgrades(string(buf), curioCfg)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, fmt.Errorf("could not decode toml: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Populate Miner Address
|
||||||
|
mmeta, err := lr.Datastore(ctx, "/metadata")
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, xerrors.Errorf("opening miner metadata datastore: %w", err)
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
// _ = mmeta.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
|
maddrBytes, err := mmeta.Get(ctx, datastore.NewKey("miner-address"))
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, xerrors.Errorf("getting miner address datastore entry: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
addr, err := address.NewFromBytes(maddrBytes)
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, xerrors.Errorf("parsing miner actor address: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
minerAddress = addr
|
||||||
|
|
||||||
|
curioCfg.Addresses = []config.CurioAddresses{{
|
||||||
|
MinerAddresses: []string{addr.String()},
|
||||||
|
PreCommitControl: smCfg.Addresses.PreCommitControl,
|
||||||
|
CommitControl: smCfg.Addresses.CommitControl,
|
||||||
|
TerminateControl: smCfg.Addresses.TerminateControl,
|
||||||
|
DisableOwnerFallback: smCfg.Addresses.DisableOwnerFallback,
|
||||||
|
DisableWorkerFallback: smCfg.Addresses.DisableWorkerFallback,
|
||||||
|
}}
|
||||||
|
|
||||||
|
ks, err := lr.KeyStore()
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, xerrors.Errorf("keystore err: %w", err)
|
||||||
|
}
|
||||||
|
js, err := ks.Get(modules.JWTSecretName)
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, xerrors.Errorf("error getting JWTSecretName: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
curioCfg.Apis.StorageRPCSecret = base64.StdEncoding.EncodeToString(js.PrivateKey)
|
||||||
|
|
||||||
|
curioCfg.Apis.ChainApiInfo = append(curioCfg.Apis.ChainApiInfo, chainApiInfo)
|
||||||
|
// Express as configTOML
|
||||||
|
configTOML := &bytes.Buffer{}
|
||||||
|
if err = toml.NewEncoder(configTOML).Encode(curioCfg); err != nil {
|
||||||
|
return minerAddress, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if lo.Contains(titles, "base") {
|
||||||
|
// append addresses
|
||||||
|
var baseCfg = config.DefaultCurioConfig()
|
||||||
|
var baseText string
|
||||||
|
err = db.QueryRow(ctx, "SELECT config FROM harmony_config WHERE title='base'").Scan(&baseText)
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, xerrors.Errorf("Cannot load base config: %w", err)
|
||||||
|
}
|
||||||
|
ensureEmptyArrays(baseCfg)
|
||||||
|
_, err := deps.LoadConfigWithUpgrades(baseText, baseCfg)
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, xerrors.Errorf("Cannot load base config: %w", err)
|
||||||
|
}
|
||||||
|
for _, addr := range baseCfg.Addresses {
|
||||||
|
if lo.Contains(addr.MinerAddresses, curioCfg.Addresses[0].MinerAddresses[0]) {
|
||||||
|
goto skipWritingToBase
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// write to base
|
||||||
|
{
|
||||||
|
baseCfg.Addresses = append(baseCfg.Addresses, curioCfg.Addresses[0])
|
||||||
|
baseCfg.Addresses = lo.Filter(baseCfg.Addresses, func(a config.CurioAddresses, _ int) bool {
|
||||||
|
return len(a.MinerAddresses) > 0
|
||||||
|
})
|
||||||
|
|
||||||
|
cb, err := config.ConfigUpdate(baseCfg, config.DefaultCurioConfig(), config.Commented(true), config.DefaultKeepUncommented(), config.NoEnv())
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, xerrors.Errorf("cannot interpret config: %w", err)
|
||||||
|
}
|
||||||
|
_, err = db.Exec(ctx, "UPDATE harmony_config SET config=$1 WHERE title='base'", string(cb))
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, xerrors.Errorf("cannot update base config: %w", err)
|
||||||
|
}
|
||||||
|
say(plain, "Configuration 'base' was updated to include this miner's address and its wallet setup.")
|
||||||
|
}
|
||||||
|
say(plain, "Compare the configurations %s to %s. Changes between the miner IDs other than wallet addreses should be a new, minimal layer for runners that need it.", "base", "mig-"+curioCfg.Addresses[0].MinerAddresses[0])
|
||||||
|
skipWritingToBase:
|
||||||
|
} else if layerName == "" {
|
||||||
|
cfg, err := deps.GetDefaultConfig(true)
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, xerrors.Errorf("Cannot get default config: %w", err)
|
||||||
|
}
|
||||||
|
_, err = db.Exec(ctx, `INSERT INTO harmony_config (title, config) VALUES ('base', $1)
|
||||||
|
ON CONFLICT(title) DO UPDATE SET config=EXCLUDED.config`, cfg)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, xerrors.Errorf("Cannot insert base config: %w", err)
|
||||||
|
}
|
||||||
|
say(notice, "Configuration 'base' was created to include this miner's address and its wallet setup.")
|
||||||
|
}
|
||||||
|
|
||||||
|
if layerName == "" { // only make mig if base exists and we are different. // compare to base.
|
||||||
|
layerName = fmt.Sprintf("mig-%s", curioCfg.Addresses[0].MinerAddresses[0])
|
||||||
|
overwrite = true
|
||||||
|
} else {
|
||||||
|
if lo.Contains(titles, layerName) && !overwrite {
|
||||||
|
return minerAddress, errors.New("the overwrite flag is needed to replace existing layer: " + layerName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if overwrite {
|
||||||
|
_, err := db.Exec(ctx, "DELETE FROM harmony_config WHERE title=$1", layerName)
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, xerrors.Errorf("Cannot delete existing layer: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = db.Exec(ctx, "INSERT INTO harmony_config (title, config) VALUES ($1, $2)", layerName, configTOML.String())
|
||||||
|
if err != nil {
|
||||||
|
return minerAddress, xerrors.Errorf("Cannot insert layer after layer created message: %w", err)
|
||||||
|
}
|
||||||
|
say(plain, "Layer %s created. ", layerName)
|
||||||
|
|
||||||
|
dbSettings := getDBSettings(*smCfg)
|
||||||
|
say(plain, "To work with the config: ")
|
||||||
|
fmt.Println(code.Render(`curio ` + dbSettings + ` config edit base`))
|
||||||
|
say(plain, `To run Curio: With machine or cgroup isolation, use the command (with example layer selection):`)
|
||||||
|
fmt.Println(code.Render(`curio ` + dbSettings + ` run --layer=post`))
|
||||||
|
return minerAddress, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getDBSettings(smCfg config.StorageMiner) string {
|
||||||
|
dbSettings := ""
|
||||||
|
def := config.DefaultStorageMiner().HarmonyDB
|
||||||
|
if def.Hosts[0] != smCfg.HarmonyDB.Hosts[0] {
|
||||||
|
dbSettings += ` --db-host="` + strings.Join(smCfg.HarmonyDB.Hosts, ",") + `"`
|
||||||
|
}
|
||||||
|
if def.Port != smCfg.HarmonyDB.Port {
|
||||||
|
dbSettings += " --db-port=" + smCfg.HarmonyDB.Port
|
||||||
|
}
|
||||||
|
if def.Username != smCfg.HarmonyDB.Username {
|
||||||
|
dbSettings += ` --db-user="` + smCfg.HarmonyDB.Username + `"`
|
||||||
|
}
|
||||||
|
if def.Password != smCfg.HarmonyDB.Password {
|
||||||
|
dbSettings += ` --db-password="` + smCfg.HarmonyDB.Password + `"`
|
||||||
|
}
|
||||||
|
if def.Database != smCfg.HarmonyDB.Database {
|
||||||
|
dbSettings += ` --db-name="` + smCfg.HarmonyDB.Database + `"`
|
||||||
|
}
|
||||||
|
return dbSettings
|
||||||
|
}
|
||||||
|
|
||||||
|
func ensureEmptyArrays(cfg *config.CurioConfig) {
|
||||||
|
if cfg.Addresses == nil {
|
||||||
|
cfg.Addresses = []config.CurioAddresses{}
|
||||||
|
} else {
|
||||||
|
for i := range cfg.Addresses {
|
||||||
|
if cfg.Addresses[i].PreCommitControl == nil {
|
||||||
|
cfg.Addresses[i].PreCommitControl = []string{}
|
||||||
|
}
|
||||||
|
if cfg.Addresses[i].CommitControl == nil {
|
||||||
|
cfg.Addresses[i].CommitControl = []string{}
|
||||||
|
}
|
||||||
|
if cfg.Addresses[i].TerminateControl == nil {
|
||||||
|
cfg.Addresses[i].TerminateControl = []string{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if cfg.Apis.ChainApiInfo == nil {
|
||||||
|
cfg.Apis.ChainApiInfo = []string{}
|
||||||
|
}
|
||||||
|
}
|
331
cmd/curio/internal/translations/catalog.go
Normal file
331
cmd/curio/internal/translations/catalog.go
Normal file
@ -0,0 +1,331 @@
|
|||||||
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
|
package translations
|
||||||
|
|
||||||
|
import (
|
||||||
|
"golang.org/x/text/language"
|
||||||
|
"golang.org/x/text/message"
|
||||||
|
"golang.org/x/text/message/catalog"
|
||||||
|
)
|
||||||
|
|
||||||
|
type dictionary struct {
|
||||||
|
index []uint32
|
||||||
|
data string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *dictionary) Lookup(key string) (data string, ok bool) {
|
||||||
|
p, ok := messageKeyToIndex[key]
|
||||||
|
if !ok {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
start, end := d.index[p], d.index[p+1]
|
||||||
|
if start == end {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
return d.data[start:end], true
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
dict := map[string]catalog.Dictionary{
|
||||||
|
"en": &dictionary{index: enIndex, data: enData},
|
||||||
|
"ko": &dictionary{index: koIndex, data: koData},
|
||||||
|
"zh": &dictionary{index: zhIndex, data: zhData},
|
||||||
|
}
|
||||||
|
fallback := language.MustParse("en")
|
||||||
|
cat, err := catalog.NewFromMap(dict, catalog.Fallback(fallback))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
message.DefaultCatalog = cat
|
||||||
|
}
|
||||||
|
|
||||||
|
var messageKeyToIndex = map[string]int{
|
||||||
|
"Aborting migration.": 41,
|
||||||
|
"Aborting remaining steps.": 19,
|
||||||
|
"Aggregate-Anonymous: version, net, and Miner power (bucketed).": 16,
|
||||||
|
"Cannot read the config.toml file in the provided directory, Error: %s": 70,
|
||||||
|
"Compare the configurations %s to %s. Changes between the miner IDs other than wallet addreses should be a new, minimal layer for runners that need it.": 76,
|
||||||
|
"Configuration 'base' was created to include this miner's address and its wallet setup.": 77,
|
||||||
|
"Configuration 'base' was updated to include this miner's address and its wallet setup.": 75,
|
||||||
|
"Connected to Yugabyte": 64,
|
||||||
|
"Connected to Yugabyte. Schema is current.": 56,
|
||||||
|
"Continue to connect and update schema.": 49,
|
||||||
|
"Could not create repo from directory: %s. Aborting migration": 71,
|
||||||
|
"Could not lock miner repo. Your miner must be stopped: %s\n Aborting migration": 72,
|
||||||
|
"Ctrl+C pressed in Terminal": 3,
|
||||||
|
"Database config error occurred, abandoning migration: %s ": 50,
|
||||||
|
"Database: %s": 48,
|
||||||
|
"Documentation: ": 27,
|
||||||
|
"Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.": 1,
|
||||||
|
"Enabling Sector Indexing in the database.": 57,
|
||||||
|
"Enter the Yugabyte database %s": 53,
|
||||||
|
"Enter the Yugabyte database host(s)": 51,
|
||||||
|
"Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)": 43,
|
||||||
|
"Enter the path to the configuration directory used by %s": 68,
|
||||||
|
"Error connecting to Yugabyte database: %s": 55,
|
||||||
|
"Error connecting to lotus node: %s %s": 9,
|
||||||
|
"Error encoding config.toml: %s": 58,
|
||||||
|
"Error expanding path: %s": 60,
|
||||||
|
"Error getting miner info: %s": 22,
|
||||||
|
"Error getting miner power: %s": 20,
|
||||||
|
"Error getting token: %s": 11,
|
||||||
|
"Error interpreting miner ID: %s: ID: %s": 36,
|
||||||
|
"Error marshalling message: %s": 21,
|
||||||
|
"Error reading filemode of config.toml: %s": 61,
|
||||||
|
"Error reading from database: %s. Aborting Migration.": 8,
|
||||||
|
"Error saving config to layer: %s. Aborting Migration": 12,
|
||||||
|
"Error sending message: %s": 24,
|
||||||
|
"Error sending message: Status %s, Message: ": 25,
|
||||||
|
"Error signing message: %s": 23,
|
||||||
|
"Error verifying sectors: %s": 37,
|
||||||
|
"Error writing config.toml: %s": 62,
|
||||||
|
"Filecoin %s channels: %s and %s": 30,
|
||||||
|
"Hint: I am someone running Curio on net.": 17,
|
||||||
|
"Host: %s": 44,
|
||||||
|
"Individual Data: Miner ID, Curio version, net (%s or %s). Signed.": 15,
|
||||||
|
"Layer %s created. ": 78,
|
||||||
|
"Lotus-Miner to Curio Migration.": 4,
|
||||||
|
"Message sent.": 26,
|
||||||
|
"Migrating config.toml to database.": 7,
|
||||||
|
"No host provided": 52,
|
||||||
|
"No path provided, abandoning migration ": 69,
|
||||||
|
"No value provided": 54,
|
||||||
|
"Nothing.": 18,
|
||||||
|
"Now shut down lotus-miner and move the systems to %s.": 39,
|
||||||
|
"One database can serve multiple miner IDs: Run a migration for each lotus-miner.": 33,
|
||||||
|
"Other": 67,
|
||||||
|
"Password: %s": 47,
|
||||||
|
"Please start (or restart) %s now that database credentials are in %s.": 34,
|
||||||
|
"Point your browser to your web GUI to complete setup with %s and advanced featues.": 32,
|
||||||
|
"Port: %s": 45,
|
||||||
|
"Press return to continue": 40,
|
||||||
|
"Press return to update %s with Yugabyte info. Backup the file now.": 59,
|
||||||
|
"Protocol Labs wants to improve the software you use. Tell the team you're using Curio.": 13,
|
||||||
|
"Read Miner Config": 73,
|
||||||
|
"Restart Lotus Miner. ": 63,
|
||||||
|
"Sectors verified. %d sector locations found.": 42,
|
||||||
|
"Select the location of your lotus-miner config directory?": 66,
|
||||||
|
"Select what you want to share with the Curio team.": 14,
|
||||||
|
"Start multiple Curio instances with the '%s' layer to redundancy.": 31,
|
||||||
|
"Step Complete: %s\n": 74,
|
||||||
|
"The '%s' layer stores common configuration. All curio instances can include it in their %s argument.": 28,
|
||||||
|
"The sectors are in the database. The database is ready for %s.": 38,
|
||||||
|
"This interactive tool migrates lotus-miner to Curio in 5 minutes.": 0,
|
||||||
|
"To run Curio: With machine or cgroup isolation, use the command (with example layer selection):": 80,
|
||||||
|
"To start, ensure your sealing pipeline is drained and shut-down lotus-miner.": 65,
|
||||||
|
"To work with the config: ": 79,
|
||||||
|
"Try the web interface with %s for further guided improvements.": 5,
|
||||||
|
"Use the arrow keys to navigate: ↓ ↑ → ← ": 2,
|
||||||
|
"Username: %s": 46,
|
||||||
|
"Waiting for %s to write sectors into Yugabyte.": 35,
|
||||||
|
"You can add other layers for per-machine configuration changes.": 29,
|
||||||
|
"You can now migrate your market node (%s), if applicable.": 6,
|
||||||
|
"could not get API info for FullNode: %w": 10,
|
||||||
|
}
|
||||||
|
|
||||||
|
var enIndex = []uint32{ // 82 elements
|
||||||
|
// Entry 0 - 1F
|
||||||
|
0x00000000, 0x00000042, 0x0000009b, 0x000000d0,
|
||||||
|
0x000000eb, 0x0000010b, 0x0000014d, 0x0000018a,
|
||||||
|
0x000001ad, 0x000001e5, 0x00000211, 0x0000023c,
|
||||||
|
0x00000257, 0x0000028f, 0x000002e6, 0x00000319,
|
||||||
|
0x00000361, 0x000003a0, 0x000003c9, 0x000003d2,
|
||||||
|
0x000003ec, 0x0000040d, 0x0000042e, 0x0000044e,
|
||||||
|
0x0000046b, 0x00000488, 0x000004bb, 0x000004c9,
|
||||||
|
0x000004dd, 0x00000548, 0x00000588, 0x000005b1,
|
||||||
|
// Entry 20 - 3F
|
||||||
|
0x000005f6, 0x0000064c, 0x0000069d, 0x000006e9,
|
||||||
|
0x0000071b, 0x00000749, 0x00000768, 0x000007aa,
|
||||||
|
0x000007e3, 0x000007fc, 0x00000810, 0x00000840,
|
||||||
|
0x000008a2, 0x000008ae, 0x000008ba, 0x000008ca,
|
||||||
|
0x000008da, 0x000008ea, 0x00000911, 0x00000952,
|
||||||
|
0x00000976, 0x00000987, 0x000009a9, 0x000009bb,
|
||||||
|
0x000009e8, 0x00000a12, 0x00000a3c, 0x00000a5e,
|
||||||
|
0x00000aa4, 0x00000ac0, 0x00000aed, 0x00000b0e,
|
||||||
|
// Entry 40 - 5F
|
||||||
|
0x00000b28, 0x00000b3e, 0x00000b8b, 0x00000bc5,
|
||||||
|
0x00000bcb, 0x00000c07, 0x00000c33, 0x00000c7c,
|
||||||
|
0x00000cbc, 0x00000d0d, 0x00000d1f, 0x00000d39,
|
||||||
|
0x00000d90, 0x00000e2d, 0x00000e84, 0x00000e9e,
|
||||||
|
0x00000ebc, 0x00000f1c,
|
||||||
|
} // Size: 352 bytes
|
||||||
|
|
||||||
|
const enData string = "" + // Size: 3868 bytes
|
||||||
|
"\x02This interactive tool migrates lotus-miner to Curio in 5 minutes." +
|
||||||
|
"\x02Each step needs your confirmation and can be reversed. Press Ctrl+C " +
|
||||||
|
"to exit at any time.\x04\x00\x01 0\x02Use the arrow keys to navigate: ↓ " +
|
||||||
|
"↑ → ←\x02Ctrl+C pressed in Terminal\x02Lotus-Miner to Curio Migration." +
|
||||||
|
"\x02Try the web interface with %[1]s for further guided improvements." +
|
||||||
|
"\x02You can now migrate your market node (%[1]s), if applicable.\x02Migr" +
|
||||||
|
"ating config.toml to database.\x02Error reading from database: %[1]s. Ab" +
|
||||||
|
"orting Migration.\x02Error connecting to lotus node: %[1]s %[2]s\x02coul" +
|
||||||
|
"d not get API info for FullNode: %[1]w\x02Error getting token: %[1]s\x02" +
|
||||||
|
"Error saving config to layer: %[1]s. Aborting Migration\x02Protocol Labs" +
|
||||||
|
" wants to improve the software you use. Tell the team you're using Curio" +
|
||||||
|
".\x02Select what you want to share with the Curio team.\x02Individual Da" +
|
||||||
|
"ta: Miner ID, Curio version, net (%[1]s or %[2]s). Signed.\x02Aggregate-" +
|
||||||
|
"Anonymous: version, net, and Miner power (bucketed).\x02Hint: I am someo" +
|
||||||
|
"ne running Curio on net.\x02Nothing.\x02Aborting remaining steps.\x02Err" +
|
||||||
|
"or getting miner power: %[1]s\x02Error marshalling message: %[1]s\x02Err" +
|
||||||
|
"or getting miner info: %[1]s\x02Error signing message: %[1]s\x02Error se" +
|
||||||
|
"nding message: %[1]s\x04\x00\x01 .\x02Error sending message: Status %[1]" +
|
||||||
|
"s, Message:\x02Message sent.\x04\x00\x01 \x0f\x02Documentation:\x02The '" +
|
||||||
|
"%[1]s' layer stores common configuration. All curio instances can includ" +
|
||||||
|
"e it in their %[2]s argument.\x02You can add other layers for per-machin" +
|
||||||
|
"e configuration changes.\x02Filecoin %[1]s channels: %[2]s and %[3]s\x02" +
|
||||||
|
"Start multiple Curio instances with the '%[1]s' layer to redundancy.\x02" +
|
||||||
|
"Point your browser to your web GUI to complete setup with %[1]s and adva" +
|
||||||
|
"nced featues.\x02One database can serve multiple miner IDs: Run a migrat" +
|
||||||
|
"ion for each lotus-miner.\x02Please start (or restart) %[1]s now that da" +
|
||||||
|
"tabase credentials are in %[2]s.\x02Waiting for %[1]s to write sectors i" +
|
||||||
|
"nto Yugabyte.\x02Error interpreting miner ID: %[1]s: ID: %[2]s\x02Error " +
|
||||||
|
"verifying sectors: %[1]s\x02The sectors are in the database. The databas" +
|
||||||
|
"e is ready for %[1]s.\x02Now shut down lotus-miner and move the systems " +
|
||||||
|
"to %[1]s.\x02Press return to continue\x02Aborting migration.\x02Sectors " +
|
||||||
|
"verified. %[1]d sector locations found.\x02Enter the info to connect to " +
|
||||||
|
"your Yugabyte database installation (https://download.yugabyte.com/)\x02" +
|
||||||
|
"Host: %[1]s\x02Port: %[1]s\x02Username: %[1]s\x02Password: %[1]s\x02Data" +
|
||||||
|
"base: %[1]s\x02Continue to connect and update schema.\x04\x00\x01 <\x02D" +
|
||||||
|
"atabase config error occurred, abandoning migration: %[1]s\x02Enter the " +
|
||||||
|
"Yugabyte database host(s)\x02No host provided\x02Enter the Yugabyte data" +
|
||||||
|
"base %[1]s\x02No value provided\x02Error connecting to Yugabyte database" +
|
||||||
|
": %[1]s\x02Connected to Yugabyte. Schema is current.\x02Enabling Sector " +
|
||||||
|
"Indexing in the database.\x02Error encoding config.toml: %[1]s\x02Press " +
|
||||||
|
"return to update %[1]s with Yugabyte info. Backup the file now.\x02Error" +
|
||||||
|
" expanding path: %[1]s\x02Error reading filemode of config.toml: %[1]s" +
|
||||||
|
"\x02Error writing config.toml: %[1]s\x04\x00\x01 \x15\x02Restart Lotus M" +
|
||||||
|
"iner.\x02Connected to Yugabyte\x02To start, ensure your sealing pipeline" +
|
||||||
|
" is drained and shut-down lotus-miner.\x02Select the location of your lo" +
|
||||||
|
"tus-miner config directory?\x02Other\x02Enter the path to the configurat" +
|
||||||
|
"ion directory used by %[1]s\x04\x00\x01 '\x02No path provided, abandonin" +
|
||||||
|
"g migration\x02Cannot read the config.toml file in the provided director" +
|
||||||
|
"y, Error: %[1]s\x02Could not create repo from directory: %[1]s. Aborting" +
|
||||||
|
" migration\x02Could not lock miner repo. Your miner must be stopped: %[1" +
|
||||||
|
"]s\x0a Aborting migration\x02Read Miner Config\x04\x00\x01\x0a\x15\x02St" +
|
||||||
|
"ep Complete: %[1]s\x02Configuration 'base' was updated to include this m" +
|
||||||
|
"iner's address and its wallet setup.\x02Compare the configurations %[1]s" +
|
||||||
|
" to %[2]s. Changes between the miner IDs other than wallet addreses shou" +
|
||||||
|
"ld be a new, minimal layer for runners that need it.\x02Configuration 'b" +
|
||||||
|
"ase' was created to include this miner's address and its wallet setup." +
|
||||||
|
"\x04\x00\x01 \x15\x02Layer %[1]s created.\x04\x00\x01 \x19\x02To work wi" +
|
||||||
|
"th the config:\x02To run Curio: With machine or cgroup isolation, use th" +
|
||||||
|
"e command (with example layer selection):"
|
||||||
|
|
||||||
|
var koIndex = []uint32{ // 82 elements
|
||||||
|
// Entry 0 - 1F
|
||||||
|
0x00000000, 0x0000004d, 0x000000c8, 0x0000010c,
|
||||||
|
0x0000012d, 0x00000150, 0x00000150, 0x000001a0,
|
||||||
|
0x000001da, 0x0000022f, 0x0000022f, 0x0000022f,
|
||||||
|
0x0000022f, 0x00000287, 0x00000315, 0x0000034e,
|
||||||
|
0x000003aa, 0x000003f4, 0x00000437, 0x00000452,
|
||||||
|
0x00000477, 0x000004b1, 0x000004e4, 0x0000051e,
|
||||||
|
0x00000548, 0x00000572, 0x000005b4, 0x000005d8,
|
||||||
|
0x000005e5, 0x0000066b, 0x000006bd, 0x000006bd,
|
||||||
|
// Entry 20 - 3F
|
||||||
|
0x000006bd, 0x0000071e, 0x0000071e, 0x0000071e,
|
||||||
|
0x00000762, 0x00000762, 0x00000789, 0x000007f4,
|
||||||
|
0x0000083e, 0x00000865, 0x00000880, 0x000008cf,
|
||||||
|
0x0000093d, 0x0000094e, 0x0000095c, 0x00000974,
|
||||||
|
0x00000988, 0x000009a2, 0x000009cc, 0x00000a2f,
|
||||||
|
0x00000a6b, 0x00000a95, 0x00000acd, 0x00000af1,
|
||||||
|
0x00000b45, 0x00000b86, 0x00000b86, 0x00000bcd,
|
||||||
|
0x00000c39, 0x00000c39, 0x00000c88, 0x00000cc6,
|
||||||
|
// Entry 40 - 5F
|
||||||
|
0x00000cea, 0x00000d00, 0x00000d6b, 0x00000dba,
|
||||||
|
0x00000dc1, 0x00000e09, 0x00000e5b, 0x00000eb5,
|
||||||
|
0x00000eb5, 0x00000eb5, 0x00000ecd, 0x00000ee7,
|
||||||
|
0x00000f51, 0x0000100b, 0x0000106f, 0x0000109e,
|
||||||
|
0x0000109e, 0x0000112a,
|
||||||
|
} // Size: 352 bytes
|
||||||
|
|
||||||
|
const koData string = "" + // Size: 4394 bytes
|
||||||
|
"\x02이 대화형 도구는 5분 안에 lotus-miner를 Curio로 이주합니다.\x02각 단계는 확인이 필요하며 되돌릴 수 있" +
|
||||||
|
"습니다. 언제든지 Ctrl+C를 눌러 종료할 수 있습니다.\x04\x00\x01 ?\x02화살표 키를 사용하여 이동하세요: ↓" +
|
||||||
|
" ↑ → ←\x02터미널에서 Ctrl+C가 눌림\x02Lotus-Miner에서 Curio로 이주.\x02해당하는 경우 이제 시장 " +
|
||||||
|
"노드를 이주할 수 있습니다 (%[1]s).\x02config.toml을 데이터베이스로 이주 중입니다.\x02데이터베이스에서 읽" +
|
||||||
|
"는 중 오류 발생: %[1]s. 마이그레이션 중단.\x02레이어에 구성을 저장하는 중 오류 발생: %[1]s. 마이그레이션 중" +
|
||||||
|
"단\x02Protocol Labs는 당신이 사용하는 소프트웨어를 개선하고 싶어합니다. Curio를 사용 중이라고 팀에 알려주세" +
|
||||||
|
"요.\x02Curio 팀과 공유하고 싶은 것을 선택하세요.\x02개별 데이터: 마이너 ID, Curio 버전, 네트워크 (%[" +
|
||||||
|
"1]s 또는 %[2]s). 서명됨.\x02집계-익명: 버전, 네트워크, 그리고 마이너 파워 (버킷).\x02힌트: 네트워크에서 C" +
|
||||||
|
"urio를 실행 중인 사람입니다.\x02아무것도 없습니다.\x02나머지 단계를 중단합니다.\x02마이너 파워를 가져오는 중 오류 " +
|
||||||
|
"발생: %[1]s\x02메시지를 마샬하는 중 오류 발생: %[1]s\x02마이너 정보를 가져오는 중 오류 발생: %[1]s" +
|
||||||
|
"\x02메시지 서명 중 오류 발생: %[1]s\x02메시지 전송 중 오류 발생: %[1]s\x04\x00\x01 =\x02메시지 " +
|
||||||
|
"전송 중 오류 발생: 상태 %[1]s, 메시지:\x02메시지가 전송되었습니다.\x04\x00\x01 \x08\x02문서:" +
|
||||||
|
"\x02'%[1]s' 레이어에는 공통 구성이 저장됩니다. 모든 Curio 인스턴스는 %[2]s 인수에 포함시킬 수 있습니다." +
|
||||||
|
"\x02기계별 구성 변경을 위해 다른 레이어를 추가할 수 있습니다.\x02브라우저를 웹 GUI로 이동하여 %[1]s 및 고급 기능" +
|
||||||
|
"으로 설정을 완료하세요.\x02%[1]s가 Yugabyte에 섹터를 기록하도록 대기 중입니다.\x02섹터 확인 중 오류 발생:" +
|
||||||
|
" %[1]s\x02섹터가 데이터베이스에 있습니다. 데이터베이스가 %[1]s를 위해 준비되었습니다.\x02이제 lotus-miner" +
|
||||||
|
"를 종료하고 시스템을 %[1]s로 이동하세요.\x02계속하려면 리턴을 누르세요\x02마이그레이션 중단.\x02섹터가 확인되었습" +
|
||||||
|
"니다. %[1]d개의 섹터 위치를 찾았습니다.\x02Yugabyte 데이터베이스 설치에 연결할 정보를 입력하십시오 (https" +
|
||||||
|
"://download.yugabyte.com/)\x02호스트: %[1]s\x02포트: %[1]s\x02사용자 이름: %[1]s" +
|
||||||
|
"\x02비밀번호: %[1]s\x02데이터베이스: %[1]s\x02계속 연결 및 스키마 업데이트.\x04\x00\x01 ^\x02데" +
|
||||||
|
"이터베이스 구성 오류가 발생하여 마이그레이션을 포기합니다: %[1]s\x02Yugabyte 데이터베이스 호스트를 입력하십시오" +
|
||||||
|
"\x02호스트가 제공되지 않았습니다\x02Yugabyte 데이터베이스 %[1]s을 입력하십시오\x02값이 제공되지 않았습니다" +
|
||||||
|
"\x02Yugabyte 데이터베이스에 연결하는 중 오류가 발생했습니다: %[1]s\x02Yugabyte에 연결되었습니다. 스키마가" +
|
||||||
|
" 현재입니다.\x02config.toml을 인코딩하는 중 오류가 발생했습니다: %[1]s\x02%[1]s을 Yugabyte 정보로" +
|
||||||
|
" 업데이트하려면 리턴을 누르세요. 지금 파일을 백업하세요.\x02config.toml의 파일 모드를 읽는 중 오류가 발생했습니다:" +
|
||||||
|
" %[1]s\x02config.toml을 쓰는 중 오류가 발생했습니다: %[1]s\x04\x00\x01 \x1f\x02로터스 마이" +
|
||||||
|
"너 재시작.\x02Yugabyte에 연결됨\x02시작하려면 밀봉 파이프라인이 비어 있고 lotus-miner가 종료되었는지 확" +
|
||||||
|
"인하세요.\x02로터스 마이너 구성 디렉토리의 위치를 선택하시겠습니까?\x02기타\x02%[1]s에서 사용하는 구성 디렉터리 " +
|
||||||
|
"경로를 입력하세요.\x04\x00\x01 M\x02경로가 제공되지 않았으므로 마이그레이션을 포기합니다\x02제공된 디렉토리에서" +
|
||||||
|
" config.toml 파일을 읽을 수 없습니다. 오류: %[1]s\x02마이너 구성 읽기\x04\x00\x01\x0a\x15" +
|
||||||
|
"\x02단계 완료: %[1]s\x02이 마이너의 주소와 지갑 설정을 포함하도록 구성 'base'가 업데이트되었습니다.\x02구성 " +
|
||||||
|
"%[1]s를 %[2]s과 비교하세요. 지갑 주소 이외의 마이너 ID 사이의 변경 사항은 필요한 실행자를 위한 새로운 최소한의 레이" +
|
||||||
|
"어여야 합니다.\x02이 마이너의 주소와 지갑 설정을 포함하도록 구성 'base'가 생성되었습니다.\x04\x00\x01 *" +
|
||||||
|
"\x02레이어 %[1]s가 생성되었습니다.\x02Curio를 실행하려면: 기계 또는 cgroup 격리를 사용하여 다음 명령을 사용" +
|
||||||
|
"하세요 (예제 레이어 선택과 함께):"
|
||||||
|
|
||||||
|
var zhIndex = []uint32{ // 82 elements
|
||||||
|
// Entry 0 - 1F
|
||||||
|
0x00000000, 0x00000048, 0x00000097, 0x000000ca,
|
||||||
|
0x000000e3, 0x00000100, 0x00000100, 0x00000141,
|
||||||
|
0x0000016b, 0x000001a4, 0x000001a4, 0x000001a4,
|
||||||
|
0x000001a4, 0x000001dd, 0x0000022f, 0x0000025c,
|
||||||
|
0x000002a9, 0x000002e7, 0x00000317, 0x00000321,
|
||||||
|
0x00000337, 0x0000035b, 0x00000379, 0x0000039d,
|
||||||
|
0x000003bb, 0x000003d9, 0x0000040e, 0x00000421,
|
||||||
|
0x00000430, 0x0000048a, 0x000004c7, 0x000004c7,
|
||||||
|
// Entry 20 - 3F
|
||||||
|
0x000004c7, 0x0000051e, 0x0000051e, 0x0000051e,
|
||||||
|
0x00000544, 0x00000544, 0x00000562, 0x0000059e,
|
||||||
|
0x000005d0, 0x000005e0, 0x000005f0, 0x00000623,
|
||||||
|
0x0000067d, 0x0000068c, 0x0000069b, 0x000006ad,
|
||||||
|
0x000006bc, 0x000006ce, 0x000006ed, 0x00000725,
|
||||||
|
0x0000074a, 0x0000075a, 0x00000778, 0x00000785,
|
||||||
|
0x000007b1, 0x000007de, 0x000007de, 0x00000801,
|
||||||
|
0x00000845, 0x00000845, 0x00000874, 0x00000897,
|
||||||
|
// Entry 40 - 5F
|
||||||
|
0x000008b7, 0x000008cc, 0x00000917, 0x00000947,
|
||||||
|
0x0000094e, 0x00000978, 0x0000099c, 0x000009e0,
|
||||||
|
0x000009e0, 0x000009e0, 0x000009f3, 0x00000a0d,
|
||||||
|
0x00000a59, 0x00000adb, 0x00000b27, 0x00000b41,
|
||||||
|
0x00000b41, 0x00000b98,
|
||||||
|
} // Size: 352 bytes
|
||||||
|
|
||||||
|
const zhData string = "" + // Size: 2968 bytes
|
||||||
|
"\x02这个交互式工具可以在5分钟内将lotus-miner迁移到Curio。\x02每一步都需要您的确认,并且可以撤销。随时按Ctrl+C退出" +
|
||||||
|
"。\x04\x00\x01 .\x02使用箭头键进行导航:↓ ↑ → ←\x02在终端中按下Ctrl+C\x02Lotus-Miner到Cu" +
|
||||||
|
"rio迁移。\x02如果适用,您现在可以迁移您的市场节点(%[1]s)。\x02正在将config.toml迁移到数据库。\x02读取数据库时出" +
|
||||||
|
"错:%[1]s。正在中止迁移。\x02保存配置到层时出错:%[1]s。正在中止迁移\x02Protocol Labs希望改进您使用的软件。告" +
|
||||||
|
"诉团队您正在使用Curio。\x02选择您想与Curio团队分享的内容。\x02个人数据:矿工ID、Curio版本、网络(%[1]s或%[2" +
|
||||||
|
"]s)。已签名。\x02聚合-匿名:版本、网络和矿工功率(分桶)。\x02提示:我是在网络上运行Curio的人。\x02没有。\x02中止剩余步" +
|
||||||
|
"骤。\x02获取矿工功率时出错:%[1]s\x02整理消息时出错:%[1]s\x02获取矿工信息时出错:%[1]s\x02签署消息时出错:%" +
|
||||||
|
"[1]s\x02发送消息时出错:%[1]s\x04\x00\x01 0\x02发送消息时出错:状态%[1]s,消息:\x02消息已发送。\x04" +
|
||||||
|
"\x00\x01 \x0a\x02文档:\x02'%[1]s'层存储通用配置。所有Curio实例都可以在其%[2]s参数中包含它。\x02您可以" +
|
||||||
|
"添加其他层进行每台机器的配置更改。\x02将您的浏览器指向您的网络GUI,以使用%[1]s和高级功能完成设置。\x02等待%[1]s将扇区写" +
|
||||||
|
"入Yugabyte。\x02验证扇区时出错:%[1]s\x02扇区在数据库中。数据库已准备好用于%[1]s。\x02现在关闭lotus-mi" +
|
||||||
|
"ner并将系统移至%[1]s。\x02按回车继续\x02中止迁移。\x02扇区已验证。发现了%[1]d个扇区位置。\x02输入连接到您的Yuga" +
|
||||||
|
"byte数据库安装的信息(https://download.yugabyte.com/)\x02主机:%[1]s\x02端口:%[1]s\x02" +
|
||||||
|
"用户名:%[1]s\x02密码:%[1]s\x02数据库:%[1]s\x02继续连接和更新架构。\x04\x00\x01 3\x02发生数据" +
|
||||||
|
"库配置错误,放弃迁移:%[1]s\x02输入Yugabyte数据库主机(S)\x02未提供主机\x02输入Yugabyte数据库 %[1]s" +
|
||||||
|
"\x02未提供值\x02连接到Yugabyte数据库时出错:%[1]s\x02已连接到Yugabyte。模式是当前的。\x02编码config." +
|
||||||
|
"toml时出错:%[1]s\x02按回车更新%[1]s以获取Yugabyte信息。现在备份文件。\x02读取config.toml文件模式时出错" +
|
||||||
|
":%[1]s\x02写入config.toml时出错:%[1]s\x04\x00\x01 \x1b\x02重新启动Lotus Miner。" +
|
||||||
|
"\x02已连接到Yugabyte\x02开始之前,请确保您的密封管道已排空并关闭lotus-miner。\x02选择您的lotus-miner配" +
|
||||||
|
"置目录的位置?\x02其他\x02输入%[1]s使用的配置目录的路径\x04\x00\x01 \x1f\x02未提供路径,放弃迁移\x02无" +
|
||||||
|
"法读取提供的目录中的config.toml文件,错误:%[1]s\x02读取矿工配置\x04\x00\x01\x0a\x15\x02步骤完成" +
|
||||||
|
":%[1]s\x02配置'base'已更新,包含了这个矿工的地址和其钱包设置。\x02比较配置%[1]s和%[2]s。矿工ID之间除了钱包地" +
|
||||||
|
"址的变化应该是需要的运行者的一个新的、最小的层。\x02配置'base'已创建,包括了这个矿工的地址和其钱包设置。\x04\x00\x01 " +
|
||||||
|
"\x15\x02层%[1]s已创建。\x02运行Curio:使用机器或cgroup隔离,使用命令(附带示例层选择):"
|
||||||
|
|
||||||
|
// Total table size 12286 bytes (11KiB); checksum: 15B16994
|
82
cmd/curio/internal/translations/knowns/main.go
Normal file
82
cmd/curio/internal/translations/knowns/main.go
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
|
||||||
|
"github.com/samber/lo"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
for _, arg := range os.Args {
|
||||||
|
handleKnowns(arg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleKnowns(pathStart string) {
|
||||||
|
outpath := path.Join(pathStart, "out.gotext.json")
|
||||||
|
b, err := os.ReadFile(outpath)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("cannot open "+outpath+":", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
type TMsg struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Translation string `json:"translation"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
Placeholder json.RawMessage `json:"placeholder"`
|
||||||
|
}
|
||||||
|
type Dataformat struct {
|
||||||
|
Language string `json:"language"`
|
||||||
|
Messages []TMsg `json:"messages"`
|
||||||
|
}
|
||||||
|
var outData Dataformat
|
||||||
|
err = json.NewDecoder(bytes.NewBuffer(b)).Decode(&outData)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("cannot decode "+outpath+":", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
f, err := os.Open(path.Join(pathStart, "messages.gotext.json"))
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("cannot open "+path.Join(pathStart, "messages.gotext.json")+":", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer func() { _ = f.Close() }()
|
||||||
|
|
||||||
|
var msgData Dataformat
|
||||||
|
err = json.NewDecoder(f).Decode(&msgData)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("cannot decode "+path.Join(pathStart, "messages.gotext.json")+":", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
knowns := map[string]string{}
|
||||||
|
for _, msg := range msgData.Messages {
|
||||||
|
knowns[msg.ID] = msg.Translation
|
||||||
|
}
|
||||||
|
|
||||||
|
toTranslate := lo.Filter(outData.Messages, func(msg TMsg, _ int) bool {
|
||||||
|
_, ok := knowns[msg.ID]
|
||||||
|
return !ok
|
||||||
|
})
|
||||||
|
|
||||||
|
outData.Messages = toTranslate // drop the "done" messages
|
||||||
|
var outJSON bytes.Buffer
|
||||||
|
enc := json.NewEncoder(&outJSON)
|
||||||
|
enc.SetIndent(" ", " ")
|
||||||
|
err = enc.Encode(outData)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("cannot encode "+outpath+":", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = os.WriteFile(outpath, outJSON.Bytes(), 0644)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("cannot write "+outpath+":", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println("rearranged successfully")
|
||||||
|
}
|
1104
cmd/curio/internal/translations/locales/en/out.gotext.json
Normal file
1104
cmd/curio/internal/translations/locales/en/out.gotext.json
Normal file
File diff suppressed because it is too large
Load Diff
704
cmd/curio/internal/translations/locales/ko/messages.gotext.json
Normal file
704
cmd/curio/internal/translations/locales/ko/messages.gotext.json
Normal file
@ -0,0 +1,704 @@
|
|||||||
|
{
|
||||||
|
"language": "ko",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"id": "This interactive tool will walk you through migration of Curio.\nPress Ctrl+C to exit at any time.",
|
||||||
|
"message": "This interactive tool will walk you through migration of Curio.\nPress Ctrl+C to exit at any time.",
|
||||||
|
"translation": "이 대화형 도구는 Curio 마이그레이션 과정을 안내합니다.\n언제든지 종료하려면 Ctrl+C를 누르십시오."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "This tool confirms each action it does.",
|
||||||
|
"message": "This tool confirms each action it does.",
|
||||||
|
"translation": "이 도구는 수행하는 각 작업을 확인합니다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Ctrl+C pressed in Terminal",
|
||||||
|
"message": "Ctrl+C pressed in Terminal",
|
||||||
|
"translation": "터미널에서 Ctrl+C가 눌림"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Verifying Sectors exist in Yugabyte.",
|
||||||
|
"message": "Verifying Sectors exist in Yugabyte.",
|
||||||
|
"translation": "Yugabyte에 섹터가 존재하는지 확인 중."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error verifying sectors: {Error}",
|
||||||
|
"message": "Error verifying sectors: {Error}",
|
||||||
|
"translation": "섹터 확인 중 오류 발생: {Error}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Error",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "err.Error()"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Sectors verified. {I} sectors found.",
|
||||||
|
"message": "Sectors verified. {I} sectors found.",
|
||||||
|
"translation": "섹터가 확인되었습니다. {I}개의 섹터가 발견되었습니다.",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "I",
|
||||||
|
"string": "%[1]d",
|
||||||
|
"type": "[]int",
|
||||||
|
"underlyingType": "[]int",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "i"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Never remove the database info from the config.toml for lotus-miner as it avoids double PoSt.",
|
||||||
|
"message": "Never remove the database info from the config.toml for lotus-miner as it avoids double PoSt.",
|
||||||
|
"translation": "로터스 마이너의 config.toml에서 데이터베이스 정보를 제거하지 마십시오. 두 번의 PoSt를 피하기 위함입니다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)",
|
||||||
|
"message": "Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)",
|
||||||
|
"translation": "Yugabyte 데이터베이스 설치에 연결할 정보를 입력하십시오 (https://download.yugabyte.com/)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Host: {Hosts_}",
|
||||||
|
"message": "Host: {Hosts_}",
|
||||||
|
"translation": "호스트: {Hosts_}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Hosts_",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "strings.Join(harmonycfg.Hosts, \",\")"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Port: {Port}",
|
||||||
|
"message": "Port: {Port}",
|
||||||
|
"translation": "포트: {Port}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Port",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "harmonycfg.Port"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Username: {Username}",
|
||||||
|
"message": "Username: {Username}",
|
||||||
|
"translation": "사용자 이름: {Username}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Username",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "harmonycfg.Username"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Password: {Password}",
|
||||||
|
"message": "Password: {Password}",
|
||||||
|
"translation": "비밀번호: {Password}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Password",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "harmonycfg.Password"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Database: {Database}",
|
||||||
|
"message": "Database: {Database}",
|
||||||
|
"translation": "데이터베이스: {Database}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Database",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "harmonycfg.Database"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Continue to connect and update schema.",
|
||||||
|
"message": "Continue to connect and update schema.",
|
||||||
|
"translation": "계속 연결 및 스키마 업데이트."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Database config error occurred, abandoning migration: {Error}",
|
||||||
|
"message": "Database config error occurred, abandoning migration: {Error}",
|
||||||
|
"translation": "데이터베이스 구성 오류가 발생하여 마이그레이션을 포기합니다: {Error}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Error",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "err.Error()"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Enter the Yugabyte database host(s)",
|
||||||
|
"message": "Enter the Yugabyte database host(s)",
|
||||||
|
"translation": "Yugabyte 데이터베이스 호스트를 입력하십시오"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "No host provided",
|
||||||
|
"message": "No host provided",
|
||||||
|
"translation": "호스트가 제공되지 않았습니다"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Enter the Yugabyte database {Stringport_username_password_databasei_1}",
|
||||||
|
"message": "Enter the Yugabyte database {Stringport_username_password_databasei_1}",
|
||||||
|
"translation": "Yugabyte 데이터베이스 {Stringport_username_password_databasei_1}을 입력하십시오",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Stringport_username_password_databasei_1",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "[]string{\"port\", \"username\", \"password\", \"database\"}[i-1]"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "No value provided",
|
||||||
|
"message": "No value provided",
|
||||||
|
"translation": "값이 제공되지 않았습니다"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error connecting to Yugabyte database: {Error}",
|
||||||
|
"message": "Error connecting to Yugabyte database: {Error}",
|
||||||
|
"translation": "Yugabyte 데이터베이스에 연결하는 중 오류가 발생했습니다: {Error}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Error",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "err.Error()"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Connected to Yugabyte. Schema is current.",
|
||||||
|
"message": "Connected to Yugabyte. Schema is current.",
|
||||||
|
"translation": "Yugabyte에 연결되었습니다. 스키마가 현재입니다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error encoding config.toml: {Error}",
|
||||||
|
"message": "Error encoding config.toml: {Error}",
|
||||||
|
"translation": "config.toml을 인코딩하는 중 오류가 발생했습니다: {Error}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Error",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "err.Error()"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error reading filemode of config.toml: {Error}",
|
||||||
|
"message": "Error reading filemode of config.toml: {Error}",
|
||||||
|
"translation": "config.toml의 파일 모드를 읽는 중 오류가 발생했습니다: {Error}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Error",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "err.Error()"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error writing config.toml: {Error}",
|
||||||
|
"message": "Error writing config.toml: {Error}",
|
||||||
|
"translation": "config.toml을 쓰는 중 오류가 발생했습니다: {Error}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Error",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "err.Error()"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Restart Lotus Miner.",
|
||||||
|
"message": "Restart Lotus Miner.",
|
||||||
|
"translation": "로터스 마이너 재시작."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Connected to Yugabyte",
|
||||||
|
"message": "Connected to Yugabyte",
|
||||||
|
"translation": "Yugabyte에 연결됨"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Select the location of your lotus-miner config directory?",
|
||||||
|
"message": "Select the location of your lotus-miner config directory?",
|
||||||
|
"translation": "로터스 마이너 구성 디렉토리의 위치를 선택하시겠습니까?"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Other",
|
||||||
|
"message": "Other",
|
||||||
|
"translation": "기타"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Enter the path to the configuration directory used by lotus-miner",
|
||||||
|
"message": "Enter the path to the configuration directory used by lotus-miner",
|
||||||
|
"translation": "로터스 마이너에서 사용하는 구성 디렉토리의 경로를 입력하십시오"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "No path provided, abandoning migration",
|
||||||
|
"message": "No path provided, abandoning migration",
|
||||||
|
"translation": "경로가 제공되지 않았으므로 마이그레이션을 포기합니다"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Cannot read the config.toml file in the provided directory, Error: {Error}",
|
||||||
|
"message": "Cannot read the config.toml file in the provided directory, Error: {Error}",
|
||||||
|
"translation": "제공된 디렉토리에서 config.toml 파일을 읽을 수 없습니다. 오류: {Error}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Error",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "err.Error()"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Read Miner Config",
|
||||||
|
"message": "Read Miner Config",
|
||||||
|
"translation": "마이너 구성 읽기"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Completed Step: {Step}",
|
||||||
|
"message": "Completed Step: {Step}",
|
||||||
|
"translation": "단계 완료: {Step}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Step",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "step"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "This interactive tool migrates lotus-miner to Curio in 5 minutes.",
|
||||||
|
"translation": "이 대화형 도구는 5분 안에 lotus-miner를 Curio로 이주합니다.",
|
||||||
|
"message": "This interactive tool migrates lotus-miner to Curio in 5 minutes.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.",
|
||||||
|
"translation": "각 단계는 확인이 필요하며 되돌릴 수 있습니다. 언제든지 Ctrl+C를 눌러 종료할 수 있습니다.",
|
||||||
|
"message": "Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Use the arrow keys to navigate: ↓ ↑ → ←",
|
||||||
|
"translation": "화살표 키를 사용하여 이동하세요: ↓ ↑ → ←",
|
||||||
|
"message": "Use the arrow keys to navigate: ↓ ↑ → ←",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Lotus-Miner to Curio Migration.",
|
||||||
|
"translation": "Lotus-Miner에서 Curio로 이주.",
|
||||||
|
"message": "Lotus-Miner to Curio Migration.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Try the web interface with for further guided improvements.",
|
||||||
|
"translation": "더 나은 안내를 위해 웹 인터페이스를 사용해보세요.",
|
||||||
|
"message": "Try the web interface with for further guided improvements.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "You can now migrate your market node ({Boost}), if applicable.",
|
||||||
|
"translation": "해당하는 경우 이제 시장 노드를 이주할 수 있습니다 ({Boost}).",
|
||||||
|
"message": "You can now migrate your market node ({Boost}), if applicable.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Migrating config.toml to database.",
|
||||||
|
"translation": "config.toml을 데이터베이스로 이주 중입니다.",
|
||||||
|
"message": "Migrating config.toml to database.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error reading from database: {Error}. Aborting Migration.",
|
||||||
|
"translation": "데이터베이스에서 읽는 중 오류 발생: {Error}. 마이그레이션 중단.",
|
||||||
|
"message": "Error reading from database: {Error}. Aborting Migration.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cannot read API: {Error}. Aborting Migration",
|
||||||
|
"translation": "API를 읽을 수 없습니다: {Error}. 마이그레이션 중단",
|
||||||
|
"message": "cannot read API: {Error}. Aborting Migration",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error saving config to layer: {Error}. Aborting Migration",
|
||||||
|
"translation": "레이어에 구성을 저장하는 중 오류 발생: {Error}. 마이그레이션 중단",
|
||||||
|
"message": "Error saving config to layer: {Error}. Aborting Migration",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Protocol Labs wants to improve the software you use. Tell the team you're using Curio.",
|
||||||
|
"translation": "Protocol Labs는 당신이 사용하는 소프트웨어를 개선하고 싶어합니다. Curio를 사용 중이라고 팀에 알려주세요.",
|
||||||
|
"message": "Protocol Labs wants to improve the software you use. Tell the team you're using Curio.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Select what you want to share with the Curio team.",
|
||||||
|
"translation": "Curio 팀과 공유하고 싶은 것을 선택하세요.",
|
||||||
|
"message": "Select what you want to share with the Curio team.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Individual Data: Miner ID, Curio version, net ({Mainnet} or {Testnet}). Signed.",
|
||||||
|
"translation": "개별 데이터: 마이너 ID, Curio 버전, 네트워크 ({Mainnet} 또는 {Testnet}). 서명됨.",
|
||||||
|
"message": "Individual Data: Miner ID, Curio version, net ({Mainnet} or {Testnet}). Signed.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Aggregate-Anonymous: version, net, and Miner power (bucketed).",
|
||||||
|
"translation": "집계-익명: 버전, 네트워크, 그리고 마이너 파워 (버킷).",
|
||||||
|
"message": "Aggregate-Anonymous: version, net, and Miner power (bucketed).",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Hint: I am someone running Curio on net.",
|
||||||
|
"translation": "힌트: 네트워크에서 Curio를 실행 중인 사람입니다.",
|
||||||
|
"message": "Hint: I am someone running Curio on net.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Nothing.",
|
||||||
|
"translation": "아무것도 없습니다.",
|
||||||
|
"message": "Nothing.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Aborting remaining steps.",
|
||||||
|
"translation": "나머지 단계를 중단합니다.",
|
||||||
|
"message": "Aborting remaining steps.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error connecting to lotus node: {Error}",
|
||||||
|
"translation": "로터스 노드에 연결하는 중 오류 발생: {Error}",
|
||||||
|
"message": "Error connecting to lotus node: {Error}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error getting miner power: {Error}",
|
||||||
|
"translation": "마이너 파워를 가져오는 중 오류 발생: {Error}",
|
||||||
|
"message": "Error getting miner power: {Error}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error marshalling message: {Error}",
|
||||||
|
"translation": "메시지를 마샬하는 중 오류 발생: {Error}",
|
||||||
|
"message": "Error marshalling message: {Error}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error getting miner info: {Error}",
|
||||||
|
"translation": "마이너 정보를 가져오는 중 오류 발생: {Error}",
|
||||||
|
"message": "Error getting miner info: {Error}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error signing message: {Error}",
|
||||||
|
"translation": "메시지 서명 중 오류 발생: {Error}",
|
||||||
|
"message": "Error signing message: {Error}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error sending message: {Error}",
|
||||||
|
"translation": "메시지 전송 중 오류 발생: {Error}",
|
||||||
|
"message": "Error sending message: {Error}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error sending message: Status {Status}, Message:",
|
||||||
|
"translation": "메시지 전송 중 오류 발생: 상태 {Status}, 메시지:",
|
||||||
|
"message": "Error sending message: Status {Status}, Message:",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Message sent.",
|
||||||
|
"translation": "메시지가 전송되었습니다.",
|
||||||
|
"message": "Message sent.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Documentation:",
|
||||||
|
"translation": "문서:",
|
||||||
|
"message": "Documentation:",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "The '{Base}' layer stores common configuration. All curio instances can include it in their {__layers} argument.",
|
||||||
|
"translation": "'{Base}' 레이어에는 공통 구성이 저장됩니다. 모든 Curio 인스턴스는 {__layers} 인수에 포함시킬 수 있습니다.",
|
||||||
|
"message": "The '{Base}' layer stores common configuration. All curio instances can include it in their {__layers} argument.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "You can add other layers for per-machine configuration changes.",
|
||||||
|
"translation": "기계별 구성 변경을 위해 다른 레이어를 추가할 수 있습니다.",
|
||||||
|
"message": "You can add other layers for per-machine configuration changes.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Join {Fil_curio_help} in Filecoin {Slack} for help.",
|
||||||
|
"translation": "도움을 위해 Filecoin {Slack}의 {Fil_curio_help}에 가입하세요.",
|
||||||
|
"message": "Join {Fil_curio_help} in Filecoin {Slack} for help.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Join {Fil_curio_dev} in Filecoin {Slack} to follow development and feedback!",
|
||||||
|
"translation": "개발과 피드백을 따르려면 Filecoin {Slack}의 {Fil_curio_dev}에 가입하세요!",
|
||||||
|
"message": "Join {Fil_curio_dev} in Filecoin {Slack} to follow development and feedback!",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Want PoST redundancy? Run many Curio instances with the '{Post}' layer.",
|
||||||
|
"translation": "PoST 중복성이 필요하신가요? '{Post}' 레이어와 함께 여러 Curio 인스턴스를 실행하세요.",
|
||||||
|
"message": "Want PoST redundancy? Run many Curio instances with the '{Post}' layer.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Point your browser to your web GUI to complete setup with {Boost} and advanced featues.",
|
||||||
|
"translation": "브라우저를 웹 GUI로 이동하여 {Boost} 및 고급 기능으로 설정을 완료하세요.",
|
||||||
|
"message": "Point your browser to your web GUI to complete setup with {Boost} and advanced featues.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "For SPs with multiple Miner IDs, run 1 migration per lotus-miner all to the same 1 database. The cluster will serve all Miner IDs.",
|
||||||
|
"translation": "여러 마이너 ID가 있는 SP의 경우 각 lotus-miner당 1회 마이그레이션을 동일한 1개의 데이터베이스로 모두 실행하세요. 클러스터는 모든 마이너 ID를 제공합니다.",
|
||||||
|
"message": "For SPs with multiple Miner IDs, run 1 migration per lotus-miner all to the same 1 database. The cluster will serve all Miner IDs.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Please start {Lotus_miner} now that database credentials are in {Toml}.",
|
||||||
|
"translation": "데이터베이스 자격 증명이 {Toml}에 있으므로 이제 {Lotus_miner}를 시작하세요.",
|
||||||
|
"message": "Please start {Lotus_miner} now that database credentials are in {Toml}.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Waiting for {Lotus_miner} to write sectors into Yugabyte.",
|
||||||
|
"translation": "{Lotus_miner}가 Yugabyte에 섹터를 기록하도록 대기 중입니다.",
|
||||||
|
"message": "Waiting for {Lotus_miner} to write sectors into Yugabyte.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "The sectors are in the database. The database is ready for {Curio}.",
|
||||||
|
"translation": "섹터가 데이터베이스에 있습니다. 데이터베이스가 {Curio}를 위해 준비되었습니다.",
|
||||||
|
"message": "The sectors are in the database. The database is ready for {Curio}.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Now shut down lotus-miner and move the systems to {Curio}.",
|
||||||
|
"translation": "이제 lotus-miner를 종료하고 시스템을 {Curio}로 이동하세요.",
|
||||||
|
"message": "Now shut down lotus-miner and move the systems to {Curio}.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Press return to continue",
|
||||||
|
"translation": "계속하려면 리턴을 누르세요",
|
||||||
|
"message": "Press return to continue",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Aborting migration.",
|
||||||
|
"translation": "마이그레이션 중단.",
|
||||||
|
"message": "Aborting migration.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Sectors verified. {I} sector locations found.",
|
||||||
|
"translation": "섹터가 확인되었습니다. {I}개의 섹터 위치를 찾았습니다.",
|
||||||
|
"message": "Sectors verified. {I} sector locations found.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Press return to update {Toml} with Yugabyte info. Backup the file now.",
|
||||||
|
"translation": "{Toml}을 Yugabyte 정보로 업데이트하려면 리턴을 누르세요. 지금 파일을 백업하세요.",
|
||||||
|
"message": "Press return to update {Toml} with Yugabyte info. Backup the file now.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "To start, ensure your sealing pipeline is drained and shut-down lotus-miner.",
|
||||||
|
"translation": "시작하려면 밀봉 파이프라인이 비어 있고 lotus-miner가 종료되었는지 확인하세요.",
|
||||||
|
"message": "To start, ensure your sealing pipeline is drained and shut-down lotus-miner.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Enter the path to the configuration directory used by {Lotus_miner}",
|
||||||
|
"translation": "{Lotus_miner}에서 사용하는 구성 디렉터리 경로를 입력하세요.",
|
||||||
|
"message": "Enter the path to the configuration directory used by {Lotus_miner}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Step Complete: {Step}",
|
||||||
|
"translation": "단계 완료: {Step}",
|
||||||
|
"message": "Step Complete: {Step}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Configuration 'base' was updated to include this miner's address and its wallet setup.",
|
||||||
|
"translation": "이 마이너의 주소와 지갑 설정을 포함하도록 구성 'base'가 업데이트되었습니다.",
|
||||||
|
"message": "Configuration 'base' was updated to include this miner's address and its wallet setup.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Compare the configurations {Base} to {MinerAddresses0}. Changes between the miner IDs other than wallet addreses should be a new, minimal layer for runners that need it.",
|
||||||
|
"translation": "구성 {Base}를 {MinerAddresses0}과 비교하세요. 지갑 주소 이외의 마이너 ID 사이의 변경 사항은 필요한 실행자를 위한 새로운 최소한의 레이어여야 합니다.",
|
||||||
|
"message": "Compare the configurations {Base} to {MinerAddresses0}. Changes between the miner IDs other than wallet addreses should be a new, minimal layer for runners that need it.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Configuration 'base' was created to include this miner's address and its wallet setup.",
|
||||||
|
"translation": "이 마이너의 주소와 지갑 설정을 포함하도록 구성 'base'가 생성되었습니다.",
|
||||||
|
"message": "Configuration 'base' was created to include this miner's address and its wallet setup.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Layer {LayerName} created.",
|
||||||
|
"translation": "레이어 {LayerName}가 생성되었습니다.",
|
||||||
|
"message": "Layer {LayerName} created.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "To work with the config: \\n",
|
||||||
|
"translation": "구성을 사용하려면: \\n",
|
||||||
|
"message": "To work with the config: \\n",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "To run Curio: With machine or cgroup isolation, use the command (with example layer selection):",
|
||||||
|
"translation": "Curio를 실행하려면: 기계 또는 cgroup 격리를 사용하여 다음 명령을 사용하세요 (예제 레이어 선택과 함께):",
|
||||||
|
"message": "To run Curio: With machine or cgroup isolation, use the command (with example layer selection):",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Try the web interface with {__layersgui} for further guided improvements.",
|
||||||
|
"translation": "더 많은 안내를 위해 {__layersgui}를 사용하여 웹 인터페이스를 시도하세요.",
|
||||||
|
"message": "Try the web interface with {__layersgui} for further guided improvements.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error connecting to lotus node: {Error} {Error_1}",
|
||||||
|
"translation": "lotus 노드에 연결하는 중 오류 발생: {Error} {Error_1}",
|
||||||
|
"message": "Error connecting to lotus node: {Error} {Error_1}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "could not get API info for FullNode: {Err}",
|
||||||
|
"translation": "FullNode의 API 정보를 가져올 수 없습니다: {Err}",
|
||||||
|
"message": "could not get API info for FullNode: {Err}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error getting token: {Error}",
|
||||||
|
"translation": "토큰을 가져오는 중 오류 발생: {Error}",
|
||||||
|
"message": "Error getting token: {Error}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Filecoin {Slack} channels: {Fil_curio_help} and {Fil_curio_dev}",
|
||||||
|
"translation": "Filecoin {Slack} 채널: {Fil_curio_help} 및 {Fil_curio_dev}",
|
||||||
|
"message": "Filecoin {Slack} channels: {Fil_curio_help} and {Fil_curio_dev}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Start multiple Curio instances with the '{Post}' layer to redundancy.",
|
||||||
|
"translation": "'{Post}' 레이어로 여러 Curio 인스턴스를 시작하여 중복성을 확보하세요.",
|
||||||
|
"message": "Start multiple Curio instances with the '{Post}' layer to redundancy.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "One database can serve multiple miner IDs: Run a migration for each lotus-miner.",
|
||||||
|
"translation": "한 개의 데이터베이스는 여러 광부 ID를 제공할 수 있습니다: 각 lotus-miner에 대해 마이그레이션을 실행하세요.",
|
||||||
|
"message": "One database can serve multiple miner IDs: Run a migration for each lotus-miner.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Please start (or restart) {Lotus_miner} now that database credentials are in {Toml}.",
|
||||||
|
"translation": "데이터베이스 자격 증명이 {Toml}에 입력되었으므로 지금 {Lotus_miner}을 시작하거나 다시 시작하세요.",
|
||||||
|
"message": "Please start (or restart) {Lotus_miner} now that database credentials are in {Toml}.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error interpreting miner ID: {Error}: ID: {String}",
|
||||||
|
"translation": "광부 ID를 해석하는 중 오류 발생: {Error}: ID: {String}",
|
||||||
|
"message": "Error interpreting miner ID: {Error}: ID: {String}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Enabling Sector Indexing in the database.",
|
||||||
|
"translation": "데이터베이스에서 Sector Indexing을 활성화합니다.",
|
||||||
|
"message": "Enabling Sector Indexing in the database.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error expanding path: {Error}",
|
||||||
|
"translation": "경로를 확장하는 중 오류 발생: {Error}",
|
||||||
|
"message": "Error expanding path: {Error}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Could not create repo from directory: {Error}. Aborting migration",
|
||||||
|
"translation": "디렉토리에서 저장소를 생성할 수 없습니다: {Error}. 마이그레이션을 중단합니다.",
|
||||||
|
"message": "Could not create repo from directory: {Error}. Aborting migration",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Could not lock miner repo. Your miner must be stopped: {Error}\n Aborting migration",
|
||||||
|
"translation": "광부 저장소를 잠금 해제할 수 없습니다. 귀하의 광부를 중지해야 합니다: {Error}\n 마이그레이션을 중단합니다.",
|
||||||
|
"message": "Could not lock miner repo. Your miner must be stopped: {Error}\n Aborting migration",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "To work with the config:",
|
||||||
|
"translation": "구성 파일을 사용하려면:",
|
||||||
|
"message": "To work with the config:",
|
||||||
|
"placeholder": null
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
89
cmd/curio/internal/translations/locales/ko/out.gotext.json
Normal file
89
cmd/curio/internal/translations/locales/ko/out.gotext.json
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
{
|
||||||
|
"language": "ko",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"id": "Try the web interface with {__layersgui} for further guided improvements.",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Try the web interface with {__layersgui} for further guided improvements.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error connecting to lotus node: {Error} {Error_1}",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Error connecting to lotus node: {Error} {Error_1}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "could not get API info for FullNode: {Err}",
|
||||||
|
"translation": "",
|
||||||
|
"message": "could not get API info for FullNode: {Err}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error getting token: {Error}",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Error getting token: {Error}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Filecoin {Slack} channels: {Fil_curio_help} and {Fil_curio_dev}",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Filecoin {Slack} channels: {Fil_curio_help} and {Fil_curio_dev}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Start multiple Curio instances with the '{Post}' layer to redundancy.",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Start multiple Curio instances with the '{Post}' layer to redundancy.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "One database can serve multiple miner IDs: Run a migration for each lotus-miner.",
|
||||||
|
"translation": "",
|
||||||
|
"message": "One database can serve multiple miner IDs: Run a migration for each lotus-miner.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Please start (or restart) {Lotus_miner} now that database credentials are in {Toml}.",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Please start (or restart) {Lotus_miner} now that database credentials are in {Toml}.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error interpreting miner ID: {Error}: ID: {String}",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Error interpreting miner ID: {Error}: ID: {String}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Enabling Sector Indexing in the database.",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Enabling Sector Indexing in the database.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error expanding path: {Error}",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Error expanding path: {Error}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Could not create repo from directory: {Error}. Aborting migration",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Could not create repo from directory: {Error}. Aborting migration",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Could not lock miner repo. Your miner must be stopped: {Error}\n Aborting migration",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Could not lock miner repo. Your miner must be stopped: {Error}\n Aborting migration",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "To work with the config:",
|
||||||
|
"translation": "",
|
||||||
|
"message": "To work with the config:",
|
||||||
|
"placeholder": null
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
704
cmd/curio/internal/translations/locales/zh/messages.gotext.json
Normal file
704
cmd/curio/internal/translations/locales/zh/messages.gotext.json
Normal file
@ -0,0 +1,704 @@
|
|||||||
|
{
|
||||||
|
"language": "zh",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"id": "This interactive tool will walk you through migration of Curio.\nPress Ctrl+C to exit at any time.",
|
||||||
|
"message": "This interactive tool will walk you through migration of Curio.\nPress Ctrl+C to exit at any time.",
|
||||||
|
"translation": "此互动工具将引导您完成Curio的迁移。\n随时按Ctrl+C退出。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "This tool confirms each action it does.",
|
||||||
|
"message": "This tool confirms each action it does.",
|
||||||
|
"translation": "此工具确认其执行的每个操作。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Ctrl+C pressed in Terminal",
|
||||||
|
"message": "Ctrl+C pressed in Terminal",
|
||||||
|
"translation": "在终端中按下Ctrl+C"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Verifying Sectors exist in Yugabyte.",
|
||||||
|
"message": "Verifying Sectors exist in Yugabyte.",
|
||||||
|
"translation": "正在验证Yugabyte中的扇区是否存在。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error verifying sectors: {Error}",
|
||||||
|
"message": "Error verifying sectors: {Error}",
|
||||||
|
"translation": "验证扇区时出错:{Error}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Error",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "err.Error()"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Sectors verified. {I} sectors found.",
|
||||||
|
"message": "Sectors verified. {I} sectors found.",
|
||||||
|
"translation": "已验证扇区。找到了{I}个扇区。",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "I",
|
||||||
|
"string": "%[1]d",
|
||||||
|
"type": "[]int",
|
||||||
|
"underlyingType": "[]int",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "i"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Never remove the database info from the config.toml for lotus-miner as it avoids double PoSt.",
|
||||||
|
"message": "Never remove the database info from the config.toml for lotus-miner as it avoids double PoSt.",
|
||||||
|
"translation": "从config.toml中永远不要删除lotus-miner的数据库信息,因为它避免了双PoSt。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)",
|
||||||
|
"message": "Enter the info to connect to your Yugabyte database installation (https://download.yugabyte.com/)",
|
||||||
|
"translation": "输入连接到您的Yugabyte数据库安装的信息(https://download.yugabyte.com/)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Host: {Hosts_}",
|
||||||
|
"message": "Host: {Hosts_}",
|
||||||
|
"translation": "主机:{Hosts_}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Hosts_",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "strings.Join(harmonycfg.Hosts, \",\")"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Port: {Port}",
|
||||||
|
"message": "Port: {Port}",
|
||||||
|
"translation": "端口:{Port}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Port",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "harmonycfg.Port"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Username: {Username}",
|
||||||
|
"message": "Username: {Username}",
|
||||||
|
"translation": "用户名:{Username}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Username",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "harmonycfg.Username"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Password: {Password}",
|
||||||
|
"message": "Password: {Password}",
|
||||||
|
"translation": "密码:{Password}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Password",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "harmonycfg.Password"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Database: {Database}",
|
||||||
|
"message": "Database: {Database}",
|
||||||
|
"translation": "数据库:{Database}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Database",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "harmonycfg.Database"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Continue to connect and update schema.",
|
||||||
|
"message": "Continue to connect and update schema.",
|
||||||
|
"translation": "继续连接和更新架构。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Database config error occurred, abandoning migration: {Error}",
|
||||||
|
"message": "Database config error occurred, abandoning migration: {Error}",
|
||||||
|
"translation": "发生数据库配置错误,放弃迁移:{Error}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Error",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "err.Error()"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Enter the Yugabyte database host(s)",
|
||||||
|
"message": "Enter the Yugabyte database host(s)",
|
||||||
|
"translation": "输入Yugabyte数据库主机(S)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "No host provided",
|
||||||
|
"message": "No host provided",
|
||||||
|
"translation": "未提供主机"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Enter the Yugabyte database {Stringport_username_password_databasei_1}",
|
||||||
|
"message": "Enter the Yugabyte database {Stringport_username_password_databasei_1}",
|
||||||
|
"translation": "输入Yugabyte数据库 {Stringport_username_password_databasei_1}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Stringport_username_password_databasei_1",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "[]string{\"port\", \"username\", \"password\", \"database\"}[i-1]"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "No value provided",
|
||||||
|
"message": "No value provided",
|
||||||
|
"translation": "未提供值"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error connecting to Yugabyte database: {Error}",
|
||||||
|
"message": "Error connecting to Yugabyte database: {Error}",
|
||||||
|
"translation": "连接到Yugabyte数据库时出错:{Error}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Error",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "err.Error()"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Connected to Yugabyte. Schema is current.",
|
||||||
|
"message": "Connected to Yugabyte. Schema is current.",
|
||||||
|
"translation": "已连接到Yugabyte。模式是当前的。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error encoding config.toml: {Error}",
|
||||||
|
"message": "Error encoding config.toml: {Error}",
|
||||||
|
"translation": "编码config.toml时出错:{Error}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Error",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "err.Error()"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error reading filemode of config.toml: {Error}",
|
||||||
|
"message": "Error reading filemode of config.toml: {Error}",
|
||||||
|
"translation": "读取config.toml文件模式时出错:{Error}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Error",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "err.Error()"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error writing config.toml: {Error}",
|
||||||
|
"message": "Error writing config.toml: {Error}",
|
||||||
|
"translation": "写入config.toml时出错:{Error}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Error",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "err.Error()"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Restart Lotus Miner.",
|
||||||
|
"message": "Restart Lotus Miner.",
|
||||||
|
"translation": "重新启动Lotus Miner。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Connected to Yugabyte",
|
||||||
|
"message": "Connected to Yugabyte",
|
||||||
|
"translation": "已连接到Yugabyte"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Select the location of your lotus-miner config directory?",
|
||||||
|
"message": "Select the location of your lotus-miner config directory?",
|
||||||
|
"translation": "选择您的lotus-miner配置目录的位置?"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Other",
|
||||||
|
"message": "Other",
|
||||||
|
"translation": "其他"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Enter the path to the configuration directory used by lotus-miner",
|
||||||
|
"message": "Enter the path to the configuration directory used by lotus-miner",
|
||||||
|
"translation": "输入lotus-miner使用的配置目录的路径"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "No path provided, abandoning migration",
|
||||||
|
"message": "No path provided, abandoning migration",
|
||||||
|
"translation": "未提供路径,放弃迁移"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Cannot read the config.toml file in the provided directory, Error: {Error}",
|
||||||
|
"message": "Cannot read the config.toml file in the provided directory, Error: {Error}",
|
||||||
|
"translation": "无法读取提供的目录中的config.toml文件,错误:{Error}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Error",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "err.Error()"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Read Miner Config",
|
||||||
|
"message": "Read Miner Config",
|
||||||
|
"translation": "读取矿工配置"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Completed Step: {Step}",
|
||||||
|
"message": "Completed Step: {Step}",
|
||||||
|
"translation": "完成步骤:{Step}",
|
||||||
|
"placeholders": [
|
||||||
|
{
|
||||||
|
"id": "Step",
|
||||||
|
"string": "%[1]s",
|
||||||
|
"type": "string",
|
||||||
|
"underlyingType": "string",
|
||||||
|
"argNum": 1,
|
||||||
|
"expr": "step"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "This interactive tool migrates lotus-miner to Curio in 5 minutes.",
|
||||||
|
"translation": "这个交互式工具可以在5分钟内将lotus-miner迁移到Curio。",
|
||||||
|
"message": "This interactive tool migrates lotus-miner to Curio in 5 minutes.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.",
|
||||||
|
"translation": "每一步都需要您的确认,并且可以撤销。随时按Ctrl+C退出。",
|
||||||
|
"message": "Each step needs your confirmation and can be reversed. Press Ctrl+C to exit at any time.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Use the arrow keys to navigate: ↓ ↑ → ←",
|
||||||
|
"translation": "使用箭头键进行导航:↓ ↑ → ←",
|
||||||
|
"message": "Use the arrow keys to navigate: ↓ ↑ → ←",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Lotus-Miner to Curio Migration.",
|
||||||
|
"translation": "Lotus-Miner到Curio迁移。",
|
||||||
|
"message": "Lotus-Miner to Curio Migration.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Try the web interface with for further guided improvements.",
|
||||||
|
"translation": "尝试使用网页界面进行进一步的指导改进。",
|
||||||
|
"message": "Try the web interface with for further guided improvements.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "You can now migrate your market node ({Boost}), if applicable.",
|
||||||
|
"translation": "如果适用,您现在可以迁移您的市场节点({Boost})。",
|
||||||
|
"message": "You can now migrate your market node ({Boost}), if applicable.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Migrating config.toml to database.",
|
||||||
|
"translation": "正在将config.toml迁移到数据库。",
|
||||||
|
"message": "Migrating config.toml to database.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error reading from database: {Error}. Aborting Migration.",
|
||||||
|
"translation": "读取数据库时出错:{Error}。正在中止迁移。",
|
||||||
|
"message": "Error reading from database: {Error}. Aborting Migration.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cannot read API: {Error}. Aborting Migration",
|
||||||
|
"translation": "无法读取API:{Error}。正在中止迁移",
|
||||||
|
"message": "cannot read API: {Error}. Aborting Migration",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error saving config to layer: {Error}. Aborting Migration",
|
||||||
|
"translation": "保存配置到层时出错:{Error}。正在中止迁移",
|
||||||
|
"message": "Error saving config to layer: {Error}. Aborting Migration",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Protocol Labs wants to improve the software you use. Tell the team you're using Curio.",
|
||||||
|
"translation": "Protocol Labs希望改进您使用的软件。告诉团队您正在使用Curio。",
|
||||||
|
"message": "Protocol Labs wants to improve the software you use. Tell the team you're using Curio.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Select what you want to share with the Curio team.",
|
||||||
|
"translation": "选择您想与Curio团队分享的内容。",
|
||||||
|
"message": "Select what you want to share with the Curio team.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Individual Data: Miner ID, Curio version, net ({Mainnet} or {Testnet}). Signed.",
|
||||||
|
"translation": "个人数据:矿工ID、Curio版本、网络({Mainnet}或{Testnet})。已签名。",
|
||||||
|
"message": "Individual Data: Miner ID, Curio version, net ({Mainnet} or {Testnet}). Signed.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Aggregate-Anonymous: version, net, and Miner power (bucketed).",
|
||||||
|
"translation": "聚合-匿名:版本、网络和矿工功率(分桶)。",
|
||||||
|
"message": "Aggregate-Anonymous: version, net, and Miner power (bucketed).",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Hint: I am someone running Curio on net.",
|
||||||
|
"translation": "提示:我是在网络上运行Curio的人。",
|
||||||
|
"message": "Hint: I am someone running Curio on net.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Nothing.",
|
||||||
|
"translation": "没有。",
|
||||||
|
"message": "Nothing.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Aborting remaining steps.",
|
||||||
|
"translation": "中止剩余步骤。",
|
||||||
|
"message": "Aborting remaining steps.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error connecting to lotus node: {Error}",
|
||||||
|
"translation": "连接到莲花节点时出错:{Error}",
|
||||||
|
"message": "Error connecting to lotus node: {Error}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error getting miner power: {Error}",
|
||||||
|
"translation": "获取矿工功率时出错:{Error}",
|
||||||
|
"message": "Error getting miner power: {Error}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error marshalling message: {Error}",
|
||||||
|
"translation": "整理消息时出错:{Error}",
|
||||||
|
"message": "Error marshalling message: {Error}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error getting miner info: {Error}",
|
||||||
|
"translation": "获取矿工信息时出错:{Error}",
|
||||||
|
"message": "Error getting miner info: {Error}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error signing message: {Error}",
|
||||||
|
"translation": "签署消息时出错:{Error}",
|
||||||
|
"message": "Error signing message: {Error}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error sending message: {Error}",
|
||||||
|
"translation": "发送消息时出错:{Error}",
|
||||||
|
"message": "Error sending message: {Error}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error sending message: Status {Status}, Message:",
|
||||||
|
"translation": "发送消息时出错:状态{Status},消息:",
|
||||||
|
"message": "Error sending message: Status {Status}, Message:",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Message sent.",
|
||||||
|
"translation": "消息已发送。",
|
||||||
|
"message": "Message sent.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Documentation:",
|
||||||
|
"translation": "文档:",
|
||||||
|
"message": "Documentation:",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "The '{Base}' layer stores common configuration. All curio instances can include it in their {__layers} argument.",
|
||||||
|
"translation": "'{Base}'层存储通用配置。所有Curio实例都可以在其{__layers}参数中包含它。",
|
||||||
|
"message": "The '{Base}' layer stores common configuration. All curio instances can include it in their {__layers} argument.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "You can add other layers for per-machine configuration changes.",
|
||||||
|
"translation": "您可以添加其他层进行每台机器的配置更改。",
|
||||||
|
"message": "You can add other layers for per-machine configuration changes.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Join {Fil_curio_help} in Filecoin {Slack} for help.",
|
||||||
|
"translation": "加入Filecoin {Slack}中的{Fil_curio_help}寻求帮助。",
|
||||||
|
"message": "Join {Fil_curio_help} in Filecoin {Slack} for help.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Join {Fil_curio_dev} in Filecoin {Slack} to follow development and feedback!",
|
||||||
|
"translation": "加入Filecoin {Slack}中的{Fil_curio_dev}来跟踪开发和反馈!",
|
||||||
|
"message": "Join {Fil_curio_dev} in Filecoin {Slack} to follow development and feedback!",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Want PoST redundancy? Run many Curio instances with the '{Post}' layer.",
|
||||||
|
"translation": "需要PoST冗余?使用'{Post}'层运行多个Curio实例。",
|
||||||
|
"message": "Want PoST redundancy? Run many Curio instances with the '{Post}' layer.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Point your browser to your web GUI to complete setup with {Boost} and advanced featues.",
|
||||||
|
"translation": "将您的浏览器指向您的网络GUI,以使用{Boost}和高级功能完成设置。",
|
||||||
|
"message": "Point your browser to your web GUI to complete setup with {Boost} and advanced featues.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "For SPs with multiple Miner IDs, run 1 migration per lotus-miner all to the same 1 database. The cluster will serve all Miner IDs.",
|
||||||
|
"translation": "对于具有多个矿工ID的SP,针对所有lotus-miner运行1次迁移到同一个数据库。集群将服务所有矿工ID。",
|
||||||
|
"message": "For SPs with multiple Miner IDs, run 1 migration per lotus-miner all to the same 1 database. The cluster will serve all Miner IDs.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Please start {Lotus_miner} now that database credentials are in {Toml}.",
|
||||||
|
"translation": "现在数据库凭证在{Toml}中,请启动{Lotus_miner}。",
|
||||||
|
"message": "Please start {Lotus_miner} now that database credentials are in {Toml}.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Waiting for {Lotus_miner} to write sectors into Yugabyte.",
|
||||||
|
"translation": "等待{Lotus_miner}将扇区写入Yugabyte。",
|
||||||
|
"message": "Waiting for {Lotus_miner} to write sectors into Yugabyte.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "The sectors are in the database. The database is ready for {Curio}.",
|
||||||
|
"translation": "扇区在数据库中。数据库已准备好用于{Curio}。",
|
||||||
|
"message": "The sectors are in the database. The database is ready for {Curio}.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Now shut down lotus-miner and move the systems to {Curio}.",
|
||||||
|
"translation": "现在关闭lotus-miner并将系统移至{Curio}。",
|
||||||
|
"message": "Now shut down lotus-miner and move the systems to {Curio}.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Press return to continue",
|
||||||
|
"translation": "按回车继续",
|
||||||
|
"message": "Press return to continue",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Aborting migration.",
|
||||||
|
"translation": "中止迁移。",
|
||||||
|
"message": "Aborting migration.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Sectors verified. {I} sector locations found.",
|
||||||
|
"translation": "扇区已验证。发现了{I}个扇区位置。",
|
||||||
|
"message": "Sectors verified. {I} sector locations found.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Press return to update {Toml} with Yugabyte info. Backup the file now.",
|
||||||
|
"translation": "按回车更新{Toml}以获取Yugabyte信息。现在备份文件。",
|
||||||
|
"message": "Press return to update {Toml} with Yugabyte info. Backup the file now.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "To start, ensure your sealing pipeline is drained and shut-down lotus-miner.",
|
||||||
|
"translation": "开始之前,请确保您的密封管道已排空并关闭lotus-miner。",
|
||||||
|
"message": "To start, ensure your sealing pipeline is drained and shut-down lotus-miner.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Enter the path to the configuration directory used by {Lotus_miner}",
|
||||||
|
"translation": "输入{Lotus_miner}使用的配置目录的路径",
|
||||||
|
"message": "Enter the path to the configuration directory used by {Lotus_miner}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Step Complete: {Step}",
|
||||||
|
"translation": "步骤完成:{Step}",
|
||||||
|
"message": "Step Complete: {Step}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Configuration 'base' was updated to include this miner's address and its wallet setup.",
|
||||||
|
"translation": "配置'base'已更新,包含了这个矿工的地址和其钱包设置。",
|
||||||
|
"message": "Configuration 'base' was updated to include this miner's address and its wallet setup.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Compare the configurations {Base} to {MinerAddresses0}. Changes between the miner IDs other than wallet addreses should be a new, minimal layer for runners that need it.",
|
||||||
|
"translation": "比较配置{Base}和{MinerAddresses0}。矿工ID之间除了钱包地址的变化应该是需要的运行者的一个新的、最小的层。",
|
||||||
|
"message": "Compare the configurations {Base} to {MinerAddresses0}. Changes between the miner IDs other than wallet addreses should be a new, minimal layer for runners that need it.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Configuration 'base' was created to include this miner's address and its wallet setup.",
|
||||||
|
"translation": "配置'base'已创建,包括了这个矿工的地址和其钱包设置。",
|
||||||
|
"message": "Configuration 'base' was created to include this miner's address and its wallet setup.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Layer {LayerName} created.",
|
||||||
|
"translation": "层{LayerName}已创建。",
|
||||||
|
"message": "Layer {LayerName} created.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "To work with the config: \\n",
|
||||||
|
"translation": "要使用配置:\\n",
|
||||||
|
"message": "To work with the config: \\n",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "To run Curio: With machine or cgroup isolation, use the command (with example layer selection):",
|
||||||
|
"translation": "运行Curio:使用机器或cgroup隔离,使用命令(附带示例层选择):",
|
||||||
|
"message": "To run Curio: With machine or cgroup isolation, use the command (with example layer selection):",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Try the web interface with {__layersgui} for further guided improvements.",
|
||||||
|
"translation": "尝试使用{__layersgui}的Web界面进行进一步引导式改进。",
|
||||||
|
"message": "Try the web interface with {__layersgui} for further guided improvements.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error connecting to lotus node: {Error} {Error_1}",
|
||||||
|
"translation": "连接到lotus节点时出错:{Error} {Error_1}",
|
||||||
|
"message": "Error connecting to lotus node: {Error} {Error_1}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "could not get API info for FullNode: {Err}",
|
||||||
|
"translation": "无法获取FullNode的API信息:{Err}",
|
||||||
|
"message": "could not get API info for FullNode: {Err}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error getting token: {Error}",
|
||||||
|
"translation": "获取令牌时出错:{Error}",
|
||||||
|
"message": "Error getting token: {Error}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Filecoin {Slack} channels: {Fil_curio_help} and {Fil_curio_dev}",
|
||||||
|
"translation": "Filecoin {Slack} 频道:{Fil_curio_help} 和 {Fil_curio_dev}",
|
||||||
|
"message": "Filecoin {Slack} channels: {Fil_curio_help} and {Fil_curio_dev}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Start multiple Curio instances with the '{Post}' layer to redundancy.",
|
||||||
|
"translation": "使用'{Post}'层启动多个Curio实例以实现冗余。",
|
||||||
|
"message": "Start multiple Curio instances with the '{Post}' layer to redundancy.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "One database can serve multiple miner IDs: Run a migration for each lotus-miner.",
|
||||||
|
"translation": "一个数据库可以服务多个矿工ID:为每个lotus-miner运行迁移。",
|
||||||
|
"message": "One database can serve multiple miner IDs: Run a migration for each lotus-miner.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Please start (or restart) {Lotus_miner} now that database credentials are in {Toml}.",
|
||||||
|
"translation": "请立即启动(或重新启动){Lotus_miner},因为数据库凭据已在{Toml}中。",
|
||||||
|
"message": "Please start (or restart) {Lotus_miner} now that database credentials are in {Toml}.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error interpreting miner ID: {Error}: ID: {String}",
|
||||||
|
"translation": "解释矿工ID时出错:{Error}:ID:{String}",
|
||||||
|
"message": "Error interpreting miner ID: {Error}: ID: {String}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Enabling Sector Indexing in the database.",
|
||||||
|
"translation": "在数据库中启用扇区索引。",
|
||||||
|
"message": "Enabling Sector Indexing in the database.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error expanding path: {Error}",
|
||||||
|
"translation": "扩展路径时出错:{Error}",
|
||||||
|
"message": "Error expanding path: {Error}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Could not create repo from directory: {Error}. Aborting migration",
|
||||||
|
"translation": "无法从目录创建repo:{Error}。 中止迁移",
|
||||||
|
"message": "Could not create repo from directory: {Error}. Aborting migration",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Could not lock miner repo. Your miner must be stopped: {Error}\n Aborting migration",
|
||||||
|
"translation": "无法锁定矿工repo。 您的矿工必须停止:{Error}\n 中止迁移",
|
||||||
|
"message": "Could not lock miner repo. Your miner must be stopped: {Error}\n Aborting migration",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "To work with the config:",
|
||||||
|
"translation": "要使用配置:",
|
||||||
|
"message": "To work with the config:",
|
||||||
|
"placeholder": null
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
89
cmd/curio/internal/translations/locales/zh/out.gotext.json
Normal file
89
cmd/curio/internal/translations/locales/zh/out.gotext.json
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
{
|
||||||
|
"language": "zh",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"id": "Try the web interface with {__layersgui} for further guided improvements.",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Try the web interface with {__layersgui} for further guided improvements.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error connecting to lotus node: {Error} {Error_1}",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Error connecting to lotus node: {Error} {Error_1}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "could not get API info for FullNode: {Err}",
|
||||||
|
"translation": "",
|
||||||
|
"message": "could not get API info for FullNode: {Err}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error getting token: {Error}",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Error getting token: {Error}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Filecoin {Slack} channels: {Fil_curio_help} and {Fil_curio_dev}",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Filecoin {Slack} channels: {Fil_curio_help} and {Fil_curio_dev}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Start multiple Curio instances with the '{Post}' layer to redundancy.",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Start multiple Curio instances with the '{Post}' layer to redundancy.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "One database can serve multiple miner IDs: Run a migration for each lotus-miner.",
|
||||||
|
"translation": "",
|
||||||
|
"message": "One database can serve multiple miner IDs: Run a migration for each lotus-miner.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Please start (or restart) {Lotus_miner} now that database credentials are in {Toml}.",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Please start (or restart) {Lotus_miner} now that database credentials are in {Toml}.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error interpreting miner ID: {Error}: ID: {String}",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Error interpreting miner ID: {Error}: ID: {String}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Enabling Sector Indexing in the database.",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Enabling Sector Indexing in the database.",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Error expanding path: {Error}",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Error expanding path: {Error}",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Could not create repo from directory: {Error}. Aborting migration",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Could not create repo from directory: {Error}. Aborting migration",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Could not lock miner repo. Your miner must be stopped: {Error}\n Aborting migration",
|
||||||
|
"translation": "",
|
||||||
|
"message": "Could not lock miner repo. Your miner must be stopped: {Error}\n Aborting migration",
|
||||||
|
"placeholder": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "To work with the config:",
|
||||||
|
"translation": "",
|
||||||
|
"message": "To work with the config:",
|
||||||
|
"placeholder": null
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
27
cmd/curio/internal/translations/translations.go
Normal file
27
cmd/curio/internal/translations/translations.go
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
// Usage:
|
||||||
|
// To UPDATE translations:
|
||||||
|
//
|
||||||
|
// 1. add/change strings in guidedsetup folder that use d.T() or d.say().
|
||||||
|
//
|
||||||
|
// 2. run `go generate` in the cmd/curio/internal/translations/ folder.
|
||||||
|
//
|
||||||
|
// 3. ChatGPT 3.5 can translate the ./locales/??/out.gotext.json files'
|
||||||
|
// which ONLY include the un-translated messages.
|
||||||
|
// APPEND to the messages.gotext.json files's array.
|
||||||
|
//
|
||||||
|
// ChatGPT fuss:
|
||||||
|
// - on a good day, you may need to hit "continue generating".
|
||||||
|
// - > 60? you'll need to give it sections of the file.
|
||||||
|
//
|
||||||
|
// 4. Re-import with `go generate` again.
|
||||||
|
//
|
||||||
|
// To ADD a language:
|
||||||
|
// 1. Add it to the list in updateLang.sh
|
||||||
|
// 2. Run `go generate` in the cmd/curio/internal/translations/ folder.
|
||||||
|
// 3. Follow the "Update translations" steps here.
|
||||||
|
// 4. Code will auto-detect the new language and use it.
|
||||||
|
//
|
||||||
|
// FUTURE Reliability: OpenAPI automation.
|
||||||
|
package translations
|
||||||
|
|
||||||
|
//go:generate ./updateLang.sh
|
8
cmd/curio/internal/translations/updateLang.sh
Executable file
8
cmd/curio/internal/translations/updateLang.sh
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#OP: Only run if some file in ../guidedsetup* is newer than catalog.go
|
||||||
|
# Change this condition if using translations more widely.
|
||||||
|
if [ "$(find ../../guidedsetup/* -newermt "$(date -d '1 minute ago')" -newer catalog.go)" ] || [ "$(find locales/* -newermt "$(date -d '1 minute ago')" -newer catalog.go)" ]; then
|
||||||
|
gotext -srclang=en update -out=catalog.go -lang=en,zh,ko github.com/filecoin-project/lotus/cmd/curio/guidedsetup
|
||||||
|
go run knowns/main.go locales/zh locales/ko
|
||||||
|
fi
|
@ -16,7 +16,8 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/build"
|
"github.com/filecoin-project/lotus/build"
|
||||||
lcli "github.com/filecoin-project/lotus/cli"
|
lcli "github.com/filecoin-project/lotus/cli"
|
||||||
cliutil "github.com/filecoin-project/lotus/cli/util"
|
cliutil "github.com/filecoin-project/lotus/cli/util"
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/deps"
|
"github.com/filecoin-project/lotus/cmd/curio/deps"
|
||||||
|
"github.com/filecoin-project/lotus/cmd/curio/guidedsetup"
|
||||||
"github.com/filecoin-project/lotus/lib/lotuslog"
|
"github.com/filecoin-project/lotus/lib/lotuslog"
|
||||||
"github.com/filecoin-project/lotus/lib/tracing"
|
"github.com/filecoin-project/lotus/lib/tracing"
|
||||||
"github.com/filecoin-project/lotus/node/repo"
|
"github.com/filecoin-project/lotus/node/repo"
|
||||||
@ -24,7 +25,7 @@ import (
|
|||||||
|
|
||||||
var log = logging.Logger("main")
|
var log = logging.Logger("main")
|
||||||
|
|
||||||
func SetupCloseHandler() {
|
func setupCloseHandler() {
|
||||||
c := make(chan os.Signal, 1)
|
c := make(chan os.Signal, 1)
|
||||||
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
|
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
|
||||||
go func() {
|
go func() {
|
||||||
@ -36,7 +37,6 @@ func SetupCloseHandler() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
SetupCloseHandler()
|
|
||||||
|
|
||||||
lotuslog.SetupLogLevels()
|
lotuslog.SetupLogLevels()
|
||||||
|
|
||||||
@ -48,10 +48,12 @@ func main() {
|
|||||||
configCmd,
|
configCmd,
|
||||||
testCmd,
|
testCmd,
|
||||||
webCmd,
|
webCmd,
|
||||||
|
guidedsetup.GuidedsetupCmd,
|
||||||
|
configMigrateCmd,
|
||||||
sealCmd,
|
sealCmd,
|
||||||
}
|
}
|
||||||
|
|
||||||
jaeger := tracing.SetupJaegerTracing("lotus")
|
jaeger := tracing.SetupJaegerTracing("curio")
|
||||||
defer func() {
|
defer func() {
|
||||||
if jaeger != nil {
|
if jaeger != nil {
|
||||||
_ = jaeger.ForceFlush(context.Background())
|
_ = jaeger.ForceFlush(context.Background())
|
||||||
@ -65,7 +67,7 @@ func main() {
|
|||||||
if jaeger != nil {
|
if jaeger != nil {
|
||||||
_ = jaeger.Shutdown(cctx.Context)
|
_ = jaeger.Shutdown(cctx.Context)
|
||||||
}
|
}
|
||||||
jaeger = tracing.SetupJaegerTracing("lotus/" + cmd.Name)
|
jaeger = tracing.SetupJaegerTracing("curio/" + cmd.Name)
|
||||||
|
|
||||||
if cctx.IsSet("color") {
|
if cctx.IsSet("color") {
|
||||||
color.NoColor = !cctx.Bool("color")
|
color.NoColor = !cctx.Bool("color")
|
||||||
@ -80,10 +82,14 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
app := &cli.App{
|
app := &cli.App{
|
||||||
Name: "lotus-provider",
|
Name: "curio",
|
||||||
Usage: "Filecoin decentralized storage network provider",
|
Usage: "Filecoin decentralized storage network provider",
|
||||||
Version: build.UserVersion(),
|
Version: build.UserVersion(),
|
||||||
EnableBashCompletion: true,
|
EnableBashCompletion: true,
|
||||||
|
Before: func(c *cli.Context) error {
|
||||||
|
setupCloseHandler()
|
||||||
|
return nil
|
||||||
|
},
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
&cli.BoolFlag{
|
&cli.BoolFlag{
|
||||||
// examined in the Before above
|
// examined in the Before above
|
||||||
@ -93,48 +99,45 @@ func main() {
|
|||||||
},
|
},
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "panic-reports",
|
Name: "panic-reports",
|
||||||
EnvVars: []string{"LOTUS_PANIC_REPORT_PATH"},
|
EnvVars: []string{"CURIO_PANIC_REPORT_PATH"},
|
||||||
Hidden: true,
|
Hidden: true,
|
||||||
Value: "~/.lotusprovider", // should follow --repo default
|
Value: "~/.curio", // should follow --repo default
|
||||||
},
|
},
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "db-host",
|
Name: "db-host",
|
||||||
EnvVars: []string{"LOTUS_DB_HOST"},
|
EnvVars: []string{"CURIO_DB_HOST", "CURIO_HARMONYDB_HOSTS"},
|
||||||
Usage: "Command separated list of hostnames for yugabyte cluster",
|
Usage: "Command separated list of hostnames for yugabyte cluster",
|
||||||
Value: "yugabyte",
|
Value: "yugabyte",
|
||||||
},
|
},
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "db-name",
|
Name: "db-name",
|
||||||
EnvVars: []string{"LOTUS_DB_NAME", "LOTUS_HARMONYDB_HOSTS"},
|
EnvVars: []string{"CURIO_DB_NAME", "CURIO_HARMONYDB_NAME"},
|
||||||
Value: "yugabyte",
|
Value: "yugabyte",
|
||||||
},
|
},
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "db-user",
|
Name: "db-user",
|
||||||
EnvVars: []string{"LOTUS_DB_USER", "LOTUS_HARMONYDB_USERNAME"},
|
EnvVars: []string{"CURIO_DB_USER", "CURIO_HARMONYDB_USERNAME"},
|
||||||
Value: "yugabyte",
|
Value: "yugabyte",
|
||||||
},
|
},
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "db-password",
|
Name: "db-password",
|
||||||
EnvVars: []string{"LOTUS_DB_PASSWORD", "LOTUS_HARMONYDB_PASSWORD"},
|
EnvVars: []string{"CURIO_DB_PASSWORD", "CURIO_HARMONYDB_PASSWORD"},
|
||||||
Value: "yugabyte",
|
Value: "yugabyte",
|
||||||
},
|
},
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "db-port",
|
Name: "db-port",
|
||||||
EnvVars: []string{"LOTUS_DB_PORT", "LOTUS_HARMONYDB_PORT"},
|
EnvVars: []string{"CURIO_DB_PORT", "CURIO_HARMONYDB_PORT"},
|
||||||
Hidden: true,
|
Hidden: true,
|
||||||
Value: "5433",
|
Value: "5433",
|
||||||
},
|
},
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: deps.FlagRepoPath,
|
Name: deps.FlagRepoPath,
|
||||||
EnvVars: []string{"LOTUS_REPO_PATH"},
|
EnvVars: []string{"CURIO_REPO_PATH"},
|
||||||
Value: "~/.lotusprovider",
|
Value: "~/.curio",
|
||||||
},
|
},
|
||||||
cliutil.FlagVeryVerbose,
|
cliutil.FlagVeryVerbose,
|
||||||
},
|
},
|
||||||
Commands: append(local, lcli.CommonCommands...),
|
Commands: append(local, lcli.CommonCommands...),
|
||||||
Before: func(c *cli.Context) error {
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
After: func(c *cli.Context) error {
|
After: func(c *cli.Context) error {
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
p, err := homedir.Expand(c.String(FlagMinerRepo))
|
p, err := homedir.Expand(c.String(FlagMinerRepo))
|
||||||
@ -143,7 +146,7 @@ func main() {
|
|||||||
panic(r)
|
panic(r)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate report in LOTUS_PATH and re-raise panic
|
// Generate report in CURIO_PATH and re-raise panic
|
||||||
build.GeneratePanicReport(c.String("panic-reports"), p, c.App.Name)
|
build.GeneratePanicReport(c.String("panic-reports"), p, c.App.Name)
|
||||||
panic(r)
|
panic(r)
|
||||||
}
|
}
|
||||||
@ -151,6 +154,6 @@ func main() {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
app.Setup()
|
app.Setup()
|
||||||
app.Metadata["repoType"] = repo.Provider
|
app.Metadata["repoType"] = repo.Curio
|
||||||
lcli.RunApp(app)
|
lcli.RunApp(app)
|
||||||
}
|
}
|
71
cmd/curio/migrate.go
Normal file
71
cmd/curio/migrate.go
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/urfave/cli/v2"
|
||||||
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
|
cliutil "github.com/filecoin-project/lotus/cli/util"
|
||||||
|
"github.com/filecoin-project/lotus/cmd/curio/guidedsetup"
|
||||||
|
"github.com/filecoin-project/lotus/node/repo"
|
||||||
|
)
|
||||||
|
|
||||||
|
var configMigrateCmd = &cli.Command{
|
||||||
|
Name: "from-miner",
|
||||||
|
Usage: "Express a database config (for curio) from an existing miner.",
|
||||||
|
Description: "Express a database config (for curio) from an existing miner.",
|
||||||
|
Flags: []cli.Flag{
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: FlagMinerRepo,
|
||||||
|
Aliases: []string{FlagMinerRepoDeprecation},
|
||||||
|
EnvVars: []string{"LOTUS_MINER_PATH", "LOTUS_STORAGE_PATH"},
|
||||||
|
Value: "~/.lotusminer",
|
||||||
|
Usage: fmt.Sprintf("Specify miner repo path. flag(%s) and env(LOTUS_STORAGE_PATH) are DEPRECATION, will REMOVE SOON", FlagMinerRepoDeprecation),
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "repo",
|
||||||
|
EnvVars: []string{"LOTUS_PATH"},
|
||||||
|
Hidden: true,
|
||||||
|
Value: "~/.lotus",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "to-layer",
|
||||||
|
Aliases: []string{"t"},
|
||||||
|
Usage: "The layer name for this data push. 'base' is recommended for single-miner setup.",
|
||||||
|
},
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: "overwrite",
|
||||||
|
Aliases: []string{"o"},
|
||||||
|
Usage: "Use this with --to-layer to replace an existing layer",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Action: fromMiner,
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
FlagMinerRepo = "miner-repo"
|
||||||
|
)
|
||||||
|
|
||||||
|
const FlagMinerRepoDeprecation = "storagerepo"
|
||||||
|
|
||||||
|
func fromMiner(cctx *cli.Context) (err error) {
|
||||||
|
minerRepoPath := cctx.String(FlagMinerRepo)
|
||||||
|
layerName := cctx.String("to-layer")
|
||||||
|
overwrite := cctx.Bool("overwrite")
|
||||||
|
|
||||||
|
// Populate API Key
|
||||||
|
_, header, err := cliutil.GetRawAPI(cctx, repo.FullNode, "v0")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("cannot read API: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
ainfo, err := cliutil.GetAPIInfo(&cli.Context{}, repo.FullNode)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf(`could not get API info for FullNode: %w
|
||||||
|
Set the environment variable to the value of "lotus auth api-info --perm=admin"`, err)
|
||||||
|
}
|
||||||
|
chainApiInfo := header.Get("Authorization")[7:] + ":" + ainfo.Addr
|
||||||
|
_, err = guidedsetup.SaveConfigToLayer(minerRepoPath, layerName, overwrite, chainApiInfo)
|
||||||
|
return err
|
||||||
|
}
|
@ -12,9 +12,9 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
lcli "github.com/filecoin-project/lotus/cli"
|
lcli "github.com/filecoin-project/lotus/cli"
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/deps"
|
"github.com/filecoin-project/lotus/cmd/curio/deps"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/seal"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
||||||
"github.com/filecoin-project/lotus/provider/lpseal"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var sealCmd = &cli.Command{
|
var sealCmd = &cli.Command{
|
||||||
@ -113,7 +113,7 @@ var sealStartCmd = &cli.Command{
|
|||||||
return xerrors.Errorf("getting seal proof type: %w", err)
|
return xerrors.Errorf("getting seal proof type: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
num, err := lpseal.AllocateSectorNumbers(ctx, dep.Full, dep.DB, act, cctx.Int("count"), func(tx *harmonydb.Tx, numbers []abi.SectorNumber) (bool, error) {
|
num, err := seal.AllocateSectorNumbers(ctx, dep.Full, dep.DB, act, cctx.Int("count"), func(tx *harmonydb.Tx, numbers []abi.SectorNumber) (bool, error) {
|
||||||
for _, n := range numbers {
|
for _, n := range numbers {
|
||||||
_, err := tx.Exec("insert into sectors_sdr_pipeline (sp_id, sector_number, reg_seal_proof) values ($1, $2, $3)", mid, n, spt)
|
_, err := tx.Exec("insert into sectors_sdr_pipeline (sp_id, sector_number, reg_seal_proof) values ($1, $2, $3)", mid, n, spt)
|
||||||
if err != nil {
|
if err != nil {
|
@ -15,9 +15,9 @@ import (
|
|||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
"github.com/filecoin-project/go-state-types/dline"
|
"github.com/filecoin-project/go-state-types/dline"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/deps"
|
"github.com/filecoin-project/lotus/cmd/curio/deps"
|
||||||
|
curio "github.com/filecoin-project/lotus/curiosrc"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
||||||
"github.com/filecoin-project/lotus/provider"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var testCmd = &cli.Command{
|
var testCmd = &cli.Command{
|
||||||
@ -27,6 +27,9 @@ var testCmd = &cli.Command{
|
|||||||
//provingInfoCmd,
|
//provingInfoCmd,
|
||||||
wdPostCmd,
|
wdPostCmd,
|
||||||
},
|
},
|
||||||
|
Before: func(cctx *cli.Context) error {
|
||||||
|
return nil
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
var wdPostCmd = &cli.Command{
|
var wdPostCmd = &cli.Command{
|
||||||
@ -47,7 +50,7 @@ var wdPostCmd = &cli.Command{
|
|||||||
var wdPostTaskCmd = &cli.Command{
|
var wdPostTaskCmd = &cli.Command{
|
||||||
Name: "task",
|
Name: "task",
|
||||||
Aliases: []string{"scheduled", "schedule", "async", "asynchronous"},
|
Aliases: []string{"scheduled", "schedule", "async", "asynchronous"},
|
||||||
Usage: "Test the windowpost scheduler by running it on the next available lotus-provider. ",
|
Usage: "Test the windowpost scheduler by running it on the next available curio. ",
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
&cli.Uint64Flag{
|
&cli.Uint64Flag{
|
||||||
Name: "deadline",
|
Name: "deadline",
|
||||||
@ -148,7 +151,7 @@ It will not send any messages to the chain. Since it can compute any deadline, o
|
|||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "storage-json",
|
Name: "storage-json",
|
||||||
Usage: "path to json file containing storage config",
|
Usage: "path to json file containing storage config",
|
||||||
Value: "~/.lotus-provider/storage.json",
|
Value: "~/.curio/storage.json",
|
||||||
},
|
},
|
||||||
&cli.Uint64Flag{
|
&cli.Uint64Flag{
|
||||||
Name: "partition",
|
Name: "partition",
|
||||||
@ -164,7 +167,8 @@ It will not send any messages to the chain. Since it can compute any deadline, o
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
wdPostTask, wdPoStSubmitTask, derlareRecoverTask, err := provider.WindowPostScheduler(ctx, deps.Cfg.Fees, deps.Cfg.Proving, deps.Full, deps.Verif, deps.LW, nil, nil,
|
wdPostTask, wdPoStSubmitTask, derlareRecoverTask, err := curio.WindowPostScheduler(
|
||||||
|
ctx, deps.Cfg.Fees, deps.Cfg.Proving, deps.Full, deps.Verif, deps.LW, nil, nil,
|
||||||
deps.As, deps.Maddrs, deps.DB, deps.Stor, deps.Si, deps.Cfg.Subsystems.WindowPostMaxTasks)
|
deps.As, deps.Maddrs, deps.DB, deps.Stor, deps.Si, deps.Cfg.Subsystems.WindowPostMaxTasks)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
@ -27,34 +27,33 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/api"
|
"github.com/filecoin-project/lotus/api"
|
||||||
"github.com/filecoin-project/lotus/api/client"
|
"github.com/filecoin-project/lotus/api/client"
|
||||||
cliutil "github.com/filecoin-project/lotus/cli/util"
|
cliutil "github.com/filecoin-project/lotus/cli/util"
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/deps"
|
"github.com/filecoin-project/lotus/cmd/curio/deps"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/market"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/web"
|
||||||
"github.com/filecoin-project/lotus/lib/rpcenc"
|
"github.com/filecoin-project/lotus/lib/rpcenc"
|
||||||
"github.com/filecoin-project/lotus/metrics"
|
"github.com/filecoin-project/lotus/metrics"
|
||||||
"github.com/filecoin-project/lotus/metrics/proxy"
|
"github.com/filecoin-project/lotus/metrics/proxy"
|
||||||
"github.com/filecoin-project/lotus/node/repo"
|
"github.com/filecoin-project/lotus/node/repo"
|
||||||
"github.com/filecoin-project/lotus/provider/lpmarket"
|
|
||||||
"github.com/filecoin-project/lotus/provider/lpweb"
|
|
||||||
"github.com/filecoin-project/lotus/storage/paths"
|
"github.com/filecoin-project/lotus/storage/paths"
|
||||||
"github.com/filecoin-project/lotus/storage/sealer/fsutil"
|
"github.com/filecoin-project/lotus/storage/sealer/fsutil"
|
||||||
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
||||||
)
|
)
|
||||||
|
|
||||||
var log = logging.Logger("lp/rpc")
|
var log = logging.Logger("curio/rpc")
|
||||||
|
|
||||||
var permissioned = os.Getenv("LOTUS_DISABLE_AUTH_PERMISSIONED") != "1"
|
var permissioned = os.Getenv("LOTUS_DISABLE_AUTH_PERMISSIONED") != "1"
|
||||||
|
|
||||||
func LotusProviderHandler(
|
func CurioHandler(
|
||||||
authv func(ctx context.Context, token string) ([]auth.Permission, error),
|
authv func(ctx context.Context, token string) ([]auth.Permission, error),
|
||||||
remote http.HandlerFunc,
|
remote http.HandlerFunc,
|
||||||
a api.LotusProvider,
|
a api.Curio,
|
||||||
permissioned bool) http.Handler {
|
permissioned bool) http.Handler {
|
||||||
mux := mux.NewRouter()
|
mux := mux.NewRouter()
|
||||||
readerHandler, readerServerOpt := rpcenc.ReaderParamDecoder()
|
readerHandler, readerServerOpt := rpcenc.ReaderParamDecoder()
|
||||||
rpcServer := jsonrpc.NewServer(jsonrpc.WithServerErrors(api.RPCErrors), readerServerOpt)
|
rpcServer := jsonrpc.NewServer(jsonrpc.WithServerErrors(api.RPCErrors), readerServerOpt)
|
||||||
|
|
||||||
wapi := proxy.MetricedAPI[api.LotusProvider, api.LotusProviderStruct](a)
|
wapi := proxy.MetricedAPI[api.Curio, api.CurioStruct](a)
|
||||||
if permissioned {
|
if permissioned {
|
||||||
wapi = api.PermissionedAPI[api.LotusProvider, api.LotusProviderStruct](wapi)
|
wapi = api.PermissionedAPI[api.Curio, api.CurioStruct](wapi)
|
||||||
}
|
}
|
||||||
|
|
||||||
rpcServer.Register("Filecoin", wapi)
|
rpcServer.Register("Filecoin", wapi)
|
||||||
@ -76,13 +75,16 @@ func LotusProviderHandler(
|
|||||||
return ah
|
return ah
|
||||||
}
|
}
|
||||||
|
|
||||||
type ProviderAPI struct {
|
type CurioAPI struct {
|
||||||
*deps.Deps
|
*deps.Deps
|
||||||
paths.SectorIndex
|
paths.SectorIndex
|
||||||
ShutdownChan chan struct{}
|
ShutdownChan chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *ProviderAPI) StorageDetachLocal(ctx context.Context, path string) error {
|
func (p *CurioAPI) Version(context.Context) (api.Version, error) {
|
||||||
|
return api.CurioAPIVersion0, nil
|
||||||
|
}
|
||||||
|
func (p *CurioAPI) StorageDetachLocal(ctx context.Context, path string) error {
|
||||||
path, err := homedir.Expand(path)
|
path, err := homedir.Expand(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("expanding local path: %w", err)
|
return xerrors.Errorf("expanding local path: %w", err)
|
||||||
@ -130,7 +132,7 @@ func (p *ProviderAPI) StorageDetachLocal(ctx context.Context, path string) error
|
|||||||
return p.LocalStore.ClosePath(ctx, localPath.ID)
|
return p.LocalStore.ClosePath(ctx, localPath.ID)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *ProviderAPI) StorageLocal(ctx context.Context) (map[storiface.ID]string, error) {
|
func (p *CurioAPI) StorageLocal(ctx context.Context) (map[storiface.ID]string, error) {
|
||||||
ps, err := p.LocalStore.Local(ctx)
|
ps, err := p.LocalStore.Local(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -144,27 +146,23 @@ func (p *ProviderAPI) StorageLocal(ctx context.Context) (map[storiface.ID]string
|
|||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *ProviderAPI) StorageStat(ctx context.Context, id storiface.ID) (fsutil.FsStat, error) {
|
func (p *CurioAPI) StorageStat(ctx context.Context, id storiface.ID) (fsutil.FsStat, error) {
|
||||||
return p.Stor.FsStat(ctx, id)
|
return p.Stor.FsStat(ctx, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *ProviderAPI) Version(context.Context) (api.Version, error) {
|
func (p *CurioAPI) AllocatePieceToSector(ctx context.Context, maddr address.Address, piece api.PieceDealInfo, rawSize int64, source url.URL, header http.Header) (api.SectorOffset, error) {
|
||||||
return api.ProviderAPIVersion0, nil
|
di := market.NewPieceIngester(p.Deps.DB, p.Deps.Full)
|
||||||
}
|
|
||||||
|
|
||||||
func (p *ProviderAPI) AllocatePieceToSector(ctx context.Context, maddr address.Address, piece api.PieceDealInfo, rawSize int64, source url.URL, header http.Header) (api.SectorOffset, error) {
|
|
||||||
di := lpmarket.NewPieceIngester(p.Deps.DB, p.Deps.Full)
|
|
||||||
|
|
||||||
return di.AllocatePieceToSector(ctx, maddr, piece, rawSize, source, header)
|
return di.AllocatePieceToSector(ctx, maddr, piece, rawSize, source, header)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Trigger shutdown
|
// Trigger shutdown
|
||||||
func (p *ProviderAPI) Shutdown(context.Context) error {
|
func (p *CurioAPI) Shutdown(context.Context) error {
|
||||||
close(p.ShutdownChan)
|
close(p.ShutdownChan)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *ProviderAPI) StorageAddLocal(ctx context.Context, path string) error {
|
func (p *CurioAPI) StorageAddLocal(ctx context.Context, path string) error {
|
||||||
path, err := homedir.Expand(path)
|
path, err := homedir.Expand(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("expanding local path: %w", err)
|
return xerrors.Errorf("expanding local path: %w", err)
|
||||||
@ -212,10 +210,10 @@ func ListenAndServe(ctx context.Context, dependencies *deps.Deps, shutdownChan c
|
|||||||
}
|
}
|
||||||
// Serve the RPC.
|
// Serve the RPC.
|
||||||
srv := &http.Server{
|
srv := &http.Server{
|
||||||
Handler: LotusProviderHandler(
|
Handler: CurioHandler(
|
||||||
authVerify,
|
authVerify,
|
||||||
remoteHandler,
|
remoteHandler,
|
||||||
&ProviderAPI{dependencies, dependencies.Si, shutdownChan},
|
&CurioAPI{dependencies, dependencies.Si, shutdownChan},
|
||||||
permissioned),
|
permissioned),
|
||||||
ReadHeaderTimeout: time.Minute * 3,
|
ReadHeaderTimeout: time.Minute * 3,
|
||||||
BaseContext: func(listener net.Listener) context.Context {
|
BaseContext: func(listener net.Listener) context.Context {
|
||||||
@ -230,7 +228,7 @@ func ListenAndServe(ctx context.Context, dependencies *deps.Deps, shutdownChan c
|
|||||||
eg.Go(srv.ListenAndServe)
|
eg.Go(srv.ListenAndServe)
|
||||||
|
|
||||||
if dependencies.Cfg.Subsystems.EnableWebGui {
|
if dependencies.Cfg.Subsystems.EnableWebGui {
|
||||||
web, err := lpweb.GetSrv(ctx, dependencies)
|
web, err := web.GetSrv(ctx, dependencies)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -252,8 +250,8 @@ func ListenAndServe(ctx context.Context, dependencies *deps.Deps, shutdownChan c
|
|||||||
return eg.Wait()
|
return eg.Wait()
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetProviderAPI(ctx *cli.Context) (api.LotusProvider, jsonrpc.ClientCloser, error) {
|
func GetCurioAPI(ctx *cli.Context) (api.Curio, jsonrpc.ClientCloser, error) {
|
||||||
addr, headers, err := cliutil.GetRawAPI(ctx, repo.Provider, "v0")
|
addr, headers, err := cliutil.GetRawAPI(ctx, repo.Curio, "v0")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
@ -272,5 +270,5 @@ func GetProviderAPI(ctx *cli.Context) (api.LotusProvider, jsonrpc.ClientCloser,
|
|||||||
|
|
||||||
addr = u.String()
|
addr = u.String()
|
||||||
|
|
||||||
return client.NewProviderRpc(ctx.Context, addr, headers)
|
return client.NewCurioRpc(ctx.Context, addr, headers)
|
||||||
}
|
}
|
@ -14,9 +14,9 @@ import (
|
|||||||
|
|
||||||
"github.com/filecoin-project/lotus/build"
|
"github.com/filecoin-project/lotus/build"
|
||||||
lcli "github.com/filecoin-project/lotus/cli"
|
lcli "github.com/filecoin-project/lotus/cli"
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/deps"
|
"github.com/filecoin-project/lotus/cmd/curio/deps"
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/rpc"
|
"github.com/filecoin-project/lotus/cmd/curio/rpc"
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/tasks"
|
"github.com/filecoin-project/lotus/cmd/curio/tasks"
|
||||||
"github.com/filecoin-project/lotus/lib/ulimit"
|
"github.com/filecoin-project/lotus/lib/ulimit"
|
||||||
"github.com/filecoin-project/lotus/metrics"
|
"github.com/filecoin-project/lotus/metrics"
|
||||||
"github.com/filecoin-project/lotus/node"
|
"github.com/filecoin-project/lotus/node"
|
||||||
@ -28,7 +28,7 @@ type stackTracer interface {
|
|||||||
|
|
||||||
var runCmd = &cli.Command{
|
var runCmd = &cli.Command{
|
||||||
Name: "run",
|
Name: "run",
|
||||||
Usage: "Start a lotus provider process",
|
Usage: "Start a Curio process",
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "listen",
|
Name: "listen",
|
||||||
@ -53,12 +53,12 @@ var runCmd = &cli.Command{
|
|||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "storage-json",
|
Name: "storage-json",
|
||||||
Usage: "path to json file containing storage config",
|
Usage: "path to json file containing storage config",
|
||||||
Value: "~/.lotus-provider/storage.json",
|
Value: "~/.curio/storage.json",
|
||||||
},
|
},
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "journal",
|
Name: "journal",
|
||||||
Usage: "path to journal files",
|
Usage: "path to journal files",
|
||||||
Value: "~/.lotus-provider/",
|
Value: "~/.curio/",
|
||||||
},
|
},
|
||||||
&cli.StringSliceFlag{
|
&cli.StringSliceFlag{
|
||||||
Name: "layers",
|
Name: "layers",
|
||||||
@ -89,7 +89,7 @@ var runCmd = &cli.Command{
|
|||||||
ctx, _ := tag.New(lcli.DaemonContext(cctx),
|
ctx, _ := tag.New(lcli.DaemonContext(cctx),
|
||||||
tag.Insert(metrics.Version, build.BuildVersion),
|
tag.Insert(metrics.Version, build.BuildVersion),
|
||||||
tag.Insert(metrics.Commit, build.CurrentCommit),
|
tag.Insert(metrics.Commit, build.CurrentCommit),
|
||||||
tag.Insert(metrics.NodeType, "provider"),
|
tag.Insert(metrics.NodeType, "curio"),
|
||||||
)
|
)
|
||||||
shutdownChan := make(chan struct{})
|
shutdownChan := make(chan struct{})
|
||||||
{
|
{
|
||||||
@ -135,7 +135,7 @@ var runCmd = &cli.Command{
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
finishCh := node.MonitorShutdown(shutdownChan) //node.ShutdownHandler{Component: "rpc server", StopFunc: rpcStopper},
|
finishCh := node.MonitorShutdown(shutdownChan) //node.ShutdownHandler{Component: "rpc server", StopFunc: rpcStopper},
|
||||||
//node.ShutdownHandler{Component: "provider", StopFunc: stop},
|
//node.ShutdownHandler{Component: "curio", StopFunc: stop},
|
||||||
|
|
||||||
<-finishCh
|
<-finishCh
|
||||||
return nil
|
return nil
|
||||||
@ -144,8 +144,8 @@ var runCmd = &cli.Command{
|
|||||||
|
|
||||||
var webCmd = &cli.Command{
|
var webCmd = &cli.Command{
|
||||||
Name: "web",
|
Name: "web",
|
||||||
Usage: "Start lotus provider web interface",
|
Usage: "Start Curio web interface",
|
||||||
Description: `Start an instance of lotus provider web interface.
|
Description: `Start an instance of Curio web interface.
|
||||||
This creates the 'web' layer if it does not exist, then calls run with that layer.`,
|
This creates the 'web' layer if it does not exist, then calls run with that layer.`,
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
@ -10,7 +10,7 @@ import (
|
|||||||
|
|
||||||
var stopCmd = &cli.Command{
|
var stopCmd = &cli.Command{
|
||||||
Name: "stop",
|
Name: "stop",
|
||||||
Usage: "Stop a running lotus provider",
|
Usage: "Stop a running Curio process",
|
||||||
Flags: []cli.Flag{},
|
Flags: []cli.Flag{},
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
api, closer, err := lcli.GetAPI(cctx)
|
api, closer, err := lcli.GetAPI(cctx)
|
@ -23,7 +23,7 @@ import (
|
|||||||
|
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
lcli "github.com/filecoin-project/lotus/cli"
|
lcli "github.com/filecoin-project/lotus/cli"
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/rpc"
|
"github.com/filecoin-project/lotus/cmd/curio/rpc"
|
||||||
"github.com/filecoin-project/lotus/storage/sealer/fsutil"
|
"github.com/filecoin-project/lotus/storage/sealer/fsutil"
|
||||||
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
||||||
)
|
)
|
||||||
@ -104,7 +104,7 @@ over time
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
minerApi, closer, err := rpc.GetProviderAPI(cctx)
|
minerApi, closer, err := rpc.GetCurioAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -182,7 +182,7 @@ var storageDetachCmd = &cli.Command{
|
|||||||
},
|
},
|
||||||
ArgsUsage: "[path]",
|
ArgsUsage: "[path]",
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
minerApi, closer, err := rpc.GetProviderAPI(cctx)
|
minerApi, closer, err := rpc.GetCurioAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -213,7 +213,7 @@ var storageListCmd = &cli.Command{
|
|||||||
//storageListSectorsCmd,
|
//storageListSectorsCmd,
|
||||||
},
|
},
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
minerApi, closer, err := rpc.GetProviderAPI(cctx)
|
minerApi, closer, err := rpc.GetCurioAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -412,7 +412,7 @@ var storageFindCmd = &cli.Command{
|
|||||||
Usage: "find sector in the storage system",
|
Usage: "find sector in the storage system",
|
||||||
ArgsUsage: "[miner address] [sector number]",
|
ArgsUsage: "[miner address] [sector number]",
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
minerApi, closer, err := rpc.GetProviderAPI(cctx)
|
minerApi, closer, err := rpc.GetCurioAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
// Package tasks contains tasks that can be run by the lotus-provider command.
|
// Package tasks contains tasks that can be run by the curio command.
|
||||||
package tasks
|
package tasks
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -8,18 +8,18 @@ import (
|
|||||||
"github.com/samber/lo"
|
"github.com/samber/lo"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/deps"
|
"github.com/filecoin-project/lotus/cmd/curio/deps"
|
||||||
|
curio "github.com/filecoin-project/lotus/curiosrc"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/chainsched"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/ffi"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/message"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/seal"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/winning"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
||||||
"github.com/filecoin-project/lotus/node/modules"
|
"github.com/filecoin-project/lotus/node/modules"
|
||||||
"github.com/filecoin-project/lotus/provider"
|
|
||||||
"github.com/filecoin-project/lotus/provider/chainsched"
|
|
||||||
"github.com/filecoin-project/lotus/provider/lpffi"
|
|
||||||
"github.com/filecoin-project/lotus/provider/lpmessage"
|
|
||||||
"github.com/filecoin-project/lotus/provider/lpseal"
|
|
||||||
"github.com/filecoin-project/lotus/provider/lpwinning"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var log = logging.Logger("lotus-provider/deps")
|
var log = logging.Logger("curio/deps")
|
||||||
|
|
||||||
func StartTasks(ctx context.Context, dependencies *deps.Deps) (*harmonytask.TaskEngine, error) {
|
func StartTasks(ctx context.Context, dependencies *deps.Deps) (*harmonytask.TaskEngine, error) {
|
||||||
cfg := dependencies.Cfg
|
cfg := dependencies.Cfg
|
||||||
@ -34,7 +34,7 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps) (*harmonytask.Task
|
|||||||
si := dependencies.Si
|
si := dependencies.Si
|
||||||
var activeTasks []harmonytask.TaskInterface
|
var activeTasks []harmonytask.TaskInterface
|
||||||
|
|
||||||
sender, sendTask := lpmessage.NewSender(full, full, db)
|
sender, sendTask := message.NewSender(full, full, db)
|
||||||
activeTasks = append(activeTasks, sendTask)
|
activeTasks = append(activeTasks, sendTask)
|
||||||
|
|
||||||
chainSched := chainsched.New(full)
|
chainSched := chainsched.New(full)
|
||||||
@ -48,8 +48,10 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps) (*harmonytask.Task
|
|||||||
// PoSt
|
// PoSt
|
||||||
|
|
||||||
if cfg.Subsystems.EnableWindowPost {
|
if cfg.Subsystems.EnableWindowPost {
|
||||||
wdPostTask, wdPoStSubmitTask, derlareRecoverTask, err := provider.WindowPostScheduler(ctx, cfg.Fees, cfg.Proving, full, verif, lw, sender,
|
wdPostTask, wdPoStSubmitTask, derlareRecoverTask, err := curio.WindowPostScheduler(
|
||||||
chainSched, as, maddrs, db, stor, si, cfg.Subsystems.WindowPostMaxTasks)
|
ctx, cfg.Fees, cfg.Proving, full, verif, lw, sender, chainSched,
|
||||||
|
as, maddrs, db, stor, si, cfg.Subsystems.WindowPostMaxTasks)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -58,7 +60,7 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps) (*harmonytask.Task
|
|||||||
}
|
}
|
||||||
|
|
||||||
if cfg.Subsystems.EnableWinningPost {
|
if cfg.Subsystems.EnableWinningPost {
|
||||||
winPoStTask := lpwinning.NewWinPostTask(cfg.Subsystems.WinningPostMaxTasks, db, lw, verif, full, maddrs)
|
winPoStTask := winning.NewWinPostTask(cfg.Subsystems.WinningPostMaxTasks, db, lw, verif, full, maddrs)
|
||||||
activeTasks = append(activeTasks, winPoStTask)
|
activeTasks = append(activeTasks, winPoStTask)
|
||||||
needProofParams = true
|
needProofParams = true
|
||||||
}
|
}
|
||||||
@ -73,40 +75,40 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps) (*harmonytask.Task
|
|||||||
{
|
{
|
||||||
// Sealing
|
// Sealing
|
||||||
|
|
||||||
var sp *lpseal.SealPoller
|
var sp *seal.SealPoller
|
||||||
var slr *lpffi.SealCalls
|
var slr *ffi.SealCalls
|
||||||
if hasAnySealingTask {
|
if hasAnySealingTask {
|
||||||
sp = lpseal.NewPoller(db, full)
|
sp = seal.NewPoller(db, full)
|
||||||
go sp.RunPoller(ctx)
|
go sp.RunPoller(ctx)
|
||||||
|
|
||||||
slr = lpffi.NewSealCalls(stor, lstor, si)
|
slr = ffi.NewSealCalls(stor, lstor, si)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: Tasks with the LEAST priority are at the top
|
// NOTE: Tasks with the LEAST priority are at the top
|
||||||
if cfg.Subsystems.EnableSealSDR {
|
if cfg.Subsystems.EnableSealSDR {
|
||||||
sdrTask := lpseal.NewSDRTask(full, db, sp, slr, cfg.Subsystems.SealSDRMaxTasks)
|
sdrTask := seal.NewSDRTask(full, db, sp, slr, cfg.Subsystems.SealSDRMaxTasks)
|
||||||
activeTasks = append(activeTasks, sdrTask)
|
activeTasks = append(activeTasks, sdrTask)
|
||||||
}
|
}
|
||||||
if cfg.Subsystems.EnableSealSDRTrees {
|
if cfg.Subsystems.EnableSealSDRTrees {
|
||||||
treesTask := lpseal.NewTreesTask(sp, db, slr, cfg.Subsystems.SealSDRTreesMaxTasks)
|
treesTask := seal.NewTreesTask(sp, db, slr, cfg.Subsystems.SealSDRTreesMaxTasks)
|
||||||
finalizeTask := lpseal.NewFinalizeTask(cfg.Subsystems.FinalizeMaxTasks, sp, slr, db)
|
finalizeTask := seal.NewFinalizeTask(cfg.Subsystems.FinalizeMaxTasks, sp, slr, db)
|
||||||
activeTasks = append(activeTasks, treesTask, finalizeTask)
|
activeTasks = append(activeTasks, treesTask, finalizeTask)
|
||||||
}
|
}
|
||||||
if cfg.Subsystems.EnableSendPrecommitMsg {
|
if cfg.Subsystems.EnableSendPrecommitMsg {
|
||||||
precommitTask := lpseal.NewSubmitPrecommitTask(sp, db, full, sender, as, cfg.Fees.MaxPreCommitGasFee)
|
precommitTask := seal.NewSubmitPrecommitTask(sp, db, full, sender, as, cfg.Fees.MaxPreCommitGasFee)
|
||||||
activeTasks = append(activeTasks, precommitTask)
|
activeTasks = append(activeTasks, precommitTask)
|
||||||
}
|
}
|
||||||
if cfg.Subsystems.EnablePoRepProof {
|
if cfg.Subsystems.EnablePoRepProof {
|
||||||
porepTask := lpseal.NewPoRepTask(db, full, sp, slr, cfg.Subsystems.PoRepProofMaxTasks)
|
porepTask := seal.NewPoRepTask(db, full, sp, slr, cfg.Subsystems.PoRepProofMaxTasks)
|
||||||
activeTasks = append(activeTasks, porepTask)
|
activeTasks = append(activeTasks, porepTask)
|
||||||
needProofParams = true
|
needProofParams = true
|
||||||
}
|
}
|
||||||
if cfg.Subsystems.EnableMoveStorage {
|
if cfg.Subsystems.EnableMoveStorage {
|
||||||
moveStorageTask := lpseal.NewMoveStorageTask(sp, slr, db, cfg.Subsystems.MoveStorageMaxTasks)
|
moveStorageTask := seal.NewMoveStorageTask(sp, slr, db, cfg.Subsystems.MoveStorageMaxTasks)
|
||||||
activeTasks = append(activeTasks, moveStorageTask)
|
activeTasks = append(activeTasks, moveStorageTask)
|
||||||
}
|
}
|
||||||
if cfg.Subsystems.EnableSendCommitMsg {
|
if cfg.Subsystems.EnableSendCommitMsg {
|
||||||
commitTask := lpseal.NewSubmitCommitTask(sp, db, full, sender, as, cfg.Fees.MaxCommitGasFee)
|
commitTask := seal.NewSubmitCommitTask(sp, db, full, sender, as, cfg.Fees.MaxCommitGasFee)
|
||||||
activeTasks = append(activeTasks, commitTask)
|
activeTasks = append(activeTasks, commitTask)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -134,7 +136,7 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps) (*harmonytask.Task
|
|||||||
}
|
}
|
||||||
|
|
||||||
if hasAnySealingTask {
|
if hasAnySealingTask {
|
||||||
watcher, err := lpmessage.NewMessageWatcher(db, ht, chainSched, full)
|
watcher, err := message.NewMessageWatcher(db, ht, chainSched, full)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
@ -1,254 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"context"
|
|
||||||
"encoding/base64"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"path"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/BurntSushi/toml"
|
|
||||||
"github.com/fatih/color"
|
|
||||||
"github.com/ipfs/go-datastore"
|
|
||||||
"github.com/samber/lo"
|
|
||||||
"github.com/urfave/cli/v2"
|
|
||||||
"golang.org/x/xerrors"
|
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
|
||||||
|
|
||||||
cliutil "github.com/filecoin-project/lotus/cli/util"
|
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/deps"
|
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
|
||||||
"github.com/filecoin-project/lotus/node/config"
|
|
||||||
"github.com/filecoin-project/lotus/node/modules"
|
|
||||||
"github.com/filecoin-project/lotus/node/repo"
|
|
||||||
)
|
|
||||||
|
|
||||||
var configMigrateCmd = &cli.Command{
|
|
||||||
Name: "from-miner",
|
|
||||||
Usage: "Express a database config (for lotus-provider) from an existing miner.",
|
|
||||||
Description: "Express a database config (for lotus-provider) from an existing miner.",
|
|
||||||
Flags: []cli.Flag{
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: FlagMinerRepo,
|
|
||||||
Aliases: []string{FlagMinerRepoDeprecation},
|
|
||||||
EnvVars: []string{"LOTUS_MINER_PATH", "LOTUS_STORAGE_PATH"},
|
|
||||||
Value: "~/.lotusminer",
|
|
||||||
Usage: "Miner repo path",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "repo",
|
|
||||||
EnvVars: []string{"LOTUS_PATH"},
|
|
||||||
Hidden: true,
|
|
||||||
Value: "~/.lotus",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "to-layer",
|
|
||||||
Aliases: []string{"t"},
|
|
||||||
Usage: "The layer name for this data push. 'base' is recommended for single-miner setup.",
|
|
||||||
},
|
|
||||||
&cli.BoolFlag{
|
|
||||||
Name: "overwrite",
|
|
||||||
Aliases: []string{"o"},
|
|
||||||
Usage: "Use this with --to-layer to replace an existing layer",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Action: fromMiner,
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
FlagMinerRepo = "miner-repo"
|
|
||||||
)
|
|
||||||
|
|
||||||
const FlagMinerRepoDeprecation = "storagerepo"
|
|
||||||
|
|
||||||
func fromMiner(cctx *cli.Context) (err error) {
|
|
||||||
ctx := context.Background()
|
|
||||||
cliCommandColor := color.New(color.FgHiBlue).SprintFunc()
|
|
||||||
configColor := color.New(color.FgHiGreen).SprintFunc()
|
|
||||||
|
|
||||||
r, err := repo.NewFS(cctx.String(FlagMinerRepo))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
ok, err := r.Exists()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf("repo not initialized")
|
|
||||||
}
|
|
||||||
|
|
||||||
lr, err := r.LockRO(repo.StorageMiner)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("locking repo: %w", err)
|
|
||||||
}
|
|
||||||
defer func() { _ = lr.Close() }()
|
|
||||||
|
|
||||||
cfgNode, err := lr.Config()
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("getting node config: %w", err)
|
|
||||||
}
|
|
||||||
smCfg := cfgNode.(*config.StorageMiner)
|
|
||||||
|
|
||||||
db, err := harmonydb.NewFromConfig(smCfg.HarmonyDB)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("could not reach the database. Ensure the Miner config toml's HarmonyDB entry"+
|
|
||||||
" is setup to reach Yugabyte correctly: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
var titles []string
|
|
||||||
err = db.Select(ctx, &titles, `SELECT title FROM harmony_config WHERE LENGTH(config) > 0`)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("miner cannot reach the db. Ensure the config toml's HarmonyDB entry"+
|
|
||||||
" is setup to reach Yugabyte correctly: %s", err.Error())
|
|
||||||
}
|
|
||||||
name := cctx.String("to-layer")
|
|
||||||
if name == "" {
|
|
||||||
name = fmt.Sprintf("mig%d", len(titles))
|
|
||||||
} else {
|
|
||||||
if lo.Contains(titles, name) && !cctx.Bool("overwrite") {
|
|
||||||
return errors.New("the overwrite flag is needed to replace existing layer: " + name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
msg := "Layer " + configColor(name) + ` created. `
|
|
||||||
|
|
||||||
// Copy over identical settings:
|
|
||||||
|
|
||||||
buf, err := os.ReadFile(path.Join(lr.Path(), "config.toml"))
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("could not read config.toml: %w", err)
|
|
||||||
}
|
|
||||||
lpCfg := config.DefaultLotusProvider()
|
|
||||||
_, err = deps.LoadConfigWithUpgrades(string(buf), lpCfg)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("could not decode toml: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Populate Miner Address
|
|
||||||
mmeta, err := lr.Datastore(ctx, "/metadata")
|
|
||||||
if err != nil {
|
|
||||||
return xerrors.Errorf("opening miner metadata datastore: %w", err)
|
|
||||||
}
|
|
||||||
defer func() {
|
|
||||||
_ = mmeta.Close()
|
|
||||||
}()
|
|
||||||
|
|
||||||
maddrBytes, err := mmeta.Get(ctx, datastore.NewKey("miner-address"))
|
|
||||||
if err != nil {
|
|
||||||
return xerrors.Errorf("getting miner address datastore entry: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
addr, err := address.NewFromBytes(maddrBytes)
|
|
||||||
if err != nil {
|
|
||||||
return xerrors.Errorf("parsing miner actor address: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
lpCfg.Addresses = []config.LotusProviderAddresses{{
|
|
||||||
MinerAddresses: []string{addr.String()},
|
|
||||||
}}
|
|
||||||
|
|
||||||
ks, err := lr.KeyStore()
|
|
||||||
if err != nil {
|
|
||||||
return xerrors.Errorf("keystore err: %w", err)
|
|
||||||
}
|
|
||||||
js, err := ks.Get(modules.JWTSecretName)
|
|
||||||
if err != nil {
|
|
||||||
return xerrors.Errorf("error getting JWTSecretName: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
lpCfg.Apis.StorageRPCSecret = base64.StdEncoding.EncodeToString(js.PrivateKey)
|
|
||||||
|
|
||||||
// Populate API Key
|
|
||||||
_, header, err := cliutil.GetRawAPI(cctx, repo.FullNode, "v0")
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("cannot read API: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
ainfo, err := cliutil.GetAPIInfo(&cli.Context{}, repo.FullNode)
|
|
||||||
if err != nil {
|
|
||||||
return xerrors.Errorf(`could not get API info for FullNode: %w
|
|
||||||
Set the environment variable to the value of "lotus auth api-info --perm=admin"`, err)
|
|
||||||
}
|
|
||||||
lpCfg.Apis.ChainApiInfo = []string{header.Get("Authorization")[7:] + ":" + ainfo.Addr}
|
|
||||||
|
|
||||||
// WindowPoSt message
|
|
||||||
msg += "\n!! Before running lotus-provider with Window PoSt enabled, ensure any miner/worker answering of WindowPost is disabled by " +
|
|
||||||
"(on Miner) " + configColor("DisableBuiltinWindowPoSt=true") + " and (on Workers) not enabling windowpost on CLI or via " +
|
|
||||||
"environment variable " + configColor("LOTUS_WORKER_WINDOWPOST") + "."
|
|
||||||
|
|
||||||
// WinningPoSt message
|
|
||||||
msg += "\n!! Before running lotus-provider with Winning PoSt enabled, ensure any miner/worker answering of WinningPost is disabled by " +
|
|
||||||
"(on Miner) " + configColor("DisableBuiltinWinningPoSt=true") + " and (on Workers) not enabling winningpost on CLI or via " +
|
|
||||||
"environment variable " + configColor("LOTUS_WORKER_WINNINGPOST") + "."
|
|
||||||
|
|
||||||
// Express as configTOML
|
|
||||||
configTOML := &bytes.Buffer{}
|
|
||||||
if err = toml.NewEncoder(configTOML).Encode(lpCfg); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if !lo.Contains(titles, "base") {
|
|
||||||
cfg, err := getDefaultConfig(true)
|
|
||||||
if err != nil {
|
|
||||||
return xerrors.Errorf("Cannot get default config: %w", err)
|
|
||||||
}
|
|
||||||
_, err = db.Exec(ctx, "INSERT INTO harmony_config (title, config) VALUES ('base', $1)", cfg)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if cctx.Bool("overwrite") {
|
|
||||||
i, err := db.Exec(ctx, "DELETE FROM harmony_config WHERE title=$1", name)
|
|
||||||
if i != 0 {
|
|
||||||
fmt.Println("Overwriting existing layer")
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("Got error while deleting existing layer: " + err.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = db.Exec(ctx, "INSERT INTO harmony_config (title, config) VALUES ($1, $2)", name, configTOML.String())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
dbSettings := ""
|
|
||||||
def := config.DefaultStorageMiner().HarmonyDB
|
|
||||||
if def.Hosts[0] != smCfg.HarmonyDB.Hosts[0] {
|
|
||||||
dbSettings += ` --db-host="` + strings.Join(smCfg.HarmonyDB.Hosts, ",") + `"`
|
|
||||||
}
|
|
||||||
if def.Port != smCfg.HarmonyDB.Port {
|
|
||||||
dbSettings += " --db-port=" + smCfg.HarmonyDB.Port
|
|
||||||
}
|
|
||||||
if def.Username != smCfg.HarmonyDB.Username {
|
|
||||||
dbSettings += ` --db-user="` + smCfg.HarmonyDB.Username + `"`
|
|
||||||
}
|
|
||||||
if def.Password != smCfg.HarmonyDB.Password {
|
|
||||||
dbSettings += ` --db-password="` + smCfg.HarmonyDB.Password + `"`
|
|
||||||
}
|
|
||||||
if def.Database != smCfg.HarmonyDB.Database {
|
|
||||||
dbSettings += ` --db-name="` + smCfg.HarmonyDB.Database + `"`
|
|
||||||
}
|
|
||||||
|
|
||||||
var layerMaybe string
|
|
||||||
if name != "base" {
|
|
||||||
layerMaybe = "--layer=" + name
|
|
||||||
}
|
|
||||||
|
|
||||||
msg += `
|
|
||||||
To work with the config:
|
|
||||||
` + cliCommandColor(`lotus-provider `+dbSettings+` config help `)
|
|
||||||
msg += `
|
|
||||||
To run Lotus Provider: in its own machine or cgroup without other files, use the command:
|
|
||||||
` + cliCommandColor(`lotus-provider `+dbSettings+` run `+layerMaybe)
|
|
||||||
fmt.Println(msg)
|
|
||||||
return nil
|
|
||||||
}
|
|
@ -34,13 +34,13 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/build"
|
"github.com/filecoin-project/lotus/build"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
lcli "github.com/filecoin-project/lotus/cli"
|
lcli "github.com/filecoin-project/lotus/cli"
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/deps"
|
"github.com/filecoin-project/lotus/cmd/curio/deps"
|
||||||
|
cumarket "github.com/filecoin-project/lotus/curiosrc/market"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/market/fakelm"
|
||||||
"github.com/filecoin-project/lotus/lib/must"
|
"github.com/filecoin-project/lotus/lib/must"
|
||||||
"github.com/filecoin-project/lotus/lib/nullreader"
|
"github.com/filecoin-project/lotus/lib/nullreader"
|
||||||
"github.com/filecoin-project/lotus/metrics/proxy"
|
"github.com/filecoin-project/lotus/metrics/proxy"
|
||||||
"github.com/filecoin-project/lotus/node"
|
"github.com/filecoin-project/lotus/node"
|
||||||
"github.com/filecoin-project/lotus/provider/lpmarket"
|
|
||||||
"github.com/filecoin-project/lotus/provider/lpmarket/fakelm"
|
|
||||||
"github.com/filecoin-project/lotus/storage/paths"
|
"github.com/filecoin-project/lotus/storage/paths"
|
||||||
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
||||||
)
|
)
|
||||||
@ -88,7 +88,7 @@ var lpUtilStartDealCmd = &cli.Command{
|
|||||||
}
|
}
|
||||||
|
|
||||||
// open rpc
|
// open rpc
|
||||||
var rpc api.LotusProviderStruct
|
var rpc api.CurioStruct
|
||||||
closer2, err := jsonrpc.NewMergeClient(ctx, cctx.String("provider-rpc"), "Filecoin", []interface{}{&rpc.Internal}, nil)
|
closer2, err := jsonrpc.NewMergeClient(ctx, cctx.String("provider-rpc"), "Filecoin", []interface{}{&rpc.Internal}, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("open rpc: %w", err)
|
return xerrors.Errorf("open rpc: %w", err)
|
||||||
@ -368,7 +368,7 @@ var lpBoostProxyCmd = &cli.Command{
|
|||||||
|
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
pin := lpmarket.NewPieceIngester(db, full)
|
pin := cumarket.NewPieceIngester(db, full)
|
||||||
|
|
||||||
si := paths.NewDBIndex(nil, db)
|
si := paths.NewDBIndex(nil, db)
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package provider
|
package curio
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
@ -6,11 +6,11 @@ import (
|
|||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/api"
|
"github.com/filecoin-project/lotus/api"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/multictladdr"
|
||||||
"github.com/filecoin-project/lotus/node/config"
|
"github.com/filecoin-project/lotus/node/config"
|
||||||
"github.com/filecoin-project/lotus/provider/multictladdr"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func AddressSelector(addrConf []config.LotusProviderAddresses) func() (*multictladdr.MultiAddressSelector, error) {
|
func AddressSelector(addrConf []config.CurioAddresses) func() (*multictladdr.MultiAddressSelector, error) {
|
||||||
return func() (*multictladdr.MultiAddressSelector, error) {
|
return func() (*multictladdr.MultiAddressSelector, error) {
|
||||||
as := &multictladdr.MultiAddressSelector{
|
as := &multictladdr.MultiAddressSelector{
|
||||||
MinerMap: make(map[address.Address]api.AddressConfig),
|
MinerMap: make(map[address.Address]api.AddressConfig),
|
46
curiosrc/builder.go
Normal file
46
curiosrc/builder.go
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
package curio
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/lotus/api"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/chainsched"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/message"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/multictladdr"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/window"
|
||||||
|
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
||||||
|
"github.com/filecoin-project/lotus/node/config"
|
||||||
|
dtypes "github.com/filecoin-project/lotus/node/modules/dtypes"
|
||||||
|
"github.com/filecoin-project/lotus/storage/paths"
|
||||||
|
"github.com/filecoin-project/lotus/storage/sealer"
|
||||||
|
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
||||||
|
)
|
||||||
|
|
||||||
|
//var log = logging.Logger("provider")
|
||||||
|
|
||||||
|
func WindowPostScheduler(ctx context.Context, fc config.CurioFees, pc config.ProvingConfig,
|
||||||
|
api api.FullNode, verif storiface.Verifier, lw *sealer.LocalWorker, sender *message.Sender, chainSched *chainsched.CurioChainSched,
|
||||||
|
as *multictladdr.MultiAddressSelector, addresses map[dtypes.MinerAddress]bool, db *harmonydb.DB,
|
||||||
|
stor paths.Store, idx paths.SectorIndex, max int) (*window.WdPostTask, *window.WdPostSubmitTask, *window.WdPostRecoverDeclareTask, error) {
|
||||||
|
|
||||||
|
// todo config
|
||||||
|
ft := window.NewSimpleFaultTracker(stor, idx, pc.ParallelCheckLimit, time.Duration(pc.SingleCheckTimeout), time.Duration(pc.PartitionCheckTimeout))
|
||||||
|
|
||||||
|
computeTask, err := window.NewWdPostTask(db, api, ft, lw, verif, chainSched, addresses, max)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
submitTask, err := window.NewWdPostSubmitTask(chainSched, sender, db, api, fc.MaxWindowPoStGasFee, as)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
recoverTask, err := window.NewWdPostRecoverDeclareTask(sender, db, api, ft, as, chainSched, fc.MaxWindowPoStGasFee, addresses)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return computeTask, submitTask, recoverTask, nil
|
||||||
|
}
|
@ -14,29 +14,29 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
var log = logging.Logger("chainsched")
|
var log = logging.Logger("curio/chainsched")
|
||||||
|
|
||||||
type NodeAPI interface {
|
type NodeAPI interface {
|
||||||
ChainHead(context.Context) (*types.TipSet, error)
|
ChainHead(context.Context) (*types.TipSet, error)
|
||||||
ChainNotify(context.Context) (<-chan []*api.HeadChange, error)
|
ChainNotify(context.Context) (<-chan []*api.HeadChange, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type ProviderChainSched struct {
|
type CurioChainSched struct {
|
||||||
api NodeAPI
|
api NodeAPI
|
||||||
|
|
||||||
callbacks []UpdateFunc
|
callbacks []UpdateFunc
|
||||||
started bool
|
started bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(api NodeAPI) *ProviderChainSched {
|
func New(api NodeAPI) *CurioChainSched {
|
||||||
return &ProviderChainSched{
|
return &CurioChainSched{
|
||||||
api: api,
|
api: api,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type UpdateFunc func(ctx context.Context, revert, apply *types.TipSet) error
|
type UpdateFunc func(ctx context.Context, revert, apply *types.TipSet) error
|
||||||
|
|
||||||
func (s *ProviderChainSched) AddHandler(ch UpdateFunc) error {
|
func (s *CurioChainSched) AddHandler(ch UpdateFunc) error {
|
||||||
if s.started {
|
if s.started {
|
||||||
return xerrors.Errorf("cannot add handler after start")
|
return xerrors.Errorf("cannot add handler after start")
|
||||||
}
|
}
|
||||||
@ -45,7 +45,7 @@ func (s *ProviderChainSched) AddHandler(ch UpdateFunc) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *ProviderChainSched) Run(ctx context.Context) {
|
func (s *CurioChainSched) Run(ctx context.Context) {
|
||||||
s.started = true
|
s.started = true
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -88,7 +88,7 @@ func (s *ProviderChainSched) Run(ctx context.Context) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx, span := trace.StartSpan(ctx, "ProviderChainSched.headChange")
|
ctx, span := trace.StartSpan(ctx, "CurioChainSched.headChange")
|
||||||
|
|
||||||
s.update(ctx, nil, chg.Val)
|
s.update(ctx, nil, chg.Val)
|
||||||
|
|
||||||
@ -97,7 +97,7 @@ func (s *ProviderChainSched) Run(ctx context.Context) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx, span := trace.StartSpan(ctx, "ProviderChainSched.headChange")
|
ctx, span := trace.StartSpan(ctx, "CurioChainSched.headChange")
|
||||||
|
|
||||||
var lowest, highest *types.TipSet = nil, nil
|
var lowest, highest *types.TipSet = nil, nil
|
||||||
|
|
||||||
@ -122,15 +122,15 @@ func (s *ProviderChainSched) Run(ctx context.Context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *ProviderChainSched) update(ctx context.Context, revert, apply *types.TipSet) {
|
func (s *CurioChainSched) update(ctx context.Context, revert, apply *types.TipSet) {
|
||||||
if apply == nil {
|
if apply == nil {
|
||||||
log.Error("no new tipset in ProviderChainSched.update")
|
log.Error("no new tipset in CurioChainSched.update")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, ch := range s.callbacks {
|
for _, ch := range s.callbacks {
|
||||||
if err := ch(ctx, revert, apply); err != nil {
|
if err := ch(ctx, revert, apply); err != nil {
|
||||||
log.Errorf("handling head updates in provider chain sched: %+v", err)
|
log.Errorf("handling head updates in curio chain sched: %+v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package lpffi
|
package ffi
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -19,8 +19,8 @@ import (
|
|||||||
"github.com/filecoin-project/go-state-types/abi"
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
proof2 "github.com/filecoin-project/go-state-types/proof"
|
proof2 "github.com/filecoin-project/go-state-types/proof"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/proof"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
||||||
"github.com/filecoin-project/lotus/provider/lpproof"
|
|
||||||
"github.com/filecoin-project/lotus/storage/paths"
|
"github.com/filecoin-project/lotus/storage/paths"
|
||||||
"github.com/filecoin-project/lotus/storage/sealer/proofpaths"
|
"github.com/filecoin-project/lotus/storage/sealer/proofpaths"
|
||||||
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
||||||
@ -151,7 +151,7 @@ func (sb *SealCalls) TreeD(ctx context.Context, sector storiface.SectorRef, size
|
|||||||
}
|
}
|
||||||
defer releaseSector()
|
defer releaseSector()
|
||||||
|
|
||||||
return lpproof.BuildTreeD(data, unpaddedData, filepath.Join(paths.Cache, proofpaths.TreeDName), size)
|
return proof.BuildTreeD(data, unpaddedData, filepath.Join(paths.Cache, proofpaths.TreeDName), size)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sb *SealCalls) TreeRC(ctx context.Context, sector storiface.SectorRef, unsealed cid.Cid) (cid.Cid, cid.Cid, error) {
|
func (sb *SealCalls) TreeRC(ctx context.Context, sector storiface.SectorRef, unsealed cid.Cid) (cid.Cid, cid.Cid, error) {
|
@ -1,4 +1,4 @@
|
|||||||
package lpffi
|
package ffi
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
@ -1,4 +1,4 @@
|
|||||||
package lpmarket
|
package market
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -17,8 +17,8 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/api"
|
"github.com/filecoin-project/lotus/api"
|
||||||
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/seal"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
||||||
"github.com/filecoin-project/lotus/provider/lpseal"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Ingester interface {
|
type Ingester interface {
|
||||||
@ -72,7 +72,7 @@ func (p *PieceIngester) AllocatePieceToSector(ctx context.Context, maddr address
|
|||||||
return api.SectorOffset{}, xerrors.Errorf("getting miner ID: %w", err)
|
return api.SectorOffset{}, xerrors.Errorf("getting miner ID: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
num, err := lpseal.AllocateSectorNumbers(ctx, p.api, p.db, maddr, 1, func(tx *harmonydb.Tx, numbers []abi.SectorNumber) (bool, error) {
|
num, err := seal.AllocateSectorNumbers(ctx, p.api, p.db, maddr, 1, func(tx *harmonydb.Tx, numbers []abi.SectorNumber) (bool, error) {
|
||||||
if len(numbers) != 1 {
|
if len(numbers) != 1 {
|
||||||
return false, xerrors.Errorf("expected one sector number")
|
return false, xerrors.Errorf("expected one sector number")
|
||||||
}
|
}
|
@ -20,9 +20,9 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/api"
|
"github.com/filecoin-project/lotus/api"
|
||||||
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/market"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
||||||
"github.com/filecoin-project/lotus/node/config"
|
"github.com/filecoin-project/lotus/node/config"
|
||||||
"github.com/filecoin-project/lotus/provider/lpmarket"
|
|
||||||
"github.com/filecoin-project/lotus/storage/paths"
|
"github.com/filecoin-project/lotus/storage/paths"
|
||||||
sealing "github.com/filecoin-project/lotus/storage/pipeline"
|
sealing "github.com/filecoin-project/lotus/storage/pipeline"
|
||||||
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
||||||
@ -37,12 +37,12 @@ type LMRPCProvider struct {
|
|||||||
|
|
||||||
ssize abi.SectorSize
|
ssize abi.SectorSize
|
||||||
|
|
||||||
pi lpmarket.Ingester
|
pi market.Ingester
|
||||||
db *harmonydb.DB
|
db *harmonydb.DB
|
||||||
confLayer string
|
confLayer string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewLMRPCProvider(si paths.SectorIndex, full api.FullNode, maddr address.Address, minerID abi.ActorID, ssize abi.SectorSize, pi lpmarket.Ingester, db *harmonydb.DB, confLayer string) *LMRPCProvider {
|
func NewLMRPCProvider(si paths.SectorIndex, full api.FullNode, maddr address.Address, minerID abi.ActorID, ssize abi.SectorSize, pi market.Ingester, db *harmonydb.DB, confLayer string) *LMRPCProvider {
|
||||||
return &LMRPCProvider{
|
return &LMRPCProvider{
|
||||||
si: si,
|
si: si,
|
||||||
full: full,
|
full: full,
|
||||||
@ -343,7 +343,7 @@ func (l *LMRPCProvider) AuthNew(ctx context.Context, perms []auth.Permission) ([
|
|||||||
return nil, xerrors.Errorf("no harmony config found")
|
return nil, xerrors.Errorf("no harmony config found")
|
||||||
}
|
}
|
||||||
|
|
||||||
lp := config.DefaultLotusProvider()
|
lp := config.DefaultCurioConfig()
|
||||||
if _, err := toml.Decode(cs[0].Config, lp); err != nil {
|
if _, err := toml.Decode(cs[0].Config, lp); err != nil {
|
||||||
return nil, xerrors.Errorf("decode harmony config: %w", err)
|
return nil, xerrors.Errorf("decode harmony config: %w", err)
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package lpmessage
|
package message
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
@ -22,7 +22,7 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/lib/promise"
|
"github.com/filecoin-project/lotus/lib/promise"
|
||||||
)
|
)
|
||||||
|
|
||||||
var log = logging.Logger("lpmessage")
|
var log = logging.Logger("curio/message")
|
||||||
|
|
||||||
var SendLockedWait = 100 * time.Millisecond
|
var SendLockedWait = 100 * time.Millisecond
|
||||||
|
|
||||||
@ -187,7 +187,7 @@ func (s *SendTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done b
|
|||||||
} else {
|
} else {
|
||||||
// Note: this handles an unlikely edge-case:
|
// Note: this handles an unlikely edge-case:
|
||||||
// We have previously signed the message but either failed to send it or failed to update the db
|
// We have previously signed the message but either failed to send it or failed to update the db
|
||||||
// note that when that happens the likely cause is the provider process losing its db connection
|
// note that when that happens the likely cause is the curio process losing its db connection
|
||||||
// or getting killed before it can update the db. In that case the message lock will still be held
|
// or getting killed before it can update the db. In that case the message lock will still be held
|
||||||
// so it will be safe to rebroadcast the signed message
|
// so it will be safe to rebroadcast the signed message
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package lpmessage
|
package message
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -12,9 +12,9 @@ import (
|
|||||||
|
|
||||||
"github.com/filecoin-project/lotus/api"
|
"github.com/filecoin-project/lotus/api"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/chainsched"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
||||||
"github.com/filecoin-project/lotus/provider/chainsched"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const MinConfidence = 6
|
const MinConfidence = 6
|
||||||
@ -38,7 +38,7 @@ type MessageWatcher struct {
|
|||||||
bestTs atomic.Pointer[types.TipSetKey]
|
bestTs atomic.Pointer[types.TipSetKey]
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMessageWatcher(db *harmonydb.DB, ht *harmonytask.TaskEngine, pcs *chainsched.ProviderChainSched, api MessageWaiterApi) (*MessageWatcher, error) {
|
func NewMessageWatcher(db *harmonydb.DB, ht *harmonytask.TaskEngine, pcs *chainsched.CurioChainSched, api MessageWaiterApi) (*MessageWatcher, error) {
|
||||||
mw := &MessageWatcher{
|
mw := &MessageWatcher{
|
||||||
db: db,
|
db: db,
|
||||||
ht: ht,
|
ht: ht,
|
@ -14,7 +14,7 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/storage/ctladdr"
|
"github.com/filecoin-project/lotus/storage/ctladdr"
|
||||||
)
|
)
|
||||||
|
|
||||||
var log = logging.Logger("multictladdr")
|
var log = logging.Logger("curio/multictladdr")
|
||||||
|
|
||||||
type MultiAddressSelector struct {
|
type MultiAddressSelector struct {
|
||||||
MinerMap map[address.Address]api.AddressConfig
|
MinerMap map[address.Address]api.AddressConfig
|
@ -1,4 +1,4 @@
|
|||||||
package lpproof
|
package proof
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
@ -1,4 +1,4 @@
|
|||||||
package lpproof
|
package proof
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
@ -1,4 +1,4 @@
|
|||||||
package lpseal
|
package seal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
@ -1,4 +1,4 @@
|
|||||||
package lpseal
|
package seal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
@ -1,4 +1,4 @@
|
|||||||
package lpseal
|
package seal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
@ -1,4 +1,4 @@
|
|||||||
package lpseal
|
package seal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
@ -1,4 +1,4 @@
|
|||||||
package lpseal
|
package seal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -7,21 +7,21 @@ import (
|
|||||||
|
|
||||||
"github.com/filecoin-project/go-state-types/abi"
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/ffi"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/resources"
|
"github.com/filecoin-project/lotus/lib/harmony/resources"
|
||||||
"github.com/filecoin-project/lotus/provider/lpffi"
|
|
||||||
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
||||||
)
|
)
|
||||||
|
|
||||||
type FinalizeTask struct {
|
type FinalizeTask struct {
|
||||||
max int
|
max int
|
||||||
sp *SealPoller
|
sp *SealPoller
|
||||||
sc *lpffi.SealCalls
|
sc *ffi.SealCalls
|
||||||
db *harmonydb.DB
|
db *harmonydb.DB
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewFinalizeTask(max int, sp *SealPoller, sc *lpffi.SealCalls, db *harmonydb.DB) *FinalizeTask {
|
func NewFinalizeTask(max int, sp *SealPoller, sc *ffi.SealCalls, db *harmonydb.DB) *FinalizeTask {
|
||||||
return &FinalizeTask{
|
return &FinalizeTask{
|
||||||
max: max,
|
max: max,
|
||||||
sp: sp,
|
sp: sp,
|
||||||
@ -86,7 +86,7 @@ func (f *FinalizeTask) CanAccept(ids []harmonytask.TaskID, engine *harmonytask.T
|
|||||||
StorageID string `db:"storage_id"`
|
StorageID string `db:"storage_id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
if 4 != storiface.FTCache {
|
if storiface.FTCache != 4 {
|
||||||
panic("storiface.FTCache != 4")
|
panic("storiface.FTCache != 4")
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package lpseal
|
package seal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -7,22 +7,22 @@ import (
|
|||||||
|
|
||||||
"github.com/filecoin-project/go-state-types/abi"
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/ffi"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/resources"
|
"github.com/filecoin-project/lotus/lib/harmony/resources"
|
||||||
"github.com/filecoin-project/lotus/provider/lpffi"
|
|
||||||
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
||||||
)
|
)
|
||||||
|
|
||||||
type MoveStorageTask struct {
|
type MoveStorageTask struct {
|
||||||
sp *SealPoller
|
sp *SealPoller
|
||||||
sc *lpffi.SealCalls
|
sc *ffi.SealCalls
|
||||||
db *harmonydb.DB
|
db *harmonydb.DB
|
||||||
|
|
||||||
max int
|
max int
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMoveStorageTask(sp *SealPoller, sc *lpffi.SealCalls, db *harmonydb.DB, max int) *MoveStorageTask {
|
func NewMoveStorageTask(sp *SealPoller, sc *ffi.SealCalls, db *harmonydb.DB, max int) *MoveStorageTask {
|
||||||
return &MoveStorageTask{
|
return &MoveStorageTask{
|
||||||
max: max,
|
max: max,
|
||||||
sp: sp,
|
sp: sp,
|
@ -1,4 +1,4 @@
|
|||||||
package lpseal
|
package seal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
@ -12,10 +12,10 @@ import (
|
|||||||
"github.com/filecoin-project/go-state-types/crypto"
|
"github.com/filecoin-project/go-state-types/crypto"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/ffi"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/resources"
|
"github.com/filecoin-project/lotus/lib/harmony/resources"
|
||||||
"github.com/filecoin-project/lotus/provider/lpffi"
|
|
||||||
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -28,12 +28,12 @@ type PoRepTask struct {
|
|||||||
db *harmonydb.DB
|
db *harmonydb.DB
|
||||||
api PoRepAPI
|
api PoRepAPI
|
||||||
sp *SealPoller
|
sp *SealPoller
|
||||||
sc *lpffi.SealCalls
|
sc *ffi.SealCalls
|
||||||
|
|
||||||
max int
|
max int
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewPoRepTask(db *harmonydb.DB, api PoRepAPI, sp *SealPoller, sc *lpffi.SealCalls, maxPoRep int) *PoRepTask {
|
func NewPoRepTask(db *harmonydb.DB, api PoRepAPI, sp *SealPoller, sc *ffi.SealCalls, maxPoRep int) *PoRepTask {
|
||||||
return &PoRepTask{
|
return &PoRepTask{
|
||||||
db: db,
|
db: db,
|
||||||
api: api,
|
api: api,
|
@ -1,4 +1,4 @@
|
|||||||
package lpseal
|
package seal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
@ -16,10 +16,10 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/build"
|
"github.com/filecoin-project/lotus/build"
|
||||||
"github.com/filecoin-project/lotus/chain/actors/policy"
|
"github.com/filecoin-project/lotus/chain/actors/policy"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/ffi"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/resources"
|
"github.com/filecoin-project/lotus/lib/harmony/resources"
|
||||||
"github.com/filecoin-project/lotus/provider/lpffi"
|
|
||||||
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -35,12 +35,12 @@ type SDRTask struct {
|
|||||||
db *harmonydb.DB
|
db *harmonydb.DB
|
||||||
sp *SealPoller
|
sp *SealPoller
|
||||||
|
|
||||||
sc *lpffi.SealCalls
|
sc *ffi.SealCalls
|
||||||
|
|
||||||
max int
|
max int
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSDRTask(api SDRAPI, db *harmonydb.DB, sp *SealPoller, sc *lpffi.SealCalls, maxSDR int) *SDRTask {
|
func NewSDRTask(api SDRAPI, db *harmonydb.DB, sp *SealPoller, sc *ffi.SealCalls, maxSDR int) *SDRTask {
|
||||||
return &SDRTask{
|
return &SDRTask{
|
||||||
api: api,
|
api: api,
|
||||||
db: db,
|
db: db,
|
||||||
@ -223,16 +223,16 @@ func (s *SDRTask) Adder(taskFunc harmonytask.AddTaskFunc) {
|
|||||||
s.sp.pollers[pollerSDR].Set(taskFunc)
|
s.sp.pollers[pollerSDR].Set(taskFunc)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SDRTask) taskToSector(id harmonytask.TaskID) (lpffi.SectorRef, error) {
|
func (s *SDRTask) taskToSector(id harmonytask.TaskID) (ffi.SectorRef, error) {
|
||||||
var refs []lpffi.SectorRef
|
var refs []ffi.SectorRef
|
||||||
|
|
||||||
err := s.db.Select(context.Background(), &refs, `SELECT sp_id, sector_number, reg_seal_proof FROM sectors_sdr_pipeline WHERE task_id_sdr = $1`, id)
|
err := s.db.Select(context.Background(), &refs, `SELECT sp_id, sector_number, reg_seal_proof FROM sectors_sdr_pipeline WHERE task_id_sdr = $1`, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return lpffi.SectorRef{}, xerrors.Errorf("getting sector ref: %w", err)
|
return ffi.SectorRef{}, xerrors.Errorf("getting sector ref: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(refs) != 1 {
|
if len(refs) != 1 {
|
||||||
return lpffi.SectorRef{}, xerrors.Errorf("expected 1 sector ref, got %d", len(refs))
|
return ffi.SectorRef{}, xerrors.Errorf("expected 1 sector ref, got %d", len(refs))
|
||||||
}
|
}
|
||||||
|
|
||||||
return refs[0], nil
|
return refs[0], nil
|
@ -1,4 +1,4 @@
|
|||||||
package lpseal
|
package seal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
@ -14,11 +14,11 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/api"
|
"github.com/filecoin-project/lotus/api"
|
||||||
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/message"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/multictladdr"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/resources"
|
"github.com/filecoin-project/lotus/lib/harmony/resources"
|
||||||
"github.com/filecoin-project/lotus/provider/lpmessage"
|
|
||||||
"github.com/filecoin-project/lotus/provider/multictladdr"
|
|
||||||
"github.com/filecoin-project/lotus/storage/ctladdr"
|
"github.com/filecoin-project/lotus/storage/ctladdr"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -35,13 +35,13 @@ type SubmitCommitTask struct {
|
|||||||
db *harmonydb.DB
|
db *harmonydb.DB
|
||||||
api SubmitCommitAPI
|
api SubmitCommitAPI
|
||||||
|
|
||||||
sender *lpmessage.Sender
|
sender *message.Sender
|
||||||
as *multictladdr.MultiAddressSelector
|
as *multictladdr.MultiAddressSelector
|
||||||
|
|
||||||
maxFee types.FIL
|
maxFee types.FIL
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSubmitCommitTask(sp *SealPoller, db *harmonydb.DB, api SubmitCommitAPI, sender *lpmessage.Sender, as *multictladdr.MultiAddressSelector, maxFee types.FIL) *SubmitCommitTask {
|
func NewSubmitCommitTask(sp *SealPoller, db *harmonydb.DB, api SubmitCommitAPI, sender *message.Sender, as *multictladdr.MultiAddressSelector, maxFee types.FIL) *SubmitCommitTask {
|
||||||
return &SubmitCommitTask{
|
return &SubmitCommitTask{
|
||||||
sp: sp,
|
sp: sp,
|
||||||
db: db,
|
db: db,
|
@ -1,4 +1,4 @@
|
|||||||
package lpseal
|
package seal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
@ -16,11 +16,11 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/api"
|
"github.com/filecoin-project/lotus/api"
|
||||||
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/message"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/multictladdr"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/resources"
|
"github.com/filecoin-project/lotus/lib/harmony/resources"
|
||||||
"github.com/filecoin-project/lotus/provider/lpmessage"
|
|
||||||
"github.com/filecoin-project/lotus/provider/multictladdr"
|
|
||||||
"github.com/filecoin-project/lotus/storage/ctladdr"
|
"github.com/filecoin-project/lotus/storage/ctladdr"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -34,13 +34,13 @@ type SubmitPrecommitTask struct {
|
|||||||
sp *SealPoller
|
sp *SealPoller
|
||||||
db *harmonydb.DB
|
db *harmonydb.DB
|
||||||
api SubmitPrecommitTaskApi
|
api SubmitPrecommitTaskApi
|
||||||
sender *lpmessage.Sender
|
sender *message.Sender
|
||||||
as *multictladdr.MultiAddressSelector
|
as *multictladdr.MultiAddressSelector
|
||||||
|
|
||||||
maxFee types.FIL
|
maxFee types.FIL
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSubmitPrecommitTask(sp *SealPoller, db *harmonydb.DB, api SubmitPrecommitTaskApi, sender *lpmessage.Sender, as *multictladdr.MultiAddressSelector, maxFee types.FIL) *SubmitPrecommitTask {
|
func NewSubmitPrecommitTask(sp *SealPoller, db *harmonydb.DB, api SubmitPrecommitTaskApi, sender *message.Sender, as *multictladdr.MultiAddressSelector, maxFee types.FIL) *SubmitPrecommitTask {
|
||||||
return &SubmitPrecommitTask{
|
return &SubmitPrecommitTask{
|
||||||
sp: sp,
|
sp: sp,
|
||||||
db: db,
|
db: db,
|
@ -1,4 +1,4 @@
|
|||||||
package lpseal
|
package seal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -13,10 +13,10 @@ import (
|
|||||||
"github.com/filecoin-project/go-padreader"
|
"github.com/filecoin-project/go-padreader"
|
||||||
"github.com/filecoin-project/go-state-types/abi"
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/ffi"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/resources"
|
"github.com/filecoin-project/lotus/lib/harmony/resources"
|
||||||
"github.com/filecoin-project/lotus/provider/lpffi"
|
|
||||||
"github.com/filecoin-project/lotus/storage/pipeline/lib/nullreader"
|
"github.com/filecoin-project/lotus/storage/pipeline/lib/nullreader"
|
||||||
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
||||||
)
|
)
|
||||||
@ -24,12 +24,12 @@ import (
|
|||||||
type TreesTask struct {
|
type TreesTask struct {
|
||||||
sp *SealPoller
|
sp *SealPoller
|
||||||
db *harmonydb.DB
|
db *harmonydb.DB
|
||||||
sc *lpffi.SealCalls
|
sc *ffi.SealCalls
|
||||||
|
|
||||||
max int
|
max int
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewTreesTask(sp *SealPoller, db *harmonydb.DB, sc *lpffi.SealCalls, maxTrees int) *TreesTask {
|
func NewTreesTask(sp *SealPoller, db *harmonydb.DB, sc *ffi.SealCalls, maxTrees int) *TreesTask {
|
||||||
return &TreesTask{
|
return &TreesTask{
|
||||||
sp: sp,
|
sp: sp,
|
||||||
db: db,
|
db: db,
|
@ -1,4 +1,4 @@
|
|||||||
package lpseal
|
package seal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
@ -1,4 +1,4 @@
|
|||||||
// Package debug provides the API for various debug endpoints in lotus-provider.
|
// Package debug provides the API for various debug endpoints in curio.
|
||||||
package debug
|
package debug
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -18,10 +18,10 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/api/client"
|
"github.com/filecoin-project/lotus/api/client"
|
||||||
"github.com/filecoin-project/lotus/build"
|
"github.com/filecoin-project/lotus/build"
|
||||||
cliutil "github.com/filecoin-project/lotus/cli/util"
|
cliutil "github.com/filecoin-project/lotus/cli/util"
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/deps"
|
"github.com/filecoin-project/lotus/cmd/curio/deps"
|
||||||
)
|
)
|
||||||
|
|
||||||
var log = logging.Logger("lp/web/debug")
|
var log = logging.Logger("curio/web/debug")
|
||||||
|
|
||||||
type debug struct {
|
type debug struct {
|
||||||
*deps.Deps
|
*deps.Deps
|
13
curiosrc/web/api/routes.go
Normal file
13
curiosrc/web/api/routes.go
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// Package api provides the HTTP API for the lotus curio web gui.
|
||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gorilla/mux"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/lotus/cmd/curio/deps"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/web/api/debug"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Routes(r *mux.Router, deps *deps.Deps) {
|
||||||
|
debug.Routes(r.PathPrefix("/debug").Subrouter(), deps)
|
||||||
|
}
|
@ -8,7 +8,7 @@ import (
|
|||||||
logging "github.com/ipfs/go-log/v2"
|
logging "github.com/ipfs/go-log/v2"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/deps"
|
"github.com/filecoin-project/lotus/cmd/curio/deps"
|
||||||
)
|
)
|
||||||
|
|
||||||
//go:embed web/*
|
//go:embed web/*
|
||||||
@ -39,4 +39,4 @@ func Routes(r *mux.Router, deps *deps.Deps) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var log = logging.Logger("lpweb")
|
var log = logging.Logger("curio/web")
|
@ -98,7 +98,7 @@ var templateDev = os.Getenv("LOTUS_WEB_DEV") == "1"
|
|||||||
|
|
||||||
func (a *app) executeTemplate(w http.ResponseWriter, name string, data interface{}) {
|
func (a *app) executeTemplate(w http.ResponseWriter, name string, data interface{}) {
|
||||||
if templateDev {
|
if templateDev {
|
||||||
fs := os.DirFS("./provider/lpweb/hapi/web")
|
fs := os.DirFS("./cmd/curio/web/hapi/web")
|
||||||
a.t = template.Must(template.ParseFS(fs, "*"))
|
a.t = template.Must(template.ParseFS(fs, "*"))
|
||||||
}
|
}
|
||||||
if err := a.t.ExecuteTemplate(w, name, data); err != nil {
|
if err := a.t.ExecuteTemplate(w, name, data); err != nil {
|
@ -1,5 +1,5 @@
|
|||||||
// Package lpweb defines the HTTP web server for static files and endpoints.
|
// Package web defines the HTTP web server for static files and endpoints.
|
||||||
package lpweb
|
package web
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -16,10 +16,10 @@ import (
|
|||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
"go.opencensus.io/tag"
|
"go.opencensus.io/tag"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/deps"
|
"github.com/filecoin-project/lotus/cmd/curio/deps"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/web/api"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/web/hapi"
|
||||||
"github.com/filecoin-project/lotus/metrics"
|
"github.com/filecoin-project/lotus/metrics"
|
||||||
"github.com/filecoin-project/lotus/provider/lpweb/api"
|
|
||||||
"github.com/filecoin-project/lotus/provider/lpweb/hapi"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
//go:embed static
|
//go:embed static
|
||||||
@ -41,7 +41,8 @@ func GetSrv(ctx context.Context, deps *deps.Deps) (*http.Server, error) {
|
|||||||
|
|
||||||
var static fs.FS = static
|
var static fs.FS = static
|
||||||
if webDev {
|
if webDev {
|
||||||
static = os.DirFS("./provider/lpweb")
|
basePath = "cmd/curio/web/static"
|
||||||
|
static = os.DirFS(basePath)
|
||||||
}
|
}
|
||||||
|
|
||||||
mx.NotFoundHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
mx.NotFoundHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
@ -71,7 +72,7 @@ func GetSrv(ctx context.Context, deps *deps.Deps) (*http.Server, error) {
|
|||||||
return &http.Server{
|
return &http.Server{
|
||||||
Handler: http.HandlerFunc(mx.ServeHTTP),
|
Handler: http.HandlerFunc(mx.ServeHTTP),
|
||||||
BaseContext: func(listener net.Listener) context.Context {
|
BaseContext: func(listener net.Listener) context.Context {
|
||||||
ctx, _ := tag.New(context.Background(), tag.Upsert(metrics.APIInterface, "lotus-provider"))
|
ctx, _ := tag.New(context.Background(), tag.Upsert(metrics.APIInterface, "curio"))
|
||||||
return ctx
|
return ctx
|
||||||
},
|
},
|
||||||
Addr: deps.Cfg.Subsystems.GuiAddress,
|
Addr: deps.Cfg.Subsystems.GuiAddress,
|
@ -1,6 +1,6 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>Lotus Provider Cluster Overview</title>
|
<title>Curio Cluster Overview</title>
|
||||||
<script src="https://unpkg.com/htmx.org@1.9.5" integrity="sha384-xcuj3WpfgjlKF+FXhSQFQ0ZNr39ln+hwjN3npfM9VBnUskLolQAcN80McRIVOPuO" crossorigin="anonymous"></script>
|
<script src="https://unpkg.com/htmx.org@1.9.5" integrity="sha384-xcuj3WpfgjlKF+FXhSQFQ0ZNr39ln+hwjN3npfM9VBnUskLolQAcN80McRIVOPuO" crossorigin="anonymous"></script>
|
||||||
<script type="module" src="chain-connectivity.js"></script>
|
<script type="module" src="chain-connectivity.js"></script>
|
||||||
<link rel="stylesheet" href="main.css">
|
<link rel="stylesheet" href="main.css">
|
||||||
@ -39,7 +39,7 @@
|
|||||||
<body>
|
<body>
|
||||||
<div class="app-head">
|
<div class="app-head">
|
||||||
<div class="head-left">
|
<div class="head-left">
|
||||||
<h1>Lotus Provider Cluster</h1>
|
<h1>Curio Cluster</h1>
|
||||||
</div>
|
</div>
|
||||||
<div class="head-right">
|
<div class="head-right">
|
||||||
version [todo]
|
version [todo]
|
@ -1,4 +1,4 @@
|
|||||||
package lpwindow
|
package window
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
@ -24,7 +24,7 @@ import (
|
|||||||
|
|
||||||
"github.com/filecoin-project/lotus/build"
|
"github.com/filecoin-project/lotus/build"
|
||||||
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
||||||
types "github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
"github.com/filecoin-project/lotus/storage/sealer"
|
"github.com/filecoin-project/lotus/storage/sealer"
|
||||||
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
||||||
)
|
)
|
@ -1,4 +1,4 @@
|
|||||||
package lpwindow
|
package window
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
@ -22,20 +22,20 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/api"
|
"github.com/filecoin-project/lotus/api"
|
||||||
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/chainsched"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/resources"
|
"github.com/filecoin-project/lotus/lib/harmony/resources"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/taskhelp"
|
"github.com/filecoin-project/lotus/lib/harmony/taskhelp"
|
||||||
"github.com/filecoin-project/lotus/lib/promise"
|
"github.com/filecoin-project/lotus/lib/promise"
|
||||||
"github.com/filecoin-project/lotus/node/modules/dtypes"
|
"github.com/filecoin-project/lotus/node/modules/dtypes"
|
||||||
"github.com/filecoin-project/lotus/provider/chainsched"
|
|
||||||
"github.com/filecoin-project/lotus/storage/sealer"
|
"github.com/filecoin-project/lotus/storage/sealer"
|
||||||
"github.com/filecoin-project/lotus/storage/sealer/sealtasks"
|
"github.com/filecoin-project/lotus/storage/sealer/sealtasks"
|
||||||
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
||||||
"github.com/filecoin-project/lotus/storage/wdpost"
|
"github.com/filecoin-project/lotus/storage/wdpost"
|
||||||
)
|
)
|
||||||
|
|
||||||
var log = logging.Logger("lpwindow")
|
var log = logging.Logger("curio/window")
|
||||||
|
|
||||||
var EpochsPerDeadline = miner.WPoStProvingPeriod() / abi.ChainEpoch(miner.WPoStPeriodDeadlines)
|
var EpochsPerDeadline = miner.WPoStProvingPeriod() / abi.ChainEpoch(miner.WPoStPeriodDeadlines)
|
||||||
|
|
||||||
@ -86,7 +86,7 @@ func NewWdPostTask(db *harmonydb.DB,
|
|||||||
faultTracker sealer.FaultTracker,
|
faultTracker sealer.FaultTracker,
|
||||||
prover ProverPoSt,
|
prover ProverPoSt,
|
||||||
verifier storiface.Verifier,
|
verifier storiface.Verifier,
|
||||||
pcs *chainsched.ProviderChainSched,
|
pcs *chainsched.CurioChainSched,
|
||||||
actors map[dtypes.MinerAddress]bool,
|
actors map[dtypes.MinerAddress]bool,
|
||||||
max int,
|
max int,
|
||||||
) (*WdPostTask, error) {
|
) (*WdPostTask, error) {
|
@ -1,4 +1,4 @@
|
|||||||
package lpwindow
|
package window
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
@ -1,4 +1,4 @@
|
|||||||
package lpwindow
|
package window
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -15,20 +15,20 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/chain/actors"
|
"github.com/filecoin-project/lotus/chain/actors"
|
||||||
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/chainsched"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/message"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/multictladdr"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/resources"
|
"github.com/filecoin-project/lotus/lib/harmony/resources"
|
||||||
"github.com/filecoin-project/lotus/lib/promise"
|
"github.com/filecoin-project/lotus/lib/promise"
|
||||||
"github.com/filecoin-project/lotus/node/modules/dtypes"
|
"github.com/filecoin-project/lotus/node/modules/dtypes"
|
||||||
"github.com/filecoin-project/lotus/provider/chainsched"
|
|
||||||
"github.com/filecoin-project/lotus/provider/lpmessage"
|
|
||||||
"github.com/filecoin-project/lotus/provider/multictladdr"
|
|
||||||
"github.com/filecoin-project/lotus/storage/sealer"
|
"github.com/filecoin-project/lotus/storage/sealer"
|
||||||
"github.com/filecoin-project/lotus/storage/wdpost"
|
"github.com/filecoin-project/lotus/storage/wdpost"
|
||||||
)
|
)
|
||||||
|
|
||||||
type WdPostRecoverDeclareTask struct {
|
type WdPostRecoverDeclareTask struct {
|
||||||
sender *lpmessage.Sender
|
sender *message.Sender
|
||||||
db *harmonydb.DB
|
db *harmonydb.DB
|
||||||
api WdPostRecoverDeclareTaskApi
|
api WdPostRecoverDeclareTaskApi
|
||||||
faultTracker sealer.FaultTracker
|
faultTracker sealer.FaultTracker
|
||||||
@ -57,12 +57,12 @@ type WdPostRecoverDeclareTaskApi interface {
|
|||||||
StateLookupID(context.Context, address.Address, types.TipSetKey) (address.Address, error)
|
StateLookupID(context.Context, address.Address, types.TipSetKey) (address.Address, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWdPostRecoverDeclareTask(sender *lpmessage.Sender,
|
func NewWdPostRecoverDeclareTask(sender *message.Sender,
|
||||||
db *harmonydb.DB,
|
db *harmonydb.DB,
|
||||||
api WdPostRecoverDeclareTaskApi,
|
api WdPostRecoverDeclareTaskApi,
|
||||||
faultTracker sealer.FaultTracker,
|
faultTracker sealer.FaultTracker,
|
||||||
as *multictladdr.MultiAddressSelector,
|
as *multictladdr.MultiAddressSelector,
|
||||||
pcs *chainsched.ProviderChainSched,
|
pcs *chainsched.CurioChainSched,
|
||||||
|
|
||||||
maxDeclareRecoveriesGasFee types.FIL,
|
maxDeclareRecoveriesGasFee types.FIL,
|
||||||
actors map[dtypes.MinerAddress]bool) (*WdPostRecoverDeclareTask, error) {
|
actors map[dtypes.MinerAddress]bool) (*WdPostRecoverDeclareTask, error) {
|
@ -1,4 +1,4 @@
|
|||||||
package lpwindow
|
package window
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
@ -15,13 +15,13 @@ import (
|
|||||||
|
|
||||||
"github.com/filecoin-project/lotus/api"
|
"github.com/filecoin-project/lotus/api"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/chainsched"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/message"
|
||||||
|
"github.com/filecoin-project/lotus/curiosrc/multictladdr"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
|
||||||
"github.com/filecoin-project/lotus/lib/harmony/resources"
|
"github.com/filecoin-project/lotus/lib/harmony/resources"
|
||||||
"github.com/filecoin-project/lotus/lib/promise"
|
"github.com/filecoin-project/lotus/lib/promise"
|
||||||
"github.com/filecoin-project/lotus/provider/chainsched"
|
|
||||||
"github.com/filecoin-project/lotus/provider/lpmessage"
|
|
||||||
"github.com/filecoin-project/lotus/provider/multictladdr"
|
|
||||||
"github.com/filecoin-project/lotus/storage/wdpost"
|
"github.com/filecoin-project/lotus/storage/wdpost"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -42,7 +42,7 @@ type WdPoStSubmitTaskApi interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type WdPostSubmitTask struct {
|
type WdPostSubmitTask struct {
|
||||||
sender *lpmessage.Sender
|
sender *message.Sender
|
||||||
db *harmonydb.DB
|
db *harmonydb.DB
|
||||||
api WdPoStSubmitTaskApi
|
api WdPoStSubmitTaskApi
|
||||||
|
|
||||||
@ -52,7 +52,7 @@ type WdPostSubmitTask struct {
|
|||||||
submitPoStTF promise.Promise[harmonytask.AddTaskFunc]
|
submitPoStTF promise.Promise[harmonytask.AddTaskFunc]
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWdPostSubmitTask(pcs *chainsched.ProviderChainSched, send *lpmessage.Sender, db *harmonydb.DB, api WdPoStSubmitTaskApi, maxWindowPoStGasFee types.FIL, as *multictladdr.MultiAddressSelector) (*WdPostSubmitTask, error) {
|
func NewWdPostSubmitTask(pcs *chainsched.CurioChainSched, send *message.Sender, db *harmonydb.DB, api WdPoStSubmitTaskApi, maxWindowPoStGasFee types.FIL, as *multictladdr.MultiAddressSelector) (*WdPostSubmitTask, error) {
|
||||||
res := &WdPostSubmitTask{
|
res := &WdPostSubmitTask{
|
||||||
sender: send,
|
sender: send,
|
||||||
db: db,
|
db: db,
|
@ -1,4 +1,4 @@
|
|||||||
package lpwinning
|
package winning
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
@ -32,7 +32,7 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
||||||
)
|
)
|
||||||
|
|
||||||
var log = logging.Logger("lpwinning")
|
var log = logging.Logger("curio/winning")
|
||||||
|
|
||||||
type WinPostTask struct {
|
type WinPostTask struct {
|
||||||
max int
|
max int
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
|
|
||||||
### Shutdown
|
### Shutdown
|
||||||
|
Trigger shutdown
|
||||||
|
|
||||||
|
|
||||||
Perms: admin
|
Perms: admin
|
@ -1,21 +1,23 @@
|
|||||||
# lotus-provider
|
# curio
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider - Filecoin decentralized storage network provider
|
curio - Filecoin decentralized storage network provider
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider [global options] command [command options] [arguments...]
|
curio [global options] command [command options] [arguments...]
|
||||||
|
|
||||||
VERSION:
|
VERSION:
|
||||||
1.27.0-dev
|
1.27.0-dev
|
||||||
|
|
||||||
COMMANDS:
|
COMMANDS:
|
||||||
cli Execute cli commands
|
cli Execute cli commands
|
||||||
run Start a lotus provider process
|
run Start a Curio process
|
||||||
stop Stop a running lotus provider
|
stop Stop a running Curio process
|
||||||
config Manage node config by layers. The layer 'base' will always be applied at Curio start-up.
|
config Manage node config by layers. The layer 'base' will always be applied at Curio start-up.
|
||||||
test Utility functions for testing
|
test Utility functions for testing
|
||||||
web Start lotus provider web interface
|
web Start Curio web interface
|
||||||
|
guided-setup Run the guided setup for migrating from lotus-miner to Curio
|
||||||
|
from-miner Express a database config (for curio) from an existing miner.
|
||||||
seal Manage the sealing pipeline
|
seal Manage the sealing pipeline
|
||||||
version Print version
|
version Print version
|
||||||
help, h Shows a list of commands or help for one command
|
help, h Shows a list of commands or help for one command
|
||||||
@ -27,23 +29,23 @@ COMMANDS:
|
|||||||
|
|
||||||
GLOBAL OPTIONS:
|
GLOBAL OPTIONS:
|
||||||
--color use color in display output (default: depends on output being a TTY)
|
--color use color in display output (default: depends on output being a TTY)
|
||||||
--db-host value Command separated list of hostnames for yugabyte cluster (default: "yugabyte") [$LOTUS_DB_HOST]
|
--db-host value Command separated list of hostnames for yugabyte cluster (default: "yugabyte") [$CURIO_DB_HOST, $CURIO_HARMONYDB_HOSTS]
|
||||||
--db-name value (default: "yugabyte") [$LOTUS_DB_NAME, $LOTUS_HARMONYDB_HOSTS]
|
--db-name value (default: "yugabyte") [$CURIO_DB_NAME, $CURIO_HARMONYDB_NAME]
|
||||||
--db-user value (default: "yugabyte") [$LOTUS_DB_USER, $LOTUS_HARMONYDB_USERNAME]
|
--db-user value (default: "yugabyte") [$CURIO_DB_USER, $CURIO_HARMONYDB_USERNAME]
|
||||||
--db-password value (default: "yugabyte") [$LOTUS_DB_PASSWORD, $LOTUS_HARMONYDB_PASSWORD]
|
--db-password value (default: "yugabyte") [$CURIO_DB_PASSWORD, $CURIO_HARMONYDB_PASSWORD]
|
||||||
--repo-path value (default: "~/.lotusprovider") [$LOTUS_REPO_PATH]
|
--repo-path value (default: "~/.curio") [$CURIO_REPO_PATH]
|
||||||
--vv enables very verbose mode, useful for debugging the CLI (default: false)
|
--vv enables very verbose mode, useful for debugging the CLI (default: false)
|
||||||
--help, -h show help
|
--help, -h show help
|
||||||
--version, -v print the version
|
--version, -v print the version
|
||||||
```
|
```
|
||||||
|
|
||||||
## lotus-provider cli
|
## curio cli
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider cli - Execute cli commands
|
curio cli - Execute cli commands
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider cli command [command options] [arguments...]
|
curio cli command [command options] [arguments...]
|
||||||
|
|
||||||
COMMANDS:
|
COMMANDS:
|
||||||
storage manage sector storage
|
storage manage sector storage
|
||||||
@ -54,57 +56,57 @@ OPTIONS:
|
|||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
### lotus-provider cli storage
|
### curio cli storage
|
||||||
```
|
```
|
||||||
```
|
```
|
||||||
|
|
||||||
## lotus-provider run
|
## curio run
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider run - Start a lotus provider process
|
curio run - Start a Curio process
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider run [command options] [arguments...]
|
curio run [command options] [arguments...]
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
--listen value host address and port the worker api will listen on (default: "0.0.0.0:12300") [$LOTUS_WORKER_LISTEN]
|
--listen value host address and port the worker api will listen on (default: "0.0.0.0:12300") [$LOTUS_WORKER_LISTEN]
|
||||||
--nosync don't check full-node sync status (default: false)
|
--nosync don't check full-node sync status (default: false)
|
||||||
--manage-fdlimit manage open file limit (default: true)
|
--manage-fdlimit manage open file limit (default: true)
|
||||||
--storage-json value path to json file containing storage config (default: "~/.lotus-provider/storage.json")
|
--storage-json value path to json file containing storage config (default: "~/.curio/storage.json")
|
||||||
--journal value path to journal files (default: "~/.lotus-provider/")
|
--journal value path to journal files (default: "~/.curio/")
|
||||||
--layers value [ --layers value ] list of layers to be interpreted (atop defaults). Default: base
|
--layers value [ --layers value ] list of layers to be interpreted (atop defaults). Default: base
|
||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
## lotus-provider stop
|
## curio stop
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider stop - Stop a running lotus provider
|
curio stop - Stop a running Curio process
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider stop [command options] [arguments...]
|
curio stop [command options] [arguments...]
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
## lotus-provider config
|
## curio config
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider config - Manage node config by layers. The layer 'base' will always be applied at Curio start-up.
|
curio config - Manage node config by layers. The layer 'base' will always be applied at Curio start-up.
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider config command [command options] [arguments...]
|
curio config command [command options] [arguments...]
|
||||||
|
|
||||||
COMMANDS:
|
COMMANDS:
|
||||||
default, defaults Print default node config
|
default, defaults Print default node config
|
||||||
set, add, update, create Set a config layer or the base by providing a filename or stdin.
|
set, add, update, create Set a config layer or the base by providing a filename or stdin.
|
||||||
get, cat, show Get a config layer by name. You may want to pipe the output to a file, or use 'less'
|
get, cat, show Get a config layer by name. You may want to pipe the output to a file, or use 'less'
|
||||||
list, ls List config layers present in the DB.
|
list, ls List config layers present in the DB.
|
||||||
interpret, view, stacked, stack Interpret stacked config layers by this version of lotus-provider, with system-generated comments.
|
interpret, view, stacked, stack Interpret stacked config layers by this version of curio, with system-generated comments.
|
||||||
remove, rm, del, delete Remove a named config layer.
|
remove, rm, del, delete Remove a named config layer.
|
||||||
edit edit a config layer
|
edit edit a config layer
|
||||||
from-miner Express a database config (for lotus-provider) from an existing miner.
|
from-miner Express a database config (for curio) from an existing miner.
|
||||||
new-cluster Create new configuration for a new cluster
|
new-cluster Create new configuration for a new cluster
|
||||||
help, h Shows a list of commands or help for one command
|
help, h Shows a list of commands or help for one command
|
||||||
|
|
||||||
@ -112,88 +114,88 @@ OPTIONS:
|
|||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
### lotus-provider config default
|
### curio config default
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider config default - Print default node config
|
curio config default - Print default node config
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider config default [command options] [arguments...]
|
curio config default [command options] [arguments...]
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
--no-comment don't comment default values (default: false)
|
--no-comment don't comment default values (default: false)
|
||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
### lotus-provider config set
|
### curio config set
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider config set - Set a config layer or the base by providing a filename or stdin.
|
curio config set - Set a config layer or the base by providing a filename or stdin.
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider config set [command options] a layer's file name
|
curio config set [command options] a layer's file name
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
--title value title of the config layer (req'd for stdin)
|
--title value title of the config layer (req'd for stdin)
|
||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
### lotus-provider config get
|
### curio config get
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider config get - Get a config layer by name. You may want to pipe the output to a file, or use 'less'
|
curio config get - Get a config layer by name. You may want to pipe the output to a file, or use 'less'
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider config get [command options] layer name
|
curio config get [command options] layer name
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
### lotus-provider config list
|
### curio config list
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider config list - List config layers present in the DB.
|
curio config list - List config layers present in the DB.
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider config list [command options] [arguments...]
|
curio config list [command options] [arguments...]
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
### lotus-provider config interpret
|
### curio config interpret
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider config interpret - Interpret stacked config layers by this version of lotus-provider, with system-generated comments.
|
curio config interpret - Interpret stacked config layers by this version of curio, with system-generated comments.
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider config interpret [command options] a list of layers to be interpreted as the final config
|
curio config interpret [command options] a list of layers to be interpreted as the final config
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
--layers value [ --layers value ] comma or space separated list of layers to be interpreted (base is always applied)
|
--layers value [ --layers value ] comma or space separated list of layers to be interpreted (base is always applied)
|
||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
### lotus-provider config remove
|
### curio config remove
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider config remove - Remove a named config layer.
|
curio config remove - Remove a named config layer.
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider config remove [command options] [arguments...]
|
curio config remove [command options] [arguments...]
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
### lotus-provider config edit
|
### curio config edit
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider config edit - edit a config layer
|
curio config edit - edit a config layer
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider config edit [command options] [layer name]
|
curio config edit [command options] [layer name]
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
--editor value editor to use (default: "vim") [$EDITOR]
|
--editor value editor to use (default: "vim") [$EDITOR]
|
||||||
@ -204,43 +206,43 @@ OPTIONS:
|
|||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
### lotus-provider config from-miner
|
### curio config from-miner
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider config from-miner - Express a database config (for lotus-provider) from an existing miner.
|
curio from-miner - Express a database config (for curio) from an existing miner.
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider config from-miner [command options] [arguments...]
|
curio from-miner [command options] [arguments...]
|
||||||
|
|
||||||
DESCRIPTION:
|
DESCRIPTION:
|
||||||
Express a database config (for lotus-provider) from an existing miner.
|
Express a database config (for curio) from an existing miner.
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
--miner-repo value, --storagerepo value Miner repo path (default: "~/.lotusminer") [$LOTUS_MINER_PATH, $LOTUS_STORAGE_PATH]
|
--miner-repo value, --storagerepo value Specify miner repo path. flag(storagerepo) and env(LOTUS_STORAGE_PATH) are DEPRECATION, will REMOVE SOON (default: "~/.lotusminer") [$LOTUS_MINER_PATH, $LOTUS_STORAGE_PATH]
|
||||||
--to-layer value, -t value The layer name for this data push. 'base' is recommended for single-miner setup.
|
--to-layer value, -t value The layer name for this data push. 'base' is recommended for single-miner setup.
|
||||||
--overwrite, -o Use this with --to-layer to replace an existing layer (default: false)
|
--overwrite, -o Use this with --to-layer to replace an existing layer (default: false)
|
||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
### lotus-provider config new-cluster
|
### curio config new-cluster
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider config new-cluster - Create new configuration for a new cluster
|
curio config new-cluster - Create new configuration for a new cluster
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider config new-cluster [command options] [SP actor address...]
|
curio config new-cluster [command options] [SP actor address...]
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
## lotus-provider test
|
## curio test
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider test - Utility functions for testing
|
curio test - Utility functions for testing
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider test command [command options] [arguments...]
|
curio test command [command options] [arguments...]
|
||||||
|
|
||||||
COMMANDS:
|
COMMANDS:
|
||||||
window-post, wd, windowpost, wdpost Compute a proof-of-spacetime for a sector (requires the sector to be pre-sealed). These will not send to the chain.
|
window-post, wd, windowpost, wdpost Compute a proof-of-spacetime for a sector (requires the sector to be pre-sealed). These will not send to the chain.
|
||||||
@ -250,30 +252,30 @@ OPTIONS:
|
|||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
### lotus-provider test window-post
|
### curio test window-post
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider test window-post - Compute a proof-of-spacetime for a sector (requires the sector to be pre-sealed). These will not send to the chain.
|
curio test window-post - Compute a proof-of-spacetime for a sector (requires the sector to be pre-sealed). These will not send to the chain.
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider test window-post command [command options] [arguments...]
|
curio test window-post command [command options] [arguments...]
|
||||||
|
|
||||||
COMMANDS:
|
COMMANDS:
|
||||||
here, cli Compute WindowPoSt for performance and configuration testing.
|
here, cli Compute WindowPoSt for performance and configuration testing.
|
||||||
task, scheduled, schedule, async, asynchronous Test the windowpost scheduler by running it on the next available lotus-provider.
|
task, scheduled, schedule, async, asynchronous Test the windowpost scheduler by running it on the next available curio.
|
||||||
help, h Shows a list of commands or help for one command
|
help, h Shows a list of commands or help for one command
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
#### lotus-provider test window-post here
|
#### curio test window-post here
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider test window-post here - Compute WindowPoSt for performance and configuration testing.
|
curio test window-post here - Compute WindowPoSt for performance and configuration testing.
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider test window-post here [command options] [deadline index]
|
curio test window-post here [command options] [deadline index]
|
||||||
|
|
||||||
DESCRIPTION:
|
DESCRIPTION:
|
||||||
Note: This command is intended to be used to verify PoSt compute performance.
|
Note: This command is intended to be used to verify PoSt compute performance.
|
||||||
@ -282,18 +284,18 @@ DESCRIPTION:
|
|||||||
OPTIONS:
|
OPTIONS:
|
||||||
--deadline value deadline to compute WindowPoSt for (default: 0)
|
--deadline value deadline to compute WindowPoSt for (default: 0)
|
||||||
--layers value [ --layers value ] list of layers to be interpreted (atop defaults). Default: base
|
--layers value [ --layers value ] list of layers to be interpreted (atop defaults). Default: base
|
||||||
--storage-json value path to json file containing storage config (default: "~/.lotus-provider/storage.json")
|
--storage-json value path to json file containing storage config (default: "~/.curio/storage.json")
|
||||||
--partition value partition to compute WindowPoSt for (default: 0)
|
--partition value partition to compute WindowPoSt for (default: 0)
|
||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
#### lotus-provider test window-post task
|
#### curio test window-post task
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider test window-post task - Test the windowpost scheduler by running it on the next available lotus-provider.
|
curio test window-post task - Test the windowpost scheduler by running it on the next available curio.
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider test window-post task [command options] [arguments...]
|
curio test window-post task [command options] [arguments...]
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
--deadline value deadline to compute WindowPoSt for (default: 0)
|
--deadline value deadline to compute WindowPoSt for (default: 0)
|
||||||
@ -301,16 +303,16 @@ OPTIONS:
|
|||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
## lotus-provider web
|
## curio web
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider web - Start lotus provider web interface
|
curio web - Start Curio web interface
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider web [command options] [arguments...]
|
curio web [command options] [arguments...]
|
||||||
|
|
||||||
DESCRIPTION:
|
DESCRIPTION:
|
||||||
Start an instance of lotus provider web interface.
|
Start an instance of Curio web interface.
|
||||||
This creates the 'web' layer if it does not exist, then calls run with that layer.
|
This creates the 'web' layer if it does not exist, then calls run with that layer.
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
@ -320,13 +322,43 @@ OPTIONS:
|
|||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
## lotus-provider seal
|
## curio guided-setup
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider seal - Manage the sealing pipeline
|
curio guided-setup - Run the guided setup for migrating from lotus-miner to Curio
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider seal command [command options] [arguments...]
|
curio guided-setup [command options] [arguments...]
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
--help, -h show help
|
||||||
|
```
|
||||||
|
|
||||||
|
## curio from-miner
|
||||||
|
```
|
||||||
|
NAME:
|
||||||
|
curio from-miner - Express a database config (for curio) from an existing miner.
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
curio from-miner [command options] [arguments...]
|
||||||
|
|
||||||
|
DESCRIPTION:
|
||||||
|
Express a database config (for curio) from an existing miner.
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
--miner-repo value, --storagerepo value Specify miner repo path. flag(storagerepo) and env(LOTUS_STORAGE_PATH) are DEPRECATION, will REMOVE SOON (default: "~/.lotusminer") [$LOTUS_MINER_PATH, $LOTUS_STORAGE_PATH]
|
||||||
|
--to-layer value, -t value The layer name for this data push. 'base' is recommended for single-miner setup.
|
||||||
|
--overwrite, -o Use this with --to-layer to replace an existing layer (default: false)
|
||||||
|
--help, -h show help
|
||||||
|
```
|
||||||
|
|
||||||
|
## curio seal
|
||||||
|
```
|
||||||
|
NAME:
|
||||||
|
curio seal - Manage the sealing pipeline
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
curio seal command [command options] [arguments...]
|
||||||
|
|
||||||
COMMANDS:
|
COMMANDS:
|
||||||
start Start new sealing operations manually
|
start Start new sealing operations manually
|
||||||
@ -336,13 +368,13 @@ OPTIONS:
|
|||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
### lotus-provider seal start
|
### curio seal start
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider seal start - Start new sealing operations manually
|
curio seal start - Start new sealing operations manually
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider seal start [command options] [arguments...]
|
curio seal start [command options] [arguments...]
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
--actor value Specify actor address to start sealing sectors for
|
--actor value Specify actor address to start sealing sectors for
|
||||||
@ -354,25 +386,25 @@ OPTIONS:
|
|||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
## lotus-provider version
|
## curio version
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider version - Print version
|
curio version - Print version
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider version [command options] [arguments...]
|
curio version [command options] [arguments...]
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
## lotus-provider auth
|
## curio auth
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider auth - Manage RPC permissions
|
curio auth - Manage RPC permissions
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider auth command [command options] [arguments...]
|
curio auth command [command options] [arguments...]
|
||||||
|
|
||||||
COMMANDS:
|
COMMANDS:
|
||||||
create-token Create token
|
create-token Create token
|
||||||
@ -383,39 +415,39 @@ OPTIONS:
|
|||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
### lotus-provider auth create-token
|
### curio auth create-token
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider auth create-token - Create token
|
curio auth create-token - Create token
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider auth create-token [command options] [arguments...]
|
curio auth create-token [command options] [arguments...]
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
--perm value permission to assign to the token, one of: read, write, sign, admin
|
--perm value permission to assign to the token, one of: read, write, sign, admin
|
||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
### lotus-provider auth api-info
|
### curio auth api-info
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider auth api-info - Get token with API info required to connect to this node
|
curio auth api-info - Get token with API info required to connect to this node
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider auth api-info [command options] [arguments...]
|
curio auth api-info [command options] [arguments...]
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
--perm value permission to assign to the token, one of: read, write, sign, admin
|
--perm value permission to assign to the token, one of: read, write, sign, admin
|
||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
## lotus-provider log
|
## curio log
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider log - Manage logging
|
curio log - Manage logging
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider log command [command options] [arguments...]
|
curio log command [command options] [arguments...]
|
||||||
|
|
||||||
COMMANDS:
|
COMMANDS:
|
||||||
list List log systems
|
list List log systems
|
||||||
@ -427,25 +459,25 @@ OPTIONS:
|
|||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
### lotus-provider log list
|
### curio log list
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider log list - List log systems
|
curio log list - List log systems
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider log list [command options] [arguments...]
|
curio log list [command options] [arguments...]
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
### lotus-provider log set-level
|
### curio log set-level
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider log set-level - Set log level
|
curio log set-level - Set log level
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider log set-level [command options] [level]
|
curio log set-level [command options] [level]
|
||||||
|
|
||||||
DESCRIPTION:
|
DESCRIPTION:
|
||||||
Set the log level for logging systems:
|
Set the log level for logging systems:
|
||||||
@ -472,26 +504,26 @@ OPTIONS:
|
|||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
### lotus-provider log alerts
|
### curio log alerts
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider log alerts - Get alert states
|
curio log alerts - Get alert states
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider log alerts [command options] [arguments...]
|
curio log alerts [command options] [arguments...]
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
--all get all (active and inactive) alerts (default: false)
|
--all get all (active and inactive) alerts (default: false)
|
||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
## lotus-provider wait-api
|
## curio wait-api
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider wait-api - Wait for lotus api to come online
|
curio wait-api - Wait for lotus api to come online
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider wait-api [command options] [arguments...]
|
curio wait-api [command options] [arguments...]
|
||||||
|
|
||||||
CATEGORY:
|
CATEGORY:
|
||||||
DEVELOPER
|
DEVELOPER
|
||||||
@ -501,13 +533,13 @@ OPTIONS:
|
|||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
## lotus-provider fetch-params
|
## curio fetch-params
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
lotus-provider fetch-params - Fetch proving parameters
|
curio fetch-params - Fetch proving parameters
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
lotus-provider fetch-params [command options] [sectorSize]
|
curio fetch-params [command options] [sectorSize]
|
||||||
|
|
||||||
CATEGORY:
|
CATEGORY:
|
||||||
DEVELOPER
|
DEVELOPER
|
13
go.mod
13
go.mod
@ -17,6 +17,7 @@ require (
|
|||||||
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d
|
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d
|
||||||
github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921
|
github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921
|
||||||
github.com/buger/goterm v1.0.3
|
github.com/buger/goterm v1.0.3
|
||||||
|
github.com/charmbracelet/lipgloss v0.9.1
|
||||||
github.com/chzyer/readline v1.5.1
|
github.com/chzyer/readline v1.5.1
|
||||||
github.com/containerd/cgroups v1.1.0
|
github.com/containerd/cgroups v1.1.0
|
||||||
github.com/coreos/go-systemd/v22 v22.5.0
|
github.com/coreos/go-systemd/v22 v22.5.0
|
||||||
@ -115,6 +116,7 @@ require (
|
|||||||
github.com/libp2p/go-libp2p-routing-helpers v0.7.0
|
github.com/libp2p/go-libp2p-routing-helpers v0.7.0
|
||||||
github.com/libp2p/go-maddr-filter v0.1.0
|
github.com/libp2p/go-maddr-filter v0.1.0
|
||||||
github.com/libp2p/go-msgio v0.3.0
|
github.com/libp2p/go-msgio v0.3.0
|
||||||
|
github.com/manifoldco/promptui v0.9.0
|
||||||
github.com/mattn/go-isatty v0.0.19
|
github.com/mattn/go-isatty v0.0.19
|
||||||
github.com/mattn/go-sqlite3 v1.14.16
|
github.com/mattn/go-sqlite3 v1.14.16
|
||||||
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1
|
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1
|
||||||
@ -160,6 +162,7 @@ require (
|
|||||||
golang.org/x/sync v0.3.0
|
golang.org/x/sync v0.3.0
|
||||||
golang.org/x/sys v0.16.0
|
golang.org/x/sys v0.16.0
|
||||||
golang.org/x/term v0.16.0
|
golang.org/x/term v0.16.0
|
||||||
|
golang.org/x/text v0.14.0
|
||||||
golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9
|
golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9
|
||||||
golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846
|
golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846
|
||||||
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2
|
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2
|
||||||
@ -174,6 +177,7 @@ require (
|
|||||||
github.com/StackExchange/wmi v1.2.1 // indirect
|
github.com/StackExchange/wmi v1.2.1 // indirect
|
||||||
github.com/akavel/rsrc v0.8.0 // indirect
|
github.com/akavel/rsrc v0.8.0 // indirect
|
||||||
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect
|
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect
|
||||||
|
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
|
||||||
github.com/benbjohnson/clock v1.3.5 // indirect
|
github.com/benbjohnson/clock v1.3.5 // indirect
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/bep/debounce v1.2.1 // indirect
|
github.com/bep/debounce v1.2.1 // indirect
|
||||||
@ -265,17 +269,19 @@ require (
|
|||||||
github.com/libp2p/go-netroute v0.2.1 // indirect
|
github.com/libp2p/go-netroute v0.2.1 // indirect
|
||||||
github.com/libp2p/go-reuseport v0.4.0 // indirect
|
github.com/libp2p/go-reuseport v0.4.0 // indirect
|
||||||
github.com/libp2p/go-yamux/v4 v4.0.1 // indirect
|
github.com/libp2p/go-yamux/v4 v4.0.1 // indirect
|
||||||
github.com/lucasb-eyer/go-colorful v1.0.3 // indirect
|
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
|
||||||
github.com/magefile/mage v1.9.0 // indirect
|
github.com/magefile/mage v1.9.0 // indirect
|
||||||
github.com/mailru/easyjson v0.7.7 // indirect
|
github.com/mailru/easyjson v0.7.7 // indirect
|
||||||
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
|
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
|
||||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||||
github.com/mattn/go-runewidth v0.0.10 // indirect
|
github.com/mattn/go-runewidth v0.0.15 // indirect
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
||||||
github.com/miekg/dns v1.1.55 // indirect
|
github.com/miekg/dns v1.1.55 // indirect
|
||||||
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
|
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
|
||||||
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
|
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
|
||||||
github.com/mr-tron/base58 v1.2.0 // indirect
|
github.com/mr-tron/base58 v1.2.0 // indirect
|
||||||
|
github.com/muesli/reflow v0.3.0 // indirect
|
||||||
|
github.com/muesli/termenv v0.15.2 // indirect
|
||||||
github.com/multiformats/go-base36 v0.2.0 // indirect
|
github.com/multiformats/go-base36 v0.2.0 // indirect
|
||||||
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
|
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
|
||||||
github.com/multiformats/go-multistream v0.4.1 // indirect
|
github.com/multiformats/go-multistream v0.4.1 // indirect
|
||||||
@ -295,7 +301,7 @@ require (
|
|||||||
github.com/quic-go/qtls-go1-20 v0.3.3 // indirect
|
github.com/quic-go/qtls-go1-20 v0.3.3 // indirect
|
||||||
github.com/quic-go/quic-go v0.38.2 // indirect
|
github.com/quic-go/quic-go v0.38.2 // indirect
|
||||||
github.com/quic-go/webtransport-go v0.5.3 // indirect
|
github.com/quic-go/webtransport-go v0.5.3 // indirect
|
||||||
github.com/rivo/uniseg v0.1.0 // indirect
|
github.com/rivo/uniseg v0.2.0 // indirect
|
||||||
github.com/rs/cors v1.7.0 // indirect
|
github.com/rs/cors v1.7.0 // indirect
|
||||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||||
github.com/shirou/gopsutil v2.18.12+incompatible // indirect
|
github.com/shirou/gopsutil v2.18.12+incompatible // indirect
|
||||||
@ -320,7 +326,6 @@ require (
|
|||||||
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
|
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
|
||||||
golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect
|
golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect
|
||||||
golang.org/x/mod v0.12.0 // indirect
|
golang.org/x/mod v0.12.0 // indirect
|
||||||
golang.org/x/text v0.14.0 // indirect
|
|
||||||
gonum.org/v1/gonum v0.13.0 // indirect
|
gonum.org/v1/gonum v0.13.0 // indirect
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect
|
||||||
google.golang.org/grpc v1.55.0 // indirect
|
google.golang.org/grpc v1.55.0 // indirect
|
||||||
|
20
go.sum
20
go.sum
@ -106,6 +106,8 @@ github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6l
|
|||||||
github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
|
github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
|
||||||
github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||||
github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
|
github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
|
||||||
|
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
|
||||||
|
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
|
||||||
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
||||||
github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
||||||
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
|
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
|
||||||
@ -159,6 +161,8 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL
|
|||||||
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
|
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
|
||||||
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
|
github.com/charmbracelet/lipgloss v0.9.1 h1:PNyd3jvaJbg4jRHKWXnCj1akQm4rh8dbEzN1p/u1KWg=
|
||||||
|
github.com/charmbracelet/lipgloss v0.9.1/go.mod h1:1mPmG4cxScwUQALAAnacHaigiiHB9Pmr+v1VEawJl6I=
|
||||||
github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ=
|
github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ=
|
||||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||||
github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM=
|
github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM=
|
||||||
@ -1175,8 +1179,9 @@ github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5
|
|||||||
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
|
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
|
||||||
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
|
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
|
||||||
github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8=
|
github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8=
|
||||||
github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac=
|
|
||||||
github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
|
github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
|
||||||
|
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
|
||||||
|
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
|
||||||
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
|
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
|
||||||
github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
|
github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
|
||||||
github.com/magefile/mage v1.9.0 h1:t3AU2wNwehMCW97vuqQLtw6puppWXHO+O2MHo5a50XE=
|
github.com/magefile/mage v1.9.0 h1:t3AU2wNwehMCW97vuqQLtw6puppWXHO+O2MHo5a50XE=
|
||||||
@ -1192,6 +1197,8 @@ github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7
|
|||||||
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
||||||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||||
|
github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA=
|
||||||
|
github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg=
|
||||||
github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc=
|
github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc=
|
||||||
github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs=
|
github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs=
|
||||||
github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I=
|
github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I=
|
||||||
@ -1214,8 +1221,10 @@ github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APP
|
|||||||
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||||
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
||||||
github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg=
|
|
||||||
github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
|
github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
|
||||||
|
github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
|
||||||
|
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
|
||||||
|
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||||
github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y=
|
github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y=
|
||||||
github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
|
github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
@ -1265,6 +1274,10 @@ github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjW
|
|||||||
github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
|
github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
|
||||||
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
|
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
|
||||||
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
|
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
|
||||||
|
github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s=
|
||||||
|
github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8=
|
||||||
|
github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo=
|
||||||
|
github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8=
|
||||||
github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA=
|
github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA=
|
||||||
github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM=
|
github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM=
|
||||||
github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE=
|
github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE=
|
||||||
@ -1485,8 +1498,9 @@ github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmO
|
|||||||
github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk=
|
github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk=
|
||||||
github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU=
|
github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU=
|
||||||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||||
github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY=
|
|
||||||
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||||
|
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
|
||||||
|
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||||
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
|
@ -46,9 +46,9 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/chain/stmgr"
|
"github.com/filecoin-project/lotus/chain/stmgr"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
"github.com/filecoin-project/lotus/chain/wallet/key"
|
"github.com/filecoin-project/lotus/chain/wallet/key"
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/deps"
|
"github.com/filecoin-project/lotus/cmd/curio/deps"
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/rpc"
|
"github.com/filecoin-project/lotus/cmd/curio/rpc"
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/tasks"
|
"github.com/filecoin-project/lotus/cmd/curio/tasks"
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-seed/seed"
|
"github.com/filecoin-project/lotus/cmd/lotus-seed/seed"
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-worker/sealworker"
|
"github.com/filecoin-project/lotus/cmd/lotus-worker/sealworker"
|
||||||
"github.com/filecoin-project/lotus/gateway"
|
"github.com/filecoin-project/lotus/gateway"
|
||||||
|
@ -22,7 +22,7 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
"github.com/filecoin-project/lotus/chain/wallet/key"
|
"github.com/filecoin-project/lotus/chain/wallet/key"
|
||||||
cliutil "github.com/filecoin-project/lotus/cli/util"
|
cliutil "github.com/filecoin-project/lotus/cli/util"
|
||||||
"github.com/filecoin-project/lotus/cmd/lotus-provider/deps"
|
"github.com/filecoin-project/lotus/cmd/curio/deps"
|
||||||
"github.com/filecoin-project/lotus/gateway"
|
"github.com/filecoin-project/lotus/gateway"
|
||||||
"github.com/filecoin-project/lotus/node"
|
"github.com/filecoin-project/lotus/node"
|
||||||
)
|
)
|
||||||
@ -57,7 +57,7 @@ type TestFullNode struct {
|
|||||||
|
|
||||||
// TestProviderNode represents a Provider node enrolled in an Ensemble.
|
// TestProviderNode represents a Provider node enrolled in an Ensemble.
|
||||||
type TestProviderNode struct {
|
type TestProviderNode struct {
|
||||||
v1api.LotusProviderStruct
|
v1api.CurioStruct
|
||||||
|
|
||||||
t *testing.T
|
t *testing.T
|
||||||
|
|
||||||
|
@ -84,7 +84,7 @@ func New(hosts []string, username, password, database, port string, itestID ITes
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
schema := "lotus"
|
schema := "curio"
|
||||||
if itest != "" {
|
if itest != "" {
|
||||||
schema = "itest_" + itest
|
schema = "itest_" + itest
|
||||||
}
|
}
|
||||||
|
42
lib/harmony/harmonydb/sql/20240212-common-layers.sql
Normal file
42
lib/harmony/harmonydb/sql/20240212-common-layers.sql
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
INSERT INTO harmony_config (title, config) VALUES
|
||||||
|
('post', '
|
||||||
|
[Subsystems]
|
||||||
|
EnableWindowPost = true
|
||||||
|
EnableWinningPost = true
|
||||||
|
'),
|
||||||
|
|
||||||
|
('gui', '
|
||||||
|
[Subsystems]
|
||||||
|
EnableWebGui = true
|
||||||
|
'),
|
||||||
|
|
||||||
|
('seal', '
|
||||||
|
[Subsystems]
|
||||||
|
EnableSealSDR = true
|
||||||
|
EnableSealSDRTrees = true
|
||||||
|
EnableSendPrecommitMsg = true
|
||||||
|
EnablePoRepProof = true
|
||||||
|
EnableSendCommitMsg = true
|
||||||
|
EnableMoveStorage = true
|
||||||
|
'),
|
||||||
|
|
||||||
|
('seal-gpu', '
|
||||||
|
[Subsystems]
|
||||||
|
EnableSealSDRTrees = true
|
||||||
|
EnableSendPrecommitMsg = true
|
||||||
|
'),
|
||||||
|
('seal-snark', '
|
||||||
|
[Subsystems]
|
||||||
|
EnablePoRepProof = true
|
||||||
|
EnableSendCommitMsg = true
|
||||||
|
'),
|
||||||
|
('sdr', '
|
||||||
|
[Subsystems]
|
||||||
|
EnableSealSDR = true
|
||||||
|
'),
|
||||||
|
|
||||||
|
('storage', '
|
||||||
|
[Subsystems]
|
||||||
|
EnableMoveStorage = true
|
||||||
|
')
|
||||||
|
ON CONFLICT (title) DO NOTHING; -- SPs may have these names defined already.
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user