mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-11-29 03:41:45 +00:00
cli: guess manifest filename from nef for loadnef
VM CLI command
Signed-off-by: Anna Shaleva <shaleva.ann@nspcc.ru>
This commit is contained in:
parent
ed2b59e077
commit
aace790651
2 changed files with 57 additions and 16 deletions
|
@ -151,9 +151,11 @@ Example:
|
||||||
{
|
{
|
||||||
Name: "loadnef",
|
Name: "loadnef",
|
||||||
Usage: "Load a NEF-consistent script into the VM optionally attaching to it provided signers with scopes",
|
Usage: "Load a NEF-consistent script into the VM optionally attaching to it provided signers with scopes",
|
||||||
UsageText: `loadnef [--historic <height>] [--gas <int>] <file> <manifest> [-- <signer-with-scope>, ...]`,
|
UsageText: `loadnef [--historic <height>] [--gas <int>] <file> [<manifest>] [-- <signer-with-scope>, ...]`,
|
||||||
Flags: []cli.Flag{historicFlag, gasFlag},
|
Flags: []cli.Flag{historicFlag, gasFlag},
|
||||||
Description: `<file> and <manifest> parameters are mandatory.
|
Description: `<file> parameter is mandatory, <manifest> parameter (if omitted) will
|
||||||
|
be guessed from the <file> parameter by replacing '.nef' suffix with '.manifest.json'
|
||||||
|
suffix.
|
||||||
|
|
||||||
` + cmdargs.SignersParsingDoc + `
|
` + cmdargs.SignersParsingDoc + `
|
||||||
|
|
||||||
|
@ -671,10 +673,36 @@ func prepareVM(c *cli.Context, tx *transaction.Transaction) error {
|
||||||
|
|
||||||
func handleLoadNEF(c *cli.Context) error {
|
func handleLoadNEF(c *cli.Context) error {
|
||||||
args := c.Args()
|
args := c.Args()
|
||||||
if len(args) < 2 {
|
if len(args) < 1 {
|
||||||
return fmt.Errorf("%w: <file> <manifest>", ErrMissingParameter)
|
return fmt.Errorf("%w: <nef> is required", ErrMissingParameter)
|
||||||
}
|
}
|
||||||
b, err := os.ReadFile(args[0])
|
nefFile := args[0]
|
||||||
|
var (
|
||||||
|
manifestFile string
|
||||||
|
signersStartOffset int
|
||||||
|
)
|
||||||
|
if len(args) == 2 {
|
||||||
|
manifestFile = args[1]
|
||||||
|
} else if len(args) == 3 {
|
||||||
|
if args[1] != cmdargs.CosignersSeparator {
|
||||||
|
return fmt.Errorf("%w: `%s` was expected as the second parameter, got %s", ErrInvalidParameter, cmdargs.CosignersSeparator, args[1])
|
||||||
|
}
|
||||||
|
signersStartOffset = 2
|
||||||
|
} else if len(args) > 3 {
|
||||||
|
if args[1] == cmdargs.CosignersSeparator {
|
||||||
|
signersStartOffset = 2
|
||||||
|
} else {
|
||||||
|
manifestFile = args[1]
|
||||||
|
if args[2] != cmdargs.CosignersSeparator {
|
||||||
|
return fmt.Errorf("%w: `%s` was expected as the third parameter, got %s", ErrInvalidParameter, cmdargs.CosignersSeparator, args[2])
|
||||||
|
}
|
||||||
|
signersStartOffset = 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(manifestFile) == 0 {
|
||||||
|
manifestFile = strings.TrimSuffix(nefFile, ".nef") + ".manifest.json"
|
||||||
|
}
|
||||||
|
b, err := os.ReadFile(nefFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -682,21 +710,15 @@ func handleLoadNEF(c *cli.Context) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to decode NEF file: %w", err)
|
return fmt.Errorf("failed to decode NEF file: %w", err)
|
||||||
}
|
}
|
||||||
m, err := getManifestFromFile(args[1])
|
m, err := getManifestFromFile(manifestFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to read manifest: %w", err)
|
return fmt.Errorf("failed to read manifest: %w", err)
|
||||||
}
|
}
|
||||||
var signers []transaction.Signer
|
var signers []transaction.Signer
|
||||||
if len(args) > 2 {
|
if signersStartOffset != 0 && len(args) > signersStartOffset {
|
||||||
if args[2] != cmdargs.CosignersSeparator {
|
signers, err = cmdargs.ParseSigners(c.Args()[signersStartOffset:])
|
||||||
return fmt.Errorf("%w: `%s` was expected as the third parameter, got %s", ErrInvalidParameter, cmdargs.CosignersSeparator, args[2])
|
|
||||||
}
|
|
||||||
if len(args) < 4 {
|
|
||||||
return fmt.Errorf("%w: signers expected after `%s`, got none", ErrInvalidParameter, cmdargs.CosignersSeparator)
|
|
||||||
}
|
|
||||||
signers, err = cmdargs.ParseSigners(c.Args()[3:])
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("%w: %v", ErrInvalidParameter, err) //nolint:errorlint // errorlint: non-wrapping format verb for fmt.Errorf. Use `%w` to format errors
|
return fmt.Errorf("%w: failed to parse signers: %v", ErrInvalidParameter, err) //nolint:errorlint // errorlint: non-wrapping format verb for fmt.Errorf. Use `%w` to format errors
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
err = prepareVM(c, createFakeTransaction(nef.Script, signers))
|
err = prepareVM(c, createFakeTransaction(nef.Script, signers))
|
||||||
|
|
|
@ -527,7 +527,17 @@ go 1.18`)
|
||||||
"loadnef "+filename+" "+notExists,
|
"loadnef "+filename+" "+notExists,
|
||||||
"loadnef "+filename+" "+filename,
|
"loadnef "+filename+" "+filename,
|
||||||
"loadnef "+filename+" "+manifestFile,
|
"loadnef "+filename+" "+manifestFile,
|
||||||
"run main add 3 5")
|
"run main add 3 5",
|
||||||
|
"loadnef "+filename,
|
||||||
|
"run main add 3 5",
|
||||||
|
"loadnef "+filename+" "+cmdargs.CosignersSeparator,
|
||||||
|
"loadnef "+filename+" "+manifestFile+" "+cmdargs.CosignersSeparator,
|
||||||
|
"loadnef "+filename+" "+manifestFile+" "+"not-a-separator",
|
||||||
|
"loadnef "+filename+" "+cmdargs.CosignersSeparator+" "+util.Uint160{1, 2, 3}.StringLE(),
|
||||||
|
"run main add 3 5",
|
||||||
|
"loadnef "+filename+" "+manifestFile+" "+cmdargs.CosignersSeparator+" "+util.Uint160{1, 2, 3}.StringLE(),
|
||||||
|
"run main add 3 5",
|
||||||
|
)
|
||||||
|
|
||||||
e.checkError(t, ErrMissingParameter)
|
e.checkError(t, ErrMissingParameter)
|
||||||
e.checkNextLine(t, "Error:")
|
e.checkNextLine(t, "Error:")
|
||||||
|
@ -535,6 +545,15 @@ go 1.18`)
|
||||||
e.checkNextLine(t, "Error:")
|
e.checkNextLine(t, "Error:")
|
||||||
e.checkNextLine(t, "READY: loaded \\d* instructions")
|
e.checkNextLine(t, "READY: loaded \\d* instructions")
|
||||||
e.checkStack(t, 8)
|
e.checkStack(t, 8)
|
||||||
|
e.checkNextLine(t, "READY: loaded \\d* instructions")
|
||||||
|
e.checkStack(t, 8)
|
||||||
|
e.checkNextLine(t, "Error:") // manifest missing, missing signer after --
|
||||||
|
e.checkNextLine(t, "Error:") // manifest present, missing signer after --
|
||||||
|
e.checkNextLine(t, "Error:") // manifest present, invalid separator
|
||||||
|
e.checkNextLine(t, "READY: loaded \\d* instructions") // manifest missing, signer present, OK
|
||||||
|
e.checkStack(t, 8)
|
||||||
|
e.checkNextLine(t, "READY: loaded \\d* instructions") // manifest present, signer present, OK
|
||||||
|
e.checkStack(t, 8)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue