mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-05 04:31:16 +00:00
cmd/puppeth: improve code (#1716)
This commit is contained in:
parent
733b6e2b37
commit
f65ecda9f1
10 changed files with 20 additions and 213 deletions
|
|
@ -25,144 +25,9 @@ import (
|
||||||
"github.com/XinFinOrg/XDPoSChain/common/hexutil"
|
"github.com/XinFinOrg/XDPoSChain/common/hexutil"
|
||||||
"github.com/XinFinOrg/XDPoSChain/consensus/ethash"
|
"github.com/XinFinOrg/XDPoSChain/consensus/ethash"
|
||||||
"github.com/XinFinOrg/XDPoSChain/core"
|
"github.com/XinFinOrg/XDPoSChain/core"
|
||||||
"github.com/XinFinOrg/XDPoSChain/core/types"
|
|
||||||
"github.com/XinFinOrg/XDPoSChain/params"
|
"github.com/XinFinOrg/XDPoSChain/params"
|
||||||
)
|
)
|
||||||
|
|
||||||
// cppEthereumGenesisSpec represents the genesis specification format used by the
|
|
||||||
// C++ Ethereum implementation.
|
|
||||||
type cppEthereumGenesisSpec struct {
|
|
||||||
SealEngine string `json:"sealEngine"`
|
|
||||||
Params struct {
|
|
||||||
AccountStartNonce hexutil.Uint64 `json:"accountStartNonce"`
|
|
||||||
HomesteadForkBlock hexutil.Uint64 `json:"homesteadForkBlock"`
|
|
||||||
EIP150ForkBlock hexutil.Uint64 `json:"EIP150ForkBlock"`
|
|
||||||
EIP158ForkBlock hexutil.Uint64 `json:"EIP158ForkBlock"`
|
|
||||||
ByzantiumForkBlock hexutil.Uint64 `json:"byzantiumForkBlock"`
|
|
||||||
ConstantinopleForkBlock hexutil.Uint64 `json:"constantinopleForkBlock"`
|
|
||||||
NetworkID hexutil.Uint64 `json:"networkID"`
|
|
||||||
ChainID hexutil.Uint64 `json:"chainID"`
|
|
||||||
MaximumExtraDataSize hexutil.Uint64 `json:"maximumExtraDataSize"`
|
|
||||||
MinGasLimit hexutil.Uint64 `json:"minGasLimit"`
|
|
||||||
MaxGasLimit hexutil.Uint64 `json:"maxGasLimit"`
|
|
||||||
GasLimitBoundDivisor hexutil.Uint64 `json:"gasLimitBoundDivisor"`
|
|
||||||
MinimumDifficulty *hexutil.Big `json:"minimumDifficulty"`
|
|
||||||
DifficultyBoundDivisor *hexutil.Big `json:"difficultyBoundDivisor"`
|
|
||||||
DurationLimit *hexutil.Big `json:"durationLimit"`
|
|
||||||
BlockReward *hexutil.Big `json:"blockReward"`
|
|
||||||
} `json:"params"`
|
|
||||||
|
|
||||||
Genesis struct {
|
|
||||||
Nonce hexutil.Bytes `json:"nonce"`
|
|
||||||
Difficulty *hexutil.Big `json:"difficulty"`
|
|
||||||
MixHash common.Hash `json:"mixHash"`
|
|
||||||
Author common.Address `json:"author"`
|
|
||||||
Timestamp hexutil.Uint64 `json:"timestamp"`
|
|
||||||
ParentHash common.Hash `json:"parentHash"`
|
|
||||||
ExtraData hexutil.Bytes `json:"extraData"`
|
|
||||||
GasLimit hexutil.Uint64 `json:"gasLimit"`
|
|
||||||
} `json:"genesis"`
|
|
||||||
|
|
||||||
Accounts map[common.Address]*cppEthereumGenesisSpecAccount `json:"accounts"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// cppEthereumGenesisSpecAccount is the prefunded genesis account and/or precompiled
|
|
||||||
// contract definition.
|
|
||||||
type cppEthereumGenesisSpecAccount struct {
|
|
||||||
Balance *hexutil.Big `json:"balance"`
|
|
||||||
Nonce uint64 `json:"nonce,omitempty"`
|
|
||||||
Precompiled *cppEthereumGenesisSpecBuiltin `json:"precompiled,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// cppEthereumGenesisSpecBuiltin is the precompiled contract definition.
|
|
||||||
type cppEthereumGenesisSpecBuiltin struct {
|
|
||||||
Name string `json:"name,omitempty"`
|
|
||||||
StartingBlock hexutil.Uint64 `json:"startingBlock,omitempty"`
|
|
||||||
Linear *cppEthereumGenesisSpecLinearPricing `json:"linear,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type cppEthereumGenesisSpecLinearPricing struct {
|
|
||||||
Base uint64 `json:"base"`
|
|
||||||
Word uint64 `json:"word"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// newCppEthereumGenesisSpec converts a go-ethereum genesis block into a Parity specific
|
|
||||||
// chain specification format.
|
|
||||||
func newCppEthereumGenesisSpec(network string, genesis *core.Genesis) (*cppEthereumGenesisSpec, error) {
|
|
||||||
// Only ethash is currently supported between go-ethereum and cpp-ethereum
|
|
||||||
if genesis.Config.Ethash == nil {
|
|
||||||
return nil, errors.New("unsupported consensus engine")
|
|
||||||
}
|
|
||||||
// Reconstruct the chain spec in Parity's format
|
|
||||||
spec := &cppEthereumGenesisSpec{
|
|
||||||
SealEngine: "Ethash",
|
|
||||||
}
|
|
||||||
spec.Params.AccountStartNonce = 0
|
|
||||||
spec.Params.HomesteadForkBlock = (hexutil.Uint64)(genesis.Config.HomesteadBlock.Uint64())
|
|
||||||
spec.Params.EIP150ForkBlock = (hexutil.Uint64)(genesis.Config.EIP150Block.Uint64())
|
|
||||||
spec.Params.EIP158ForkBlock = (hexutil.Uint64)(genesis.Config.EIP158Block.Uint64())
|
|
||||||
spec.Params.ByzantiumForkBlock = (hexutil.Uint64)(genesis.Config.ByzantiumBlock.Uint64())
|
|
||||||
spec.Params.ConstantinopleForkBlock = (hexutil.Uint64)(math.MaxUint64)
|
|
||||||
|
|
||||||
spec.Params.NetworkID = (hexutil.Uint64)(genesis.Config.ChainID.Uint64())
|
|
||||||
spec.Params.ChainID = (hexutil.Uint64)(genesis.Config.ChainID.Uint64())
|
|
||||||
|
|
||||||
spec.Params.MaximumExtraDataSize = (hexutil.Uint64)(params.MaximumExtraDataSize)
|
|
||||||
spec.Params.MinGasLimit = (hexutil.Uint64)(params.MinGasLimit)
|
|
||||||
spec.Params.MaxGasLimit = (hexutil.Uint64)(math.MaxUint64)
|
|
||||||
spec.Params.MinimumDifficulty = (*hexutil.Big)(params.MinimumDifficulty)
|
|
||||||
spec.Params.DifficultyBoundDivisor = (*hexutil.Big)(params.DifficultyBoundDivisor)
|
|
||||||
spec.Params.GasLimitBoundDivisor = (hexutil.Uint64)(params.GasLimitBoundDivisor)
|
|
||||||
spec.Params.DurationLimit = (*hexutil.Big)(params.DurationLimit)
|
|
||||||
spec.Params.BlockReward = (*hexutil.Big)(ethash.FrontierBlockReward)
|
|
||||||
|
|
||||||
spec.Genesis.Nonce = (hexutil.Bytes)(make([]byte, 8))
|
|
||||||
binary.LittleEndian.PutUint64(spec.Genesis.Nonce[:], genesis.Nonce)
|
|
||||||
|
|
||||||
spec.Genesis.MixHash = genesis.Mixhash
|
|
||||||
spec.Genesis.Difficulty = (*hexutil.Big)(genesis.Difficulty)
|
|
||||||
spec.Genesis.Author = genesis.Coinbase
|
|
||||||
spec.Genesis.Timestamp = (hexutil.Uint64)(genesis.Timestamp)
|
|
||||||
spec.Genesis.ParentHash = genesis.ParentHash
|
|
||||||
spec.Genesis.ExtraData = (hexutil.Bytes)(genesis.ExtraData)
|
|
||||||
spec.Genesis.GasLimit = (hexutil.Uint64)(genesis.GasLimit)
|
|
||||||
|
|
||||||
spec.Accounts = make(map[common.Address]*cppEthereumGenesisSpecAccount)
|
|
||||||
for address, account := range genesis.Alloc {
|
|
||||||
spec.Accounts[address] = &cppEthereumGenesisSpecAccount{
|
|
||||||
Balance: (*hexutil.Big)(account.Balance),
|
|
||||||
Nonce: account.Nonce,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
spec.Accounts[common.BytesToAddress([]byte{1})].Precompiled = &cppEthereumGenesisSpecBuiltin{
|
|
||||||
Name: "ecrecover", Linear: &cppEthereumGenesisSpecLinearPricing{Base: 3000},
|
|
||||||
}
|
|
||||||
spec.Accounts[common.BytesToAddress([]byte{2})].Precompiled = &cppEthereumGenesisSpecBuiltin{
|
|
||||||
Name: "sha256", Linear: &cppEthereumGenesisSpecLinearPricing{Base: 60, Word: 12},
|
|
||||||
}
|
|
||||||
spec.Accounts[common.BytesToAddress([]byte{3})].Precompiled = &cppEthereumGenesisSpecBuiltin{
|
|
||||||
Name: "ripemd160", Linear: &cppEthereumGenesisSpecLinearPricing{Base: 600, Word: 120},
|
|
||||||
}
|
|
||||||
spec.Accounts[common.BytesToAddress([]byte{4})].Precompiled = &cppEthereumGenesisSpecBuiltin{
|
|
||||||
Name: "identity", Linear: &cppEthereumGenesisSpecLinearPricing{Base: 15, Word: 3},
|
|
||||||
}
|
|
||||||
if genesis.Config.ByzantiumBlock != nil {
|
|
||||||
spec.Accounts[common.BytesToAddress([]byte{5})].Precompiled = &cppEthereumGenesisSpecBuiltin{
|
|
||||||
Name: "modexp", StartingBlock: (hexutil.Uint64)(genesis.Config.ByzantiumBlock.Uint64()),
|
|
||||||
}
|
|
||||||
spec.Accounts[common.BytesToAddress([]byte{6})].Precompiled = &cppEthereumGenesisSpecBuiltin{
|
|
||||||
Name: "alt_bn128_G1_add", StartingBlock: (hexutil.Uint64)(genesis.Config.ByzantiumBlock.Uint64()), Linear: &cppEthereumGenesisSpecLinearPricing{Base: 500},
|
|
||||||
}
|
|
||||||
spec.Accounts[common.BytesToAddress([]byte{7})].Precompiled = &cppEthereumGenesisSpecBuiltin{
|
|
||||||
Name: "alt_bn128_G1_mul", StartingBlock: (hexutil.Uint64)(genesis.Config.ByzantiumBlock.Uint64()), Linear: &cppEthereumGenesisSpecLinearPricing{Base: 40000},
|
|
||||||
}
|
|
||||||
spec.Accounts[common.BytesToAddress([]byte{8})].Precompiled = &cppEthereumGenesisSpecBuiltin{
|
|
||||||
Name: "alt_bn128_pairing_product", StartingBlock: (hexutil.Uint64)(genesis.Config.ByzantiumBlock.Uint64()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return spec, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// parityChainSpec is the chain specification format used by Parity.
|
// parityChainSpec is the chain specification format used by Parity.
|
||||||
type parityChainSpec struct {
|
type parityChainSpec struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
|
|
@ -341,40 +206,3 @@ func newParityChainSpec(network string, genesis *core.Genesis, bootnodes []strin
|
||||||
}
|
}
|
||||||
return spec, nil
|
return spec, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// pyEthereumGenesisSpec represents the genesis specification format used by the
|
|
||||||
// Python Ethereum implementation.
|
|
||||||
type pyEthereumGenesisSpec struct {
|
|
||||||
Nonce hexutil.Bytes `json:"nonce"`
|
|
||||||
Timestamp hexutil.Uint64 `json:"timestamp"`
|
|
||||||
ExtraData hexutil.Bytes `json:"extraData"`
|
|
||||||
GasLimit hexutil.Uint64 `json:"gasLimit"`
|
|
||||||
Difficulty *hexutil.Big `json:"difficulty"`
|
|
||||||
Mixhash common.Hash `json:"mixhash"`
|
|
||||||
Coinbase common.Address `json:"coinbase"`
|
|
||||||
Alloc types.GenesisAlloc `json:"alloc"`
|
|
||||||
ParentHash common.Hash `json:"parentHash"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// newPyEthereumGenesisSpec converts a go-ethereum genesis block into a Parity specific
|
|
||||||
// chain specification format.
|
|
||||||
func newPyEthereumGenesisSpec(network string, genesis *core.Genesis) (*pyEthereumGenesisSpec, error) {
|
|
||||||
// Only ethash is currently supported between go-ethereum and pyethereum
|
|
||||||
if genesis.Config.Ethash == nil {
|
|
||||||
return nil, errors.New("unsupported consensus engine")
|
|
||||||
}
|
|
||||||
spec := &pyEthereumGenesisSpec{
|
|
||||||
Timestamp: (hexutil.Uint64)(genesis.Timestamp),
|
|
||||||
ExtraData: genesis.ExtraData,
|
|
||||||
GasLimit: (hexutil.Uint64)(genesis.GasLimit),
|
|
||||||
Difficulty: (*hexutil.Big)(genesis.Difficulty),
|
|
||||||
Mixhash: genesis.Mixhash,
|
|
||||||
Coinbase: genesis.Coinbase,
|
|
||||||
Alloc: genesis.Alloc,
|
|
||||||
ParentHash: genesis.ParentHash,
|
|
||||||
}
|
|
||||||
spec.Nonce = (hexutil.Bytes)(make([]byte, 8))
|
|
||||||
binary.LittleEndian.PutUint64(spec.Nonce[:], genesis.Nonce)
|
|
||||||
|
|
||||||
return spec, nil
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -122,24 +122,6 @@ func tearDown(client *sshClient, network string, service string, purge bool) ([]
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// resolve retrieves the hostname a service is running on either by returning the
|
|
||||||
// actual server name and port, or preferably an nginx virtual host if available.
|
|
||||||
func resolve(client *sshClient, network string, service string, port int) (string, error) {
|
|
||||||
// Inspect the service to get various configurations from it
|
|
||||||
infos, err := inspectContainer(client, fmt.Sprintf("%s_%s_1", network, service))
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
if !infos.running {
|
|
||||||
return "", ErrServiceOffline
|
|
||||||
}
|
|
||||||
// Container online, extract any environmental variables
|
|
||||||
if vhost := infos.envvars["VIRTUAL_HOST"]; vhost != "" {
|
|
||||||
return vhost, nil
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("%s:%d", client.server, port), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// checkPort tries to connect to a remote host on a given
|
// checkPort tries to connect to a remote host on a given
|
||||||
func checkPort(host string, port int) error {
|
func checkPort(host string, port int) error {
|
||||||
log.Trace("Verifying remote TCP connectivity", "server", host, "port", port)
|
log.Trace("Verifying remote TCP connectivity", "server", host, "port", port)
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,8 @@ import (
|
||||||
|
|
||||||
"github.com/XinFinOrg/XDPoSChain/common"
|
"github.com/XinFinOrg/XDPoSChain/common"
|
||||||
"github.com/XinFinOrg/XDPoSChain/log"
|
"github.com/XinFinOrg/XDPoSChain/log"
|
||||||
|
"golang.org/x/text/cases"
|
||||||
|
"golang.org/x/text/language"
|
||||||
)
|
)
|
||||||
|
|
||||||
// faucetDockerfile is the Dockerfile required to build an faucet container to
|
// faucetDockerfile is the Dockerfile required to build an faucet container to
|
||||||
|
|
@ -89,6 +91,7 @@ func deployFaucet(client *sshClient, network string, bootnodes []string, config
|
||||||
files := make(map[string][]byte)
|
files := make(map[string][]byte)
|
||||||
|
|
||||||
dockerfile := new(bytes.Buffer)
|
dockerfile := new(bytes.Buffer)
|
||||||
|
caser := cases.Title(language.English)
|
||||||
template.Must(template.New("").Parse(faucetDockerfile)).Execute(dockerfile, map[string]interface{}{
|
template.Must(template.New("").Parse(faucetDockerfile)).Execute(dockerfile, map[string]interface{}{
|
||||||
"NetworkID": config.node.network,
|
"NetworkID": config.node.network,
|
||||||
"Bootnodes": strings.Join(bootnodes, ","),
|
"Bootnodes": strings.Join(bootnodes, ","),
|
||||||
|
|
@ -96,7 +99,7 @@ func deployFaucet(client *sshClient, network string, bootnodes []string, config
|
||||||
"EthPort": config.node.port,
|
"EthPort": config.node.port,
|
||||||
"CaptchaToken": config.captchaToken,
|
"CaptchaToken": config.captchaToken,
|
||||||
"CaptchaSecret": config.captchaSecret,
|
"CaptchaSecret": config.captchaSecret,
|
||||||
"FaucetName": strings.Title(network),
|
"FaucetName": caser.String(network),
|
||||||
"FaucetAmount": config.amount,
|
"FaucetAmount": config.amount,
|
||||||
"FaucetMinutes": config.minutes,
|
"FaucetMinutes": config.minutes,
|
||||||
"FaucetTiers": config.tiers,
|
"FaucetTiers": config.tiers,
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,8 @@ import (
|
||||||
|
|
||||||
"github.com/XinFinOrg/XDPoSChain/common"
|
"github.com/XinFinOrg/XDPoSChain/common"
|
||||||
"github.com/XinFinOrg/XDPoSChain/log"
|
"github.com/XinFinOrg/XDPoSChain/log"
|
||||||
|
"golang.org/x/text/cases"
|
||||||
|
"golang.org/x/text/language"
|
||||||
)
|
)
|
||||||
|
|
||||||
// nodeDockerfile is the Dockerfile required to run an Ethereum node.
|
// nodeDockerfile is the Dockerfile required to run an Ethereum node.
|
||||||
|
|
@ -241,7 +243,8 @@ func checkNode(client *sshClient, network string, boot bool) (*nodeInfos, error)
|
||||||
// Run a sanity check to see if the devp2p is reachable
|
// Run a sanity check to see if the devp2p is reachable
|
||||||
port := infos.portmap[infos.envvars["PORT"]]
|
port := infos.portmap[infos.envvars["PORT"]]
|
||||||
if err = checkPort(client.server, port); err != nil {
|
if err = checkPort(client.server, port); err != nil {
|
||||||
log.Warn(fmt.Sprintf("%s devp2p port seems unreachable", strings.Title(kind)), "server", client.server, "port", port, "err", err)
|
caser := cases.Title(language.English)
|
||||||
|
log.Warn(fmt.Sprintf("%s devp2p port seems unreachable", caser.String(kind)), "server", client.server, "port", port, "err", err)
|
||||||
}
|
}
|
||||||
// Assemble and return the useful infos
|
// Assemble and return the useful infos
|
||||||
stats := &nodeInfos{
|
stats := &nodeInfos{
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,7 @@ func main() {
|
||||||
app.Action = func(c *cli.Context) error {
|
app.Action = func(c *cli.Context) error {
|
||||||
// Set up the logger to print everything and the random generator
|
// Set up the logger to print everything and the random generator
|
||||||
log.SetDefault(log.NewLogger(log.NewTerminalHandlerWithLevel(os.Stdout, log.FromLegacyLevel(c.Int("loglevel")), true)))
|
log.SetDefault(log.NewLogger(log.NewTerminalHandlerWithLevel(os.Stdout, log.FromLegacyLevel(c.Int("loglevel")), true)))
|
||||||
|
//lint:ignore SA1019 set GODEBUG=randseednop=0 to restore old behavior of `rand.Seed()`
|
||||||
rand.Seed(time.Now().UnixNano())
|
rand.Seed(time.Now().UnixNano())
|
||||||
|
|
||||||
network := c.String("network")
|
network := c.String("network")
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ import (
|
||||||
|
|
||||||
"github.com/XinFinOrg/XDPoSChain/log"
|
"github.com/XinFinOrg/XDPoSChain/log"
|
||||||
"golang.org/x/crypto/ssh"
|
"golang.org/x/crypto/ssh"
|
||||||
"golang.org/x/crypto/ssh/terminal"
|
"golang.org/x/term"
|
||||||
)
|
)
|
||||||
|
|
||||||
// sshClient is a small wrapper around Go's SSH client with a few utility methods
|
// sshClient is a small wrapper around Go's SSH client with a few utility methods
|
||||||
|
|
@ -77,7 +77,7 @@ func dial(server string, pubkey []byte) (*sshClient, error) {
|
||||||
key, err := ssh.ParsePrivateKey(buf)
|
key, err := ssh.ParsePrivateKey(buf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("What's the decryption password for %s? (won't be echoed)\n>", path)
|
fmt.Printf("What's the decryption password for %s? (won't be echoed)\n>", path)
|
||||||
blob, err := terminal.ReadPassword(int(os.Stdin.Fd()))
|
blob, err := term.ReadPassword(int(os.Stdin.Fd()))
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warn("Couldn't read password", "err", err)
|
log.Warn("Couldn't read password", "err", err)
|
||||||
|
|
@ -94,7 +94,7 @@ func dial(server string, pubkey []byte) (*sshClient, error) {
|
||||||
}
|
}
|
||||||
auths = append(auths, ssh.PasswordCallback(func() (string, error) {
|
auths = append(auths, ssh.PasswordCallback(func() (string, error) {
|
||||||
fmt.Printf("What's the login password for %s at %s? (won't be echoed)\n> ", login, server)
|
fmt.Printf("What's the login password for %s at %s? (won't be echoed)\n> ", login, server)
|
||||||
blob, err := terminal.ReadPassword(int(os.Stdin.Fd()))
|
blob, err := term.ReadPassword(int(os.Stdin.Fd()))
|
||||||
|
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
return string(blob), err
|
return string(blob), err
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ import (
|
||||||
"github.com/XinFinOrg/XDPoSChain/common"
|
"github.com/XinFinOrg/XDPoSChain/common"
|
||||||
"github.com/XinFinOrg/XDPoSChain/core"
|
"github.com/XinFinOrg/XDPoSChain/core"
|
||||||
"github.com/XinFinOrg/XDPoSChain/log"
|
"github.com/XinFinOrg/XDPoSChain/log"
|
||||||
"golang.org/x/crypto/ssh/terminal"
|
"golang.org/x/term"
|
||||||
)
|
)
|
||||||
|
|
||||||
// config contains all the configurations needed by puppeth that should be saved
|
// config contains all the configurations needed by puppeth that should be saved
|
||||||
|
|
@ -232,7 +232,7 @@ func (w *wizard) readDefaultFloat(def float64) float64 {
|
||||||
// line and returns it. The input will not be echoed.
|
// line and returns it. The input will not be echoed.
|
||||||
func (w *wizard) readPassword() string {
|
func (w *wizard) readPassword() string {
|
||||||
fmt.Printf("> ")
|
fmt.Printf("> ")
|
||||||
text, err := terminal.ReadPassword(int(os.Stdin.Fd()))
|
text, err := term.ReadPassword(int(os.Stdin.Fd()))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Crit("Failed to read password", "err", err)
|
log.Crit("Failed to read password", "err", err)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -256,9 +256,7 @@ func (w *wizard) makeGenesis() {
|
||||||
|
|
||||||
var signers []common.Address
|
var signers []common.Address
|
||||||
if input != nil {
|
if input != nil {
|
||||||
for _, addr := range input.Masternodes {
|
signers = append(signers, input.Masternodes...)
|
||||||
signers = append(signers, addr)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
for {
|
for {
|
||||||
if address := w.readAddress(); address != nil {
|
if address := w.readAddress(); address != nil {
|
||||||
|
|
@ -335,6 +333,7 @@ func (w *wizard) makeGenesis() {
|
||||||
pKey, _ := crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
|
pKey, _ := crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
|
||||||
addr := crypto.PubkeyToAddress(pKey.PublicKey)
|
addr := crypto.PubkeyToAddress(pKey.PublicKey)
|
||||||
contractBackend := backends.NewXDCSimulatedBackend(types.GenesisAlloc{addr: {Balance: big.NewInt(1000000000)}}, 10000000, params.TestXDPoSMockChainConfig)
|
contractBackend := backends.NewXDCSimulatedBackend(types.GenesisAlloc{addr: {Balance: big.NewInt(1000000000)}}, 10000000, params.TestXDPoSMockChainConfig)
|
||||||
|
//lint:ignore SA1019 chainID is not determined at this time
|
||||||
transactOpts := bind.NewKeyedTransactor(pKey)
|
transactOpts := bind.NewKeyedTransactor(pKey)
|
||||||
|
|
||||||
minDeposit := new(big.Int).SetUint64(threshold)
|
minDeposit := new(big.Int).SetUint64(threshold)
|
||||||
|
|
|
||||||
|
|
@ -269,13 +269,3 @@ func (stats serverStats) render() {
|
||||||
}
|
}
|
||||||
table.Render()
|
table.Render()
|
||||||
}
|
}
|
||||||
|
|
||||||
// protips contains a collection of network infos to report pro-tips
|
|
||||||
// based on.
|
|
||||||
type protips struct {
|
|
||||||
genesis string
|
|
||||||
network int64
|
|
||||||
bootFull []string
|
|
||||||
bootLight []string
|
|
||||||
ethstats string
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -18,9 +18,10 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/XinFinOrg/XDPoSChain/log"
|
"github.com/XinFinOrg/XDPoSChain/log"
|
||||||
|
"golang.org/x/text/cases"
|
||||||
|
"golang.org/x/text/language"
|
||||||
)
|
)
|
||||||
|
|
||||||
// manageServers displays a list of servers the user can disconnect from, and an
|
// manageServers displays a list of servers the user can disconnect from, and an
|
||||||
|
|
@ -123,8 +124,8 @@ func (w *wizard) manageComponents() {
|
||||||
for _, service := range services {
|
for _, service := range services {
|
||||||
serviceHosts = append(serviceHosts, server)
|
serviceHosts = append(serviceHosts, server)
|
||||||
serviceNames = append(serviceNames, service)
|
serviceNames = append(serviceNames, service)
|
||||||
|
caser := cases.Title(language.English)
|
||||||
fmt.Printf(" %d. Tear down %s on %s\n", len(serviceHosts), strings.Title(service), server)
|
fmt.Printf(" %d. Tear down %s on %s\n", len(serviceHosts), caser.String(service), server)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fmt.Printf(" %d. Deploy new network component\n", len(serviceHosts)+1)
|
fmt.Printf(" %d. Deploy new network component\n", len(serviceHosts)+1)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue