diff --git a/Makefile b/Makefile
index 07bacba65a8afea1fd74f14498a7e932385e8e5a..2b5d84f2865d3cc598e48e1d083f635d12e5c65d 100644
--- a/Makefile
+++ b/Makefile
@@ -44,10 +44,10 @@ clean:
 # You need to put $GOBIN (or $GOPATH/bin) in your PATH to use 'go generate'.
 
 devtools:
-	go get -u golang.org/x/tools/cmd/stringer
-	go get -u github.com/jteeuwen/go-bindata/go-bindata
-	go get -u github.com/fjl/gencodec
-	go install ./cmd/abigen
+	env GOBIN= go get -u golang.org/x/tools/cmd/stringer
+	env GOBIN= go get -u github.com/jteeuwen/go-bindata/go-bindata
+	env GOBIN= go get -u github.com/fjl/gencodec
+	env GOBIN= go install ./cmd/abigen
 
 # Cross Compilation Targets (xgo)
 
diff --git a/core/gen_genesis.go b/core/gen_genesis.go
index eb86567b7beb9aed591c22e6d511a210b083671a..3f83905c9e6f412a89d32d65f95d3dd247a4ddad 100644
--- a/core/gen_genesis.go
+++ b/core/gen_genesis.go
@@ -14,19 +14,19 @@ import (
 )
 
 func (g Genesis) MarshalJSON() ([]byte, error) {
-	type GenesisJSON struct {
-		Config     *params.ChainConfig                         `json:"config" optional:"true"`
-		Nonce      math.HexOrDecimal64                         `json:"nonce" optional:"true"`
-		Timestamp  math.HexOrDecimal64                         `json:"timestamp" optional:"true"`
-		ParentHash common.Hash                                 `json:"parentHash" optional:"true"`
-		ExtraData  hexutil.Bytes                               `json:"extraData" optional:"true"`
-		GasLimit   math.HexOrDecimal64                         `json:"gasLimit"`
-		Difficulty *math.HexOrDecimal256                       `json:"difficulty"`
-		Mixhash    common.Hash                                 `json:"mixHash" optional:"true"`
-		Coinbase   common.Address                              `json:"coinbase" optional:"true"`
-		Alloc      map[common.UnprefixedAddress]GenesisAccount `json:"alloc"`
+	type Genesis struct {
+		Config     *params.ChainConfig                         `json:"config"`
+		Nonce      math.HexOrDecimal64                         `json:"nonce"`
+		Timestamp  math.HexOrDecimal64                         `json:"timestamp"`
+		ParentHash common.Hash                                 `json:"parentHash"`
+		ExtraData  hexutil.Bytes                               `json:"extraData"`
+		GasLimit   math.HexOrDecimal64                         `json:"gasLimit"   gencodec:"required"`
+		Difficulty *math.HexOrDecimal256                       `json:"difficulty" gencodec:"required"`
+		Mixhash    common.Hash                                 `json:"mixHash"`
+		Coinbase   common.Address                              `json:"coinbase"`
+		Alloc      map[common.UnprefixedAddress]GenesisAccount `json:"alloc"      gencodec:"required"`
 	}
-	var enc GenesisJSON
+	var enc Genesis
 	enc.Config = g.Config
 	enc.Nonce = math.HexOrDecimal64(g.Nonce)
 	enc.Timestamp = math.HexOrDecimal64(g.Timestamp)
@@ -46,59 +46,57 @@ func (g Genesis) MarshalJSON() ([]byte, error) {
 }
 
 func (g *Genesis) UnmarshalJSON(input []byte) error {
-	type GenesisJSON struct {
-		Config     *params.ChainConfig                         `json:"config" optional:"true"`
-		Nonce      *math.HexOrDecimal64                        `json:"nonce" optional:"true"`
-		Timestamp  *math.HexOrDecimal64                        `json:"timestamp" optional:"true"`
-		ParentHash *common.Hash                                `json:"parentHash" optional:"true"`
-		ExtraData  hexutil.Bytes                               `json:"extraData" optional:"true"`
-		GasLimit   *math.HexOrDecimal64                        `json:"gasLimit"`
-		Difficulty *math.HexOrDecimal256                       `json:"difficulty"`
-		Mixhash    *common.Hash                                `json:"mixHash" optional:"true"`
-		Coinbase   *common.Address                             `json:"coinbase" optional:"true"`
-		Alloc      map[common.UnprefixedAddress]GenesisAccount `json:"alloc"`
+	type Genesis struct {
+		Config     *params.ChainConfig                         `json:"config"`
+		Nonce      *math.HexOrDecimal64                        `json:"nonce"`
+		Timestamp  *math.HexOrDecimal64                        `json:"timestamp"`
+		ParentHash *common.Hash                                `json:"parentHash"`
+		ExtraData  hexutil.Bytes                               `json:"extraData"`
+		GasLimit   *math.HexOrDecimal64                        `json:"gasLimit"   gencodec:"required"`
+		Difficulty *math.HexOrDecimal256                       `json:"difficulty" gencodec:"required"`
+		Mixhash    *common.Hash                                `json:"mixHash"`
+		Coinbase   *common.Address                             `json:"coinbase"`
+		Alloc      map[common.UnprefixedAddress]GenesisAccount `json:"alloc"      gencodec:"required"`
 	}
-	var dec GenesisJSON
+	var dec Genesis
 	if err := json.Unmarshal(input, &dec); err != nil {
 		return err
 	}
-	var x Genesis
 	if dec.Config != nil {
-		x.Config = dec.Config
+		g.Config = dec.Config
 	}
 	if dec.Nonce != nil {
-		x.Nonce = uint64(*dec.Nonce)
+		g.Nonce = uint64(*dec.Nonce)
 	}
 	if dec.Timestamp != nil {
-		x.Timestamp = uint64(*dec.Timestamp)
+		g.Timestamp = uint64(*dec.Timestamp)
 	}
 	if dec.ParentHash != nil {
-		x.ParentHash = *dec.ParentHash
+		g.ParentHash = *dec.ParentHash
 	}
 	if dec.ExtraData != nil {
-		x.ExtraData = dec.ExtraData
+		g.ExtraData = dec.ExtraData
 	}
 	if dec.GasLimit == nil {
 		return errors.New("missing required field 'gasLimit' for Genesis")
 	}
-	x.GasLimit = uint64(*dec.GasLimit)
+	g.GasLimit = uint64(*dec.GasLimit)
 	if dec.Difficulty == nil {
 		return errors.New("missing required field 'difficulty' for Genesis")
 	}
-	x.Difficulty = (*big.Int)(dec.Difficulty)
+	g.Difficulty = (*big.Int)(dec.Difficulty)
 	if dec.Mixhash != nil {
-		x.Mixhash = *dec.Mixhash
+		g.Mixhash = *dec.Mixhash
 	}
 	if dec.Coinbase != nil {
-		x.Coinbase = *dec.Coinbase
+		g.Coinbase = *dec.Coinbase
 	}
 	if dec.Alloc == nil {
 		return errors.New("missing required field 'alloc' for Genesis")
 	}
-	x.Alloc = make(GenesisAlloc, len(dec.Alloc))
+	g.Alloc = make(GenesisAlloc, len(dec.Alloc))
 	for k, v := range dec.Alloc {
-		x.Alloc[common.Address(k)] = v
+		g.Alloc[common.Address(k)] = v
 	}
-	*g = x
 	return nil
 }
diff --git a/core/gen_genesis_account.go b/core/gen_genesis_account.go
index 8885603aa8a8632543397f0c9d7039f5117979a6..bc5fc936b97547fb6b32d86c7b33520442ca4ab1 100644
--- a/core/gen_genesis_account.go
+++ b/core/gen_genesis_account.go
@@ -13,13 +13,13 @@ import (
 )
 
 func (g GenesisAccount) MarshalJSON() ([]byte, error) {
-	type GenesisAccountJSON struct {
-		Code    hexutil.Bytes               `json:"code,omitempty" optional:"true"`
-		Storage map[common.Hash]common.Hash `json:"storage,omitempty" optional:"true"`
-		Balance *math.HexOrDecimal256       `json:"balance"`
-		Nonce   math.HexOrDecimal64         `json:"nonce,omitempty" optional:"true"`
+	type GenesisAccount struct {
+		Code    hexutil.Bytes               `json:"code,omitempty"`
+		Storage map[common.Hash]common.Hash `json:"storage,omitempty"`
+		Balance *math.HexOrDecimal256       `json:"balance" gencodec:"required"`
+		Nonce   math.HexOrDecimal64         `json:"nonce,omitempty"`
 	}
-	var enc GenesisAccountJSON
+	var enc GenesisAccount
 	enc.Code = g.Code
 	enc.Storage = g.Storage
 	enc.Balance = (*math.HexOrDecimal256)(g.Balance)
@@ -28,30 +28,28 @@ func (g GenesisAccount) MarshalJSON() ([]byte, error) {
 }
 
 func (g *GenesisAccount) UnmarshalJSON(input []byte) error {
-	type GenesisAccountJSON struct {
-		Code    hexutil.Bytes               `json:"code,omitempty" optional:"true"`
-		Storage map[common.Hash]common.Hash `json:"storage,omitempty" optional:"true"`
-		Balance *math.HexOrDecimal256       `json:"balance"`
-		Nonce   *math.HexOrDecimal64        `json:"nonce,omitempty" optional:"true"`
+	type GenesisAccount struct {
+		Code    hexutil.Bytes               `json:"code,omitempty"`
+		Storage map[common.Hash]common.Hash `json:"storage,omitempty"`
+		Balance *math.HexOrDecimal256       `json:"balance" gencodec:"required"`
+		Nonce   *math.HexOrDecimal64        `json:"nonce,omitempty"`
 	}
-	var dec GenesisAccountJSON
+	var dec GenesisAccount
 	if err := json.Unmarshal(input, &dec); err != nil {
 		return err
 	}
-	var x GenesisAccount
 	if dec.Code != nil {
-		x.Code = dec.Code
+		g.Code = dec.Code
 	}
 	if dec.Storage != nil {
-		x.Storage = dec.Storage
+		g.Storage = dec.Storage
 	}
 	if dec.Balance == nil {
 		return errors.New("missing required field 'balance' for GenesisAccount")
 	}
-	x.Balance = (*big.Int)(dec.Balance)
+	g.Balance = (*big.Int)(dec.Balance)
 	if dec.Nonce != nil {
-		x.Nonce = uint64(*dec.Nonce)
+		g.Nonce = uint64(*dec.Nonce)
 	}
-	*g = x
 	return nil
 }
diff --git a/core/genesis.go b/core/genesis.go
index 34725241ecee6c8283774c8b816997de8230c45a..883cea2fd43e8402c0d8a76e602725691fdaedec 100644
--- a/core/genesis.go
+++ b/core/genesis.go
@@ -41,16 +41,16 @@ var errGenesisNoConfig = errors.New("genesis has no chain configuration")
 // Genesis specifies the header fields, state of a genesis block. It also defines hard
 // fork switch-over blocks through the chain configuration.
 type Genesis struct {
-	Config     *params.ChainConfig `json:"config" optional:"true"`
-	Nonce      uint64              `json:"nonce" optional:"true"`
-	Timestamp  uint64              `json:"timestamp" optional:"true"`
-	ParentHash common.Hash         `json:"parentHash" optional:"true"`
-	ExtraData  []byte              `json:"extraData" optional:"true"`
-	GasLimit   uint64              `json:"gasLimit"`
-	Difficulty *big.Int            `json:"difficulty"`
-	Mixhash    common.Hash         `json:"mixHash" optional:"true"`
-	Coinbase   common.Address      `json:"coinbase" optional:"true"`
-	Alloc      GenesisAlloc        `json:"alloc"`
+	Config     *params.ChainConfig `json:"config"`
+	Nonce      uint64              `json:"nonce"`
+	Timestamp  uint64              `json:"timestamp"`
+	ParentHash common.Hash         `json:"parentHash"`
+	ExtraData  []byte              `json:"extraData"`
+	GasLimit   uint64              `json:"gasLimit"   gencodec:"required"`
+	Difficulty *big.Int            `json:"difficulty" gencodec:"required"`
+	Mixhash    common.Hash         `json:"mixHash"`
+	Coinbase   common.Address      `json:"coinbase"`
+	Alloc      GenesisAlloc        `json:"alloc"      gencodec:"required"`
 }
 
 // GenesisAlloc specifies the initial state that is part of the genesis block.
@@ -58,10 +58,10 @@ type GenesisAlloc map[common.Address]GenesisAccount
 
 // GenesisAccount is an account in the state of the genesis block.
 type GenesisAccount struct {
-	Code    []byte                      `json:"code,omitempty" optional:"true"`
-	Storage map[common.Hash]common.Hash `json:"storage,omitempty" optional:"true"`
-	Balance *big.Int                    `json:"balance"`
-	Nonce   uint64                      `json:"nonce,omitempty" optional:"true"`
+	Code    []byte                      `json:"code,omitempty"`
+	Storage map[common.Hash]common.Hash `json:"storage,omitempty"`
+	Balance *big.Int                    `json:"balance" gencodec:"required"`
+	Nonce   uint64                      `json:"nonce,omitempty"`
 }
 
 // field type overrides for gencodec
diff --git a/core/types/block.go b/core/types/block.go
index 278594d5064bc94572ce7b60298b40572d998475..8ca3d0e89690232e8eb94ce26e1dcf5d46246f1f 100644
--- a/core/types/block.go
+++ b/core/types/block.go
@@ -68,21 +68,21 @@ func (n *BlockNonce) UnmarshalText(input []byte) error {
 
 // Header represents a block header in the Ethereum blockchain.
 type Header struct {
-	ParentHash  common.Hash    `json:"parentHash"`
-	UncleHash   common.Hash    `json:"sha3Uncles"`
-	Coinbase    common.Address `json:"miner"`
-	Root        common.Hash    `json:"stateRoot"`
-	TxHash      common.Hash    `json:"transactionsRoot"`
-	ReceiptHash common.Hash    `json:"receiptsRoot"`
-	Bloom       Bloom          `json:"logsBloom"`
-	Difficulty  *big.Int       `json:"difficulty"`
-	Number      *big.Int       `json:"number"`
-	GasLimit    *big.Int       `json:"gasLimit"`
-	GasUsed     *big.Int       `json:"gasUsed"`
-	Time        *big.Int       `json:"timestamp"`
-	Extra       []byte         `json:"extraData"`
-	MixDigest   common.Hash    `json:"mixHash"`
-	Nonce       BlockNonce     `json:"nonce"`
+	ParentHash  common.Hash    `json:"parentHash"       gencodec:"required"`
+	UncleHash   common.Hash    `json:"sha3Uncles"       gencodec:"required"`
+	Coinbase    common.Address `json:"miner"            gencodec:"required"`
+	Root        common.Hash    `json:"stateRoot"        gencodec:"required"`
+	TxHash      common.Hash    `json:"transactionsRoot" gencodec:"required"`
+	ReceiptHash common.Hash    `json:"receiptsRoot"     gencodec:"required"`
+	Bloom       Bloom          `json:"logsBloom"        gencodec:"required"`
+	Difficulty  *big.Int       `json:"difficulty"       gencodec:"required"`
+	Number      *big.Int       `json:"number"           gencodec:"required"`
+	GasLimit    *big.Int       `json:"gasLimit"         gencodec:"required"`
+	GasUsed     *big.Int       `json:"gasUsed"          gencodec:"required"`
+	Time        *big.Int       `json:"timestamp"        gencodec:"required"`
+	Extra       []byte         `json:"extraData"        gencodec:"required"`
+	MixDigest   common.Hash    `json:"mixHash"          gencodec:"required"`
+	Nonce       BlockNonce     `json:"nonce"            gencodec:"required"`
 }
 
 // field type overrides for gencodec
@@ -93,6 +93,7 @@ type headerMarshaling struct {
 	GasUsed    *hexutil.Big
 	Time       *hexutil.Big
 	Extra      hexutil.Bytes
+	Hash       common.Hash `json:"hash"` // adds call to Hash() in MarshalJSON
 }
 
 // Hash returns the block hash of the header, which is simply the keccak256 hash of its
diff --git a/core/types/gen_header_json.go b/core/types/gen_header_json.go
index 91663d9d8c8e562215ebf3bdda540730c51d316f..bcff7a940dd91734d0bfb0928b43522c64d1169a 100644
--- a/core/types/gen_header_json.go
+++ b/core/types/gen_header_json.go
@@ -12,24 +12,25 @@ import (
 )
 
 func (h Header) MarshalJSON() ([]byte, error) {
-	type HeaderJSON struct {
-		ParentHash  common.Hash    `json:"parentHash"`
-		UncleHash   common.Hash    `json:"sha3Uncles"`
-		Coinbase    common.Address `json:"miner"`
-		Root        common.Hash    `json:"stateRoot"`
-		TxHash      common.Hash    `json:"transactionsRoot"`
-		ReceiptHash common.Hash    `json:"receiptsRoot"`
-		Bloom       Bloom          `json:"logsBloom"`
-		Difficulty  *hexutil.Big   `json:"difficulty"`
-		Number      *hexutil.Big   `json:"number"`
-		GasLimit    *hexutil.Big   `json:"gasLimit"`
-		GasUsed     *hexutil.Big   `json:"gasUsed"`
-		Time        *hexutil.Big   `json:"timestamp"`
-		Extra       hexutil.Bytes  `json:"extraData"`
-		MixDigest   common.Hash    `json:"mixHash"`
-		Nonce       BlockNonce     `json:"nonce"`
-	}
-	var enc HeaderJSON
+	type Header struct {
+		ParentHash  common.Hash    `json:"parentHash"       gencodec:"required"`
+		UncleHash   common.Hash    `json:"sha3Uncles"       gencodec:"required"`
+		Coinbase    common.Address `json:"miner"            gencodec:"required"`
+		Root        common.Hash    `json:"stateRoot"        gencodec:"required"`
+		TxHash      common.Hash    `json:"transactionsRoot" gencodec:"required"`
+		ReceiptHash common.Hash    `json:"receiptsRoot"     gencodec:"required"`
+		Bloom       Bloom          `json:"logsBloom"        gencodec:"required"`
+		Difficulty  *hexutil.Big   `json:"difficulty"       gencodec:"required"`
+		Number      *hexutil.Big   `json:"number"           gencodec:"required"`
+		GasLimit    *hexutil.Big   `json:"gasLimit"         gencodec:"required"`
+		GasUsed     *hexutil.Big   `json:"gasUsed"          gencodec:"required"`
+		Time        *hexutil.Big   `json:"timestamp"        gencodec:"required"`
+		Extra       hexutil.Bytes  `json:"extraData"        gencodec:"required"`
+		MixDigest   common.Hash    `json:"mixHash"          gencodec:"required"`
+		Nonce       BlockNonce     `json:"nonce"            gencodec:"required"`
+		Hash        common.Hash    `json:"hash"`
+	}
+	var enc Header
 	enc.ParentHash = h.ParentHash
 	enc.UncleHash = h.UncleHash
 	enc.Coinbase = h.Coinbase
@@ -45,92 +46,91 @@ func (h Header) MarshalJSON() ([]byte, error) {
 	enc.Extra = h.Extra
 	enc.MixDigest = h.MixDigest
 	enc.Nonce = h.Nonce
+	enc.Hash = h.Hash()
 	return json.Marshal(&enc)
 }
 
 func (h *Header) UnmarshalJSON(input []byte) error {
-	type HeaderJSON struct {
-		ParentHash  *common.Hash    `json:"parentHash"`
-		UncleHash   *common.Hash    `json:"sha3Uncles"`
-		Coinbase    *common.Address `json:"miner"`
-		Root        *common.Hash    `json:"stateRoot"`
-		TxHash      *common.Hash    `json:"transactionsRoot"`
-		ReceiptHash *common.Hash    `json:"receiptsRoot"`
-		Bloom       *Bloom          `json:"logsBloom"`
-		Difficulty  *hexutil.Big    `json:"difficulty"`
-		Number      *hexutil.Big    `json:"number"`
-		GasLimit    *hexutil.Big    `json:"gasLimit"`
-		GasUsed     *hexutil.Big    `json:"gasUsed"`
-		Time        *hexutil.Big    `json:"timestamp"`
-		Extra       hexutil.Bytes   `json:"extraData"`
-		MixDigest   *common.Hash    `json:"mixHash"`
-		Nonce       *BlockNonce     `json:"nonce"`
-	}
-	var dec HeaderJSON
+	type Header struct {
+		ParentHash  *common.Hash    `json:"parentHash"       gencodec:"required"`
+		UncleHash   *common.Hash    `json:"sha3Uncles"       gencodec:"required"`
+		Coinbase    *common.Address `json:"miner"            gencodec:"required"`
+		Root        *common.Hash    `json:"stateRoot"        gencodec:"required"`
+		TxHash      *common.Hash    `json:"transactionsRoot" gencodec:"required"`
+		ReceiptHash *common.Hash    `json:"receiptsRoot"     gencodec:"required"`
+		Bloom       *Bloom          `json:"logsBloom"        gencodec:"required"`
+		Difficulty  *hexutil.Big    `json:"difficulty"       gencodec:"required"`
+		Number      *hexutil.Big    `json:"number"           gencodec:"required"`
+		GasLimit    *hexutil.Big    `json:"gasLimit"         gencodec:"required"`
+		GasUsed     *hexutil.Big    `json:"gasUsed"          gencodec:"required"`
+		Time        *hexutil.Big    `json:"timestamp"        gencodec:"required"`
+		Extra       hexutil.Bytes   `json:"extraData"        gencodec:"required"`
+		MixDigest   *common.Hash    `json:"mixHash"          gencodec:"required"`
+		Nonce       *BlockNonce     `json:"nonce"            gencodec:"required"`
+	}
+	var dec Header
 	if err := json.Unmarshal(input, &dec); err != nil {
 		return err
 	}
-	var x Header
 	if dec.ParentHash == nil {
 		return errors.New("missing required field 'parentHash' for Header")
 	}
-	x.ParentHash = *dec.ParentHash
+	h.ParentHash = *dec.ParentHash
 	if dec.UncleHash == nil {
 		return errors.New("missing required field 'sha3Uncles' for Header")
 	}
-	x.UncleHash = *dec.UncleHash
+	h.UncleHash = *dec.UncleHash
 	if dec.Coinbase == nil {
 		return errors.New("missing required field 'miner' for Header")
 	}
-	x.Coinbase = *dec.Coinbase
+	h.Coinbase = *dec.Coinbase
 	if dec.Root == nil {
 		return errors.New("missing required field 'stateRoot' for Header")
 	}
-	x.Root = *dec.Root
+	h.Root = *dec.Root
 	if dec.TxHash == nil {
 		return errors.New("missing required field 'transactionsRoot' for Header")
 	}
-	x.TxHash = *dec.TxHash
+	h.TxHash = *dec.TxHash
 	if dec.ReceiptHash == nil {
 		return errors.New("missing required field 'receiptsRoot' for Header")
 	}
-	x.ReceiptHash = *dec.ReceiptHash
+	h.ReceiptHash = *dec.ReceiptHash
 	if dec.Bloom == nil {
 		return errors.New("missing required field 'logsBloom' for Header")
 	}
-	x.Bloom = *dec.Bloom
+	h.Bloom = *dec.Bloom
 	if dec.Difficulty == nil {
 		return errors.New("missing required field 'difficulty' for Header")
 	}
-	x.Difficulty = (*big.Int)(dec.Difficulty)
+	h.Difficulty = (*big.Int)(dec.Difficulty)
 	if dec.Number == nil {
 		return errors.New("missing required field 'number' for Header")
 	}
-	x.Number = (*big.Int)(dec.Number)
+	h.Number = (*big.Int)(dec.Number)
 	if dec.GasLimit == nil {
 		return errors.New("missing required field 'gasLimit' for Header")
 	}
-	x.GasLimit = (*big.Int)(dec.GasLimit)
+	h.GasLimit = (*big.Int)(dec.GasLimit)
 	if dec.GasUsed == nil {
 		return errors.New("missing required field 'gasUsed' for Header")
 	}
-	x.GasUsed = (*big.Int)(dec.GasUsed)
+	h.GasUsed = (*big.Int)(dec.GasUsed)
 	if dec.Time == nil {
 		return errors.New("missing required field 'timestamp' for Header")
 	}
-	x.Time = (*big.Int)(dec.Time)
+	h.Time = (*big.Int)(dec.Time)
 	if dec.Extra == nil {
 		return errors.New("missing required field 'extraData' for Header")
 	}
-	x.Extra = dec.Extra
+	h.Extra = dec.Extra
 	if dec.MixDigest == nil {
 		return errors.New("missing required field 'mixHash' for Header")
 	}
-	x.MixDigest = *dec.MixDigest
+	h.MixDigest = *dec.MixDigest
 	if dec.Nonce == nil {
 		return errors.New("missing required field 'nonce' for Header")
 	}
-	x.Nonce = *dec.Nonce
-	*h = x
+	h.Nonce = *dec.Nonce
 	return nil
 }
diff --git a/core/types/gen_log_json.go b/core/types/gen_log_json.go
index 5c8032953c33dcd61092fc9765bf114855be9af4..92c699c2a79e568751d0fcadd7d2a9b4bce2e662 100644
--- a/core/types/gen_log_json.go
+++ b/core/types/gen_log_json.go
@@ -11,18 +11,18 @@ import (
 )
 
 func (l Log) MarshalJSON() ([]byte, error) {
-	type LogJSON struct {
-		Address     common.Address `json:"address"`
-		Topics      []common.Hash  `json:"topics"`
-		Data        hexutil.Bytes  `json:"data"`
-		BlockNumber hexutil.Uint64 `json:"blockNumber" optional:"yes"`
-		TxHash      common.Hash    `json:"transactionHash"`
-		TxIndex     hexutil.Uint   `json:"transactionIndex"`
-		BlockHash   common.Hash    `json:"blockHash" optional:"yes"`
-		Index       hexutil.Uint   `json:"logIndex"`
-		Removed     bool           `json:"removed" optional:"yes"`
+	type Log struct {
+		Address     common.Address `json:"address" gencodec:"required"`
+		Topics      []common.Hash  `json:"topics" gencodec:"required"`
+		Data        hexutil.Bytes  `json:"data" gencodec:"required"`
+		BlockNumber hexutil.Uint64 `json:"blockNumber"`
+		TxHash      common.Hash    `json:"transactionHash" gencodec:"required"`
+		TxIndex     hexutil.Uint   `json:"transactionIndex" gencodec:"required"`
+		BlockHash   common.Hash    `json:"blockHash"`
+		Index       hexutil.Uint   `json:"logIndex" gencodec:"required"`
+		Removed     bool           `json:"removed"`
 	}
-	var enc LogJSON
+	var enc Log
 	enc.Address = l.Address
 	enc.Topics = l.Topics
 	enc.Data = l.Data
@@ -36,55 +36,53 @@ func (l Log) MarshalJSON() ([]byte, error) {
 }
 
 func (l *Log) UnmarshalJSON(input []byte) error {
-	type LogJSON struct {
-		Address     *common.Address `json:"address"`
-		Topics      []common.Hash   `json:"topics"`
-		Data        hexutil.Bytes   `json:"data"`
-		BlockNumber *hexutil.Uint64 `json:"blockNumber" optional:"yes"`
-		TxHash      *common.Hash    `json:"transactionHash"`
-		TxIndex     *hexutil.Uint   `json:"transactionIndex"`
-		BlockHash   *common.Hash    `json:"blockHash" optional:"yes"`
-		Index       *hexutil.Uint   `json:"logIndex"`
-		Removed     *bool           `json:"removed" optional:"yes"`
+	type Log struct {
+		Address     *common.Address `json:"address" gencodec:"required"`
+		Topics      []common.Hash   `json:"topics" gencodec:"required"`
+		Data        hexutil.Bytes   `json:"data" gencodec:"required"`
+		BlockNumber *hexutil.Uint64 `json:"blockNumber"`
+		TxHash      *common.Hash    `json:"transactionHash" gencodec:"required"`
+		TxIndex     *hexutil.Uint   `json:"transactionIndex" gencodec:"required"`
+		BlockHash   *common.Hash    `json:"blockHash"`
+		Index       *hexutil.Uint   `json:"logIndex" gencodec:"required"`
+		Removed     *bool           `json:"removed"`
 	}
-	var dec LogJSON
+	var dec Log
 	if err := json.Unmarshal(input, &dec); err != nil {
 		return err
 	}
-	var x Log
 	if dec.Address == nil {
 		return errors.New("missing required field 'address' for Log")
 	}
-	x.Address = *dec.Address
+	l.Address = *dec.Address
 	if dec.Topics == nil {
 		return errors.New("missing required field 'topics' for Log")
 	}
-	x.Topics = dec.Topics
+	l.Topics = dec.Topics
 	if dec.Data == nil {
 		return errors.New("missing required field 'data' for Log")
 	}
-	x.Data = dec.Data
+	l.Data = dec.Data
 	if dec.BlockNumber != nil {
-		x.BlockNumber = uint64(*dec.BlockNumber)
+		l.BlockNumber = uint64(*dec.BlockNumber)
 	}
 	if dec.TxHash == nil {
 		return errors.New("missing required field 'transactionHash' for Log")
 	}
-	x.TxHash = *dec.TxHash
+	l.TxHash = *dec.TxHash
 	if dec.TxIndex == nil {
 		return errors.New("missing required field 'transactionIndex' for Log")
 	}
-	x.TxIndex = uint(*dec.TxIndex)
+	l.TxIndex = uint(*dec.TxIndex)
 	if dec.BlockHash != nil {
-		x.BlockHash = *dec.BlockHash
+		l.BlockHash = *dec.BlockHash
 	}
 	if dec.Index == nil {
 		return errors.New("missing required field 'logIndex' for Log")
 	}
-	x.Index = uint(*dec.Index)
+	l.Index = uint(*dec.Index)
 	if dec.Removed != nil {
-		x.Removed = *dec.Removed
+		l.Removed = *dec.Removed
 	}
-	*l = x
 	return nil
 }
diff --git a/core/types/gen_receipt_json.go b/core/types/gen_receipt_json.go
index 6583a8ec0b3fbd044f595a0dab40291e08a78b19..edbd64ba4e3e7d01c76a5150e0b1682a55a10a95 100644
--- a/core/types/gen_receipt_json.go
+++ b/core/types/gen_receipt_json.go
@@ -12,16 +12,16 @@ import (
 )
 
 func (r Receipt) MarshalJSON() ([]byte, error) {
-	type ReceiptJSON struct {
-		PostState         hexutil.Bytes  `json:"root"`
-		CumulativeGasUsed *hexutil.Big   `json:"cumulativeGasUsed"`
-		Bloom             Bloom          `json:"logsBloom"`
-		Logs              []*Log         `json:"logs"`
-		TxHash            common.Hash    `json:"transactionHash"`
-		ContractAddress   common.Address `json:"contractAddress" optional:"true"`
-		GasUsed           *hexutil.Big   `json:"gasUsed"`
+	type Receipt struct {
+		PostState         hexutil.Bytes  `json:"root"              gencodec:"required"`
+		CumulativeGasUsed *hexutil.Big   `json:"cumulativeGasUsed" gencodec:"required"`
+		Bloom             Bloom          `json:"logsBloom"         gencodec:"required"`
+		Logs              []*Log         `json:"logs"              gencodec:"required"`
+		TxHash            common.Hash    `json:"transactionHash" gencodec:"required"`
+		ContractAddress   common.Address `json:"contractAddress"`
+		GasUsed           *hexutil.Big   `json:"gasUsed" gencodec:"required"`
 	}
-	var enc ReceiptJSON
+	var enc Receipt
 	enc.PostState = r.PostState
 	enc.CumulativeGasUsed = (*hexutil.Big)(r.CumulativeGasUsed)
 	enc.Bloom = r.Bloom
@@ -33,47 +33,45 @@ func (r Receipt) MarshalJSON() ([]byte, error) {
 }
 
 func (r *Receipt) UnmarshalJSON(input []byte) error {
-	type ReceiptJSON struct {
-		PostState         hexutil.Bytes   `json:"root"`
-		CumulativeGasUsed *hexutil.Big    `json:"cumulativeGasUsed"`
-		Bloom             *Bloom          `json:"logsBloom"`
-		Logs              []*Log          `json:"logs"`
-		TxHash            *common.Hash    `json:"transactionHash"`
-		ContractAddress   *common.Address `json:"contractAddress" optional:"true"`
-		GasUsed           *hexutil.Big    `json:"gasUsed"`
+	type Receipt struct {
+		PostState         hexutil.Bytes   `json:"root"              gencodec:"required"`
+		CumulativeGasUsed *hexutil.Big    `json:"cumulativeGasUsed" gencodec:"required"`
+		Bloom             *Bloom          `json:"logsBloom"         gencodec:"required"`
+		Logs              []*Log          `json:"logs"              gencodec:"required"`
+		TxHash            *common.Hash    `json:"transactionHash" gencodec:"required"`
+		ContractAddress   *common.Address `json:"contractAddress"`
+		GasUsed           *hexutil.Big    `json:"gasUsed" gencodec:"required"`
 	}
-	var dec ReceiptJSON
+	var dec Receipt
 	if err := json.Unmarshal(input, &dec); err != nil {
 		return err
 	}
-	var x Receipt
 	if dec.PostState == nil {
 		return errors.New("missing required field 'root' for Receipt")
 	}
-	x.PostState = dec.PostState
+	r.PostState = dec.PostState
 	if dec.CumulativeGasUsed == nil {
 		return errors.New("missing required field 'cumulativeGasUsed' for Receipt")
 	}
-	x.CumulativeGasUsed = (*big.Int)(dec.CumulativeGasUsed)
+	r.CumulativeGasUsed = (*big.Int)(dec.CumulativeGasUsed)
 	if dec.Bloom == nil {
 		return errors.New("missing required field 'logsBloom' for Receipt")
 	}
-	x.Bloom = *dec.Bloom
+	r.Bloom = *dec.Bloom
 	if dec.Logs == nil {
 		return errors.New("missing required field 'logs' for Receipt")
 	}
-	x.Logs = dec.Logs
+	r.Logs = dec.Logs
 	if dec.TxHash == nil {
 		return errors.New("missing required field 'transactionHash' for Receipt")
 	}
-	x.TxHash = *dec.TxHash
+	r.TxHash = *dec.TxHash
 	if dec.ContractAddress != nil {
-		x.ContractAddress = *dec.ContractAddress
+		r.ContractAddress = *dec.ContractAddress
 	}
 	if dec.GasUsed == nil {
 		return errors.New("missing required field 'gasUsed' for Receipt")
 	}
-	x.GasUsed = (*big.Int)(dec.GasUsed)
-	*r = x
+	r.GasUsed = (*big.Int)(dec.GasUsed)
 	return nil
 }
diff --git a/core/types/gen_tx_json.go b/core/types/gen_tx_json.go
index 6101b963746e3da1c79df1eb60b5161b900698a0..4fb658e0d911e72409a52f32872e76ce22531655 100644
--- a/core/types/gen_tx_json.go
+++ b/core/types/gen_tx_json.go
@@ -12,19 +12,19 @@ import (
 )
 
 func (t txdata) MarshalJSON() ([]byte, error) {
-	type txdataJSON struct {
-		AccountNonce hexutil.Uint64  `json:"nonce"`
-		Price        *hexutil.Big    `json:"gasPrice"`
-		GasLimit     *hexutil.Big    `json:"gas"`
-		Recipient    *common.Address `json:"to" optional:"yes" rlp:"nil"`
-		Amount       *hexutil.Big    `json:"value"`
-		Payload      hexutil.Bytes   `json:"input"`
-		V            *hexutil.Big    `json:"v"`
-		R            *hexutil.Big    `json:"r"`
-		S            *hexutil.Big    `json:"s"`
-		Hash         *common.Hash    `json:"hash" optional:"yes" rlp:"-"`
+	type txdata struct {
+		AccountNonce hexutil.Uint64  `json:"nonce"    gencodec:"required"`
+		Price        *hexutil.Big    `json:"gasPrice" gencodec:"required"`
+		GasLimit     *hexutil.Big    `json:"gas"      gencodec:"required"`
+		Recipient    *common.Address `json:"to"       rlp:"nil"`
+		Amount       *hexutil.Big    `json:"value"    gencodec:"required"`
+		Payload      hexutil.Bytes   `json:"input"    gencodec:"required"`
+		V            *hexutil.Big    `json:"v" gencodec:"required"`
+		R            *hexutil.Big    `json:"r" gencodec:"required"`
+		S            *hexutil.Big    `json:"s" gencodec:"required"`
+		Hash         *common.Hash    `json:"hash" rlp:"-"`
 	}
-	var enc txdataJSON
+	var enc txdata
 	enc.AccountNonce = hexutil.Uint64(t.AccountNonce)
 	enc.Price = (*hexutil.Big)(t.Price)
 	enc.GasLimit = (*hexutil.Big)(t.GasLimit)
@@ -39,61 +39,59 @@ func (t txdata) MarshalJSON() ([]byte, error) {
 }
 
 func (t *txdata) UnmarshalJSON(input []byte) error {
-	type txdataJSON struct {
-		AccountNonce *hexutil.Uint64 `json:"nonce"`
-		Price        *hexutil.Big    `json:"gasPrice"`
-		GasLimit     *hexutil.Big    `json:"gas"`
-		Recipient    *common.Address `json:"to" optional:"yes" rlp:"nil"`
-		Amount       *hexutil.Big    `json:"value"`
-		Payload      hexutil.Bytes   `json:"input"`
-		V            *hexutil.Big    `json:"v"`
-		R            *hexutil.Big    `json:"r"`
-		S            *hexutil.Big    `json:"s"`
-		Hash         *common.Hash    `json:"hash" optional:"yes" rlp:"-"`
+	type txdata struct {
+		AccountNonce *hexutil.Uint64 `json:"nonce"    gencodec:"required"`
+		Price        *hexutil.Big    `json:"gasPrice" gencodec:"required"`
+		GasLimit     *hexutil.Big    `json:"gas"      gencodec:"required"`
+		Recipient    *common.Address `json:"to"       rlp:"nil"`
+		Amount       *hexutil.Big    `json:"value"    gencodec:"required"`
+		Payload      hexutil.Bytes   `json:"input"    gencodec:"required"`
+		V            *hexutil.Big    `json:"v" gencodec:"required"`
+		R            *hexutil.Big    `json:"r" gencodec:"required"`
+		S            *hexutil.Big    `json:"s" gencodec:"required"`
+		Hash         *common.Hash    `json:"hash" rlp:"-"`
 	}
-	var dec txdataJSON
+	var dec txdata
 	if err := json.Unmarshal(input, &dec); err != nil {
 		return err
 	}
-	var x txdata
 	if dec.AccountNonce == nil {
 		return errors.New("missing required field 'nonce' for txdata")
 	}
-	x.AccountNonce = uint64(*dec.AccountNonce)
+	t.AccountNonce = uint64(*dec.AccountNonce)
 	if dec.Price == nil {
 		return errors.New("missing required field 'gasPrice' for txdata")
 	}
-	x.Price = (*big.Int)(dec.Price)
+	t.Price = (*big.Int)(dec.Price)
 	if dec.GasLimit == nil {
 		return errors.New("missing required field 'gas' for txdata")
 	}
-	x.GasLimit = (*big.Int)(dec.GasLimit)
+	t.GasLimit = (*big.Int)(dec.GasLimit)
 	if dec.Recipient != nil {
-		x.Recipient = dec.Recipient
+		t.Recipient = dec.Recipient
 	}
 	if dec.Amount == nil {
 		return errors.New("missing required field 'value' for txdata")
 	}
-	x.Amount = (*big.Int)(dec.Amount)
+	t.Amount = (*big.Int)(dec.Amount)
 	if dec.Payload == nil {
 		return errors.New("missing required field 'input' for txdata")
 	}
-	x.Payload = dec.Payload
+	t.Payload = dec.Payload
 	if dec.V == nil {
 		return errors.New("missing required field 'v' for txdata")
 	}
-	x.V = (*big.Int)(dec.V)
+	t.V = (*big.Int)(dec.V)
 	if dec.R == nil {
 		return errors.New("missing required field 'r' for txdata")
 	}
-	x.R = (*big.Int)(dec.R)
+	t.R = (*big.Int)(dec.R)
 	if dec.S == nil {
 		return errors.New("missing required field 's' for txdata")
 	}
-	x.S = (*big.Int)(dec.S)
+	t.S = (*big.Int)(dec.S)
 	if dec.Hash != nil {
-		x.Hash = dec.Hash
+		t.Hash = dec.Hash
 	}
-	*t = x
 	return nil
 }
diff --git a/core/types/log.go b/core/types/log.go
index 57fc7b36315fd9ecaa5f67a81f04b297fc88cc43..be5de38da79f01b6dfbd069080e9cd1c58979e82 100644
--- a/core/types/log.go
+++ b/core/types/log.go
@@ -32,28 +32,28 @@ import (
 type Log struct {
 	// Consensus fields:
 	// address of the contract that generated the event
-	Address common.Address `json:"address"`
+	Address common.Address `json:"address" gencodec:"required"`
 	// list of topics provided by the contract.
-	Topics []common.Hash `json:"topics"`
+	Topics []common.Hash `json:"topics" gencodec:"required"`
 	// supplied by the contract, usually ABI-encoded
-	Data []byte `json:"data"`
+	Data []byte `json:"data" gencodec:"required"`
 
 	// Derived fields. These fields are filled in by the node
 	// but not secured by consensus.
 	// block in which the transaction was included
-	BlockNumber uint64 `json:"blockNumber" optional:"yes"`
+	BlockNumber uint64 `json:"blockNumber"`
 	// hash of the transaction
-	TxHash common.Hash `json:"transactionHash"`
+	TxHash common.Hash `json:"transactionHash" gencodec:"required"`
 	// index of the transaction in the block
-	TxIndex uint `json:"transactionIndex"`
+	TxIndex uint `json:"transactionIndex" gencodec:"required"`
 	// hash of the block in which the transaction was included
-	BlockHash common.Hash `json:"blockHash" optional:"yes"`
+	BlockHash common.Hash `json:"blockHash"`
 	// index of the log in the receipt
-	Index uint `json:"logIndex"`
+	Index uint `json:"logIndex" gencodec:"required"`
 
 	// The Removed field is true if this log was reverted due to a chain reorganisation.
 	// You must pay attention to this field if you receive logs through a filter query.
-	Removed bool `json:"removed" optional:"yes"`
+	Removed bool `json:"removed"`
 }
 
 type logMarshaling struct {
diff --git a/core/types/receipt.go b/core/types/receipt.go
index 5bfcb15fc7133d1a9625c0558ef300c0c7a750cd..ef6f6a2bb2287ddda70d8f5fcbc463af44fb894f 100644
--- a/core/types/receipt.go
+++ b/core/types/receipt.go
@@ -31,15 +31,15 @@ import (
 // Receipt represents the results of a transaction.
 type Receipt struct {
 	// Consensus fields
-	PostState         []byte   `json:"root"`
-	CumulativeGasUsed *big.Int `json:"cumulativeGasUsed"`
-	Bloom             Bloom    `json:"logsBloom"`
-	Logs              []*Log   `json:"logs"`
+	PostState         []byte   `json:"root"              gencodec:"required"`
+	CumulativeGasUsed *big.Int `json:"cumulativeGasUsed" gencodec:"required"`
+	Bloom             Bloom    `json:"logsBloom"         gencodec:"required"`
+	Logs              []*Log   `json:"logs"              gencodec:"required"`
 
 	// Implementation fields (don't reorder!)
-	TxHash          common.Hash    `json:"transactionHash"`
-	ContractAddress common.Address `json:"contractAddress" optional:"true"`
-	GasUsed         *big.Int       `json:"gasUsed"`
+	TxHash          common.Hash    `json:"transactionHash" gencodec:"required"`
+	ContractAddress common.Address `json:"contractAddress"`
+	GasUsed         *big.Int       `json:"gasUsed" gencodec:"required"`
 }
 
 type receiptMarshaling struct {
diff --git a/core/types/transaction.go b/core/types/transaction.go
index 3945684a158c82be8ff03cba5087ed568aa09f10..8e108b2a337fda23a734597321b879a1537561cc 100644
--- a/core/types/transaction.go
+++ b/core/types/transaction.go
@@ -55,20 +55,20 @@ type Transaction struct {
 }
 
 type txdata struct {
-	AccountNonce uint64          `json:"nonce"`
-	Price        *big.Int        `json:"gasPrice"`
-	GasLimit     *big.Int        `json:"gas"`
-	Recipient    *common.Address `json:"to" optional:"yes" rlp:"nil"` // nil means contract creation
-	Amount       *big.Int        `json:"value"`
-	Payload      []byte          `json:"input"`
+	AccountNonce uint64          `json:"nonce"    gencodec:"required"`
+	Price        *big.Int        `json:"gasPrice" gencodec:"required"`
+	GasLimit     *big.Int        `json:"gas"      gencodec:"required"`
+	Recipient    *common.Address `json:"to"       rlp:"nil"` // nil means contract creation
+	Amount       *big.Int        `json:"value"    gencodec:"required"`
+	Payload      []byte          `json:"input"    gencodec:"required"`
 
 	// Signature values
-	V *big.Int `json:"v"`
-	R *big.Int `json:"r"`
-	S *big.Int `json:"s"`
+	V *big.Int `json:"v" gencodec:"required"`
+	R *big.Int `json:"r" gencodec:"required"`
+	S *big.Int `json:"s" gencodec:"required"`
 
 	// This is only used when marshaling to JSON.
-	Hash *common.Hash `json:"hash" optional:"yes" rlp:"-"`
+	Hash *common.Hash `json:"hash" rlp:"-"`
 }
 
 type txdataMarshaling struct {