[#749] neofs-adm: create wallet for signing contract group

Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
Evgenii Stratonikov 2021-11-29 15:48:06 +03:00 committed by Alex Vanin
parent b416285eb0
commit def1bbc84c
4 changed files with 79 additions and 3 deletions

View file

@ -42,6 +42,12 @@ func generateAlphabetCreds(cmd *cobra.Command, args []string) error {
return err return err
} }
w, err := initializeContractWallet(walletDir)
if err != nil {
return err
}
w.Close()
cmd.Println("size:", size) cmd.Println("size:", size)
cmd.Println("alphabet-wallets:", walletDir) cmd.Println("alphabet-wallets:", walletDir)
for i := range pwds { for i := range pwds {

View file

@ -48,6 +48,15 @@ func TestGenerateAlphabet(t *testing.T) {
buf.WriteString("pass\r") buf.WriteString("pass\r")
require.Error(t, generateAlphabetCreds(cmd, nil)) require.Error(t, generateAlphabetCreds(cmd, nil))
}) })
t.Run("no password for contract group wallet", func(t *testing.T) {
buf.Reset()
v.Set(alphabetWalletsFlag, walletDir)
require.NoError(t, cmd.Flags().Set(alphabetSizeFlag, strconv.FormatUint(size, 10)))
for i := uint64(0); i < size; i++ {
buf.WriteString(strconv.FormatUint(i, 10) + "\r")
}
require.Error(t, generateAlphabetCreds(cmd, nil))
})
buf.Reset() buf.Reset()
v.Set(alphabetWalletsFlag, walletDir) v.Set(alphabetWalletsFlag, walletDir)
@ -56,6 +65,8 @@ func TestGenerateAlphabet(t *testing.T) {
buf.WriteString(strconv.FormatUint(i, 10) + "\r") buf.WriteString(strconv.FormatUint(i, 10) + "\r")
} }
const groupPassword = "grouppass"
buf.WriteString(groupPassword + "\r")
require.NoError(t, generateAlphabetCreds(cmd, nil)) require.NoError(t, generateAlphabetCreds(cmd, nil))
for i := uint64(0); i < size; i++ { for i := uint64(0); i < size; i++ {
@ -76,6 +87,14 @@ func TestGenerateAlphabet(t *testing.T) {
} }
} }
} }
t.Run("check contract group wallet", func(t *testing.T) {
p := filepath.Join(walletDir, contractWalletName)
w, err := wallet.NewWalletFromFile(p)
require.NoError(t, err, "contract wallet doesn't exist")
require.Equal(t, 1, len(w.Accounts), "contract wallet must have 1 accout")
require.NoError(t, w.Accounts[0].Decrypt(groupPassword, keys.NEP2ScryptParams()))
})
} }
func setupTestTerminal(t *testing.T) *bytes.Buffer { func setupTestTerminal(t *testing.T) *bytes.Buffer {

View file

@ -3,25 +3,76 @@ package morph
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"os"
"path" "path"
"path/filepath"
"github.com/nspcc-dev/neo-go/cli/input" "github.com/nspcc-dev/neo-go/cli/input"
"github.com/nspcc-dev/neo-go/pkg/crypto/keys" "github.com/nspcc-dev/neo-go/pkg/crypto/keys"
"github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest" "github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest"
"github.com/nspcc-dev/neo-go/pkg/util" "github.com/nspcc-dev/neo-go/pkg/util"
"github.com/nspcc-dev/neo-go/pkg/wallet" "github.com/nspcc-dev/neo-go/pkg/wallet"
"github.com/spf13/cobra"
"github.com/spf13/viper" "github.com/spf13/viper"
) )
const contractWalletName = "contract.json" const contractWalletName = "contract.json"
func openContractWallet(walletDir string) (*wallet.Wallet, error) { func initializeContractWallet(walletDir string) (*wallet.Wallet, error) {
var (
password string
err error
)
if key := "credentials.contract"; viper.IsSet(key) {
password = viper.GetString(key)
} else {
prompt := "Password for contract wallet > "
password, err = input.ReadPassword(prompt)
if err != nil {
return nil, err
}
}
w, err := wallet.NewWallet(path.Join(walletDir, contractWalletName))
if err != nil {
return nil, err
}
acc, err := wallet.NewAccount()
if err != nil {
return nil, err
}
err = acc.Encrypt(password, keys.NEP2ScryptParams())
if err != nil {
return nil, err
}
w.AddAccount(acc)
if err := w.Save(); err != nil {
return nil, err
}
return w, nil
}
func openContractWallet(cmd *cobra.Command, walletDir string) (*wallet.Wallet, error) {
p := path.Join(walletDir, contractWalletName) p := path.Join(walletDir, contractWalletName)
w, err := wallet.NewWalletFromFile(p) w, err := wallet.NewWalletFromFile(p)
if err != nil { if err != nil {
if !os.IsNotExist(err) {
return nil, fmt.Errorf("can't open wallet: %w", err) return nil, fmt.Errorf("can't open wallet: %w", err)
} }
cmd.Printf("Contract group wallet is missing, initialize at %s\n",
filepath.Join(walletDir, contractWalletName))
w, err = initializeContractWallet(walletDir)
if err != nil {
return nil, err
}
}
var password string var password string
if key := "credentials.contract"; viper.IsSet(key) { if key := "credentials.contract"; viper.IsSet(key) {
password = viper.GetString(key) password = viper.GetString(key)

View file

@ -97,7 +97,7 @@ func newInitializeContext(cmd *cobra.Command, v *viper.Viper) (*initializeContex
return nil, err return nil, err
} }
w, err := openContractWallet(walletDir) w, err := openContractWallet(cmd, walletDir)
if err != nil { if err != nil {
return nil, err return nil, err
} }