feat: curio: web based config edit (#11822)

* cfg edit 1

* jsonschema deps

* 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

* part 2 of last

* message

* merge addtl

* fixing guided setup for myself

* warn-on-no-post

* EditorLoads

* cleanups and styles

* create info

* fix tests

* make gen

* change layout, add help button

* Duration custom json

* mjs naming

---------

Co-authored-by: LexLuthr <88259624+LexLuthr@users.noreply.github.com>
Co-authored-by: LexLuthr <lexluthr@protocol.ai>
Co-authored-by: LexLuthr <lexluthr@curiostorage.org>
This commit is contained in:
Andrew Jackson (Ajax) 2024-04-16 09:30:27 -05:00 committed by GitHub
parent 2dd7db20f5
commit fd7f1a95e2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
34 changed files with 1072 additions and 299 deletions

1
.gitignore vendored
View File

@ -39,6 +39,7 @@ build/paramfetch.sh
*.snap *.snap
devgen.car devgen.car
localnet.json localnet.json
/*.ndjson
*-fuzz.zip *-fuzz.zip
/chain/types/work_msg/ /chain/types/work_msg/

View File

@ -6,6 +6,8 @@ import (
"math/big" "math/big"
"strings" "strings"
"github.com/invopop/jsonschema"
"github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/build"
) )
@ -138,5 +140,12 @@ func MustParseFIL(s string) FIL {
return n return n
} }
func (f FIL) JSONSchema() *jsonschema.Schema {
return &jsonschema.Schema{
Type: "string",
Pattern: `^((\d+(\.\d+)?|0x[0-9a-fA-F]+))( ([aA]([tT][tT][oO])?)?[fF][iI][lL])?$`,
}
}
var _ encoding.TextMarshaler = (*FIL)(nil) var _ encoding.TextMarshaler = (*FIL)(nil)
var _ encoding.TextUnmarshaler = (*FIL)(nil) var _ encoding.TextUnmarshaler = (*FIL)(nil)

View File

@ -491,7 +491,7 @@ var MpoolReplaceCmd = &cli.Command{
msg.GasFeeCap = big.Max(retm.GasFeeCap, msg.GasPremium) msg.GasFeeCap = big.Max(retm.GasFeeCap, msg.GasPremium)
mff := func() (abi.TokenAmount, error) { mff := func() (abi.TokenAmount, error) {
return abi.TokenAmount(config.DefaultDefaultMaxFee), nil return abi.TokenAmount(config.DefaultDefaultMaxFee()), nil
} }
messagepool.CapGasFee(mff, &msg, mss) messagepool.CapGasFee(mff, &msg, mss)

View File

@ -40,6 +40,9 @@ var cliCmd = &cli.Command{
// set already // set already
return nil return nil
} }
if os.Getenv("LOTUS_DOCS_GENERATION") == "1" {
return nil
}
db, err := deps.MakeDB(cctx) db, err := deps.MakeDB(cctx)
if err != nil { if err != nil {

View File

@ -1,8 +1,11 @@
package main package main
import ( import (
"reflect"
"testing" "testing"
"time"
"github.com/invopop/jsonschema"
"github.com/samber/lo" "github.com/samber/lo"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
@ -414,3 +417,22 @@ func TestConfig(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
} }
func TestCustomConfigDurationJson(t *testing.T) {
ref := new(jsonschema.Reflector)
ref.Mapper = func(i reflect.Type) *jsonschema.Schema {
if i == reflect.TypeOf(config.Duration(time.Second)) {
return &jsonschema.Schema{
Type: "string",
Format: "duration",
}
}
return nil
}
sch := ref.Reflect(config.CurioConfig{})
definitions := sch.Definitions["CurioProvingConfig"]
prop, ok := definitions.Properties.Get("SingleCheckTimeout")
require.True(t, ok)
require.Equal(t, prop.Type, "string")
}

View File

@ -165,6 +165,7 @@ func GetDeps(ctx context.Context, cctx *cli.Context) (*Deps, error) {
} }
type Deps struct { type Deps struct {
Layers []string
Cfg *config.CurioConfig // values Cfg *config.CurioConfig // values
DB *harmonydb.DB // has itest capability DB *harmonydb.DB // has itest capability
Full api.FullNode Full api.FullNode
@ -212,6 +213,9 @@ func (deps *Deps) PopulateRemainingDeps(ctx context.Context, cctx *cli.Context,
return err return err
} }
} }
if deps.Layers == nil {
deps.Layers = append([]string{"base"}, cctx.StringSlice("layers")...) // Always stack on top of "base" layer
}
if deps.Cfg == nil { if deps.Cfg == nil {
// The config feeds into task runners & their helpers // The config feeds into task runners & their helpers

View File

@ -244,7 +244,7 @@ type MigrationData struct {
func complete(d *MigrationData) { func complete(d *MigrationData) {
stepCompleted(d, d.T("Lotus-Miner to Curio Migration.")) 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, "Try the web interface with %s for further guided improvements.", code.Render("curio run --layers=gui"))
d.say(plain, "You can now migrate your market node (%s), if applicable.", "Boost") d.say(plain, "You can now migrate your market node (%s), if applicable.", "Boost")
} }
@ -279,7 +279,7 @@ func configToDB(d *MigrationData) {
chainApiInfo := fmt.Sprintf("%s:%s", string(token), ainfo.Addr) chainApiInfo := fmt.Sprintf("%s:%s", string(token), ainfo.Addr)
d.MinerID, err = SaveConfigToLayer(d.MinerConfigPath, "", false, chainApiInfo) d.MinerID, err = SaveConfigToLayer(d.MinerConfigPath, chainApiInfo)
if err != nil { if err != nil {
d.say(notice, "Error saving config to layer: %s. Aborting Migration", err.Error()) d.say(notice, "Error saving config to layer: %s. Aborting Migration", err.Error())
os.Exit(1) os.Exit(1)
@ -423,7 +423,7 @@ func verifySectors(d *MigrationData) {
time.Sleep(5 * time.Second) time.Sleep(5 * time.Second)
} }
d.say(plain, "The sectors are in the database. The database is ready for %s.", "Curio") 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") d.say(notice, "Now shut down lotus-miner and lotus-worker and use run %s instead.", code.Render("curio run"))
_, err = (&promptui.Prompt{Label: d.T("Press return to continue")}).Run() _, err = (&promptui.Prompt{Label: d.T("Press return to continue")}).Run()
if err != nil { if err != nil {

View File

@ -4,7 +4,6 @@ import (
"bytes" "bytes"
"context" "context"
"encoding/base64" "encoding/base64"
"errors"
"fmt" "fmt"
"os" "os"
"path" "path"
@ -30,7 +29,7 @@ const (
const FlagMinerRepoDeprecation = "storagerepo" const FlagMinerRepoDeprecation = "storagerepo"
func SaveConfigToLayer(minerRepoPath, layerName string, overwrite bool, chainApiInfo string) (minerAddress address.Address, err error) { func SaveConfigToLayer(minerRepoPath, chainApiInfo string) (minerAddress address.Address, err error) {
_, say := SetupLanguage() _, say := SetupLanguage()
ctx := context.Background() ctx := context.Background()
@ -165,6 +164,12 @@ func SaveConfigToLayer(minerRepoPath, layerName string, overwrite bool, chainApi
baseCfg.Addresses = lo.Filter(baseCfg.Addresses, func(a config.CurioAddresses, _ int) bool { baseCfg.Addresses = lo.Filter(baseCfg.Addresses, func(a config.CurioAddresses, _ int) bool {
return len(a.MinerAddresses) > 0 return len(a.MinerAddresses) > 0
}) })
if baseCfg.Apis.ChainApiInfo == nil {
baseCfg.Apis.ChainApiInfo = append(baseCfg.Apis.ChainApiInfo, chainApiInfo)
}
if baseCfg.Apis.StorageRPCSecret == "" {
baseCfg.Apis.StorageRPCSecret = curioCfg.Apis.StorageRPCSecret
}
cb, err := config.ConfigUpdate(baseCfg, config.DefaultCurioConfig(), config.Commented(true), config.DefaultKeepUncommented(), config.NoEnv()) cb, err := config.ConfigUpdate(baseCfg, config.DefaultCurioConfig(), config.Commented(true), config.DefaultKeepUncommented(), config.NoEnv())
if err != nil { if err != nil {
@ -174,44 +179,33 @@ func SaveConfigToLayer(minerRepoPath, layerName string, overwrite bool, chainApi
if err != nil { if err != nil {
return minerAddress, xerrors.Errorf("cannot update base config: %w", err) 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, "Configuration 'base' was updated to include this miner's address (%s) and its wallet setup.", minerAddress)
} }
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]) 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: skipWritingToBase:
} else if layerName == "" { } else {
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) _, err = db.Exec(ctx, `INSERT INTO harmony_config (title, config) VALUES ('base', $1)
ON CONFLICT(title) DO UPDATE SET config=EXCLUDED.config`, cfg) ON CONFLICT(title) DO UPDATE SET config=EXCLUDED.config`, configTOML)
if err != nil { if err != nil {
return minerAddress, xerrors.Errorf("Cannot insert base config: %w", err) 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.") say(notice, "Configuration 'base' was created to resemble this lotus-miner's config.toml .")
} }
if layerName == "" { // only make mig if base exists and we are different. // compare to base. { // make a layer representing the migration
layerName = fmt.Sprintf("mig-%s", curioCfg.Addresses[0].MinerAddresses[0]) layerName := fmt.Sprintf("mig-%s", curioCfg.Addresses[0].MinerAddresses[0])
overwrite = true _, err = db.Exec(ctx, "DELETE FROM harmony_config WHERE title=$1", layerName)
} 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 { if err != nil {
return minerAddress, xerrors.Errorf("Cannot delete existing layer: %w", err) 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()) _, err = db.Exec(ctx, "INSERT INTO harmony_config (title, config) VALUES ($1, $2)", layerName, configTOML.String())
if err != nil { if err != nil {
return minerAddress, xerrors.Errorf("Cannot insert layer after layer created message: %w", err) return minerAddress, xerrors.Errorf("Cannot insert layer after layer created message: %w", err)
} }
say(plain, "Layer %s created. ", layerName) say(plain, "Layer %s created. ", layerName)
}
dbSettings := getDBSettings(*smCfg) dbSettings := getDBSettings(*smCfg)
say(plain, "To work with the config: ") say(plain, "To work with the config: ")

View File

@ -48,9 +48,9 @@ var messageKeyToIndex = map[string]int{
"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.": 116, "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.": 116,
"Confidence epochs": 86, "Confidence epochs": 86,
"Confidence epochs: %d": 76, "Confidence epochs: %d": 76,
"Configuration 'base' was created to include this miner's address and its wallet setup.": 117, "Configuration 'base' was created to resemble this lotus-miner's config.toml .": 117,
"Configuration 'base' was updated to include this miner's address": 99, "Configuration 'base' was updated to include this miner's address": 99,
"Configuration 'base' was updated to include this miner's address and its wallet setup.": 115, "Configuration 'base' was updated to include this miner's address (%s) and its wallet setup.": 115,
"Connected to Yugabyte": 59, "Connected to Yugabyte": 59,
"Connected to Yugabyte. Schema is current.": 47, "Connected to Yugabyte. Schema is current.": 47,
"Continue to connect and update schema.": 109, "Continue to connect and update schema.": 109,
@ -125,7 +125,7 @@ var messageKeyToIndex = map[string]int{
"No path provided, abandoning migration ": 64, "No path provided, abandoning migration ": 64,
"No value provided": 84, "No value provided": 84,
"Nothing.": 24, "Nothing.": 24,
"Now shut down lotus-miner and move the systems to %s.": 43, "Now shut down lotus-miner and lotus-worker and use run %s instead.": 43,
"One database can serve multiple miner IDs: Run a migration for each lotus-miner.": 37, "One database can serve multiple miner IDs: Run a migration for each lotus-miner.": 37,
"Other": 62, "Other": 62,
"Owner Address: %s": 72, "Owner Address: %s": 72,
@ -177,31 +177,31 @@ var enIndex = []uint32{ // 122 elements
0x0000063c, 0x00000650, 0x000006bb, 0x000006fb, 0x0000063c, 0x00000650, 0x000006bb, 0x000006fb,
0x00000724, 0x0000079b, 0x000007ec, 0x00000838, 0x00000724, 0x0000079b, 0x000007ec, 0x00000838,
0x0000086a, 0x00000898, 0x000008b7, 0x000008f9, 0x0000086a, 0x00000898, 0x000008b7, 0x000008f9,
0x00000932, 0x0000094b, 0x0000095f, 0x0000098f, 0x0000093f, 0x00000958, 0x0000096c, 0x0000099c,
0x000009b9, 0x000009e3, 0x00000a05, 0x00000a7c, 0x000009c6, 0x000009f0, 0x00000a12, 0x00000a89,
0x00000a98, 0x00000ac5, 0x00000ae7, 0x00000b08, 0x00000aa5, 0x00000ad2, 0x00000af4, 0x00000b15,
0x00000b29, 0x00000b4a, 0x00000b6b, 0x00000b85, 0x00000b36, 0x00000b57, 0x00000b78, 0x00000b92,
0x00000b9b, 0x00000be8, 0x00000c22, 0x00000c28, 0x00000ba8, 0x00000bf5, 0x00000c2f, 0x00000c35,
// Entry 40 - 5F // Entry 40 - 5F
0x00000c64, 0x00000c90, 0x00000cd9, 0x00000d19, 0x00000c71, 0x00000c9d, 0x00000ce6, 0x00000d26,
0x00000d6a, 0x00000d7c, 0x00000d96, 0x00000db6, 0x00000d77, 0x00000d89, 0x00000da3, 0x00000dc3,
0x00000ddb, 0x00000df0, 0x00000e06, 0x00000e1c, 0x00000de8, 0x00000dfd, 0x00000e13, 0x00000e29,
0x00000e2f, 0x00000e48, 0x00000e87, 0x00000eb1, 0x00000e3c, 0x00000e55, 0x00000e94, 0x00000ebe,
0x00000ec9, 0x00000edd, 0x00000f00, 0x00000f14, 0x00000ed6, 0x00000eea, 0x00000f0d, 0x00000f21,
0x00000f2a, 0x00000f3c, 0x00000f5f, 0x00000f71, 0x00000f37, 0x00000f49, 0x00000f6c, 0x00000f7e,
0x00000f93, 0x00000fbb, 0x00000fdc, 0x00000ff7, 0x00000fa0, 0x00000fc8, 0x00000fe9, 0x00001004,
0x00001020, 0x00001042, 0x00001074, 0x0000110b, 0x0000102d, 0x0000104f, 0x00001081, 0x00001118,
// Entry 60 - 7F // Entry 60 - 7F
0x00001136, 0x0000116e, 0x00001197, 0x000011cf, 0x00001143, 0x0000117b, 0x000011a4, 0x000011dc,
0x00001210, 0x00001240, 0x00001263, 0x0000128b, 0x0000121d, 0x0000124d, 0x00001270, 0x00001298,
0x000012ed, 0x000012f9, 0x00001305, 0x00001315, 0x000012fa, 0x00001306, 0x00001312, 0x00001322,
0x00001325, 0x00001335, 0x0000135c, 0x0000139d, 0x00001332, 0x00001342, 0x00001369, 0x000013aa,
0x000013c1, 0x000013d2, 0x000013f4, 0x00001421, 0x000013ce, 0x000013df, 0x00001401, 0x0000142e,
0x00001478, 0x00001515, 0x0000156c, 0x00001586, 0x0000148d, 0x0000152a, 0x00001578, 0x00001592,
0x000015a4, 0x00001604, 0x000015b0, 0x00001610,
} // Size: 512 bytes } // Size: 512 bytes
const enData string = "" + // Size: 5636 bytes const enData string = "" + // Size: 5648 bytes
"\x04\x00\x01 0\x02Use the arrow keys to navigate: ↓ ↑ → ←\x02This intera" + "\x04\x00\x01 0\x02Use the arrow keys to navigate: ↓ ↑ → ←\x02This intera" +
"ctive tool creates a new miner actor and creates the basic configuration" + "ctive tool creates a new miner actor and creates the basic configuration" +
" layer for it.\x02This process is partially idempotent. Once a new miner" + " layer for it.\x02This process is partially idempotent. Once a new miner" +
@ -236,207 +236,208 @@ const enData string = "" + // Size: 5636 bytes
"re in %[2]s.\x02Waiting for %[1]s to write sectors into Yugabyte.\x02Err" + "re in %[2]s.\x02Waiting for %[1]s to write sectors into Yugabyte.\x02Err" +
"or interpreting miner ID: %[1]s: ID: %[2]s\x02Error verifying sectors: %" + "or interpreting miner ID: %[1]s: ID: %[2]s\x02Error verifying sectors: %" +
"[1]s\x02The sectors are in the database. The database is ready for %[1]s" + "[1]s\x02The sectors are in the database. The database is ready for %[1]s" +
".\x02Now shut down lotus-miner and move the systems to %[1]s.\x02Press r" + ".\x02Now shut down lotus-miner and lotus-worker and use run %[1]s instea" +
"eturn to continue\x02Aborting migration.\x02Sectors verified. %[1]d sect" + "d.\x02Press return to continue\x02Aborting migration.\x02Sectors verifie" +
"or locations found.\x02Connected to Yugabyte. Schema is current.\x02Enab" + "d. %[1]d sector locations found.\x02Connected to Yugabyte. Schema is cur" +
"ling Sector Indexing in the database.\x02Error encoding config.toml: %[1" + "rent.\x02Enabling Sector Indexing in the database.\x02Error encoding con" +
"]s\x02Press return to update %[1]s with Yugabyte info. A Backup file wil" + "fig.toml: %[1]s\x02Press return to update %[1]s with Yugabyte info. A Ba" +
"l be written to that folder before changes are made.\x02Error expanding " + "ckup file will be written to that folder before changes are made.\x02Err" +
"path: %[1]s\x02Error reading filemode of config.toml: %[1]s\x02Error cre" + "or expanding path: %[1]s\x02Error reading filemode of config.toml: %[1]s" +
"ating backup file: %[1]s\x02Error reading config.toml: %[1]s\x02Error wr" + "\x02Error creating backup file: %[1]s\x02Error reading config.toml: %[1]" +
"iting backup file: %[1]s\x02Error closing backup file: %[1]s\x02Error wr" + "s\x02Error writing backup file: %[1]s\x02Error closing backup file: %[1]" +
"iting config.toml: %[1]s\x04\x00\x01 \x15\x02Restart Lotus Miner.\x02Con" + "s\x02Error writing config.toml: %[1]s\x04\x00\x01 \x15\x02Restart Lotus " +
"nected to Yugabyte\x02To start, ensure your sealing pipeline is drained " + "Miner.\x02Connected to Yugabyte\x02To start, ensure your sealing pipelin" +
"and shut-down lotus-miner.\x02Select the location of your lotus-miner co" + "e is drained and shut-down lotus-miner.\x02Select the location of your l" +
"nfig directory?\x02Other\x02Enter the path to the configuration director" + "otus-miner config directory?\x02Other\x02Enter the path to the configura" +
"y used by %[1]s\x04\x00\x01 '\x02No path provided, abandoning migration" + "tion directory used by %[1]s\x04\x00\x01 '\x02No path provided, abandoni" +
"\x02Cannot read the config.toml file in the provided directory, Error: %" + "ng migration\x02Cannot read the config.toml file in the provided directo" +
"[1]s\x02Could not create repo from directory: %[1]s. Aborting migration" + "ry, Error: %[1]s\x02Could not create repo from directory: %[1]s. Abortin" +
"\x02Could not lock miner repo. Your miner must be stopped: %[1]s\x0a Abo" + "g migration\x02Could not lock miner repo. Your miner must be stopped: %[" +
"rting migration\x02Read Miner Config\x04\x00\x01\x0a\x15\x02Step Complet" + "1]s\x0a Aborting migration\x02Read Miner Config\x04\x00\x01\x0a\x15\x02S" +
"e: %[1]s\x02Initializing a new miner actor.\x02Enter the info to create " + "tep Complete: %[1]s\x02Initializing a new miner actor.\x02Enter the info" +
"a new miner\x02Owner Address: %[1]s\x02Worker Address: %[1]s\x02Sender A" + " to create a new miner\x02Owner Address: %[1]s\x02Worker Address: %[1]s" +
"ddress: %[1]s\x02Sector Size: %[1]d\x02Confidence epochs: %[1]d\x02Conti" + "\x02Sender Address: %[1]s\x02Sector Size: %[1]d\x02Confidence epochs: %[" +
"nue to verify the addresses and create a new miner actor.\x04\x00\x01 %" + "1]d\x02Continue to verify the addresses and create a new miner actor." +
"\x02Miner creation error occurred: %[1]s\x02Enter the owner address\x02N" + "\x04\x00\x01 %\x02Miner creation error occurred: %[1]s\x02Enter the owne" +
"o address provided\x02Failed to parse the address: %[1]s\x02Enter %[1]s " + "r address\x02No address provided\x02Failed to parse the address: %[1]s" +
"address\x02Enter the sector size\x02No value provided\x02Failed to parse" + "\x02Enter %[1]s address\x02Enter the sector size\x02No value provided" +
" sector size: %[1]s\x02Confidence epochs\x02Failed to parse confidence: " + "\x02Failed to parse sector size: %[1]s\x02Confidence epochs\x02Failed to" +
"%[1]s\x02Failed to create the miner actor: %[1]s\x02Miner %[1]s created " + " parse confidence: %[1]s\x02Failed to create the miner actor: %[1]s\x02M" +
"successfully\x02Cannot reach the DB: %[1]s\x02Error connecting to full n" + "iner %[1]s created successfully\x02Cannot reach the DB: %[1]s\x02Error c" +
"ode API: %[1]s\x02Pre-initialization steps complete\x02Failed to generat" + "onnecting to full node API: %[1]s\x02Pre-initialization steps complete" +
"e random bytes for secret: %[1]s\x02Please do not run guided-setup again" + "\x02Failed to generate random bytes for secret: %[1]s\x02Please do not r" +
" as miner creation is not idempotent. You need to run 'curio config new-" + "un guided-setup again as miner creation is not idempotent. You need to r" +
"cluster %[1]s' to finish the configuration\x02Failed to get API info for" + "un 'curio config new-cluster %[1]s' to finish the configuration\x02Faile" +
" FullNode: %[1]w\x02Failed to verify the auth token from daemon node: %[" + "d to get API info for FullNode: %[1]w\x02Failed to verify the auth token" +
"1]s\x02Failed to generate default config: %[1]s\x02Failed to insert 'bas" + " from daemon node: %[1]s\x02Failed to generate default config: %[1]s\x02" +
"e' config layer in database: %[1]s\x02Configuration 'base' was updated t" + "Failed to insert 'base' config layer in database: %[1]s\x02Configuration" +
"o include this miner's address\x02Failed to load base config from databa" + " 'base' was updated to include this miner's address\x02Failed to load ba" +
"se: %[1]s\x02Failed to parse base config: %[1]s\x02Failed to regenerate " + "se config from database: %[1]s\x02Failed to parse base config: %[1]s\x02" +
"base config: %[1]s\x02Enter the info to connect to your Yugabyte databas" + "Failed to regenerate base config: %[1]s\x02Enter the info to connect to " +
"e installation (https://download.yugabyte.com/)\x02Host: %[1]s\x02Port: " + "your Yugabyte database installation (https://download.yugabyte.com/)\x02" +
"%[1]s\x02Username: %[1]s\x02Password: %[1]s\x02Database: %[1]s\x02Contin" + "Host: %[1]s\x02Port: %[1]s\x02Username: %[1]s\x02Password: %[1]s\x02Data" +
"ue to connect and update schema.\x04\x00\x01 <\x02Database config error " + "base: %[1]s\x02Continue to connect and update schema.\x04\x00\x01 <\x02D" +
"occurred, abandoning migration: %[1]s\x02Enter the Yugabyte database hos" + "atabase config error occurred, abandoning migration: %[1]s\x02Enter the " +
"t(s)\x02No host provided\x02Enter the Yugabyte database %[1]s\x02Error c" + "Yugabyte database host(s)\x02No host provided\x02Enter the Yugabyte data" +
"onnecting to Yugabyte database: %[1]s\x02Configuration 'base' was update" + "base %[1]s\x02Error connecting to Yugabyte database: %[1]s\x02Configurat" +
"d to include this miner's address and its wallet setup.\x02Compare the c" + "ion 'base' was updated to include this miner's address (%[1]s) and its w" +
"onfigurations %[1]s to %[2]s. Changes between the miner IDs other than w" + "allet setup.\x02Compare the configurations %[1]s to %[2]s. Changes betwe" +
"allet addreses should be a new, minimal layer for runners that need it." + "en the miner IDs other than wallet addreses should be a new, minimal lay" +
"\x02Configuration 'base' was created to include this miner's address and" + "er for runners that need it.\x02Configuration 'base' was created to rese" +
" its wallet setup.\x04\x00\x01 \x15\x02Layer %[1]s created.\x04\x00\x01 " + "mble this lotus-miner's config.toml .\x04\x00\x01 \x15\x02Layer %[1]s cr" +
"\x19\x02To work with the config:\x02To run Curio: With machine or cgroup" + "eated.\x04\x00\x01 \x19\x02To work with the config:\x02To run Curio: Wit" +
" isolation, use the command (with example layer selection):" "h machine or cgroup isolation, use the command (with example layer selec" +
"tion):"
var koIndex = []uint32{ // 122 elements var koIndex = []uint32{ // 122 elements
// Entry 0 - 1F // Entry 0 - 1F
0x00000000, 0x00000044, 0x000000c1, 0x000001c1, 0x00000000, 0x00000044, 0x000000c1, 0x000001c1,
0x0000020e, 0x00000289, 0x000002aa, 0x000002bc, 0x0000020e, 0x00000289, 0x000002aa, 0x000002bc,
0x000002e5, 0x00000300, 0x00000325, 0x00000348, 0x000002e5, 0x00000300, 0x00000325, 0x00000348,
0x000003a2, 0x000003f2, 0x00000418, 0x00000471, 0x000003b2, 0x00000402, 0x00000428, 0x00000481,
0x00000490, 0x000004cc, 0x000004fc, 0x00000554, 0x000004a0, 0x000004dc, 0x0000050c, 0x00000564,
0x000005e0, 0x00000619, 0x0000066f, 0x000006ad, 0x000005f0, 0x00000629, 0x0000067f, 0x000006bd,
0x000006fb, 0x00000716, 0x00000750, 0x00000783, 0x0000070b, 0x00000726, 0x00000760, 0x00000793,
0x000007bd, 0x000007e7, 0x00000811, 0x00000853, 0x000007cd, 0x000007f7, 0x00000821, 0x00000863,
// Entry 20 - 3F // Entry 20 - 3F
0x00000877, 0x00000884, 0x0000090a, 0x0000095c, 0x00000887, 0x00000894, 0x0000091a, 0x0000096c,
0x00000983, 0x00000a1f, 0x00000ab1, 0x00000b2c, 0x00000993, 0x00000a2f, 0x00000ac1, 0x00000b3c,
0x00000b70, 0x00000bae, 0x00000bd5, 0x00000c40, 0x00000b80, 0x00000bbe, 0x00000be5, 0x00000c50,
0x00000c8a, 0x00000cb1, 0x00000ccc, 0x00000d1b, 0x00000c9d, 0x00000cc4, 0x00000cdf, 0x00000d2e,
0x00000d5c, 0x00000d9c, 0x00000de3, 0x00000e89, 0x00000d6f, 0x00000daf, 0x00000df6, 0x00000e9c,
0x00000eb9, 0x00000f08, 0x00000f2b, 0x00000f4c, 0x00000ecc, 0x00000f1b, 0x00000f3e, 0x00000f5f,
0x00000f6f, 0x00000f92, 0x00000fd0, 0x00000ff4, 0x00000f82, 0x00000fa5, 0x00000fe3, 0x00001007,
0x0000100a, 0x00001075, 0x000010c4, 0x000010cb, 0x0000101d, 0x00001088, 0x000010d7, 0x000010de,
// Entry 40 - 5F // Entry 40 - 5F
0x00001113, 0x00001165, 0x000011bf, 0x00001229, 0x00001126, 0x00001178, 0x000011d2, 0x0000123c,
0x000012ba, 0x000012d2, 0x000012ec, 0x00001310, 0x000012cd, 0x000012e5, 0x000012ff, 0x00001323,
0x00001343, 0x0000135b, 0x00001373, 0x0000138b, 0x00001356, 0x0000136e, 0x00001386, 0x0000139e,
0x000013a0, 0x000013b8, 0x0000140f, 0x0000143a, 0x000013b3, 0x000013cb, 0x00001422, 0x0000144d,
0x00001452, 0x00001479, 0x0000149c, 0x000014b0, 0x00001465, 0x0000148c, 0x000014af, 0x000014c3,
0x000014c5, 0x000014e9, 0x00001513, 0x00001524, 0x000014d8, 0x000014fc, 0x00001526, 0x00001537,
0x0000154a, 0x00001570, 0x000015a9, 0x000015e1, 0x0000155d, 0x00001583, 0x000015bc, 0x000015f4,
0x00001619, 0x00001638, 0x00001684, 0x00001742, 0x0000162c, 0x0000164b, 0x00001697, 0x00001755,
// Entry 60 - 7F // Entry 60 - 7F
0x0000178e, 0x000017dc, 0x000017ff, 0x0000185b, 0x000017a1, 0x000017ef, 0x00001812, 0x0000186e,
0x000018ab, 0x00001900, 0x00001943, 0x00001982, 0x000018be, 0x00001913, 0x00001956, 0x00001995,
0x000019f0, 0x00001a01, 0x00001a0f, 0x00001a27, 0x00001a03, 0x00001a14, 0x00001a22, 0x00001a3a,
0x00001a3b, 0x00001a55, 0x00001a7f, 0x00001ae2, 0x00001a4e, 0x00001a68, 0x00001a92, 0x00001af5,
0x00001b1e, 0x00001b48, 0x00001b80, 0x00001bd4, 0x00001b31, 0x00001b5b, 0x00001b93, 0x00001be7,
0x00001c3e, 0x00001cf8, 0x00001d5c, 0x00001d8b, 0x00001c60, 0x00001d1a, 0x00001d71, 0x00001da0,
0x00001db2, 0x00001e3e, 0x00001dc7, 0x00001e53,
} // Size: 512 bytes } // Size: 512 bytes
const koData string = "" + // Size: 7742 bytes const koData string = "" + // Size: 7763 bytes
"\x04\x00\x01 ?\x02화살표 키를 사용하여 이동하세요: ↓ ↑ → ←\x02이 대화형 도구는 새로운 채굴자 액터를 생성" + "\x04\x00\x01 ?\x02화살표 키를 사용하여 이동하세요: ↓ ↑ → ←\x02이 대화형 도구는 새로운 채굴자 액터를 생성" +
"하고 그에 대한 기본 구성 레이어를 생성합니다.\x02이 프로세스는 부분적으로 항등원적입니다. 새로운 채굴자 액터가 생성되었고" + "하고 그에 대한 기본 구성 레이어를 생성합니다.\x02이 프로세스는 부분적으로 항등원적입니다. 새로운 채굴자 액터가 생성되었고" +
" 후속 단계가 실패하는 경우 사용자는 구성을 완료하기 위해 'curio config new-cluster < 채굴자 ID >'를 " + " 후속 단계가 실패하는 경우 사용자는 구성을 완료하기 위해 'curio config new-cluster < 채굴자 ID >'를 " +
"실행해야 합니다.\x02이 대화형 도구는 5분 안에 lotus-miner를 Curio로 이주합니다.\x02각 단계는 확인이 필" + "실행해야 합니다.\x02이 대화형 도구는 5분 안에 lotus-miner를 Curio로 이주합니다.\x02각 단계는 확인이 필" +
"요하며 되돌릴 수 있습니다. 언제든지 Ctrl+C를 눌러 종료할 수 있습니다.\x02터미널에서 Ctrl+C가 눌림\x02나는 " + "요하며 되돌릴 수 있습니다. 언제든지 Ctrl+C를 눌러 종료할 수 있습니다.\x02터미널에서 Ctrl+C가 눌림\x02나는 " +
"원한다:\x02기존의 Lotus-Miner에서 이전하기\x02새로운 채굴자 생성\x02나머지 단계를 중단합니다.\x02Lotu" + "원한다:\x02기존의 Lotus-Miner에서 이전하기\x02새로운 채굴자 생성\x02나머지 단계를 중단합니다.\x02Lotu" +
"s-Miner에서 Curio로 이주.\x02더 많은 안내를 위해 %[1]s를 사용하여 웹 인터페이스를 시도하세요.\x02해당하는 " + "s-Miner에서 Curio로 이주.\x02%[1]s를 사용하여 웹 인터페이스를 시도하고 더 나은 안내된 개선을 진행하세요." +
"경우 이제 시장 노드를 이주할 수 있습니다 (%[1]s).\x02새로운 채굴자 초기화 완료.\x02lotus-miner con" + "\x02해당하는 경우 이제 시장 노드를 이주할 수 있습니다 (%[1]s).\x02새로운 채굴자 초기화 완료.\x02lotus-mi" +
"fig.toml을 Curio의 데이터베이스 구성으로 이전 중입니다.\x02API 가져오기 오류: %[1]s\x02FullNode의" + "ner config.toml을 Curio의 데이터베이스 구성으로 이전 중입니다.\x02API 가져오기 오류: %[1]s\x02Fu" +
" API 정보를 가져올 수 없습니다: %[1]w\x02토큰을 가져오는 중 오류 발생: %[1]s\x02레이어에 구성을 저장하는 중" + "llNode의 API 정보를 가져올 수 없습니다: %[1]w\x02토큰을 가져오는 중 오류 발생: %[1]s\x02레이어에 구성을" +
" 오류 발생: %[1]s. 마이그레이션 중단\x02Curio 팀은 당신이 사용하는 소프트웨어를 개선하고자 합니다. 팀에게 `%[1" + " 저장하는 중 오류 발생: %[1]s. 마이그레이션 중단\x02Curio 팀은 당신이 사용하는 소프트웨어를 개선하고자 합니다. 팀" +
"]s`를 사용 중이라고 알려주세요.\x02Curio 팀과 공유하고 싶은 것을 선택하세요.\x02개별 데이터: 채굴자 ID, Cur" + "에게 `%[1]s`를 사용 중이라고 알려주세요.\x02Curio 팀과 공유하고 싶은 것을 선택하세요.\x02개별 데이터: 채굴" +
"io 버전, 체인 (%[1]s 또는 %[2]s). 서명됨.\x02집계-익명: 버전, 체인, 및 채굴자 파워 (버킷).\x02힌트:" + "자 ID, Curio 버전, 체인 (%[1]s 또는 %[2]s). 서명됨.\x02집계-익명: 버전, 체인, 및 채굴자 파워 (" +
" 나는 어떤 체인에서든 Curio를 실행 중인 사람입니다.\x02아무것도 없습니다.\x02마이너 파워를 가져오는 중 오류 발생: " + "버킷).\x02힌트: 나는 어떤 체인에서든 Curio를 실행 중인 사람입니다.\x02아무것도 없습니다.\x02마이너 파워를 가" +
"%[1]s\x02메시지를 마샬하는 중 오류 발생: %[1]s\x02마이너 정보를 가져오는 중 오류 발생: %[1]s\x02메시지 " + "져오는 중 오류 발생: %[1]s\x02메시지를 마샬하는 중 오류 발생: %[1]s\x02마이너 정보를 가져오는 중 오류 발생" +
"서명 중 오류 발생: %[1]s\x02메시지 전송 중 오류 발생: %[1]s\x04\x00\x01 =\x02메시지 전송 중 오" + ": %[1]s\x02메시지 서명 중 오류 발생: %[1]s\x02메시지 전송 중 오류 발생: %[1]s\x04\x00\x01 =" +
"류 발생: 상태 %[1]s, 메시지:\x02메시지가 전송되었습니다.\x04\x00\x01 \x08\x02문서:\x02'%[1]" + "\x02메시지 전송 중 오류 발생: 상태 %[1]s, 메시지:\x02메시지가 전송되었습니다.\x04\x00\x01 \x08\x02" +
"s' 레이어에는 공통 구성이 저장됩니다. 모든 Curio 인스턴스는 %[2]s 인수에 포함시킬 수 있습니다.\x02기계별 구성 변" + "문서:\x02'%[1]s' 레이어에는 공통 구성이 저장됩니다. 모든 Curio 인스턴스는 %[2]s 인수에 포함시킬 수 있습니" +
"경을 위해 다른 레이어를 추가할 수 있습니다.\x02Filecoin %[1]s 채널: %[2]s 및 %[3]s\x02신뢰성 향" + "다.\x02기계별 구성 변경을 위해 다른 레이어를 추가할 수 있습니다.\x02Filecoin %[1]s 채널: %[2]s 및 " +
"상을 위한 중복성 사용: 적어도 post 레이어를 사용하여 여러 대의 기계를 시작하십시오: 'curio run --layers" + "%[3]s\x02신뢰성 향상을 위한 중복성 사용: 적어도 post 레이어를 사용하여 여러 대의 기계를 시작하십시오: 'curio " +
"=post'\x02한 개의 데이터베이스는 여러 광부 ID를 제공할 수 있습니다: 각 lotus-miner에 대해 마이그레이션을 실" + "run --layers=post'\x02한 개의 데이터베이스는 여러 광부 ID를 제공할 수 있습니다: 각 lotus-miner에 " +
"행하세요.\x02데이터베이스 자격 증명이 %[2]s에 입력되었으므로 지금 %[1]s을 시작하거나 다시 시작하세요.\x02%[1" + "대해 마이그레이션을 실행하세요.\x02데이터베이스 자격 증명이 %[2]s에 입력되었으므로 지금 %[1]s을 시작하거나 다시 시" +
"]s가 Yugabyte에 섹터를 기록하도록 대기 중입니다.\x02광부 ID를 해석하는 중 오류 발생: %[1]s: ID: %[2]" + "작하세요.\x02%[1]s가 Yugabyte에 섹터를 기록하도록 대기 중입니다.\x02광부 ID를 해석하는 중 오류 발생: %" +
"s\x02섹터 확인 중 오류 발생: %[1]s\x02섹터가 데이터베이스에 있습니다. 데이터베이스가 %[1]s를 위해 준비되었습니다" + "[1]s: ID: %[2]s\x02섹터 확인 중 오류 발생: %[1]s\x02섹터가 데이터베이스에 있습니다. 데이터베이스가 %[1" +
".\x02이제 lotus-miner를 종료하고 시스템을 %[1]s로 이동하세요.\x02계속하려면 리턴을 누르세요\x02마이그레이션" + "]s를 위해 준비되었습니다.\x02이제 lotus-miner와 lotus-worker를 종료하고 %[1]s을 실행하세요.\x02계" +
" 중단.\x02섹터가 확인되었습니다. %[1]d개의 섹터 위치를 찾았습니다.\x02Yugabyte에 연결되었습니다. 스키마가 현재" + "속하려면 리턴을 누르세요\x02마이그레이션 중단.\x02섹터가 확인되었습니다. %[1]d개의 섹터 위치를 찾았습니다.\x02Y" +
"입니다.\x02데이터베이스에서 Sector Indexing을 활성화합니다.\x02config.toml을 인코딩하는 중 오류가 " + "ugabyte에 연결되었습니다. 스키마가 현재입니다.\x02데이터베이스에서 Sector Indexing을 활성화합니다.\x02co" +
"발생했습니다: %[1]s\x02%[1]s을 Yugabyte 정보로 업데이트하려면 리턴 키를 누르세요. 변경 사항을 적용하기 전" + "nfig.toml을 인코딩하는 중 오류가 발생했습니다: %[1]s\x02%[1]s을 Yugabyte 정보로 업데이트하려면 리턴 키" +
"에 해당 폴더에 백업 파일이 작성됩니다.\x02경로를 확장하는 중 오류 발생: %[1]s\x02config.toml의 파일 모" + "를 누르세요. 변경 사항을 적용하기 전에 해당 폴더에 백업 파일이 작성됩니다.\x02경로를 확장하는 중 오류 발생: %[1]s" +
"드를 읽는 중 오류가 발생했습니다: %[1]s\x02백업 파일 생성 오류: %[1]s\x02config.toml 읽기 오류: " + "\x02config.toml의 파일 모드를 읽는 중 오류가 발생했습니다: %[1]s\x02백업 파일 생성 오류: %[1]s\x02" +
"%[1]s\x02백업 파일 쓰기 오류: %[1]s\x02백업 파일 닫기 오류: %[1]s\x02config.toml을 쓰는 중 오" + "config.toml 읽기 오류: %[1]s\x02백업 파일 쓰기 오류: %[1]s\x02백업 파일 닫기 오류: %[1]s\x02" +
"류가 발생했습니다: %[1]s\x04\x00\x01 \x1f\x02로터스 마이너 재시작.\x02Yugabyte에 연결됨\x02" + "config.toml을 쓰는 중 오류가 발생했습니다: %[1]s\x04\x00\x01 \x1f\x02로터스 마이너 재시작.\x02" +
"시작하려면 밀봉 파이프라인이 비어 있고 lotus-miner가 종료되었는지 확인하세요.\x02로터스 마이너 구성 디렉토리의 위" + "Yugabyte에 연결됨\x02시작하려면 밀봉 파이프라인이 비어 있고 lotus-miner가 종료되었는지 확인하세요.\x02로터스" +
"치를 선택하시겠습니까?\x02기타\x02%[1]s에서 사용하는 구성 디렉터리 경로를 입력하세요.\x04\x00\x01 M" + " 마이너 구성 디렉토리의 위치를 선택하시겠습니까?\x02기타\x02%[1]s에서 사용하는 구성 디렉터리 경로를 입력하세요.\x04" +
"\x02경로가 제공되지 않았으므로 마이그레이션을 포기합니다\x02제공된 디렉토리에서 config.toml 파일을 읽을 수 없습니다" + "\x00\x01 M\x02경로가 제공되지 않았으므로 마이그레이션을 포기합니다\x02제공된 디렉토리에서 config.toml 파일을" +
". 오류: %[1]s\x02디렉토리에서 저장소를 생성할 수 없습니다: %[1]s. 마이그레이션을 중단합니다.\x02광부 저장소를 " + " 읽을 수 없습니다. 오류: %[1]s\x02디렉토리에서 저장소를 생성할 수 없습니다: %[1]s. 마이그레이션을 중단합니다." +
"잠금 해제할 수 없습니다. 귀하의 광부를 중지해야 합니다: %[1]s\x0a 마이그레이션을 중단합니다.\x02마이너 구성 읽기" + "\x02광부 저장소를 잠금 해제할 수 없습니다. 귀하의 광부를 중지해야 합니다: %[1]s\x0a 마이그레이션을 중단합니다." +
"\x04\x00\x01\x0a\x15\x02단계 완료: %[1]s\x02새 채굴자 액터 초기화 중.\x02새 채굴자를 생성하기 위" + "\x02마이너 구성 읽기\x04\x00\x01\x0a\x15\x02단계 완료: %[1]s\x02새 채굴자 액터 초기화 중.\x02" +
"한 정보 입력\x02소유자 주소: %[1]s\x02작업자 주소: %[1]s\x02송신자 주소: %[1]s\x02섹터 크기: %" + "새 채굴자를 생성하기 위한 정보 입력\x02소유자 주소: %[1]s\x02작업자 주소: %[1]s\x02송신자 주소: %[1]" +
"[1]d\x02신뢰 에포크: %[1]d\x02주소를 확인하고 새 채굴자 액터를 생성하려면 계속 진행하세요.\x04\x00\x01 " + "s\x02섹터 크기: %[1]d\x02신뢰 에포크: %[1]d\x02주소를 확인하고 새 채굴자 액터를 생성하려면 계속 진행하세요." +
"&\x02채굴자 생성 오류 발생: %[1]s\x02소유자 주소 입력\x02주소가 제공되지 않았습니다\x02주소 구문 분석 실패: " + "\x04\x00\x01 &\x02채굴자 생성 오류 발생: %[1]s\x02소유자 주소 입력\x02주소가 제공되지 않았습니다\x02" +
"%[1]s\x02%[1]s 주소 입력\x02섹터 크기 입력\x02값이 제공되지 않았습니다\x02섹터 크기 구문 분석 실패: %[1" + "주소 구문 분석 실패: %[1]s\x02%[1]s 주소 입력\x02섹터 크기 입력\x02값이 제공되지 않았습니다\x02섹터 크" +
"]s\x02신뢰 에포크\x02신뢰도 구문 분석 실패: %[1]s\x02채굴자 액터 생성 실패: %[1]s\x02%[1]s 채굴자가" + "기 구문 분석 실패: %[1]s\x02신뢰 에포크\x02신뢰도 구문 분석 실패: %[1]s\x02채굴자 액터 생성 실패: %[" +
" 성공적으로 생성되었습니다\x02데이터베이스에 연결할 수 없습니다: %[1]s\x02풀 노드 API에 연결하는 중 오류 발생: %" + "1]s\x02%[1]s 채굴자가 성공적으로 생성되었습니다\x02데이터베이스에 연결할 수 없습니다: %[1]s\x02풀 노드 API" +
"[1]s\x02사전 초기화 단계 완료\x02비밀번호를 위한 랜덤 바이트 생성에 실패했습니다: %[1]s\x02마이너 생성은 ide" + "에 연결하는 중 오류 발생: %[1]s\x02사전 초기화 단계 완료\x02비밀번호를 위한 랜덤 바이트 생성에 실패했습니다: %" +
"mpotent하지 않으므로 가이드 설정을 다시 실행하지 마십시오. 구성을 완료하려면 'curio config new-cluster" + "[1]s\x02마이너 생성은 idempotent하지 않으므로 가이드 설정을 다시 실행하지 마십시오. 구성을 완료하려면 'curio" +
" %[1]s'를 실행해야 합니다.\x02FullNode에 대한 API 정보를 가져오는 데 실패했습니다: %[1]w\x02데몬 노드" + " config new-cluster %[1]s'를 실행해야 합니다.\x02FullNode에 대한 API 정보를 가져오는 데 실패했" +
"로부터 인증 토큰을 확인하는 중 오류 발생: %[1]s\x02기본 구성 생성 실패: %[1]s\x02데이터베이스에 'base'" + "습니다: %[1]w\x02데몬 노드로부터 인증 토큰을 확인하는 중 오류 발생: %[1]s\x02기본 구성 생성 실패: %[1]" +
" 구성 레이어를 삽입하는 데 실패했습니다: %[1]s\x02이 마이너 주소를 포함한 구성 'base'가 업데이트되었습니다.\x02" + "s\x02데이터베이스에 'base' 구성 레이어를 삽입하는 데 실패했습니다: %[1]s\x02이 마이너 주소를 포함한 구성 'ba" +
"데이터베이스에서 기본 구성을 로드하는 데 실패했습니다: %[1]s\x02기본 구성을 구문 분석하는 데 실패했습니다: %[1]s" + "se'가 업데이트되었습니다.\x02데이터베이스에서 기본 구성을 로드하는 데 실패했습니다: %[1]s\x02기본 구성을 구문 분석하" +
"\x02기본 구성을 재생성하는 데 실패했습니다: %[1]s\x02Yugabyte 데이터베이스 설치에 연결할 정보를 입력하십시오 (" + "는 데 실패했습니다: %[1]s\x02기본 구성을 재생성하는 데 실패했습니다: %[1]s\x02Yugabyte 데이터베이스 설" +
"https://download.yugabyte.com/)\x02호스트: %[1]s\x02포트: %[1]s\x02사용자 이름: %[" + "치에 연결할 정보를 입력하십시오 (https://download.yugabyte.com/)\x02호스트: %[1]s\x02포트" +
"1]s\x02비밀번호: %[1]s\x02데이터베이스: %[1]s\x02계속 연결 및 스키마 업데이트.\x04\x00\x01 ^" + ": %[1]s\x02사용자 이름: %[1]s\x02비밀번호: %[1]s\x02데이터베이스: %[1]s\x02계속 연결 및 스키마 " +
"\x02데이터베이스 구성 오류가 발생하여 마이그레이션을 포기합니다: %[1]s\x02Yugabyte 데이터베이스 호스트를 입력하십" + "업데이트.\x04\x00\x01 ^\x02데이터베이스 구성 오류가 발생하여 마이그레이션을 포기합니다: %[1]s\x02Yuga" +
"시오\x02호스트가 제공되지 않았습니다\x02Yugabyte 데이터베이스 %[1]s을 입력하십시오\x02Yugabyte 데이터" + "byte 데이터베이스 호스트를 입력하십시오\x02호스트가 제공되지 않았습니다\x02Yugabyte 데이터베이스 %[1]s을 입력하" +
"베이스에 연결하는 중 오류가 발생했습니다: %[1]s\x02이 마이너의 주소와 지갑 설정을 포함하도록 구성 'base'가 업데" + "십시오\x02Yugabyte 데이터베이스에 연결하는 중 오류가 발생했습니다: %[1]s\x02기본 설정 'base'가 이 마이" +
"이트되었습니다.\x02구성 %[1]s를 %[2]s과 비교하세요. 지갑 주소 이외의 마이너 ID 사이의 변경 사항은 필요한 실행" + "너의 주소(%[1]s) 및 지갑 설정을 포함하도록 업데이트되었습니다.\x02구성 %[1]s를 %[2]s과 비교하세요. 지갑 주" +
"자를 위한 새로운 최소한의 레이어여야 합니다.\x02이 마이너의 주소와 지갑 설정을 포함하도록 구성 'base'가 생성되었습니" + "소 이외의 마이너 ID 사이의 변경 사항은 필요한 실행자를 위한 새로운 최소한의 레이어여야 합니다.\x02'base' 설정이 " +
"다.\x04\x00\x01 *\x02레이어 %[1]s가 생성되었습니다.\x04\x00\x01 \x22\x02구성 파일을 사용하" + "이 lotus-miner의 config.toml과 유사하게 만들어졌습니다.\x04\x00\x01 *\x02레이어 %[1]s가 " +
"려면:\x02Curio를 실행하려면: 기계 또는 cgroup 격리를 사용하여 다음 명령을 사용하세요 (예제 레이어 선택과 함께" + "생성되었습니다.\x04\x00\x01 \x22\x02구성 파일을 사용하려면:\x02Curio를 실행하려면: 기계 또는 cgro" +
"):" "up 격리를 사용하여 다음 명령을 사용하세요 (예제 레이어 선택과 함께):"
var zhIndex = []uint32{ // 122 elements var zhIndex = []uint32{ // 122 elements
// Entry 0 - 1F // Entry 0 - 1F
0x00000000, 0x00000033, 0x0000008b, 0x00000134, 0x00000000, 0x00000033, 0x0000008b, 0x00000134,
0x0000017c, 0x000001cb, 0x000001e4, 0x000001f1, 0x0000017c, 0x000001cb, 0x000001e4, 0x000001f1,
0x00000211, 0x0000022a, 0x00000240, 0x0000025d, 0x00000211, 0x0000022a, 0x00000240, 0x0000025d,
0x0000029c, 0x000002dd, 0x000002f9, 0x0000033e, 0x000002a5, 0x000002e6, 0x00000302, 0x00000347,
0x0000035b, 0x00000384, 0x000003a2, 0x000003db, 0x00000364, 0x0000038d, 0x000003ab, 0x000003e4,
0x0000042f, 0x0000045c, 0x000004ab, 0x000004e6, 0x00000438, 0x00000465, 0x000004b4, 0x000004ef,
0x0000051b, 0x00000525, 0x00000549, 0x00000567, 0x00000524, 0x0000052e, 0x00000552, 0x00000570,
0x0000058b, 0x000005a9, 0x000005c7, 0x000005fc, 0x00000594, 0x000005b2, 0x000005d0, 0x00000605,
// Entry 20 - 3F // Entry 20 - 3F
0x0000060f, 0x0000061e, 0x00000678, 0x000006b5, 0x00000618, 0x00000627, 0x00000681, 0x000006be,
0x000006dd, 0x0000073c, 0x0000078c, 0x000007df, 0x000006e6, 0x00000745, 0x00000795, 0x000007e8,
0x00000805, 0x00000832, 0x00000850, 0x0000088c, 0x0000080e, 0x0000083b, 0x00000859, 0x00000895,
0x000008be, 0x000008ce, 0x000008de, 0x00000911, 0x000008d9, 0x000008e9, 0x000008f9, 0x0000092c,
0x0000093e, 0x00000963, 0x00000986, 0x000009fe, 0x00000959, 0x0000097e, 0x000009a1, 0x00000a19,
0x00000a1c, 0x00000a4b, 0x00000a6f, 0x00000a94, 0x00000a37, 0x00000a66, 0x00000a8a, 0x00000aaf,
0x00000ab8, 0x00000adc, 0x00000aff, 0x00000b1f, 0x00000ad3, 0x00000af7, 0x00000b1a, 0x00000b3a,
0x00000b34, 0x00000b7f, 0x00000baf, 0x00000bb6, 0x00000b4f, 0x00000b9a, 0x00000bca, 0x00000bd1,
// Entry 40 - 5F // Entry 40 - 5F
0x00000be0, 0x00000c04, 0x00000c48, 0x00000c7a, 0x00000bfb, 0x00000c1f, 0x00000c63, 0x00000c95,
0x00000cc3, 0x00000cd6, 0x00000cf0, 0x00000d0f, 0x00000cde, 0x00000cf1, 0x00000d0b, 0x00000d2a,
0x00000d34, 0x00000d4c, 0x00000d61, 0x00000d79, 0x00000d4f, 0x00000d67, 0x00000d7c, 0x00000d94,
0x00000d8d, 0x00000da4, 0x00000dd5, 0x00000dfa, 0x00000da8, 0x00000dbf, 0x00000df0, 0x00000e15,
0x00000e10, 0x00000e20, 0x00000e3a, 0x00000e4e, 0x00000e2b, 0x00000e3b, 0x00000e55, 0x00000e69,
0x00000e61, 0x00000e6e, 0x00000e8e, 0x00000e9e, 0x00000e7c, 0x00000e89, 0x00000ea9, 0x00000eb9,
0x00000ebb, 0x00000edb, 0x00000ef5, 0x00000f12, 0x00000ed6, 0x00000ef6, 0x00000f10, 0x00000f2d,
0x00000f43, 0x00000f5c, 0x00000f85, 0x00001012, 0x00000f5e, 0x00000f77, 0x00000fa0, 0x0000102d,
// Entry 60 - 7F // Entry 60 - 7F
0x0000103e, 0x00001079, 0x00001099, 0x000010ca, 0x00001059, 0x00001094, 0x000010b4, 0x000010e5,
0x000010fd, 0x0000112a, 0x0000114b, 0x00001171, 0x00001118, 0x00001145, 0x00001166, 0x0000118c,
0x000011cb, 0x000011da, 0x000011e9, 0x000011fb, 0x000011e6, 0x000011f5, 0x00001204, 0x00001216,
0x0000120a, 0x0000121c, 0x0000123b, 0x00001273, 0x00001225, 0x00001237, 0x00001256, 0x0000128e,
0x00001298, 0x000012a8, 0x000012c6, 0x000012f2, 0x000012b3, 0x000012c3, 0x000012e1, 0x0000130d,
0x0000133e, 0x000013c0, 0x0000140c, 0x00001426, 0x0000135e, 0x000013e0, 0x00001427, 0x00001441,
0x0000143e, 0x00001495, 0x00001459, 0x000014b0,
} // Size: 512 bytes } // Size: 512 bytes
const zhData string = "" + // Size: 5269 bytes const zhData string = "" + // Size: 5296 bytes
"\x04\x00\x01 .\x02使用箭头键进行导航↓ ↑ → ←\x02此交互式工具将创建一个新的矿工角色并为其创建基本配置层。\x02" + "\x04\x00\x01 .\x02使用箭头键进行导航↓ ↑ → ←\x02此交互式工具将创建一个新的矿工角色并为其创建基本配置层。\x02" +
"该过程部分幂等。一旦创建了新的矿工角色,并且随后的步骤失败,用户需要运行 'curio config new-cluster < 矿工 ID" + "该过程部分幂等。一旦创建了新的矿工角色,并且随后的步骤失败,用户需要运行 'curio config new-cluster < 矿工 ID" +
" >' 来完成配置。\x02这个交互式工具可以在5分钟内将lotus-miner迁移到Curio。\x02每一步都需要您的确认并且可以撤销。随" + " >' 来完成配置。\x02这个交互式工具可以在5分钟内将lotus-miner迁移到Curio。\x02每一步都需要您的确认并且可以撤销。随" +
"时按Ctrl+C退出。\x02在终端中按下Ctrl+C\x02我想要\x02从现有的 Lotus-Miner 迁移\x02创建一个新的矿工" + "时按Ctrl+C退出。\x02在终端中按下Ctrl+C\x02我想要\x02从现有的 Lotus-Miner 迁移\x02创建一个新的矿工" +
"\x02中止剩余步骤。\x02Lotus-Miner到Curio迁移。\x02尝试使用%[1]s的Web界面进行进一步引导式改进。\x02如果适" + "\x02中止剩余步骤。\x02Lotus-Miner到Curio迁移。\x02尝试使用%[1]s的网络界面进行更进一步的指导性改进。\x02如果" +
"用,您现在可以迁移您的市场节点(%[1]s)。\x02新矿工初始化完成。\x02将 lotus-miner config.toml 迁移到 " + "用,您现在可以迁移您的市场节点(%[1]s)。\x02新矿工初始化完成。\x02将 lotus-miner config.toml 迁移到" +
"Curio 的数据库配置中。\x02获取 API 时出错:%[1]s\x02无法获取FullNode的API信息%[1]w\x02获取令牌时" + " Curio 的数据库配置中。\x02获取 API 时出错:%[1]s\x02无法获取FullNode的API信息%[1]w\x02获取令牌时" +
"错:%[1]s\x02保存配置到层时出错%[1]s。正在中止迁移\x02Curio 团队希望改进您使用的软件。告诉团队您正在使用 `%[1" + "错:%[1]s\x02保存配置到层时出错%[1]s。正在中止迁移\x02Curio 团队希望改进您使用的软件。告诉团队您正在使用 `%[" +
"]s`。\x02选择您想与Curio团队分享的内容。\x02个人数据矿工 IDCurio 版本,链(%[1]s 或 %[2]s。签名。" + "1]s`。\x02选择您想与Curio团队分享的内容。\x02个人数据矿工 IDCurio 版本,链(%[1]s 或 %[2]s。签名。" +
"\x02聚合-匿名:版本,链和矿工算力(分桶)。\x02提示我是在任何链上运行 Curio 的人。\x02没有。\x02获取矿工功率时出错%" + "\x02聚合-匿名:版本,链和矿工算力(分桶)。\x02提示我是在任何链上运行 Curio 的人。\x02没有。\x02获取矿工功率时出错%" +
"[1]s\x02整理消息时出错%[1]s\x02获取矿工信息时出错%[1]s\x02签署消息时出错%[1]s\x02发送消息时出错%[1" + "[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文档" + "]s\x04\x00\x01 0\x02发送消息时出错状态%[1]s消息\x02消息已发送。\x04\x00\x01 \x0a\x02文档" +
@ -444,32 +445,32 @@ const zhData string = "" + // Size: 5269 bytes
"\x02Filecoin %[1]s 频道:%[2]s 和 %[3]s\x02通过冗余增加可靠性使用至少后层启动多台机器'curio run" + "\x02Filecoin %[1]s 频道:%[2]s 和 %[3]s\x02通过冗余增加可靠性使用至少后层启动多台机器'curio run" +
" --layers=post'\x02一个数据库可以服务多个矿工ID为每个lotus-miner运行迁移。\x02请立即启动或重新启动%[" + " --layers=post'\x02一个数据库可以服务多个矿工ID为每个lotus-miner运行迁移。\x02请立即启动或重新启动%[" +
"1]s因为数据库凭据已在%[2]s中。\x02等待%[1]s将扇区写入Yugabyte。\x02解释矿工ID时出错%[1]sID%[2]" + "1]s因为数据库凭据已在%[2]s中。\x02等待%[1]s将扇区写入Yugabyte。\x02解释矿工ID时出错%[1]sID%[2]" +
"s\x02验证扇区时出错%[1]s\x02扇区在数据库中。数据库已准备好用于%[1]s。\x02现在关闭lotus-miner并将系统移至%[" + "s\x02验证扇区时出错%[1]s\x02扇区在数据库中。数据库已准备好用于%[1]s。\x02现在关闭lotus-miner和lotus-w" +
"1]s。\x02按回车继续\x02中止迁移。\x02扇区已验证。发现了%[1]d个扇区位置。\x02已连接到Yugabyte。模式是当前的。" + "orker改为使用%[1]s运行。\x02按回车继续\x02中止迁移。\x02扇区已验证。发现了%[1]d个扇区位置。\x02已连接到Yuga" +
"\x02在数据库中启用扇区索引。\x02编码config.toml时出错%[1]s\x02按回车键更新 %[1]s 以包含 Yugabyte " + "byte。模式是当前的。\x02在数据库中启用扇区索引。\x02编码config.toml时出错%[1]s\x02按回车键更新 %[1]s 以" +
"信息。在进行更改之前,将在该文件夹中写入备份文件。\x02扩展路径时出错%[1]s\x02读取config.toml文件模式时出错%[1" + "包含 Yugabyte 信息。在进行更改之前,将在该文件夹中写入备份文件。\x02扩展路径时出错%[1]s\x02读取config.tom" +
"]s\x02创建备份文件时出错%[1]s\x02读取 config.toml 时出错:%[1]s\x02写入备份文件时出错:%[1]s\x02" + "l文件模式时出错%[1]s\x02创建备份文件时出错%[1]s\x02读取 config.toml 时出错:%[1]s\x02写入备份文件时" +
"关闭备份文件时出错:%[1]s\x02写入config.toml时出错%[1]s\x04\x00\x01 \x1b\x02重新启动Lotu" + "出错:%[1]s\x02关闭备份文件时出错:%[1]s\x02写入config.toml时出错%[1]s\x04\x00\x01 \x1b" +
"s Miner。\x02已连接到Yugabyte\x02开始之前请确保您的密封管道已排空并关闭lotus-miner。\x02选择您的lotu" + "\x02重新启动Lotus Miner。\x02已连接到Yugabyte\x02开始之前请确保您的密封管道已排空并关闭lotus-miner。" +
"s-miner配置目录的位置\x02其他\x02输入%[1]s使用的配置目录的路径\x04\x00\x01 \x1f\x02未提供路径放弃迁" + "\x02选择您的lotus-miner配置目录的位置\x02其他\x02输入%[1]s使用的配置目录的路径\x04\x00\x01 \x1f" +
"移\x02无法读取提供的目录中的config.toml文件错误%[1]s\x02无法从目录创建repo%[1]s。 中止迁移\x02无" + "\x02未提供路径放弃迁移\x02无法读取提供的目录中的config.toml文件错误%[1]s\x02无法从目录创建repo%[1]s" +
"法锁定矿工repo。 您的矿工必须停止:%[1]s\x0a 中止迁移\x02读取矿工配置\x04\x00\x01\x0a\x15\x02步骤" + "。 中止迁移\x02无法锁定矿工repo。 您的矿工必须停止:%[1]s\x0a 中止迁移\x02读取矿工配置\x04\x00\x01" +
"完成:%[1]s\x02初始化新的矿工角色。\x02输入创建新矿工所需的信息\x02所有者地址%[1]s\x02工作地址:%[1]s" + "\x0a\x15\x02步骤完成:%[1]s\x02初始化新的矿工角色。\x02输入创建新矿工所需的信息\x02所有者地址%[1]s\x02工" +
"\x02发送者地址%[1]s\x02扇区大小: %[1]d\x02置信度时期: %[1]d\x02继续验证地址并创建新的矿工角色。\x04" + "作地址:%[1]s\x02发送者地址%[1]s\x02扇区大小: %[1]d\x02置信度时期: %[1]d\x02继续验证地址并创建新的" +
"\x00\x01 \x02矿工创建错误发生: %[1]s\x02输入所有者地址\x02未提供地址\x02解析地址失败: %[1]s\x02输入" + "矿工角色。\x04\x00\x01 \x02矿工创建错误发生: %[1]s\x02输入所有者地址\x02未提供地址\x02解析地址失败: " +
" %[1]s 地址\x02输入扇区大小\x02未提供值\x02解析扇区大小失败: %[1]s\x02置信度时期\x02解析置信度失败: %[1]" + "%[1]s\x02输入 %[1]s 地址\x02输入扇区大小\x02未提供值\x02解析扇区大小失败: %[1]s\x02置信度时期\x02解析" +
"s\x02创建矿工角色失败: %[1]s\x02矿工 %[1]s 创建成功\x02无法访问数据库: %[1]s\x02连接到完整节点 API 时" + "置信度失败: %[1]s\x02创建矿工角色失败: %[1]s\x02矿工 %[1]s 创建成功\x02无法访问数据库: %[1]s\x02" +
"发生错误: %[1]s\x02预初始化步骤完成\x02生成密码的随机字节失败: %[1]s\x02请不要再次运行引导设置,因为矿工创建不是幂" + "连接到完整节点 API 时发生错误: %[1]s\x02预初始化步骤完成\x02生成密码的随机字节失败: %[1]s\x02请不要再次运行引" +
"等的。 您需要运行 'curio config new-cluster %[1]s' 来完成配置。\x02无法获取 FullNode 的 A" + "导设置,因为矿工创建不是幂等的。 您需要运行 'curio config new-cluster %[1]s' 来完成配置。\x02无法获取" +
"PI 信息: %[1]w\x02无法验证来自守护进程节点的授权令牌: %[1]s\x02无法生成默认配置: %[1]s\x02无法将 'base" + " FullNode 的 API 信息: %[1]w\x02无法验证来自守护进程节点的授权令牌: %[1]s\x02无法生成默认配置: %[1]s" +
"' 配置层插入数据库: %[1]s\x02配置 'base' 已更新以包含此矿工的地址\x02从数据库加载基本配置失败%[1]s\x02解析基" + "\x02无法将 'base' 配置层插入数据库: %[1]s\x02配置 'base' 已更新以包含此矿工的地址\x02从数据库加载基本配置失败" +
"本配置失败:%[1]s\x02重新生成基本配置失败: %[1]s\x02输入连接到您的Yugabyte数据库安装的信息https://do" + "%[1]s\x02解析基本配置失败:%[1]s\x02重新生成基本配置失败: %[1]s\x02输入连接到您的Yugabyte数据库安装的" +
"wnload.yugabyte.com/\x02主机%[1]s\x02端口%[1]s\x02用户名%[1]s\x02密码%[1]s" + "信息https://download.yugabyte.com/\x02主机%[1]s\x02端口%[1]s\x02用户名%[1]" +
"\x02数据库%[1]s\x02继续连接和更新架构。\x04\x00\x01 3\x02发生数据库配置错误放弃迁移%[1]s\x02输入Y" + "s\x02密码%[1]s\x02数据库%[1]s\x02继续连接和更新架构。\x04\x00\x01 3\x02发生数据库配置错误放弃迁移" +
"ugabyte数据库主机S\x02未提供主机\x02输入Yugabyte数据库 %[1]s\x02连接到Yugabyte数据库时出错%[1" + "%[1]s\x02输入Yugabyte数据库主机S\x02未提供主机\x02输入Yugabyte数据库 %[1]s\x02连接到Yug" +
"]s\x02配置'base'已更新,包含了这个矿工的地址和其钱包设置。\x02比较配置%[1]s和%[2]s。矿工ID之间除了钱包地址的变化应该" + "abyte数据库时出错%[1]s\x02'base'配置已更新,包括该矿工的地址(%[1]s及其钱包设置。\x02比较配置%[1]s和%[2" +
"是需要的运行者的一个新的、最小的层。\x02配置'base'已创建,包括了这个矿工的地址和其钱包设置。\x04\x00\x01 \x15" + "]s。矿工ID之间除了钱包地址的变化应该是需要的运行者的一个新的、最小的层。\x02'base'配置已创建以类似于这个lotus-miner的" +
"\x02层%[1]s已创建。\x04\x00\x01 \x13\x02要使用配置\x02运行Curio使用机器或cgroup隔离使用命令" + "config.toml。\x04\x00\x01 \x15\x02层%[1]s已创建。\x04\x00\x01 \x13\x02要使用配置" +
"附带示例层选择):" "\x02运行Curio使用机器或cgroup隔离使用命令附带示例层选择):"
// Total table size 20183 bytes (19KiB); checksum: 4FD3E25A // Total table size 20243 bytes (19KiB); checksum: AB52E150

View File

@ -89,18 +89,18 @@
"fuzzy": true "fuzzy": true
}, },
{ {
"id": "Try the web interface with {__layersgui} for further guided improvements.", "id": "Try the web interface with {Rendercurio_run___layersgui} for further guided improvements.",
"message": "Try the web interface with {__layersgui} for further guided improvements.", "message": "Try the web interface with {Rendercurio_run___layersgui} for further guided improvements.",
"translation": "Try the web interface with {__layersgui} for further guided improvements.", "translation": "Try the web interface with {Rendercurio_run___layersgui} for further guided improvements.",
"translatorComment": "Copied from source.", "translatorComment": "Copied from source.",
"placeholders": [ "placeholders": [
{ {
"id": "__layersgui", "id": "Rendercurio_run___layersgui",
"string": "%[1]s", "string": "%[1]s",
"type": "string", "type": "string",
"underlyingType": "string", "underlyingType": "string",
"argNum": 1, "argNum": 1,
"expr": "\"--layers=gui\"" "expr": "code.Render(\"curio run --layers=gui\")"
} }
], ],
"fuzzy": true "fuzzy": true
@ -579,18 +579,18 @@
"fuzzy": true "fuzzy": true
}, },
{ {
"id": "Now shut down lotus-miner and move the systems to {Curio}.", "id": "Now shut down lotus-miner and lotus-worker and use run {Rendercurio_run} instead.",
"message": "Now shut down lotus-miner and move the systems to {Curio}.", "message": "Now shut down lotus-miner and lotus-worker and use run {Rendercurio_run} instead.",
"translation": "Now shut down lotus-miner and move the systems to {Curio}.", "translation": "Now shut down lotus-miner and lotus-worker and use run {Rendercurio_run} instead.",
"translatorComment": "Copied from source.", "translatorComment": "Copied from source.",
"placeholders": [ "placeholders": [
{ {
"id": "Curio", "id": "Rendercurio_run",
"string": "%[1]s", "string": "%[1]s",
"type": "string", "type": "string",
"underlyingType": "string", "underlyingType": "string",
"argNum": 1, "argNum": 1,
"expr": "\"Curio\"" "expr": "code.Render(\"curio run\")"
} }
], ],
"fuzzy": true "fuzzy": true
@ -1553,10 +1553,20 @@
"fuzzy": true "fuzzy": true
}, },
{ {
"id": "Configuration 'base' was updated to include this miner's address and its wallet setup.", "id": "Configuration 'base' was updated to include this miner's address ({MinerAddress}) and its wallet setup.",
"message": "Configuration 'base' was updated to include this miner's address and its wallet setup.", "message": "Configuration 'base' was updated to include this miner's address ({MinerAddress}) and its wallet setup.",
"translation": "Configuration 'base' was updated to include this miner's address and its wallet setup.", "translation": "Configuration 'base' was updated to include this miner's address ({MinerAddress}) and its wallet setup.",
"translatorComment": "Copied from source.", "translatorComment": "Copied from source.",
"placeholders": [
{
"id": "MinerAddress",
"string": "%[1]s",
"type": "github.com/filecoin-project/go-address.Address",
"underlyingType": "struct{str string}",
"argNum": 1,
"expr": "minerAddress"
}
],
"fuzzy": true "fuzzy": true
}, },
{ {
@ -1585,9 +1595,9 @@
"fuzzy": true "fuzzy": true
}, },
{ {
"id": "Configuration 'base' was created to include this miner's address and its wallet setup.", "id": "Configuration 'base' was created to resemble this lotus-miner's config.toml .",
"message": "Configuration 'base' was created to include this miner's address and its wallet setup.", "message": "Configuration 'base' was created to resemble this lotus-miner's config.toml .",
"translation": "Configuration 'base' was created to include this miner's address and its wallet setup.", "translation": "Configuration 'base' was created to resemble this lotus-miner's config.toml .",
"translatorComment": "Copied from source.", "translatorComment": "Copied from source.",
"fuzzy": true "fuzzy": true
}, },

View File

@ -1077,6 +1077,30 @@
"translation": "기본 구성을 구문 분석하는 데 실패했습니다: {Error}", "translation": "기본 구성을 구문 분석하는 데 실패했습니다: {Error}",
"message": "Failed to parse base config: {Error}", "message": "Failed to parse base config: {Error}",
"placeholder": null "placeholder": null
},
{
"id": "Try the web interface with {Rendercurio_run___layersgui} for further guided improvements.",
"translation": "{Rendercurio_run___layersgui}를 사용하여 웹 인터페이스를 시도하고 더 나은 안내된 개선을 진행하세요.",
"message": "Try the web interface with {Rendercurio_run___layersgui} for further guided improvements.",
"placeholder": null
},
{
"id": "Now shut down lotus-miner and lotus-worker and use run {Rendercurio_run} instead.",
"translation": "이제 lotus-miner와 lotus-worker를 종료하고 {Rendercurio_run}을 실행하세요.",
"message": "Now shut down lotus-miner and lotus-worker and use run {Rendercurio_run} instead.",
"placeholder": null
},
{
"id": "Configuration 'base' was updated to include this miner's address ({MinerAddress}) and its wallet setup.",
"translation": "기본 설정 'base'가 이 마이너의 주소({MinerAddress}) 및 지갑 설정을 포함하도록 업데이트되었습니다.",
"message": "Configuration 'base' was updated to include this miner's address ({MinerAddress}) and its wallet setup.",
"placeholder": null
},
{
"id": "Configuration 'base' was created to resemble this lotus-miner's config.toml .",
"translation": "'base' 설정이 이 lotus-miner의 config.toml과 유사하게 만들어졌습니다.",
"message": "Configuration 'base' was created to resemble this lotus-miner's config.toml .",
"placeholder": null
} }
] ]
} }

View File

@ -1047,6 +1047,30 @@
"translation": "解析基本配置失败:{Error}", "translation": "解析基本配置失败:{Error}",
"message": "Failed to parse base config: {Error}", "message": "Failed to parse base config: {Error}",
"placeholder": null "placeholder": null
},
{
"id": "Try the web interface with {Rendercurio_run___layersgui} for further guided improvements.",
"translation": "尝试使用{Rendercurio_run___layersgui}的网络界面进行更进一步的指导性改进。",
"message": "Try the web interface with {Rendercurio_run___layersgui} for further guided improvements.",
"placeholder": null
},
{
"id": "Now shut down lotus-miner and lotus-worker and use run {Rendercurio_run} instead.",
"translation": "现在关闭lotus-miner和lotus-worker改为使用{Rendercurio_run}运行。",
"message": "Now shut down lotus-miner and lotus-worker and use run {Rendercurio_run} instead.",
"placeholder": null
},
{
"id": "Configuration 'base' was updated to include this miner's address ({MinerAddress}) and its wallet setup.",
"translation": "'base'配置已更新,包括该矿工的地址({MinerAddress})及其钱包设置。",
"message": "Configuration 'base' was updated to include this miner's address ({MinerAddress}) and its wallet setup.",
"placeholder": null
},
{
"id": "Configuration 'base' was created to resemble this lotus-miner's config.toml .",
"translation": "'base'配置已创建以类似于这个lotus-miner的config.toml。",
"message": "Configuration 'base' was created to resemble this lotus-miner's config.toml .",
"placeholder": null
} }
] ]
} }

View File

@ -252,7 +252,12 @@ func ListenAndServe(ctx context.Context, dependencies *deps.Deps, shutdownChan c
} }
log.Warn("Graceful shutdown successful") log.Warn("Graceful shutdown successful")
}() }()
log.Infof("Setting up web server at %s", dependencies.Cfg.Subsystems.GuiAddress)
uiAddress := dependencies.Cfg.Subsystems.GuiAddress
if uiAddress == "" || uiAddress[0] == ':' {
uiAddress = "localhost" + uiAddress
}
log.Infof("GUI: http://%s", uiAddress)
eg.Go(web.ListenAndServe) eg.Go(web.ListenAndServe)
} }
return eg.Wait() return eg.Wait()

View File

@ -63,6 +63,7 @@ var runCmd = &cli.Command{
}, },
&cli.StringSliceFlag{ &cli.StringSliceFlag{
Name: "layers", Name: "layers",
Aliases: []string{"l", "layer"},
Usage: "list of layers to be interpreted (atop defaults). Default: base", Usage: "list of layers to be interpreted (atop defaults). Default: base",
}, },
}, },
@ -169,6 +170,7 @@ var webCmd = &cli.Command{
}, },
}, },
Action: func(cctx *cli.Context) error { Action: func(cctx *cli.Context) error {
db, err := deps.MakeDB(cctx) db, err := deps.MakeDB(cctx)
if err != nil { if err != nil {
return err return err

View File

@ -13,6 +13,7 @@ var stopCmd = &cli.Command{
Usage: "Stop a running Curio process", 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)
if err != nil { if err != nil {
return err return err

View File

@ -3,9 +3,13 @@ package tasks
import ( import (
"context" "context"
"sort"
"strings"
"time"
logging "github.com/ipfs/go-log/v2" logging "github.com/ipfs/go-log/v2"
"github.com/samber/lo" "github.com/samber/lo"
"golang.org/x/exp/maps"
"golang.org/x/xerrors" "golang.org/x/xerrors"
"github.com/filecoin-project/go-address" "github.com/filecoin-project/go-address"
@ -22,6 +26,7 @@ import (
"github.com/filecoin-project/lotus/lib/lazy" "github.com/filecoin-project/lotus/lib/lazy"
"github.com/filecoin-project/lotus/lib/must" "github.com/filecoin-project/lotus/lib/must"
"github.com/filecoin-project/lotus/node/modules" "github.com/filecoin-project/lotus/node/modules"
"github.com/filecoin-project/lotus/node/modules/dtypes"
) )
var log = logging.Logger("curio/deps") var log = logging.Logger("curio/deps")
@ -157,6 +162,7 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps) (*harmonytask.Task
if err != nil { if err != nil {
return nil, err return nil, err
} }
go machineDetails(dependencies, activeTasks, ht.ResourcesAvailable().MachineID)
if hasAnySealingTask { if hasAnySealingTask {
watcher, err := message.NewMessageWatcher(db, ht, chainSched, full) watcher, err := message.NewMessageWatcher(db, ht, chainSched, full)
@ -172,3 +178,56 @@ func StartTasks(ctx context.Context, dependencies *deps.Deps) (*harmonytask.Task
return ht, nil return ht, nil
} }
func machineDetails(deps *deps.Deps, activeTasks []harmonytask.TaskInterface, machineID int) {
taskNames := lo.Map(activeTasks, func(item harmonytask.TaskInterface, _ int) string {
return item.TypeDetails().Name
})
miners := lo.Map(maps.Keys(deps.Maddrs), func(item dtypes.MinerAddress, _ int) string {
return address.Address(item).String()
})
sort.Strings(miners)
_, err := deps.DB.Exec(context.Background(), `INSERT INTO harmony_machine_details
(tasks, layers, startup_time, miners, machine_id) VALUES ($1, $2, $3, $4, $5)
ON CONFLICT (machine_id) DO UPDATE SET tasks=$1, layers=$2, startup_time=$3, miners=$4`,
strings.Join(taskNames, ","), strings.Join(deps.Layers, ","),
time.Now(), strings.Join(miners, ","), machineID)
if err != nil {
log.Errorf("failed to update machine details: %s", err)
return
}
// maybePostWarning
if !lo.Contains(taskNames, "WdPost") && !lo.Contains(taskNames, "WinPost") {
// Maybe we aren't running a PoSt for these miners?
var allMachines []struct {
MachineID int `db:"machine_id"`
Miners string `db:"miners"`
Tasks string `db:"tasks"`
}
err := deps.DB.Select(context.Background(), &allMachines, `SELECT machine_id, miners, tasks FROM harmony_machine_details`)
if err != nil {
log.Errorf("failed to get machine details: %s", err)
return
}
for _, miner := range miners {
var myPostIsHandled bool
for _, m := range allMachines {
if !lo.Contains(strings.Split(m.Miners, ","), miner) {
continue
}
if lo.Contains(strings.Split(m.Tasks, ","), "WdPost") && lo.Contains(strings.Split(m.Tasks, ","), "WinPost") {
myPostIsHandled = true
break
}
}
if !myPostIsHandled {
log.Errorf("No PoSt tasks are running for miner %s. Start handling PoSts immediately with:\n\tcurio run --layers=\"post\" ", miner)
}
}
}
}

View File

@ -0,0 +1,19 @@
package apihelper
import (
"net/http"
"runtime/debug"
logging "github.com/ipfs/go-log/v2"
)
var log = logging.Logger("lp/web/apihelper")
func OrHTTPFail(w http.ResponseWriter, err error) {
if err != nil {
w.WriteHeader(500)
_, _ = w.Write([]byte(err.Error()))
log.Errorw("http fail", "err", err, "stack", string(debug.Stack()))
panic(err)
}
}

View File

@ -0,0 +1,180 @@
package config
import (
"bytes"
"context"
"encoding/json"
"net/http"
"reflect"
"time"
"github.com/BurntSushi/toml"
"github.com/gorilla/mux"
"github.com/invopop/jsonschema"
"github.com/filecoin-project/lotus/cmd/curio/deps"
"github.com/filecoin-project/lotus/curiosrc/web/api/apihelper"
"github.com/filecoin-project/lotus/node/config"
)
type cfg struct {
*deps.Deps
}
func Routes(r *mux.Router, deps *deps.Deps) {
c := &cfg{deps}
// At menu.html:
r.Methods("GET").Path("/layers").HandlerFunc(c.getLayers)
r.Methods("GET").Path("/topo").HandlerFunc(c.topo)
// At edit.html:
r.Methods("GET").Path("/schema").HandlerFunc(getSch)
r.Methods("GET").Path("/layers/{layer}").HandlerFunc(c.getLayer)
r.Methods("POST").Path("/layers/{layer}").HandlerFunc(c.setLayer)
r.Methods("GET").Path("/default").HandlerFunc(c.def)
}
func getSch(w http.ResponseWriter, r *http.Request) {
ref := jsonschema.Reflector{
Mapper: func(i reflect.Type) *jsonschema.Schema {
if i == reflect.TypeOf(config.Duration(time.Second)) {
return &jsonschema.Schema{
Type: "string",
Format: "duration",
}
}
return nil
},
}
sch := ref.Reflect(config.CurioConfig{})
//sch := jsonschema.Reflect(config.CurioConfig{})
// add comments
for k, doc := range config.Doc {
item, ok := sch.Definitions[k]
if !ok {
continue
}
for _, line := range doc {
item, ok := item.Properties.Get(line.Name)
if !ok {
continue
}
if line.Comment != "" {
extra := make(map[string]any)
type options struct {
InfoText string `json:"infoText"`
}
opt := options{
InfoText: line.Comment,
}
extra["options"] = opt
item.Extras = extra
}
}
}
var allOpt func(s *jsonschema.Schema)
allOpt = func(s *jsonschema.Schema) {
s.Required = []string{}
for _, v := range s.Definitions {
v.Required = []string{}
allOpt(v)
}
}
allOpt(sch)
apihelper.OrHTTPFail(w, json.NewEncoder(w).Encode(sch))
}
func (c *cfg) getLayers(w http.ResponseWriter, r *http.Request) {
var layers []string
apihelper.OrHTTPFail(w, c.DB.Select(context.Background(), &layers, `SELECT title FROM harmony_config ORDER BY title`))
apihelper.OrHTTPFail(w, json.NewEncoder(w).Encode(layers))
}
func (c *cfg) getLayer(w http.ResponseWriter, r *http.Request) {
var layer string
apihelper.OrHTTPFail(w, c.DB.QueryRow(context.Background(), `SELECT config FROM harmony_config WHERE title = $1`, mux.Vars(r)["layer"]).Scan(&layer))
// Read the TOML into a struct
configStruct := map[string]any{} // NOT CurioConfig b/c we want to preserve unsets
_, err := toml.Decode(layer, &configStruct)
apihelper.OrHTTPFail(w, err)
// Encode the struct as JSON
jsonData, err := json.Marshal(configStruct)
apihelper.OrHTTPFail(w, err)
// Write the JSON response
w.Header().Set("Content-Type", "application/json")
_, err = w.Write(jsonData)
apihelper.OrHTTPFail(w, err)
}
func (c *cfg) setLayer(w http.ResponseWriter, r *http.Request) {
layer := mux.Vars(r)["layer"]
var configStruct map[string]any
dec := json.NewDecoder(r.Body)
dec.UseNumber() // JSON lib by default treats number is float64()
apihelper.OrHTTPFail(w, dec.Decode(&configStruct))
//Encode the struct as TOML
var tomlData bytes.Buffer
err := toml.NewEncoder(&tomlData).Encode(configStruct)
apihelper.OrHTTPFail(w, err)
configStr := tomlData.String()
// Generate a full commented string if this is base layer
if layer == "base" {
// Parse the into CurioConfig TOML
curioCfg := config.DefaultCurioConfig()
_, err = deps.LoadConfigWithUpgrades(tomlData.String(), curioCfg)
apihelper.OrHTTPFail(w, err)
cb, err := config.ConfigUpdate(curioCfg, config.DefaultCurioConfig(), config.Commented(true), config.DefaultKeepUncommented(), config.NoEnv())
apihelper.OrHTTPFail(w, err)
configStr = string(cb)
}
//Write the TOML to the database
_, err = c.DB.Exec(context.Background(), `INSERT INTO harmony_config (title, config) VALUES ($1, $2) ON CONFLICT (title) DO UPDATE SET config = $2`, layer, configStr)
apihelper.OrHTTPFail(w, err)
}
func (c *cfg) topo(w http.ResponseWriter, r *http.Request) {
var topology []struct {
Server string `db:"server"`
CPU int `db:"cpu"`
GPU int `db:"gpu"`
RAM int `db:"ram"`
LayersCSV string `db:"layers"`
TasksCSV string `db:"tasks"`
}
apihelper.OrHTTPFail(w, c.DB.Select(context.Background(), &topology, `
SELECT
m.host_and_port as server,
cpu, gpu, ram, layers, tasks
FROM harmony_machines m JOIN harmony_machine_details d ON m.id=d.machine_id
ORDER BY server`))
w.Header().Set("Content-Type", "application/json")
apihelper.OrHTTPFail(w, json.NewEncoder(w).Encode(topology))
}
func (c *cfg) def(w http.ResponseWriter, r *http.Request) {
cb, err := config.ConfigUpdate(config.DefaultCurioConfig(), nil, config.Commented(false), config.DefaultKeepUncommented(), config.NoEnv())
apihelper.OrHTTPFail(w, err)
// Read the TOML into a struct
configStruct := map[string]any{} // NOT CurioConfig b/c we want to preserve unsets
_, err = toml.Decode(string(cb), &configStruct)
apihelper.OrHTTPFail(w, err)
// Encode the struct as JSON
jsonData, err := json.Marshal(configStruct)
apihelper.OrHTTPFail(w, err)
// Write the JSON response
w.Header().Set("Content-Type", "application/json")
_, err = w.Write(jsonData)
apihelper.OrHTTPFail(w, err)
}

View File

@ -5,9 +5,11 @@ import (
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/filecoin-project/lotus/cmd/curio/deps" "github.com/filecoin-project/lotus/cmd/curio/deps"
"github.com/filecoin-project/lotus/curiosrc/web/api/config"
"github.com/filecoin-project/lotus/curiosrc/web/api/debug" "github.com/filecoin-project/lotus/curiosrc/web/api/debug"
) )
func Routes(r *mux.Router, deps *deps.Deps) { func Routes(r *mux.Router, deps *deps.Deps) {
debug.Routes(r.PathPrefix("/debug").Subrouter(), deps) debug.Routes(r.PathPrefix("/debug").Subrouter(), deps)
config.Routes(r.PathPrefix("/config").Subrouter(), deps)
} }

View File

@ -162,6 +162,8 @@ func (a *app) updateActor(ctx context.Context) error {
return xerrors.Errorf("getting worker balance: %w", err) return xerrors.Errorf("getting worker balance: %w", err)
} }
sort.Strings(cnames)
actorInfos = append(actorInfos, actorInfo{ actorInfos = append(actorInfos, actorInfo{
Address: addr.String(), Address: addr.String(),
CLayers: cnames, CLayers: cnames,

View File

@ -13,9 +13,6 @@
<div class="head-left"> <div class="head-left">
<h1>{{.PageTitle}}</h1> <h1>{{.PageTitle}}</h1>
</div> </div>
<div class="head-right">
version [todo]
</div>
</div> </div>
<hr/> <hr/>
<div class="page"> <div class="page">

View File

@ -0,0 +1,150 @@
<!DOCTYPE html>
<html>
<head>
<title>JSON Schema Editor</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.21.1/axios.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@json-editor/json-editor@latest/dist/jsoneditor.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous"> <link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/themes/base/jquery-ui.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/themes/ui-darkness/jquery-ui.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/themes/ui-darkness/theme.min.css" rel="stylesheet">
</head>
<body>
<style>
#saveButton {
display: block;
position: fixed;
bottom: 20px;
right: 30px;
z-index: 99;
font-size: 18px;
border: none;
outline: none;
background-color: green;
color: white;
cursor: pointer;
padding: 15px;
border-radius: 4px;
}
#saveButton:hover {
background-color: #555;
}
.help-button button {
font-size: 24px;
border-radius: 50%;
width: 50px;
height: 50px;
position: fixed;
bottom: 20px;
right: 120px;
z-index: 99;
}
.help-text {
display: none;
position: fixed;
border: 1px solid #ccc;
background-color: gray;
padding: 10px;
width: 200px;
bottom: 20px;
right: 200px;
z-index: 100;
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}
.hidden {
display: none;
}
.show {
display: block;
}
</style>
<section class="section container-fluid implementations">
<div class="row justify-content-center content">
<div class="col-md-8">
<div>
<button id="saveButton" class="saveButton">Save</button>
</div>
<div class="help-button">
<button id="helpBtn">?</button>
<p id="helpText" class="hidden help-text">Checking a box and entering a non default value will uncomment the corresponding configuration variable.
Unchecking a box will reset the value to default.</p>
</div>
<div id="editor" ></div>
<script>
var editor;
var urlParams = new URLSearchParams(window.location.search);
var layer = urlParams.get('layer');
// Make simultaneous GET requests to fetch the existing data and JSON Schema
const layerPath = layer === 'default' ? 'config/default' : `config/layers/${layer}`;
Promise.all([
axios.get(`/api/${layerPath}`),
axios.get('/api/config/schema')
])
.then(responses => {
const existingData = responses[0].data;
const schema = responses[1].data;
// Create a JSON Editor instance and pass the schema and existing data
const container = document.getElementById('editor');
const options = {
//mode: 'tree',
schema: schema,
startval: existingData,
theme: 'bootstrap5',
iconlib: 'jqueryui',
show_opt_in: true,
disable_edit_json: true,
form_name_root: "Configuration",
disable_properties: true,
};
editor = new JSONEditor(container, options);
document.getElementById("helpBtn").addEventListener("click", function() {
var helpText = document.getElementById("helpText");
if (helpText.classList.contains("hidden")) {
helpText.classList.remove("hidden");
helpText.classList.add("show");
} else {
helpText.classList.remove("show");
helpText.classList.add("hidden");
}
});
// Attach function to saveButton click event
var saveButton = document.getElementById('saveButton');
saveButton.addEventListener('click', function() {
if (layer === 'default'){
alert('Error: cannot edit defaults');
} else {
const value = editor.getValue();
console.log(value)
axios.post('/api/config/layers/' + layer, value)
.then(response => {
// Set cookie named 'message' with the value 'Data saved successfully'
document.cookie = 'message=The layer "' + layer + '" saved successfully.; path=/;';
window.location.href = '/config/';
})
.catch(error => {
alert('Error saving data:', error);
});
}
});
})
.catch(error => {
console.error('Error fetching data:', error);
});
</script>
</div>
</div>
</section>
</body>
</html>

View File

@ -0,0 +1,89 @@
<!DOCTYPE html>
<html>
<head>
<title>Configuration Editor</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.21.1/axios.min.js"></script>
<script type="module" src="/ux/curio-ux.mjs"></script>
</head>
<body style="visibility:hidden">
<!-- Get the machines -->
<script type="module">
import { LitElement, html, css } from 'https://cdn.jsdelivr.net/gh/lit/dist@3/all/lit-all.min.js';
window.customElements.define('config-list', class MyElement extends LitElement {
connectedCallback() {
super.connectedCallback();
}
constructor() {
super();
this.layers = [];
this.topo = [];
this.loadData();
this.message = this.readCookie('message');
this.eraseCookie('message');
}
static get styles() {
return [css`
.alert {
font-size: 24px;
display: inline-block;
color: green;
}
`];
}
render() {
return html`
${this.message ? html`<div class="alert">${this.message}</div>` : ''}
<table>
${this.layers.map((layer, index) => html`
<tr>
<td><a href="/config/edit.html?layer=${layer}"><button>${layer}</button></a></td>
<td>
Used By: ${(f=> f.length?f.map(topo => html`${topo.Server}`):'-')(
this.topo.filter(topo => topo.LayersCSV.split(",").includes(layer)))}
</td>
</tr>
`)}
</table>
`;
}
loadData() {
Promise.all([
axios.get('/api/config/layers'),
axios.get('/api/config/topo'),
axios.get('/api/config/default')
])
.then(responses => {
this.layers = responses[0].data;
this.layers.unshift('default');
this.topo = responses[1].data;
super.requestUpdate();
})
.catch(error => {
console.error('Error fetching data:', error);
});
}
readCookie(name) {
const cookies = document.cookie.split(';');
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i].trim();
if (cookie.startsWith(name + '=')) {
return cookie.substring(name.length + 1);
}
}
return '';
}
eraseCookie(name) {
document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
}
});
</script>
<curio-ux>
<h1>Configuration Editor</h1>
<h3>Click on a layer to edit its configuration</h3>
<config-list></config-list>
</curio-ux>
</body>
</html>

View File

@ -2,7 +2,7 @@
<head> <head>
<title>Curio 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.mjs"></script>
<link rel="stylesheet" href="main.css"> <link rel="stylesheet" href="main.css">
<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/hack-font@3.3.0/build/web/hack-subset.css'> <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/hack-font@3.3.0/build/web/hack-subset.css'>
<style> <style>
@ -101,7 +101,7 @@
<thead> <thead>
<tr> <tr>
<th>Address</th> <th>Address</th>
<th>Config Layers</th> <th>Config Layers Available</th>
<th>QaP</th> <th>QaP</th>
<th>Deadlines</th> <th>Deadlines</th>
<th>Balance</th> <th>Balance</th>

View File

@ -0,0 +1,50 @@
import {LitElement, css, html} from 'https://cdn.jsdelivr.net/gh/lit/dist@3/all/lit-all.min.js';
class CurioUX extends LitElement {
static styles = css`
.curio-slot {
}
`;
connectedCallback() {
super.connectedCallback();
const links = [
"https://unpkg.com/@cds/core/global.min.css",
"https://unpkg.com/@cds/city/css/bundles/default.min.css",
"https://unpkg.com/@cds/core/styles/theme.dark.min.css",
"https://unpkg.com/@clr/ui/clr-ui.min.css",
"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"
];
const head = document.head;
links.forEach(link => {
const linkNode = document.createElement('link');
linkNode.rel = 'stylesheet';
linkNode.href = link;
head.appendChild(linkNode);
});
var theme = document.createAttribute('cds-theme');
theme.value = localStorage.getItem('theme') || 'dark';
document.body.attributes.setNamedItem(theme);
var cdsText = document.createAttribute('cds-text');
cdsText.value = 'body';
document.body.attributes.setNamedItem(cdsText);
document.body.style.visibility = 'initial';
}
render() {
return html`
<!-- wrap the slot -->
<div >
<slot class="curio-slot"></slot>
</div>
`;
}
}
customElements.define('curio-ux', CurioUX);

View File

@ -56,6 +56,105 @@ OPTIONS:
### curio cli storage ### curio cli storage
``` ```
NAME:
curio cli storage - manage sector storage
USAGE:
curio cli storage command [command options] [arguments...]
DESCRIPTION:
Sectors can be stored across many filesystem paths. These
commands provide ways to manage the storage the miner will used to store sectors
long term for proving (references as 'store') as well as how sectors will be
stored while moving through the sealing pipeline (references as 'seal').
COMMANDS:
attach attach local storage path
detach detach local storage path
list list local storage paths
find find sector in the storage system
help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help
```
#### curio cli storage attach
```
NAME:
curio cli storage attach - attach local storage path
USAGE:
curio cli storage attach [command options] [path]
DESCRIPTION:
Storage can be attached to the miner using this command. The storage volume
list is stored local to the miner in storage.json set in curio run. We do not
recommend manually modifying this value without further understanding of the
storage system.
Each storage volume contains a configuration file which describes the
capabilities of the volume. When the '--init' flag is provided, this file will
be created using the additional flags.
Weight
A high weight value means data will be more likely to be stored in this path
Seal
Data for the sealing process will be stored here
Store
Finalized sectors that will be moved here for long term storage and be proven
over time
OPTIONS:
--init initialize the path first (default: false)
--weight value (for init) path weight (default: 10)
--seal (for init) use path for sealing (default: false)
--store (for init) use path for long-term storage (default: false)
--max-storage value (for init) limit storage space for sectors (expensive for very large paths!)
--groups value [ --groups value ] path group names
--allow-to value [ --allow-to value ] path groups allowed to pull data from this path (allow all if not specified)
--help, -h show help
```
#### curio cli storage detach
```
NAME:
curio cli storage detach - detach local storage path
USAGE:
curio cli storage detach [command options] [path]
OPTIONS:
--really-do-it (default: false)
--help, -h show help
```
#### curio cli storage list
```
NAME:
curio cli storage list - list local storage paths
USAGE:
curio cli storage list [command options] [arguments...]
OPTIONS:
--local only list local storage paths (default: false)
--help, -h show help
```
#### curio cli storage find
```
NAME:
curio cli storage find - find sector in the storage system
USAGE:
curio cli storage find [command options] [miner address] [sector number]
OPTIONS:
--help, -h show help
``` ```
### curio cli log ### curio cli log
@ -80,7 +179,7 @@ OPTIONS:
--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: "~/.curio/storage.json") --storage-json value path to json file containing storage config (default: "~/.curio/storage.json")
--journal value path to journal files (default: "~/.curio/") --journal value path to journal files (default: "~/.curio/")
--layers value [ --layers value ] list of layers to be interpreted (atop defaults). Default: base --layers value, -l value, --layer value [ --layers value, -l value, --layer value ] list of layers to be interpreted (atop defaults). Default: base
--help, -h show help --help, -h show help
``` ```

10
go.mod
View File

@ -17,7 +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/charmbracelet/lipgloss v0.10.0
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
@ -80,6 +80,7 @@ require (
github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/hashicorp/golang-lru/v2 v2.0.7
github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94
github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab
github.com/invopop/jsonschema v0.12.0
github.com/ipfs/bbloom v0.0.4 github.com/ipfs/bbloom v0.0.4
github.com/ipfs/boxo v0.18.0 github.com/ipfs/boxo v0.18.0
github.com/ipfs/go-block-format v0.2.0 github.com/ipfs/go-block-format v0.2.0
@ -159,6 +160,7 @@ require (
go.uber.org/multierr v1.11.0 go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0 go.uber.org/zap v1.27.0
golang.org/x/crypto v0.19.0 golang.org/x/crypto v0.19.0
golang.org/x/exp v0.0.0-20240213143201-ec583247a57a
golang.org/x/net v0.21.0 golang.org/x/net v0.21.0
golang.org/x/sync v0.6.0 golang.org/x/sync v0.6.0
golang.org/x/sys v0.17.0 golang.org/x/sys v0.17.0
@ -180,9 +182,11 @@ require (
github.com/akavel/rsrc v0.8.0 // indirect github.com/akavel/rsrc v0.8.0 // indirect
github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/bahlo/generic-list-go v0.2.0 // 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
github.com/buger/jsonparser v1.1.1 // indirect
github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash v1.1.0 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/cilium/ebpf v0.9.1 // indirect github.com/cilium/ebpf v0.9.1 // indirect
@ -298,7 +302,7 @@ require (
github.com/quic-go/qpack v0.4.0 // indirect github.com/quic-go/qpack v0.4.0 // indirect
github.com/quic-go/quic-go v0.42.0 // indirect github.com/quic-go/quic-go v0.42.0 // indirect
github.com/quic-go/webtransport-go v0.6.0 // indirect github.com/quic-go/webtransport-go v0.6.0 // indirect
github.com/rivo/uniseg v0.2.0 // indirect github.com/rivo/uniseg v0.4.7 // 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
github.com/sirupsen/logrus v1.9.2 // indirect github.com/sirupsen/logrus v1.9.2 // indirect
@ -310,6 +314,7 @@ require (
github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
@ -321,7 +326,6 @@ require (
go.uber.org/dig v1.17.1 // indirect go.uber.org/dig v1.17.1 // indirect
go.uber.org/mock v0.4.0 // indirect go.uber.org/mock v0.4.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect go4.org v0.0.0-20230225012048-214862532bf5 // indirect
golang.org/x/exp v0.0.0-20240213143201-ec583247a57a // indirect
golang.org/x/mod v0.15.0 // indirect golang.org/x/mod v0.15.0 // indirect
gonum.org/v1/gonum v0.14.0 // indirect gonum.org/v1/gonum v0.14.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 // indirect

15
go.sum
View File

@ -111,6 +111,8 @@ github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN
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 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
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=
@ -155,6 +157,8 @@ github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46f
github.com/buger/goterm v1.0.3 h1:7V/HeAQHrzPk/U4BvyH2g9u+xbUW9nr4yRPyG59W4fM= github.com/buger/goterm v1.0.3 h1:7V/HeAQHrzPk/U4BvyH2g9u+xbUW9nr4yRPyG59W4fM=
github.com/buger/goterm v1.0.3/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= github.com/buger/goterm v1.0.3/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE=
github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
@ -164,8 +168,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.10.0 h1:KWeXFSexGcfahHX+54URiZGkBFazf70JNMtwg/AFW3s=
github.com/charmbracelet/lipgloss v0.9.1/go.mod h1:1mPmG4cxScwUQALAAnacHaigiiHB9Pmr+v1VEawJl6I= github.com/charmbracelet/lipgloss v0.10.0/go.mod h1:Wig9DSfvANsxqkRsqj6x87irdy123SR4dOXlKa91ciE=
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=
@ -660,6 +664,8 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt
github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab h1:HqW4xhhynfjrtEiiSGcQUd6vrK23iMam1FO8rI7mwig= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab h1:HqW4xhhynfjrtEiiSGcQUd6vrK23iMam1FO8rI7mwig=
github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI=
github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0=
github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
@ -1496,8 +1502,9 @@ github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtB
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/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/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
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=
@ -1688,6 +1695,8 @@ github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84
github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4=
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds=
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI=
github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc=
github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw=
github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE=
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=

View File

@ -34,7 +34,7 @@ func TestMsgWithoutUuidWithMaxFee(t *testing.T) {
To: node.DefaultKey.Address, To: node.DefaultKey.Address,
Value: big.Div(bal, big.NewInt(2)), Value: big.Div(bal, big.NewInt(2)),
} }
smHalfBal, err := node.MpoolPushMessage(ctx, msgHalfBal, &api.MessageSendSpec{MaxFee: abi.TokenAmount(config.DefaultDefaultMaxFee)}) smHalfBal, err := node.MpoolPushMessage(ctx, msgHalfBal, &api.MessageSendSpec{MaxFee: abi.TokenAmount(config.DefaultDefaultMaxFee())})
require.NoError(t, err) require.NoError(t, err)
mLookup, err := node.StateWaitMsg(ctx, smHalfBal.Cid(), 3, api.LookbackNoLimit, true) mLookup, err := node.StateWaitMsg(ctx, smHalfBal.Cid(), 3, api.LookbackNoLimit, true)
require.NoError(t, err) require.NoError(t, err)
@ -45,7 +45,7 @@ func TestMsgWithoutUuidWithMaxFee(t *testing.T) {
To: node.DefaultKey.Address, To: node.DefaultKey.Address,
Value: big.Div(bal, big.NewInt(4)), Value: big.Div(bal, big.NewInt(4)),
} }
smQuarterBal, err := node.MpoolPushMessage(ctx, msgQuarterBal, &api.MessageSendSpec{MaxFee: abi.TokenAmount(config.DefaultDefaultMaxFee)}) smQuarterBal, err := node.MpoolPushMessage(ctx, msgQuarterBal, &api.MessageSendSpec{MaxFee: abi.TokenAmount(config.DefaultDefaultMaxFee())})
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, msgQuarterBal.Value, smQuarterBal.Message.Value) require.Equal(t, msgQuarterBal.Value, smQuarterBal.Message.Value)

View File

@ -35,7 +35,7 @@ func TestMpoolPushWithoutUuidWithMaxFee(t *testing.T) {
To: client15.DefaultKey.Address, To: client15.DefaultKey.Address,
Value: big.Div(bal, big.NewInt(2)), Value: big.Div(bal, big.NewInt(2)),
} }
smHalfBal, err := client15.MpoolPushMessage(ctx, msgHalfBal, &api.MessageSendSpec{MaxFee: abi.TokenAmount(config.DefaultDefaultMaxFee)}) smHalfBal, err := client15.MpoolPushMessage(ctx, msgHalfBal, &api.MessageSendSpec{MaxFee: abi.TokenAmount(config.DefaultDefaultMaxFee())})
require.NoError(t, err) require.NoError(t, err)
mLookup, err := client15.StateWaitMsg(ctx, smHalfBal.Cid(), 3, api.LookbackNoLimit, true) mLookup, err := client15.StateWaitMsg(ctx, smHalfBal.Cid(), 3, api.LookbackNoLimit, true)
require.NoError(t, err) require.NoError(t, err)
@ -46,7 +46,7 @@ func TestMpoolPushWithoutUuidWithMaxFee(t *testing.T) {
To: client15.DefaultKey.Address, To: client15.DefaultKey.Address,
Value: big.Div(bal, big.NewInt(4)), Value: big.Div(bal, big.NewInt(4)),
} }
smcid, err := client15.MpoolPushMessage(ctx, msgQuarterBal, &api.MessageSendSpec{MaxFee: abi.TokenAmount(config.DefaultDefaultMaxFee)}) smcid, err := client15.MpoolPushMessage(ctx, msgQuarterBal, &api.MessageSendSpec{MaxFee: abi.TokenAmount(config.DefaultDefaultMaxFee())})
require.NoError(t, err) require.NoError(t, err)
mLookup, err = client15.StateWaitMsg(ctx, smcid.Cid(), 3, api.LookbackNoLimit, true) mLookup, err = client15.StateWaitMsg(ctx, smcid.Cid(), 3, api.LookbackNoLimit, true)
require.NoError(t, err) require.NoError(t, err)

View File

@ -0,0 +1,12 @@
CREATE TABLE harmony_machine_details (
id SERIAL PRIMARY KEY,
tasks TEXT,
layers TEXT,
startup_time TIMESTAMP,
miners TEXT,
machine_id INTEGER,
FOREIGN KEY (machine_id) REFERENCES harmony_machines(id) ON DELETE CASCADE
);
CREATE UNIQUE INDEX machine_details_machine_id ON harmony_machine_details(machine_id);

View File

@ -77,17 +77,18 @@ func defCommon() Common {
} }
} }
var ( var DefaultSimultaneousTransfers = uint64(20)
DefaultDefaultMaxFee = types.MustParseFIL("0.07")
DefaultSimultaneousTransfers = uint64(20) func DefaultDefaultMaxFee() types.FIL {
) return types.MustParseFIL("0.07")
}
// DefaultFullNode returns the default config // DefaultFullNode returns the default config
func DefaultFullNode() *FullNode { func DefaultFullNode() *FullNode {
return &FullNode{ return &FullNode{
Common: defCommon(), Common: defCommon(),
Fees: FeeConfig{ Fees: FeeConfig{
DefaultMaxFee: DefaultDefaultMaxFee, DefaultMaxFee: DefaultDefaultMaxFee(),
}, },
Client: Client{ Client: Client{
SimultaneousTransfersForStorage: DefaultSimultaneousTransfers, SimultaneousTransfersForStorage: DefaultSimultaneousTransfers,
@ -334,7 +335,7 @@ func DefaultCurioConfig() *CurioConfig {
BoostAdapters: []string{}, BoostAdapters: []string{},
}, },
Fees: CurioFees{ Fees: CurioFees{
DefaultMaxFee: DefaultDefaultMaxFee, DefaultMaxFee: DefaultDefaultMaxFee(),
MaxPreCommitGasFee: types.MustParseFIL("0.025"), MaxPreCommitGasFee: types.MustParseFIL("0.025"),
MaxCommitGasFee: types.MustParseFIL("0.05"), MaxCommitGasFee: types.MustParseFIL("0.05"),