概述: 用Go创建和导入keystore。

Keystores

keystore是一个包含经过加密了的钱包私钥。go-ethereum中的keystore,每个文件只能包含一个钱包密钥对。要生成keystore,首先您必须调用NewKeyStore,给它提供保存keystore的目录路径。然后,您可调用NewAccount方法创建新的钱包,并给它传入一个用于加密的口令。您每次调用NewAccount,它将在磁盘上生成新的keystore文件。

这是一个完整的生成新的keystore账户的示例。

  1. ks := keystore.NewKeyStore("./wallets", keystore.StandardScryptN, keystore.StandardScryptP)
  2. password := "secret"
  3. account, err := ks.NewAccount(password)
  4. if err != nil {
  5. log.Fatal(err)
  6. }
  7. fmt.Println(account.Address.Hex()) // 0x20F8D42FB0F667F2E53930fed426f225752453b3

现在要导入您的keystore,您基本上像往常一样再次调用NewKeyStore,然后调用Import方法,该方法接收keystore的JSON数据作为字节。第二个参数是用于加密私钥的口令。第三个参数是指定一个新的加密口令,但我们在示例中使用一样的口令。导入账户将允许您按期访问该账户,但它将生成新keystore文件!有两个相同的事物是没有意义的,所以我们将删除旧的。

这是一个导入keystore和访问账户的示例。

  1. file := "./wallets/UTC--2018-07-04T09-58-30.122808598Z--20f8d42fb0f667f2e53930fed426f225752453b3"
  2. ks := keystore.NewKeyStore("./tmp", keystore.StandardScryptN, keystore.StandardScryptP)
  3. jsonBytes, err := ioutil.ReadFile(file)
  4. if err != nil {
  5. log.Fatal(err)
  6. }
  7. password := "secret"
  8. account, err := ks.Import(jsonBytes, password, password)
  9. if err != nil {
  10. log.Fatal(err)
  11. }
  12. fmt.Println(account.Address.Hex()) // 0x20F8D42FB0F667F2E53930fed426f225752453b3
  13. if err := os.Remove(file); err != nil {
  14. log.Fatal(err)
  15. }

-

完整代码

keystore.go

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "log"
  6. "os"
  7. "github.com/ethereum/go-ethereum/accounts/keystore"
  8. )
  9. func createKs() {
  10. ks := keystore.NewKeyStore("./tmp", keystore.StandardScryptN, keystore.StandardScryptP)
  11. password := "secret"
  12. account, err := ks.NewAccount(password)
  13. if err != nil {
  14. log.Fatal(err)
  15. }
  16. fmt.Println(account.Address.Hex()) // 0x20F8D42FB0F667F2E53930fed426f225752453b3
  17. }
  18. func importKs() {
  19. file := "./tmp/UTC--2018-07-04T09-58-30.122808598Z--20f8d42fb0f667f2e53930fed426f225752453b3"
  20. ks := keystore.NewKeyStore("./tmp", keystore.StandardScryptN, keystore.StandardScryptP)
  21. jsonBytes, err := ioutil.ReadFile(file)
  22. if err != nil {
  23. log.Fatal(err)
  24. }
  25. password := "secret"
  26. account, err := ks.Import(jsonBytes, password, password)
  27. if err != nil {
  28. log.Fatal(err)
  29. }
  30. fmt.Println(account.Address.Hex()) // 0x20F8D42FB0F667F2E53930fed426f225752453b3
  31. if err := os.Remove(file); err != nil {
  32. log.Fatal(err)
  33. }
  34. }
  35. func main() {
  36. createKs()
  37. //importKs()
  38. }