diff --git a/cmd/puppeth/genesis.go b/cmd/puppeth/genesis.go index 79d091b828..f4cce7e0fd 100644 --- a/cmd/puppeth/genesis.go +++ b/cmd/puppeth/genesis.go @@ -25,144 +25,9 @@ import ( "github.com/XinFinOrg/XDPoSChain/common/hexutil" "github.com/XinFinOrg/XDPoSChain/consensus/ethash" "github.com/XinFinOrg/XDPoSChain/core" - "github.com/XinFinOrg/XDPoSChain/core/types" "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. type parityChainSpec struct { Name string `json:"name"` @@ -341,40 +206,3 @@ func newParityChainSpec(network string, genesis *core.Genesis, bootnodes []strin } 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 -} diff --git a/cmd/puppeth/module.go b/cmd/puppeth/module.go index 7d695d11a3..0b8c8110f2 100644 --- a/cmd/puppeth/module.go +++ b/cmd/puppeth/module.go @@ -122,24 +122,6 @@ func tearDown(client *sshClient, network string, service string, purge bool) ([] 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 func checkPort(host string, port int) error { log.Trace("Verifying remote TCP connectivity", "server", host, "port", port) diff --git a/cmd/puppeth/module_faucet.go b/cmd/puppeth/module_faucet.go index 528c2023b5..675fb52704 100644 --- a/cmd/puppeth/module_faucet.go +++ b/cmd/puppeth/module_faucet.go @@ -28,6 +28,8 @@ import ( "github.com/XinFinOrg/XDPoSChain/common" "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 @@ -89,6 +91,7 @@ func deployFaucet(client *sshClient, network string, bootnodes []string, config files := make(map[string][]byte) dockerfile := new(bytes.Buffer) + caser := cases.Title(language.English) template.Must(template.New("").Parse(faucetDockerfile)).Execute(dockerfile, map[string]interface{}{ "NetworkID": config.node.network, "Bootnodes": strings.Join(bootnodes, ","), @@ -96,7 +99,7 @@ func deployFaucet(client *sshClient, network string, bootnodes []string, config "EthPort": config.node.port, "CaptchaToken": config.captchaToken, "CaptchaSecret": config.captchaSecret, - "FaucetName": strings.Title(network), + "FaucetName": caser.String(network), "FaucetAmount": config.amount, "FaucetMinutes": config.minutes, "FaucetTiers": config.tiers, diff --git a/cmd/puppeth/module_node.go b/cmd/puppeth/module_node.go index c592e59d31..4ee98b0062 100644 --- a/cmd/puppeth/module_node.go +++ b/cmd/puppeth/module_node.go @@ -28,6 +28,8 @@ import ( "github.com/XinFinOrg/XDPoSChain/common" "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. @@ -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 port := infos.portmap[infos.envvars["PORT"]] 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 stats := &nodeInfos{ diff --git a/cmd/puppeth/puppeth.go b/cmd/puppeth/puppeth.go index 9f77bda7e0..5d36470c7d 100644 --- a/cmd/puppeth/puppeth.go +++ b/cmd/puppeth/puppeth.go @@ -56,6 +56,7 @@ func main() { app.Action = func(c *cli.Context) error { // 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))) + //lint:ignore SA1019 set GODEBUG=randseednop=0 to restore old behavior of `rand.Seed()` rand.Seed(time.Now().UnixNano()) network := c.String("network") diff --git a/cmd/puppeth/ssh.go b/cmd/puppeth/ssh.go index f1bdf0b014..eeab9face5 100644 --- a/cmd/puppeth/ssh.go +++ b/cmd/puppeth/ssh.go @@ -29,7 +29,7 @@ import ( "github.com/XinFinOrg/XDPoSChain/log" "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 @@ -77,7 +77,7 @@ func dial(server string, pubkey []byte) (*sshClient, error) { key, err := ssh.ParsePrivateKey(buf) if err != nil { 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() if err != nil { 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) { 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() return string(blob), err diff --git a/cmd/puppeth/wizard.go b/cmd/puppeth/wizard.go index aa33da5df8..db420de6d3 100644 --- a/cmd/puppeth/wizard.go +++ b/cmd/puppeth/wizard.go @@ -32,7 +32,7 @@ import ( "github.com/XinFinOrg/XDPoSChain/common" "github.com/XinFinOrg/XDPoSChain/core" "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 @@ -232,7 +232,7 @@ func (w *wizard) readDefaultFloat(def float64) float64 { // line and returns it. The input will not be echoed. func (w *wizard) readPassword() string { fmt.Printf("> ") - text, err := terminal.ReadPassword(int(os.Stdin.Fd())) + text, err := term.ReadPassword(int(os.Stdin.Fd())) if err != nil { log.Crit("Failed to read password", "err", err) } diff --git a/cmd/puppeth/wizard_genesis.go b/cmd/puppeth/wizard_genesis.go index 224530ae08..8585e3b0f6 100644 --- a/cmd/puppeth/wizard_genesis.go +++ b/cmd/puppeth/wizard_genesis.go @@ -256,9 +256,7 @@ func (w *wizard) makeGenesis() { var signers []common.Address if input != nil { - for _, addr := range input.Masternodes { - signers = append(signers, addr) - } + signers = append(signers, input.Masternodes...) } else { for { if address := w.readAddress(); address != nil { @@ -335,6 +333,7 @@ func (w *wizard) makeGenesis() { pKey, _ := crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") addr := crypto.PubkeyToAddress(pKey.PublicKey) 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) minDeposit := new(big.Int).SetUint64(threshold) diff --git a/cmd/puppeth/wizard_netstats.go b/cmd/puppeth/wizard_netstats.go index 37bdb0e812..d961691b8a 100644 --- a/cmd/puppeth/wizard_netstats.go +++ b/cmd/puppeth/wizard_netstats.go @@ -269,13 +269,3 @@ func (stats serverStats) 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 -} diff --git a/cmd/puppeth/wizard_network.go b/cmd/puppeth/wizard_network.go index ab24768f2c..9b00cc2001 100644 --- a/cmd/puppeth/wizard_network.go +++ b/cmd/puppeth/wizard_network.go @@ -18,9 +18,10 @@ package main import ( "fmt" - "strings" "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 @@ -123,8 +124,8 @@ func (w *wizard) manageComponents() { for _, service := range services { serviceHosts = append(serviceHosts, server) serviceNames = append(serviceNames, service) - - fmt.Printf(" %d. Tear down %s on %s\n", len(serviceHosts), strings.Title(service), server) + caser := cases.Title(language.English) + 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)