|
|
@ -62,8 +62,11 @@ var ( |
|
|
|
newCommandNoPassPtr = newCommand.Bool("nopass", false, "The account has no pass phrase") |
|
|
|
newCommandNoPassPtr = newCommand.Bool("nopass", false, "The account has no pass phrase") |
|
|
|
|
|
|
|
|
|
|
|
// List subcommands
|
|
|
|
// List subcommands
|
|
|
|
listCommand = flag.NewFlagSet("list", flag.ExitOnError) |
|
|
|
listCommand = flag.NewFlagSet("list", flag.ExitOnError) |
|
|
|
listCommandNoPassPtr = listCommand.Bool("nopass", false, "The account has no pass phrase") |
|
|
|
|
|
|
|
|
|
|
|
// Export subcommands
|
|
|
|
|
|
|
|
exportCommand = flag.NewFlagSet("export", flag.ExitOnError) |
|
|
|
|
|
|
|
exportCommandAccountPtr = exportCommand.String("account", "", "The account to be exported") |
|
|
|
|
|
|
|
|
|
|
|
// Account subcommands
|
|
|
|
// Account subcommands
|
|
|
|
accountImportCommand = flag.NewFlagSet("import", flag.ExitOnError) |
|
|
|
accountImportCommand = flag.NewFlagSet("import", flag.ExitOnError) |
|
|
@ -116,7 +119,6 @@ func main() { |
|
|
|
fmt.Println(" 1. new - Generates a new account and store the private key locally") |
|
|
|
fmt.Println(" 1. new - Generates a new account and store the private key locally") |
|
|
|
fmt.Println(" --nopass - The private key has no passphrase (for test only)") |
|
|
|
fmt.Println(" --nopass - The private key has no passphrase (for test only)") |
|
|
|
fmt.Println(" 2. list - Lists all accounts in local keystore") |
|
|
|
fmt.Println(" 2. list - Lists all accounts in local keystore") |
|
|
|
fmt.Println(" --nopass - The private key has no passphrase (for test only)") |
|
|
|
|
|
|
|
fmt.Println(" 3. removeAll - Removes all accounts in local keystore") |
|
|
|
fmt.Println(" 3. removeAll - Removes all accounts in local keystore") |
|
|
|
fmt.Println(" 4. import - Imports a new account by private key") |
|
|
|
fmt.Println(" 4. import - Imports a new account by private key") |
|
|
|
fmt.Println(" --pass - The passphrase of the private key to import") |
|
|
|
fmt.Println(" --pass - The passphrase of the private key to import") |
|
|
@ -132,6 +134,8 @@ func main() { |
|
|
|
fmt.Println(" --shardID - The shard Id for the transfer") |
|
|
|
fmt.Println(" --shardID - The shard Id for the transfer") |
|
|
|
fmt.Println(" --inputData - Base64-encoded input data to embed in the transaction") |
|
|
|
fmt.Println(" --inputData - Base64-encoded input data to embed in the transaction") |
|
|
|
fmt.Println(" --pass - Passphrase of sender's private key") |
|
|
|
fmt.Println(" --pass - Passphrase of sender's private key") |
|
|
|
|
|
|
|
fmt.Println(" 8. export - Export account key to a new file") |
|
|
|
|
|
|
|
fmt.Println(" --account - Specify the account to export. Empty will export every key.") |
|
|
|
os.Exit(1) |
|
|
|
os.Exit(1) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -173,6 +177,8 @@ ARG: |
|
|
|
processNewCommnad() |
|
|
|
processNewCommnad() |
|
|
|
case "list": |
|
|
|
case "list": |
|
|
|
processListCommand() |
|
|
|
processListCommand() |
|
|
|
|
|
|
|
case "export": |
|
|
|
|
|
|
|
processExportCommand() |
|
|
|
case "removeAll": |
|
|
|
case "removeAll": |
|
|
|
clearKeystore() |
|
|
|
clearKeystore() |
|
|
|
case "import": |
|
|
|
case "import": |
|
|
@ -248,7 +254,7 @@ func processNewCommnad() { |
|
|
|
password := "" |
|
|
|
password := "" |
|
|
|
|
|
|
|
|
|
|
|
if !noPass { |
|
|
|
if !noPass { |
|
|
|
password := utils.AskForPassphrase("Passphrase: ") |
|
|
|
password = utils.AskForPassphrase("Passphrase: ") |
|
|
|
password2 := utils.AskForPassphrase("Passphrase again: ") |
|
|
|
password2 := utils.AskForPassphrase("Passphrase again: ") |
|
|
|
if password != password2 { |
|
|
|
if password != password2 { |
|
|
|
fmt.Printf("Passphrase doesn't match. Please try again!\n") |
|
|
|
fmt.Printf("Passphrase doesn't match. Please try again!\n") |
|
|
@ -264,38 +270,53 @@ func processNewCommnad() { |
|
|
|
fmt.Printf("URL: %s\n", account.URL) |
|
|
|
fmt.Printf("URL: %s\n", account.URL) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _exportAccount(account accounts.Account) { |
|
|
|
|
|
|
|
fmt.Printf("account: %s\n", account.Address.Hex()) |
|
|
|
|
|
|
|
fmt.Printf("URL: %s\n", account.URL) |
|
|
|
|
|
|
|
pass := utils.AskForPassphrase("Original Passphrase: ") |
|
|
|
|
|
|
|
newpass := utils.AskForPassphrase("Export Passphrase: ") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
data, err := ks.Export(account, pass, newpass) |
|
|
|
|
|
|
|
if err == nil { |
|
|
|
|
|
|
|
filename := fmt.Sprintf(".hmy/%s.key", account.Address.Hex()) |
|
|
|
|
|
|
|
f, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY, 0644) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
panic("Failed to open keystore") |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
_, err = f.Write(data) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
panic("Failed to write to keystore") |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
f.Close() |
|
|
|
|
|
|
|
fmt.Printf("Exported keyfile to: %v\n", filename) |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
switch err { |
|
|
|
|
|
|
|
case accounts.ErrInvalidPassphrase: |
|
|
|
|
|
|
|
fmt.Println("Invalid Passphrase") |
|
|
|
|
|
|
|
default: |
|
|
|
|
|
|
|
fmt.Printf("export error: %v\n", err) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func processListCommand() { |
|
|
|
func processListCommand() { |
|
|
|
listCommand.Parse(os.Args[2:]) |
|
|
|
listCommand.Parse(os.Args[2:]) |
|
|
|
noPass := *listCommandNoPassPtr |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
allAccounts := ks.Accounts() |
|
|
|
allAccounts := ks.Accounts() |
|
|
|
for _, account := range allAccounts { |
|
|
|
for _, account := range allAccounts { |
|
|
|
fmt.Printf("account: %s\n", account.Address.Hex()) |
|
|
|
fmt.Printf("account: %s\n", account.Address.Hex()) |
|
|
|
fmt.Printf("URL: %s\n", account.URL) |
|
|
|
fmt.Printf("URL: %s\n", account.URL) |
|
|
|
password := "" |
|
|
|
} |
|
|
|
newpass := "" |
|
|
|
} |
|
|
|
if !noPass { |
|
|
|
|
|
|
|
password = utils.AskForPassphrase("Passphrase: ") |
|
|
|
func processExportCommand() { |
|
|
|
newpass = utils.AskForPassphrase("Export Passphrase: ") |
|
|
|
exportCommand.Parse(os.Args[2:]) |
|
|
|
} |
|
|
|
acc := *exportCommandAccountPtr |
|
|
|
data, err := ks.Export(account, password, newpass) |
|
|
|
|
|
|
|
if err == nil { |
|
|
|
allAccounts := ks.Accounts() |
|
|
|
f, err := os.OpenFile(fmt.Sprintf(".hmy/%s.key", account.Address.Hex()), os.O_CREATE|os.O_WRONLY, 0644) |
|
|
|
for _, account := range allAccounts { |
|
|
|
if err != nil { |
|
|
|
if acc == "" || acc == account.Address.Hex() { |
|
|
|
panic("Failed to open keystore") |
|
|
|
_exportAccount(account) |
|
|
|
} |
|
|
|
|
|
|
|
_, err = f.Write(data) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
panic("Failed to write to keystore") |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
f.Close() |
|
|
|
|
|
|
|
continue |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
switch err { |
|
|
|
|
|
|
|
case accounts.ErrInvalidPassphrase: |
|
|
|
|
|
|
|
fmt.Println("Invalid Passphrase") |
|
|
|
|
|
|
|
default: |
|
|
|
|
|
|
|
fmt.Printf("export error: %v\n", err) |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -432,7 +453,13 @@ func processTransferCommand() { |
|
|
|
return |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ks.Unlock(account, senderPass) |
|
|
|
err = ks.Unlock(account, senderPass) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
fmt.Printf("Unlock account failed! %v\n", err) |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fmt.Printf("Unlock account succeeded! '%v'\n", senderPass) |
|
|
|
|
|
|
|
|
|
|
|
tx, err = ks.SignTx(account, tx, nil) |
|
|
|
tx, err = ks.SignTx(account, tx, nil) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|