123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- package dgn
- import (
- "encoding/json"
- "errors"
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/common/hexutil"
- "github.com/ethereum/go-ethereum/core/types"
- "math/big"
- )
- // MarshalJSON marshals as JSON.
- func (h BHeader) MarshalJSON() ([]byte, error) {
- type BHeader 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 types.Bloom `json:"logsBloom" gencodec:"required"`
- Difficulty *hexutil.Big `json:"difficulty" gencodec:"required"`
- Number *hexutil.Big `json:"number" gencodec:"required"`
- GasLimit hexutil.Uint64 `json:"gasLimit" gencodec:"required"`
- GasUsed hexutil.Uint64 `json:"gasUsed" gencodec:"required"`
- Time hexutil.Uint64 `json:"timestamp" gencodec:"required"`
- Extra hexutil.Bytes `json:"extraData" gencodec:"required"`
- Election hexutil.Bytes `json:"election" gencodec:"required"`
- MixDigest common.Hash `json:"mixHash"`
- Nonce types.BlockNonce `json:"nonce"`
- 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"`
- }
- var enc BHeader
- enc.ParentHash = h.ParentHash
- enc.UncleHash = h.UncleHash
- enc.Coinbase = h.Coinbase
- enc.Root = h.Root
- enc.TxHash = h.TxHash
- enc.ReceiptHash = h.ReceiptHash
- enc.Bloom = h.Bloom
- enc.Difficulty = (*hexutil.Big)(h.Difficulty)
- enc.Number = (*hexutil.Big)(h.Number)
- enc.GasLimit = hexutil.Uint64(h.GasLimit)
- enc.GasUsed = hexutil.Uint64(h.GasUsed)
- enc.Time = hexutil.Uint64(h.Time)
- enc.Extra = h.Extra
- enc.Election = h.Election
- enc.MixDigest = h.MixDigest
- enc.Nonce = h.Nonce
- enc.V = (*hexutil.Big)(h.V)
- enc.R = (*hexutil.Big)(h.R)
- enc.S = (*hexutil.Big)(h.S)
- enc.Hash = h.Hash()
- return json.Marshal(&enc)
- }
- // UnmarshalJSON unmarshals from JSON.
- func (h *BHeader) UnmarshalJSON(input []byte) error {
- type BHeader 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 *types.Bloom `json:"logsBloom" gencodec:"required"`
- Difficulty *hexutil.Big `json:"difficulty" gencodec:"required"`
- Number *hexutil.Big `json:"number" gencodec:"required"`
- GasLimit *hexutil.Uint64 `json:"gasLimit" gencodec:"required"`
- GasUsed *hexutil.Uint64 `json:"gasUsed" gencodec:"required"`
- Time *hexutil.Uint64 `json:"timestamp" gencodec:"required"`
- Extra *hexutil.Bytes `json:"extraData" gencodec:"required"`
- Election *hexutil.Bytes `json:"election" gencodec:"required"`
- MixDigest *common.Hash `json:"mixHash"`
- Nonce *types.BlockNonce `json:"nonce"`
- V *hexutil.Big `json:"v" gencodec:"required"`
- R *hexutil.Big `json:"r" gencodec:"required"`
- S *hexutil.Big `json:"s" gencodec:"required"`
- }
- var dec BHeader
- if err := json.Unmarshal(input, &dec); err != nil {
- return err
- }
- if dec.ParentHash == nil {
- return errors.New("missing required field 'parentHash' for Header")
- }
- h.ParentHash = *dec.ParentHash
- if dec.UncleHash == nil {
- return errors.New("missing required field 'sha3Uncles' for Header")
- }
- h.UncleHash = *dec.UncleHash
- if dec.Coinbase == nil {
- return errors.New("missing required field 'miner' for Header")
- }
- h.Coinbase = *dec.Coinbase
- if dec.Root == nil {
- return errors.New("missing required field 'stateRoot' for Header")
- }
- h.Root = *dec.Root
- if dec.TxHash == nil {
- return errors.New("missing required field 'transactionsRoot' for Header")
- }
- h.TxHash = *dec.TxHash
- if dec.ReceiptHash == nil {
- return errors.New("missing required field 'receiptsRoot' for Header")
- }
- h.ReceiptHash = *dec.ReceiptHash
- if dec.Bloom == nil {
- return errors.New("missing required field 'logsBloom' for Header")
- }
- h.Bloom = *dec.Bloom
- if dec.Difficulty == nil {
- return errors.New("missing required field 'difficulty' for Header")
- }
- h.Difficulty = (*big.Int)(dec.Difficulty)
- if dec.Number == nil {
- return errors.New("missing required field 'number' for Header")
- }
- h.Number = (*big.Int)(dec.Number)
- if dec.GasLimit == nil {
- return errors.New("missing required field 'gasLimit' for Header")
- }
- h.GasLimit = uint64(*dec.GasLimit)
- if dec.GasUsed == nil {
- return errors.New("missing required field 'gasUsed' for Header")
- }
- h.GasUsed = uint64(*dec.GasUsed)
- if dec.Time == nil {
- return errors.New("missing required field 'timestamp' for Header")
- }
- h.Time = uint64(*dec.Time)
- if dec.Extra == nil {
- return errors.New("missing required field 'extraData' for Header")
- }
- h.Extra = *dec.Extra
- if dec.Election == nil {
- return errors.New("missing required field 'election' for Header")
- }
- h.Election = *dec.Election
- if dec.MixDigest != nil {
- h.MixDigest = *dec.MixDigest
- }
- if dec.Nonce != nil {
- h.Nonce = *dec.Nonce
- }
- if dec.V == nil {
- return errors.New("missing required field 'v' for Header")
- }
- h.V = (*big.Int)(dec.V)
- if dec.R == nil {
- return errors.New("missing required field 'r' for Header")
- }
- h.R = (*big.Int)(dec.R)
- if dec.S == nil {
- return errors.New("missing required field 's' for Header")
- }
- h.S = (*big.Int)(dec.S)
- return nil
- }
|