Kann ich mit einem Keystore mehrere Wallet-Adressen generieren?

Ich versuche, mehrere Wallet-Adressen mit einer einzigen Keystore-Datei zu generieren. Kann mir bitte jemand einen Rat geben, ob es möglich ist? ODER kann ein Keystore nur eine Wallet-Adresse haben?

Ich generiere Schlüsselspeicher und Konto einfach mit folgendem Code

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

Problem, mit dem ich konfrontiert bin, ist, dass jedes Mal eine neue Datei aufgrund der Funktion erstellt wird NewKeyStore. Ich kann keine geeignete Funktion finden, keystore.godie den Dateinamen als Pfad verwendet

Bitte helfen Sie.

Danke

Antworten (1)

Keystores von go-ethereum können nur ein Wallet-Schlüsselpaar pro Datei enthalten. Um Keystores zuerst zu generieren, müssen Sie NewKeyStorees aufrufen und ihm den Verzeichnispfad zum Speichern der Keystores geben. Danach können Sie eine neue Wallet generieren, indem Sie die Methode aufrufen und NewAccountihr ein Passwort zur Verschlüsselung übergeben. Bei jedem Aufruf NewAccountwird eine neue Keystore-Datei auf der Festplatte generiert.

Hier ist ein vollständiges Beispiel für die Generierung eines neuen Keystore-Kontos:

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
}

Das Importieren Ihres Schlüsselspeichers ist nicht wirklich intuitiv, und ich hoffe, dass jemand den Ablauf ändern kann, oder wenn jemand einen besseren Weg kennt, aber im Grunde müssen Sie wie gewohnt erneut aufrufen und dann die Methode aufrufen, die den Schlüsselspeicher NewKeyStoreJSON Importakzeptiert Daten als Bytes. Das zweite Argument ist das Passwort, das zum Verschlüsseln verwendet wird, um es zu entschlüsseln. Das dritte Argument besteht darin, ein neues Verschlüsselungskennwort anzugeben, aber wir verwenden im Beispiel dasselbe. Durch das Importieren des Kontos erhalten Sie wie erwartet Zugriff auf das Konto, es wird jedoch eine neue Keystore-Datei generiert! Es hat keinen Sinn, zwei gleiche Dinge zu haben, also löschen wir das alte.

Hier ist ein vollständiges Beispiel für den Import eines Schlüsselspeichers und den Zugriff auf das Konto.

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)
    }
}

Auf diese Weise kann ich den Schlüsselspeicher wiederherstellen, aber ich hoffe, dass jemand auf eine sauberere Weise Licht ins Dunkel bringen kann.