Я пытаюсь сгенерировать несколько адресов кошелька, используя один файл хранилища ключей. Может кто-нибудь, пожалуйста, посоветуйте мне, если это возможно? ИЛИ одно хранилище ключей может иметь только один адрес кошелька?
Я создаю хранилище ключей и учетную запись, просто используя следующий код
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
которая принимает имя файла в качестве пути
Пожалуйста помоги.
Спасибо
Хранилища ключей от 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
ключей Import
JSON данные в виде байтов. Второй аргумент — это пароль, используемый для его шифрования с целью его расшифровки. Третий аргумент — указать новый пароль шифрования, но в примере мы будем использовать тот же пароль. Импорт учетной записи даст вам доступ к учетной записи, как и ожидалось, но он создаст новый файл хранилища ключей! Нет смысла иметь две одинаковые вещи, поэтому мы удалим старую.
Вот полный пример импорта хранилища ключей и доступа к учетной записи.
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)
}
}
Именно так я могу восстановить хранилище ключей, но я надеюсь, что кто-то сможет пролить свет на более чистый способ.