---
概述: 用Go創建和導入keystore。
---
# Keystores
keystore是一個包含經過加密了的錢包私鑰。go-ethereum中的keystore,每個文件只能包含一個錢包密鑰對。要生成keystore,首先您必須調用`NewKeyStore`,給它提供保存keystore的目錄路徑。然后,您可調用`NewAccount`方法創建新的錢包,并給它傳入一個用于加密的口令。您每次調用`NewAccount`,它將在磁盤上生成新的keystore文件。
這是一個完整的生成新的keystore賬戶的示例。
```go
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
```
現在要導入您的keystore,您基本上像往常一樣再次調用`NewKeyStore`,然后調用`Import`方法,該方法接收keystore的JSON數據作為字節。第二個參數是用于加密私鑰的口令。第三個參數是指定一個新的加密口令,但我們在示例中使用一樣的口令。導入賬戶將允許您按期訪問該賬戶,但它將生成新keystore文件!有兩個相同的事物是沒有意義的,所以我們將刪除舊的。
這是一個導入keystore和訪問賬戶的示例。
```go
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)
}
```
----
### 完整代碼
```go
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"github.com/ethereum/go-ethereum/accounts/keystore"
)
func createKs() {
ks := keystore.NewKeyStore("./tmp", keystore.StandardScryptN, keystore.StandardScryptP)
password := "secret"
account, err := ks.NewAccount(password)
if err != nil {
log.Fatal(err)
}
fmt.Println(account.Address.Hex()) // 0x20F8D42FB0F667F2E53930fed426f225752453b3
}
func importKs() {
file := "./tmp/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)
}
}
func main() {
createKs()
//importKs()
}
```
- 客戶端
- 創建客戶端
- 以太坊賬戶
- 賬戶余額
- 賬戶代幣余額
- 生成新錢包
- 密匙庫
- 硬件錢包
- 地址驗證
- 交易
- 查詢區塊
- 查詢交易
- ETH轉賬
- 代幣轉賬
- 監聽新區塊
- 創建裸交易
- 發送裸交易
- 智能合約
- 智能合約 & ABI
- 部署智能合約
- 加載智能合約
- 查詢智能合約
- 寫入智能合約
- 讀取智能合約二進制碼
- 查詢ERC20代幣智能合約
- 事件日志
- 監聽事件日志
- 讀取時間日志
- 讀取ERC20代幣的事件日志
- 讀取0x Protocol事件日志
- 簽名
- 生成簽名
- 驗證簽名
- 測試
- 發幣龍頭
- 使用模擬客戶端
- Swarm存儲
- 創建 Swarm存儲
- 上傳文件到Swarm
- 從Swarm下載文件
- Whisper通信協議
- 創建Whisper客戶端
- 生成Whisper密匙對
- 在Whisper上發送消息
- 監聽Whisper消息
- 工具
- 工具集合
- 專有詞匯表
- 資源