github.com/klaytn/klaytn@v1.10.2/cmd/utils/nodecmd/genesis_test.go (about)

     1  // Modifications Copyright 2018 The klaytn Authors
     2  // Copyright 2016 The go-ethereum Authors
     3  // This file is part of go-ethereum.
     4  //
     5  // go-ethereum is free software: you can redistribute it and/or modify
     6  // it under the terms of the GNU General Public License as published by
     7  // the Free Software Foundation, either version 3 of the License, or
     8  // (at your option) any later version.
     9  //
    10  // go-ethereum is distributed in the hope that it will be useful,
    11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    13  // GNU General Public License for more details.
    14  //
    15  // You should have received a copy of the GNU General Public License
    16  // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
    17  //
    18  // This file is derived from cmd/geth/genesis_test.go (2018/06/04).
    19  // Modified and improved for the klaytn development.
    20  
    21  package nodecmd
    22  
    23  import (
    24  	"io/ioutil"
    25  	"os"
    26  	"path/filepath"
    27  	"testing"
    28  )
    29  
    30  var customGenesisTests = []struct {
    31  	genesis string
    32  	query   []string
    33  	result  []string
    34  }{
    35  	// Plain genesis file without anything extra
    36  	{
    37  		genesis: `{
    38  			"alloc"      : {},
    39  			"blockScore" : "0x20000",
    40  			"extraData"  : "0x0000000000000000000000000000000000000000000000000000000000000000f89af85494dddfb991127b43e209c2f8ed08b8b3d0b5843d3694195ba9cc787b00796a7ae6356e5b656d4360353794777fd033b5e3bcaad6006bc9f481ffed6b83cf5a94d473284239f704adccd24647c7ca132992a28973b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0",
    41  			"gasLimit"   : "0x2fefd8",
    42  			"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
    43  			"timestamp"  : "0x00"
    44  		}`,
    45  		query:  []string{"klay.getBlock(0).parentHash"},
    46  		result: []string{"0x0000000000000000000000000000000000000000000000000000000000000000"},
    47  	},
    48  	// Genesis file with an empty chain configuration (ensure missing fields work)
    49  	{
    50  		genesis: `{
    51  			"alloc"      : {},
    52  			"blockScore" : "0x20000",
    53  			"extraData"  : "0x0000000000000000000000000000000000000000000000000000000000000000f89af85494dddfb991127b43e209c2f8ed08b8b3d0b5843d3694195ba9cc787b00796a7ae6356e5b656d4360353794777fd033b5e3bcaad6006bc9f481ffed6b83cf5a94d473284239f704adccd24647c7ca132992a28973b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0",
    54  			"gasLimit"   : "0x2fefd8",
    55  			"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
    56  			"timestamp"  : "0x00",
    57  			"config"     : {}
    58  		}`,
    59  		query:  []string{"klay.getBlock(0).parentHash"},
    60  		result: []string{"0x0000000000000000000000000000000000000000000000000000000000000000"},
    61  	},
    62  	// Genesis file with specific chain configurations
    63  	{
    64  		genesis: `{
    65  			"alloc"      : {},
    66  			"blockScore" : "0x20000",
    67  			"extraData"  : "0x0000000000000000000000000000000000000000000000000000000000000000f89af85494dddfb991127b43e209c2f8ed08b8b3d0b5843d3694195ba9cc787b00796a7ae6356e5b656d4360353794777fd033b5e3bcaad6006bc9f481ffed6b83cf5a94d473284239f704adccd24647c7ca132992a28973b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0",
    68  			"gasLimit"   : "0x2fefd8",
    69  			"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
    70  			"timestamp"  : "0x00",
    71  			"config"     : {
    72  				"homesteadBlock" : 314,
    73  				"daoForkBlock"   : 141,
    74  				"daoForkSupport" : true
    75  			}
    76  		}`,
    77  		query:  []string{"klay.getBlock(0).parentHash"},
    78  		result: []string{"0x0000000000000000000000000000000000000000000000000000000000000000"},
    79  	},
    80  	{
    81  		genesis: `{
    82  		    "config": {
    83  		        "chainId": 1000,
    84  		        "istanbul": {
    85  		            "epoch": 30,
    86  		            "policy": 0,
    87  		            "sub": 22
    88  		        },
    89  		        "unitPrice": 0,
    90  		        "deriveShaImpl": 2,
    91  		        "governance": null
    92  		    },
    93  		    "timestamp": "0x5da3fdfd",
    94  		    "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000f89af8549413c9a496fb7b84ea6bf39f3602658c41f0dd7a51947cf8c6a6a6a4fbb9b846527b5d762b278adfe7369438b99937e557a21d9ab9b6d9cfc07498b50660d09442b1d1fccee0e7b51a5091c532eb2b92a1e49296b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0",
    95  		    "governanceData": null,
    96  		    "blockScore": "0x1",
    97  		    "alloc": {
    98  		        "04d67289f30351fc46c161eb3c588d07c2995367": {
    99  		            "balance": "0x446c3b15f9926687d2c40534fdb564000000000000"
   100  		        },
   101  		        "13c9a496fb7b84ea6bf39f3602658c41f0dd7a51": {
   102  		            "balance": "0x446c3b15f9926687d2c40534fdb564000000000000"
   103  		        },
   104  		        "2913ecaec7da798466611271a27b53836f20b108": {
   105  		            "balance": "0x446c3b15f9926687d2c40534fdb564000000000000"
   106  		        },
   107  		        "30208f32c70e8b53a67ea171c8720cbfe32888ff": {
   108  		            "balance": "0x446c3b15f9926687d2c40534fdb564000000000000"
   109  		        }
   110  		    },
   111  		    "number": "0x0",
   112  		    "gasUsed": "0x0",
   113  		    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
   114  		}`,
   115  		query:  []string{"klay.getBlock(0).parentHash", "klay.getBlock(0).blockScore", "klay.getBlock(0).extraData", "governance.chainConfig.chainId", "governance.chainConfig.deriveShaImpl", "governance.chainConfig.unitPrice", "governance.chainConfig.governance.governanceMode", "governance.chainConfig.governance.governingNode", "governance.chainConfig.governance.reward.deferredTxFee", "governance.chainConfig.governance.reward.minimumStake", "governance.chainConfig.governance.reward.mintingAmount", "governance.chainConfig.governance.reward.proposerUpdateInterval", "governance.chainConfig.governance.reward.ratio", "governance.chainConfig.governance.reward.stakingUpdateInterval", "governance.chainConfig.governance.reward.useGiniCoeff", "governance.chainConfig.istanbul.epoch", "governance.chainConfig.istanbul.policy", "governance.chainConfig.istanbul.sub"},
   116  		result: []string{"0x0000000000000000000000000000000000000000000000000000000000000000", "0x1", "0x0000000000000000000000000000000000000000000000000000000000000000f89af8549413c9a496fb7b84ea6bf39f3602658c41f0dd7a51947cf8c6a6a6a4fbb9b846527b5d762b278adfe7369438b99937e557a21d9ab9b6d9cfc07498b50660d09442b1d1fccee0e7b51a5091c532eb2b92a1e49296b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", "1000", "2", "0", "none", "0x0000000000000000000000000000000000000000", "false", "2000000", "0", "3600", "100/0/0", "86400", "false", "30", "0", "22"},
   117  	},
   118  	{
   119  		genesis: `{"config":{"chainId":2019,"istanbul":{"epoch":30,"policy":2,"sub":13},"unitPrice":25000000000,"deriveShaImpl":2,"governance":{"governingNode":"0xdddfb991127b43e209c2f8ed08b8b3d0b5843d36","governanceMode":"single","reward":{"mintingAmount":9600000000000000000,"ratio":"34/54/12","useGiniCoeff":false,"deferredTxFee":true,"stakingUpdateInterval":60,"proposerUpdateInterval":30,"minimumStake":5000000}}},"timestamp":"0x5ce33d6e","extraData":"0x0000000000000000000000000000000000000000000000000000000000000000f89af85494dddfb991127b43e209c2f8ed08b8b3d0b5843d3694195ba9cc787b00796a7ae6356e5b656d4360353794777fd033b5e3bcaad6006bc9f481ffed6b83cf5a94d473284239f704adccd24647c7ca132992a28973b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","governanceData":null,"blockScore":"0x1","alloc":{"195ba9cc787b00796a7ae6356e5b656d43603537":{"balance":"0x446c3b15f9926687d2c40534fdb564000000000000"},"777fd033b5e3bcaad6006bc9f481ffed6b83cf5a":{"balance":"0x446c3b15f9926687d2c40534fdb564000000000000"},"d473284239f704adccd24647c7ca132992a28973":{"balance":"0x446c3b15f9926687d2c40534fdb564000000000000"},"dddfb991127b43e209c2f8ed08b8b3d0b5843d36":{"balance":"0x446c3b15f9926687d2c40534fdb564000000000000"},"f4316f69d9522667c0674afcd8638288489f0333":{"balance":"0x446c3b15f9926687d2c40534fdb564000000000000"}},"number":"0x0","gasUsed":"0x0","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000"}`,
   120  		query:   []string{"klay.getBlock(0).parentHash", "klay.getBlock(0).blockScore", "klay.getBlock(0).extraData", "governance.chainConfig.chainId", "governance.chainConfig.deriveShaImpl", "governance.chainConfig.unitPrice", "governance.chainConfig.governance.governanceMode", "governance.chainConfig.governance.governingNode", "governance.chainConfig.governance.reward.deferredTxFee", "governance.chainConfig.governance.reward.minimumStake", "governance.chainConfig.governance.reward.mintingAmount", "governance.chainConfig.governance.reward.proposerUpdateInterval", "governance.chainConfig.governance.reward.ratio", "governance.chainConfig.governance.reward.stakingUpdateInterval", "governance.chainConfig.governance.reward.useGiniCoeff", "governance.chainConfig.istanbul.epoch", "governance.chainConfig.istanbul.policy", "governance.chainConfig.istanbul.sub"},
   121  		result:  []string{"0x0000000000000000000000000000000000000000000000000000000000000000", "0x1", "0x0000000000000000000000000000000000000000000000000000000000000000f89af85494dddfb991127b43e209c2f8ed08b8b3d0b5843d3694195ba9cc787b00796a7ae6356e5b656d4360353794777fd033b5e3bcaad6006bc9f481ffed6b83cf5a94d473284239f704adccd24647c7ca132992a28973b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", "2019", "2", "25000000000", "single", "0xdddfb991127b43e209c2f8ed08b8b3d0b5843d36", "true", "5000000", "9600000000000000000", "30", "34/54/12", "60", "false", "30", "2", "13"},
   122  	},
   123  }
   124  
   125  // Tests that initializing Klay with a custom genesis block and chain definitions
   126  // work properly.
   127  func TestCustomGenesis(t *testing.T) {
   128  	for i, tt := range customGenesisTests {
   129  		// Create a temporary data directory to use and inspect later
   130  		datadir := tmpdir(t)
   131  		defer os.RemoveAll(datadir)
   132  
   133  		// Initialize the data directory with the custom genesis block
   134  		json := filepath.Join(datadir, "genesis.json")
   135  		if err := ioutil.WriteFile(json, []byte(tt.genesis), 0o600); err != nil {
   136  			t.Fatalf("test %d: failed to write genesis file: %v", i, err)
   137  		}
   138  		runKlay(t, "klay-test", "--datadir", datadir, "--verbosity", "0", "init", json).WaitExit()
   139  
   140  		// Query the custom genesis block
   141  		if len(tt.query) != len(tt.result) {
   142  			t.Errorf("Test cases are wrong, #query: %v, #result, %v", len(tt.query), len(tt.result))
   143  		}
   144  		for idx, query := range tt.query {
   145  			klay := runKlay(t,
   146  				"klay-test", "--datadir", datadir, "--maxconnections", "0", "--port", "0",
   147  				"--nodiscover", "--nat", "none", "--ipcdisable", "--ntp.disable",
   148  				"--exec", query, "--verbosity", "0", "console")
   149  			klay.ExpectRegexp(tt.result[idx])
   150  			klay.ExpectExit()
   151  		}
   152  	}
   153  }