cosmos-sdk/server/init.go

130 lines
3.3 KiB
Go
Raw Normal View History

package server
import (
"encoding/json"
"errors"
2018-03-28 08:03:17 -07:00
"fmt"
"github.com/cosmos/cosmos-sdk/crypto/keys"
"github.com/tendermint/tendermint/crypto"
dbm "github.com/tendermint/tendermint/libs/db"
"github.com/tendermint/tendermint/types"
2018-04-25 21:27:40 -07:00
clkeys "github.com/cosmos/cosmos-sdk/client/keys"
"github.com/cosmos/cosmos-sdk/codec"
2018-04-25 21:27:40 -07:00
sdk "github.com/cosmos/cosmos-sdk/types"
tmtypes "github.com/tendermint/tendermint/types"
)
// SimpleGenTx is a simple genesis tx
type SimpleGenTx struct {
Addr sdk.AccAddress `json:"addr"`
2018-04-23 17:05:58 -07:00
}
//_____________________________________________________________________
// Generate a genesis transaction
func SimpleAppGenTx(cdc *codec.Codec, pk crypto.PubKey) (
appGenTx, cliPrint json.RawMessage, validator types.GenesisValidator, err error) {
2018-07-06 00:06:53 -07:00
var addr sdk.AccAddress
var secret string
2018-07-06 00:06:53 -07:00
addr, secret, err = GenerateCoinKey()
if err != nil {
return
}
var bz []byte
simpleGenTx := SimpleGenTx{Addr: addr}
bz, err = cdc.MarshalJSON(simpleGenTx)
if err != nil {
return
}
appGenTx = json.RawMessage(bz)
mm := map[string]string{"secret": secret}
bz, err = cdc.MarshalJSON(mm)
if err != nil {
return
}
cliPrint = json.RawMessage(bz)
validator = tmtypes.GenesisValidator{
PubKey: pk,
Power: 10,
}
2018-04-20 16:55:22 -07:00
return
}
2018-04-25 21:49:53 -07:00
// create the genesis app state
func SimpleAppGenState(cdc *codec.Codec, genDoc tmtypes.GenesisDoc, appGenTxs []json.RawMessage) (
appState json.RawMessage, err error) {
2018-04-25 21:49:53 -07:00
if len(appGenTxs) != 1 {
err = errors.New("must provide a single genesis transaction")
return
}
var tx SimpleGenTx
err = cdc.UnmarshalJSON(appGenTxs[0], &tx)
2018-04-25 21:49:53 -07:00
if err != nil {
return
}
appState = json.RawMessage(fmt.Sprintf(`{
"accounts": [{
"address": "%s",
"coins": [
{
"denom": "mycoin",
"amount": "9007199254740992"
2018-04-25 21:49:53 -07:00
}
]
}]
}`, tx.Addr))
2018-04-25 21:49:53 -07:00
return
}
//___________________________________________________________________________________________
2018-04-20 14:42:56 -07:00
// GenerateCoinKey returns the address of a public key, along with the secret
// phrase to recover the private key.
2018-07-06 00:06:53 -07:00
func GenerateCoinKey() (sdk.AccAddress, string, error) {
2018-04-20 16:55:22 -07:00
2018-04-05 03:31:33 -07:00
// construct an in-memory key store
keybase := keys.New(
dbm.NewMemDB(),
)
// generate a private key, with recovery phrase
info, secret, err := keybase.CreateMnemonic("name", keys.English, "pass", keys.Secp256k1)
2018-04-05 03:31:33 -07:00
if err != nil {
2018-07-09 01:47:38 -07:00
return sdk.AccAddress([]byte{}), "", err
2018-04-05 03:31:33 -07:00
}
addr := info.GetPubKey().Address()
2018-07-06 00:06:53 -07:00
return sdk.AccAddress(addr), secret, nil
2018-04-05 03:31:33 -07:00
}
2018-04-25 21:27:40 -07:00
// GenerateSaveCoinKey returns the address of a public key, along with the secret
// phrase to recover the private key.
2018-07-06 00:06:53 -07:00
func GenerateSaveCoinKey(clientRoot, keyName, keyPass string, overwrite bool) (sdk.AccAddress, string, error) {
2018-04-25 21:27:40 -07:00
// get the keystore from the client
keybase, err := clkeys.GetKeyBaseFromDirWithWritePerm(clientRoot)
2018-04-25 21:27:40 -07:00
if err != nil {
2018-07-09 01:47:38 -07:00
return sdk.AccAddress([]byte{}), "", err
2018-04-25 21:27:40 -07:00
}
// ensure no overwrite
if !overwrite {
_, err := keybase.Get(keyName)
if err == nil {
return sdk.AccAddress([]byte{}), "", fmt.Errorf(
"key already exists, overwrite is disabled (clientRoot: %s)", clientRoot)
2018-04-25 21:27:40 -07:00
}
}
// generate a private key, with recovery phrase
info, secret, err := keybase.CreateMnemonic(keyName, keys.English, keyPass, keys.Secp256k1)
2018-04-25 21:27:40 -07:00
if err != nil {
2018-07-09 01:47:38 -07:00
return sdk.AccAddress([]byte{}), "", err
2018-04-25 21:27:40 -07:00
}
addr := info.GetPubKey().Address()
2018-07-06 00:06:53 -07:00
return sdk.AccAddress(addr), secret, nil
2018-04-25 21:27:40 -07:00
}