Могу ли я сгенерировать несколько адресов кошелька, используя одно хранилище ключей?

Я пытаюсь сгенерировать несколько адресов кошелька, используя один файл хранилища ключей. Может кто-нибудь, пожалуйста, посоветуйте мне, если это возможно? ИЛИ одно хранилище ключей может иметь только один адрес кошелька?

Я создаю хранилище ключей и учетную запись, просто используя следующий код

ks      := keystore.NewKeyStore("./dir", keystore.StandardScryptN, keystore.StandardScryptP)

// Create a new account with the specified encryption passphrase
newAcc, err     := ks.NewAccount(password)

// Return address & array
return newAcc.Address.String(), err

Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда создается новый файл из-за функции NewKeyStore. Я не могу найти подходящую функцию, keystore.goкоторая принимает имя файла в качестве пути

Пожалуйста помоги.

Спасибо

Ответы (1)

Хранилища ключей от go-ethereum могут содержать только одну пару ключей кошелька на файл. Чтобы сначала сгенерировать хранилища ключей, вы должны вызвать NewKeyStoreего, указав путь к каталогу для сохранения хранилищ ключей. После этого вы можете сгенерировать новый кошелек, вызвав метод, NewAccountпередав ему пароль для шифрования. Каждый раз, когда вы вызываете NewAccountего, на диске создается новый файл хранилища ключей.

Вот полный пример создания новой учетной записи хранилища ключей:

package main

import (
    "fmt"
    "log"

    "github.com/ethereum/go-ethereum/accounts/keystore"
)

func main() {
    ks := keystore.NewKeyStore("./wallets", keystore.StandardScryptN, keystore.StandardScryptP)
    password := "secret"
    account, err := ks.NewAccount(password)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(account.Address.Hex()) // 0x20F8D42FB0F667F2E53930fed426f225752453b3
}

Теперь импортировать ваше хранилище ключей не очень интуитивно понятно, и я надеюсь, что кто-то может изменить поток этого, или если кто-то знает лучший способ, но в основном вам нужно снова вызвать, как обычно, а затем вызвать метод, который принимает хранилище NewKeyStoreключей ImportJSON данные в виде байтов. Второй аргумент — это пароль, используемый для его шифрования с целью его расшифровки. Третий аргумент — указать новый пароль шифрования, но в примере мы будем использовать тот же пароль. Импорт учетной записи даст вам доступ к учетной записи, как и ожидалось, но он создаст новый файл хранилища ключей! Нет смысла иметь две одинаковые вещи, поэтому мы удалим старую.

Вот полный пример импорта хранилища ключей и доступа к учетной записи.

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "os"

    "github.com/ethereum/go-ethereum/accounts/keystore"
)

func main() {
    file := "./wallets/UTC--2018-07-04T09-58-30.122808598Z--20f8d42fb0f667f2e53930fed426f225752453b3"
    ks := keystore.NewKeyStore("./tmp", keystore.StandardScryptN, keystore.StandardScryptP)
    jsonBytes, err := ioutil.ReadFile(file)
    if err != nil {
        log.Fatal(err)
    }

    password := "secret"
    account, err := ks.Import(jsonBytes, password, password)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(account.Address.Hex()) // 0x20F8D42FB0F667F2E53930fed426f225752453b3

    if err := os.Remove(file); err != nil {
        log.Fatal(err)
    }
}

Именно так я могу восстановить хранилище ключей, но я надеюсь, что кто-то сможет пролить свет на более чистый способ.