v1.27.0-a #10
1
.gitignore
vendored
1
.gitignore
vendored
@ -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/
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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 {
|
||||||
|
@ -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")
|
||||||
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
@ -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: ")
|
||||||
|
@ -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个人数据:矿工 ID,Curio 版本,链(%[1]s 或 %[2]s)。签名。" +
|
"1]s`。\x02选择您想与Curio团队分享的内容。\x02个人数据:矿工 ID,Curio 版本,链(%[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]s:ID:%[2]" +
|
"1]s,因为数据库凭据已在%[2]s中。\x02等待%[1]s将扇区写入Yugabyte。\x02解释矿工ID时出错:%[1]s:ID:%[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
|
||||||
|
@ -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
|
||||||
},
|
},
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
@ -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
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
19
curiosrc/web/api/apihelper/apihelper.go
Normal file
19
curiosrc/web/api/apihelper/apihelper.go
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
180
curiosrc/web/api/config/config.go
Normal file
180
curiosrc/web/api/config/config.go
Normal 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)
|
||||||
|
}
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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">
|
||||||
|
150
curiosrc/web/static/config/edit.html
Normal file
150
curiosrc/web/static/config/edit.html
Normal 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>
|
89
curiosrc/web/static/config/index.html
Normal file
89
curiosrc/web/static/config/index.html
Normal 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>
|
@ -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>
|
||||||
|
50
curiosrc/web/static/ux/curio-ux.mjs
Normal file
50
curiosrc/web/static/ux/curio-ux.mjs
Normal 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);
|
@ -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
10
go.mod
@ -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
15
go.sum
@ -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=
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
12
lib/harmony/harmonydb/sql/20240404-machine_detail.sql
Normal file
12
lib/harmony/harmonydb/sql/20240404-machine_detail.sql
Normal 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);
|
||||||
|
|
@ -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"),
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user