| 
									
										
										
										
											2016-07-08 11:43:36 +03:00
										 |  |  | // Copyright 2016 The go-ethereum Authors | 
					
						
							|  |  |  | // This file is part of go-ethereum. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // go-ethereum is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | // it under the terms of the GNU General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // go-ethereum is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							|  |  |  | // GNU General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  | // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"io/ioutil" | 
					
						
							|  |  |  | 	"os" | 
					
						
							|  |  |  | 	"path/filepath" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var customGenesisTests = []struct { | 
					
						
							|  |  |  | 	genesis string | 
					
						
							|  |  |  | 	query   string | 
					
						
							|  |  |  | 	result  string | 
					
						
							|  |  |  | }{ | 
					
						
							|  |  |  | 	// Plain genesis file without anything extra | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		genesis: `{ | 
					
						
							|  |  |  | 			"alloc"      : {}, | 
					
						
							|  |  |  | 			"coinbase"   : "0x0000000000000000000000000000000000000000", | 
					
						
							|  |  |  | 			"difficulty" : "0x20000", | 
					
						
							|  |  |  | 			"extraData"  : "", | 
					
						
							|  |  |  | 			"gasLimit"   : "0x2fefd8", | 
					
						
							|  |  |  | 			"nonce"      : "0x0000000000000042", | 
					
						
							|  |  |  | 			"mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000", | 
					
						
							|  |  |  | 			"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", | 
					
						
							|  |  |  | 			"timestamp"  : "0x00" | 
					
						
							|  |  |  | 		}`, | 
					
						
							|  |  |  | 		query:  "eth.getBlock(0).nonce", | 
					
						
							|  |  |  | 		result: "0x0000000000000042", | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	// Genesis file with an empty chain configuration (ensure missing fields work) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		genesis: `{ | 
					
						
							|  |  |  | 			"alloc"      : {}, | 
					
						
							|  |  |  | 			"coinbase"   : "0x0000000000000000000000000000000000000000", | 
					
						
							|  |  |  | 			"difficulty" : "0x20000", | 
					
						
							|  |  |  | 			"extraData"  : "", | 
					
						
							|  |  |  | 			"gasLimit"   : "0x2fefd8", | 
					
						
							|  |  |  | 			"nonce"      : "0x0000000000000042", | 
					
						
							|  |  |  | 			"mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000", | 
					
						
							|  |  |  | 			"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", | 
					
						
							|  |  |  | 			"timestamp"  : "0x00", | 
					
						
							|  |  |  | 			"config"     : {} | 
					
						
							|  |  |  | 		}`, | 
					
						
							|  |  |  | 		query:  "eth.getBlock(0).nonce", | 
					
						
							|  |  |  | 		result: "0x0000000000000042", | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	// Genesis file with specific chain configurations | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		genesis: `{ | 
					
						
							|  |  |  | 			"alloc"      : {}, | 
					
						
							|  |  |  | 			"coinbase"   : "0x0000000000000000000000000000000000000000", | 
					
						
							|  |  |  | 			"difficulty" : "0x20000", | 
					
						
							|  |  |  | 			"extraData"  : "", | 
					
						
							|  |  |  | 			"gasLimit"   : "0x2fefd8", | 
					
						
							|  |  |  | 			"nonce"      : "0x0000000000000042", | 
					
						
							|  |  |  | 			"mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000", | 
					
						
							|  |  |  | 			"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", | 
					
						
							|  |  |  | 			"timestamp"  : "0x00", | 
					
						
							|  |  |  | 			"config"     : { | 
					
						
							|  |  |  | 				"homesteadBlock" : 314, | 
					
						
							| 
									
										
										
										
											2016-07-08 18:48:17 +03:00
										 |  |  | 				"daoForkBlock"   : 141, | 
					
						
							|  |  |  | 				"daoForkSupport" : true | 
					
						
							| 
									
										
										
										
											2016-07-08 11:43:36 +03:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 		}`, | 
					
						
							|  |  |  | 		query:  "eth.getBlock(0).nonce", | 
					
						
							|  |  |  | 		result: "0x0000000000000042", | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Tests that initializing Geth with a custom genesis block and chain definitions | 
					
						
							|  |  |  | // work properly. | 
					
						
							|  |  |  | func TestCustomGenesis(t *testing.T) { | 
					
						
							|  |  |  | 	for i, tt := range customGenesisTests { | 
					
						
							|  |  |  | 		// Create a temporary data directory to use and inspect later | 
					
						
							|  |  |  | 		datadir := tmpdir(t) | 
					
						
							|  |  |  | 		defer os.RemoveAll(datadir) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Initialize the data directory with the custom genesis block | 
					
						
							|  |  |  | 		json := filepath.Join(datadir, "genesis.json") | 
					
						
							|  |  |  | 		if err := ioutil.WriteFile(json, []byte(tt.genesis), 0600); err != nil { | 
					
						
							|  |  |  | 			t.Fatalf("test %d: failed to write genesis file: %v", i, err) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-06-21 14:54:23 +02:00
										 |  |  | 		runGeth(t, "--datadir", datadir, "init", json).WaitExit() | 
					
						
							| 
									
										
										
										
											2016-07-08 11:43:36 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// Query the custom genesis block | 
					
						
							| 
									
										
										
										
											2016-08-25 16:44:35 +02:00
										 |  |  | 		geth := runGeth(t, | 
					
						
							|  |  |  | 			"--datadir", datadir, "--maxpeers", "0", "--port", "0", | 
					
						
							|  |  |  | 			"--nodiscover", "--nat", "none", "--ipcdisable", | 
					
						
							|  |  |  | 			"--exec", tt.query, "console") | 
					
						
							| 
									
										
										
										
											2017-06-21 14:54:23 +02:00
										 |  |  | 		geth.ExpectRegexp(tt.result) | 
					
						
							|  |  |  | 		geth.ExpectExit() | 
					
						
							| 
									
										
										
										
											2016-07-08 11:43:36 +03:00
										 |  |  | 	} | 
					
						
							|  |  |  | } |