neo-go/pkg/rpc/response/result/block_header.go
Anna Shaleva 79f7862496 rpc: fix blockheader marshalling in getblockheader RPC server
Problem: wrong json marshalling of `nextconsensus` field of
result.Header

Solution: change field type from util.uint160 to address string
2020-03-24 14:55:20 +03:00

54 lines
1.7 KiB
Go

package result
import (
"strconv"
"github.com/nspcc-dev/neo-go/pkg/core"
"github.com/nspcc-dev/neo-go/pkg/core/block"
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
"github.com/nspcc-dev/neo-go/pkg/encoding/address"
"github.com/nspcc-dev/neo-go/pkg/io"
"github.com/nspcc-dev/neo-go/pkg/util"
)
type (
// Header wrapper used for the representation of
// block header on the RPC Server.
Header struct {
Hash util.Uint256 `json:"hash"`
Size int `json:"size"`
Version uint32 `json:"version"`
PrevBlockHash util.Uint256 `json:"previousblockhash"`
MerkleRoot util.Uint256 `json:"merkleroot"`
Timestamp uint32 `json:"time"`
Index uint32 `json:"index"`
Nonce string `json:"nonce"`
NextConsensus string `json:"nextconsensus"`
Script transaction.Witness `json:"script"`
Confirmations uint32 `json:"confirmations"`
NextBlockHash *util.Uint256 `json:"nextblockhash,omitempty"`
}
)
// NewHeader creates a new Header wrapper.
func NewHeader(h *block.Header, chain core.Blockchainer) Header {
res := Header{
Hash: h.Hash(),
Size: io.GetVarSize(h),
Version: h.Version,
PrevBlockHash: h.PrevHash,
MerkleRoot: h.MerkleRoot,
Timestamp: h.Timestamp,
Index: h.Index,
Nonce: strconv.FormatUint(h.ConsensusData, 16),
NextConsensus: address.Uint160ToString(h.NextConsensus),
Script: h.Script,
Confirmations: chain.BlockHeight() - h.Index + 1,
}
hash := chain.GetHeaderHash(int(h.Index) + 1)
if !hash.Equals(util.Uint256{}) {
res.NextBlockHash = &hash
}
return res
}