From 2f490a3403fea308a80609c0086b331deca4b1ba Mon Sep 17 00:00:00 2001 From: Evgeniy Stratonikov Date: Mon, 1 Mar 2021 15:20:27 +0300 Subject: [PATCH] block: remove `ConsensusData` field --- cli/testdata/chain50x2.acc | Bin 45879 -> 45471 bytes internal/testchain/address.go | 5 +- pkg/consensus/block.go | 2 +- pkg/consensus/block_test.go | 3 - pkg/consensus/consensus.go | 10 ++- pkg/core/block/block.go | 49 ++++---------- pkg/core/block/block_base.go | 7 ++ pkg/core/block/block_test.go | 19 ++---- pkg/core/block/consensus_data.go | 86 ------------------------- pkg/core/helper_test.go | 8 --- pkg/core/native/native_gas.go | 2 +- pkg/core/test_data/block_1.json | 9 +-- pkg/core/util.go | 4 -- pkg/core/util_test.go | 2 +- pkg/crypto/hash/merkle_tree.go | 2 +- pkg/rpc/client/rpc_test.go | 25 ++++--- pkg/rpc/client/wsclient_test.go | 2 +- pkg/rpc/server/server_test.go | 4 +- pkg/rpc/server/subscription.go | 2 +- pkg/rpc/server/subscription_test.go | 3 +- pkg/rpc/server/testdata/testblocks.acc | Bin 9881 -> 9809 bytes scripts/gendump/main.go | 4 -- 22 files changed, 52 insertions(+), 196 deletions(-) delete mode 100644 pkg/core/block/consensus_data.go diff --git a/cli/testdata/chain50x2.acc b/cli/testdata/chain50x2.acc index 1c8067f4eb77159e46b3465c5ae8e904376d547b..02f46c5e44fe4368721275534f505ef836610985 100644 GIT binary patch literal 45471 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 diff --git a/internal/testchain/address.go b/internal/testchain/address.go index 9249bf2a4..7c7217d36 100644 --- a/internal/testchain/address.go +++ b/internal/testchain/address.go @@ -167,14 +167,11 @@ func NewBlock(t *testing.T, bc blockchainer.Blockchainer, offset uint32, primary PrevHash: hdr.Hash(), Timestamp: (uint64(time.Now().UTC().Unix()) + uint64(hdr.Index)) * 1000, Index: hdr.Index + offset, + PrimaryIndex: byte(primary), NextConsensus: witness.ScriptHash(), Script: witness, Network: bc.GetConfig().Magic, }, - ConsensusData: block.ConsensusData{ - PrimaryIndex: primary, - Nonce: 1111, - }, Transactions: txs, } b.RebuildMerkleRoot() diff --git a/pkg/consensus/block.go b/pkg/consensus/block.go index 390846fc6..101d7099a 100644 --- a/pkg/consensus/block.go +++ b/pkg/consensus/block.go @@ -71,7 +71,7 @@ func (n *neoBlock) Timestamp() uint64 { return n.Block.Timestamp * nsInMs } func (n *neoBlock) Index() uint32 { return n.Block.Index } // ConsensusData implements block.Block interface. -func (n *neoBlock) ConsensusData() uint64 { return n.Block.ConsensusData.Nonce } +func (n *neoBlock) ConsensusData() uint64 { return 0 } // NextConsensus implements block.Block interface. func (n *neoBlock) NextConsensus() util.Uint160 { return n.Block.NextConsensus } diff --git a/pkg/consensus/block_test.go b/pkg/consensus/block_test.go index 62f6bebe7..efed586e3 100644 --- a/pkg/consensus/block_test.go +++ b/pkg/consensus/block_test.go @@ -34,9 +34,6 @@ func TestNeoBlock_Setters(t *testing.T) { // 777ms -> 777000000ns require.EqualValues(t, 777000000, b.Timestamp()) - b.Block.ConsensusData.Nonce = 456 - require.EqualValues(t, 456, b.ConsensusData()) - b.Block.MerkleRoot = util.Uint256{1, 2, 3, 4} require.Equal(t, util.Uint256{1, 2, 3, 4}, b.MerkleRoot()) diff --git a/pkg/consensus/consensus.go b/pkg/consensus/consensus.go index 03451d438..c2929ddf7 100644 --- a/pkg/consensus/consensus.go +++ b/pkg/consensus/consensus.go @@ -662,14 +662,12 @@ func (s *service) newBlockFromContext(ctx *dbft.Context) block.Block { block.Block.NextConsensus = crypto.Hash160(script) block.Block.PrevHash = ctx.PrevHash block.Block.Version = ctx.Version - block.Block.ConsensusData.Nonce = ctx.Nonce - primaryIndex := uint32(ctx.PrimaryIndex) - block.Block.ConsensusData.PrimaryIndex = primaryIndex + primaryIndex := byte(ctx.PrimaryIndex) + block.Block.PrimaryIndex = primaryIndex - hashes := make([]util.Uint256, len(ctx.TransactionHashes)+1) - hashes[0] = block.Block.ConsensusData.Hash() - copy(hashes[1:], ctx.TransactionHashes) + hashes := make([]util.Uint256, len(ctx.TransactionHashes)) + copy(hashes, ctx.TransactionHashes) block.Block.MerkleRoot = hash.CalcMerkleRoot(hashes) return block diff --git a/pkg/core/block/block.go b/pkg/core/block/block.go index e7fa4974a..5355eda88 100644 --- a/pkg/core/block/block.go +++ b/pkg/core/block/block.go @@ -17,7 +17,7 @@ const ( // MaxContentsPerBlock is the maximum number of contents (transactions + consensus data) per block. MaxContentsPerBlock = math.MaxUint16 // MaxTransactionsPerBlock is the maximum number of transactions per block. - MaxTransactionsPerBlock = MaxContentsPerBlock - 1 + MaxTransactionsPerBlock = MaxContentsPerBlock ) // ErrMaxContentsPerBlock is returned when the maximum number of contents per block is reached. @@ -28,9 +28,6 @@ type Block struct { // The base of the block. Base - // Primary index and nonce - ConsensusData ConsensusData `json:"consensusdata"` - // Transaction list. Transactions []*transaction.Transaction @@ -40,14 +37,12 @@ type Block struct { // auxBlockOut is used for JSON i/o. type auxBlockOut struct { - ConsensusData ConsensusData `json:"consensusdata"` - Transactions []*transaction.Transaction `json:"tx"` + Transactions []*transaction.Transaction `json:"tx"` } // auxBlockIn is used for JSON i/o. type auxBlockIn struct { - ConsensusData ConsensusData `json:"consensusdata"` - Transactions []json.RawMessage `json:"tx"` + Transactions []json.RawMessage `json:"tx"` } // Header returns the Header of the Block. @@ -59,10 +54,9 @@ func (b *Block) Header() *Header { // ComputeMerkleRoot computes Merkle tree root hash based on actual block's data. func (b *Block) ComputeMerkleRoot() util.Uint256 { - hashes := make([]util.Uint256, len(b.Transactions)+1) - hashes[0] = b.ConsensusData.Hash() + hashes := make([]util.Uint256, len(b.Transactions)) for i, tx := range b.Transactions { - hashes[i+1] = tx.Hash() + hashes[i] = tx.Hash() } return hash.CalcMerkleRoot(hashes) @@ -98,16 +92,12 @@ func NewBlockFromTrimmedBytes(network netmode.Magic, stateRootEnabled bool, b [] return nil, ErrMaxContentsPerBlock } if lenHashes > 0 { - var consensusDataHash util.Uint256 - consensusDataHash.DecodeBinary(br) - lenTX := lenHashes - 1 - block.Transactions = make([]*transaction.Transaction, lenTX) - for i := 0; i < int(lenTX); i++ { + block.Transactions = make([]*transaction.Transaction, lenHashes) + for i := 0; i < int(lenHashes); i++ { var hash util.Uint256 hash.DecodeBinary(br) block.Transactions[i] = transaction.NewTrimmedTX(hash) } - block.ConsensusData.DecodeBinary(br) } return block, br.Err @@ -132,16 +122,12 @@ func (b *Block) Trim() ([]byte, error) { buf.WriteB(1) b.Script.EncodeBinary(buf.BinWriter) - buf.WriteVarUint(uint64(len(b.Transactions)) + 1) - hash := b.ConsensusData.Hash() - hash.EncodeBinary(buf.BinWriter) - + buf.WriteVarUint(uint64(len(b.Transactions))) for _, tx := range b.Transactions { h := tx.Hash() h.EncodeBinary(buf.BinWriter) } - b.ConsensusData.EncodeBinary(buf.BinWriter) if buf.Err != nil { return nil, buf.Err } @@ -154,17 +140,12 @@ func (b *Block) Trim() ([]byte, error) { func (b *Block) DecodeBinary(br *io.BinReader) { b.Base.DecodeBinary(br) contentsCount := br.ReadVarUint() - if contentsCount == 0 { - br.Err = errors.New("invalid block format") - return - } if contentsCount > MaxContentsPerBlock { br.Err = ErrMaxContentsPerBlock return } - b.ConsensusData.DecodeBinary(br) - txes := make([]*transaction.Transaction, contentsCount-1) - for i := 0; i < int(contentsCount)-1; i++ { + txes := make([]*transaction.Transaction, contentsCount) + for i := 0; i < int(contentsCount); i++ { tx := &transaction.Transaction{Network: b.Network} tx.DecodeBinary(br) txes[i] = tx @@ -179,8 +160,7 @@ func (b *Block) DecodeBinary(br *io.BinReader) { // Serializable interface. func (b *Block) EncodeBinary(bw *io.BinWriter) { b.Base.EncodeBinary(bw) - bw.WriteVarUint(uint64(len(b.Transactions) + 1)) - b.ConsensusData.EncodeBinary(bw) + bw.WriteVarUint(uint64(len(b.Transactions))) for i := 0; i < len(b.Transactions); i++ { b.Transactions[i].EncodeBinary(bw) } @@ -202,8 +182,7 @@ func (b *Block) Compare(item queue.Item) int { // MarshalJSON implements json.Marshaler interface. func (b Block) MarshalJSON() ([]byte, error) { auxb, err := json.Marshal(auxBlockOut{ - ConsensusData: b.ConsensusData, - Transactions: b.Transactions, + Transactions: b.Transactions, }) if err != nil { return nil, err @@ -246,9 +225,5 @@ func (b *Block) UnmarshalJSON(data []byte) error { b.Transactions = append(b.Transactions, tx) } } - b.ConsensusData = auxb.ConsensusData - // Some tests rely on hash presence and we're usually precomputing - // other hashes upon deserialization. - _ = b.ConsensusData.Hash() return nil } diff --git a/pkg/core/block/block_base.go b/pkg/core/block/block_base.go index 483a62c01..e8809082a 100644 --- a/pkg/core/block/block_base.go +++ b/pkg/core/block/block_base.go @@ -47,6 +47,8 @@ type Base struct { StateRootEnabled bool // PrevStateRoot is state root of the previous block. PrevStateRoot util.Uint256 + // PrimaryIndex is the index of primary consensus node for this block. + PrimaryIndex byte // Hash of this block, created when binary encoded (double SHA256). hash util.Uint256 @@ -66,6 +68,7 @@ type baseAux struct { Timestamp uint64 `json:"time"` Index uint32 `json:"index"` NextConsensus string `json:"nextconsensus"` + PrimaryIndex byte `json:"primary"` PrevStateRoot *util.Uint256 `json:"previousstateroot,omitempty"` Witnesses []transaction.Witness `json:"witnesses"` } @@ -135,6 +138,7 @@ func (b *Base) encodeHashableFields(bw *io.BinWriter) { bw.WriteBytes(b.MerkleRoot[:]) bw.WriteU64LE(b.Timestamp) bw.WriteU32LE(b.Index) + bw.WriteB(b.PrimaryIndex) bw.WriteBytes(b.NextConsensus[:]) if b.StateRootEnabled { bw.WriteBytes(b.PrevStateRoot[:]) @@ -149,6 +153,7 @@ func (b *Base) decodeHashableFields(br *io.BinReader) { br.ReadBytes(b.MerkleRoot[:]) b.Timestamp = br.ReadU64LE() b.Index = br.ReadU32LE() + b.PrimaryIndex = br.ReadB() br.ReadBytes(b.NextConsensus[:]) if b.StateRootEnabled { br.ReadBytes(b.PrevStateRoot[:]) @@ -170,6 +175,7 @@ func (b Base) MarshalJSON() ([]byte, error) { MerkleRoot: b.MerkleRoot, Timestamp: b.Timestamp, Index: b.Index, + PrimaryIndex: b.PrimaryIndex, NextConsensus: address.Uint160ToString(b.NextConsensus), Witnesses: []transaction.Witness{b.Script}, } @@ -201,6 +207,7 @@ func (b *Base) UnmarshalJSON(data []byte) error { b.MerkleRoot = aux.MerkleRoot b.Timestamp = aux.Timestamp b.Index = aux.Index + b.PrimaryIndex = aux.PrimaryIndex b.NextConsensus = nextC b.Script = aux.Witnesses[0] if b.StateRootEnabled { diff --git a/pkg/core/block/block_test.go b/pkg/core/block/block_test.go index 743867f82..d08acf10d 100644 --- a/pkg/core/block/block_test.go +++ b/pkg/core/block/block_test.go @@ -67,8 +67,6 @@ func TestTrimmedBlock(t *testing.T) { assert.Equal(t, block.MerkleRoot, trimmedBlock.MerkleRoot) assert.Equal(t, block.Timestamp, trimmedBlock.Timestamp) assert.Equal(t, block.Index, trimmedBlock.Index) - require.NoError(t, trimmedBlock.ConsensusData.createHash()) - assert.Equal(t, block.ConsensusData, trimmedBlock.ConsensusData) assert.Equal(t, block.NextConsensus, trimmedBlock.NextConsensus) assert.Equal(t, block.Script, trimmedBlock.Script) @@ -93,10 +91,6 @@ func newDumbBlock() *Block { InvocationScript: []byte{0x61}, // NOP }, }, - ConsensusData: ConsensusData{ - PrimaryIndex: 0, - Nonce: 1111, - }, Transactions: []*transaction.Transaction{ transaction.New(netmode.UnitTestNet, []byte{byte(opcode.PUSH1)}, 0), }, @@ -111,7 +105,7 @@ func TestHashBlockEqualsHashHeader(t *testing.T) { func TestBinBlockDecodeEncode(t *testing.T) { // block taken from testnet: 256 - rawblock := "AAAAAFIZHAfkJpTDtc9SysVfmBLqDbwXeM7Z7KgaRpWsaCv9qRn3glL7lmCRuSDAE+a5DanThVwfQjtf/1ewuJroTAoqSYJodwEAAAABAADgo8VcrXICj7WQF0ixmie+IfZUBAH9SgEMQBnIhXApbOmC+bxtLNa5UXVrBLRAGC45FHrzZihV+QnTkoYbunP06wsFn38XUEc7tMIhwRxzxKv0BypuietJGgIMQOGFmepNSLy1dhutMGtWPyL1jGXw2toAwgPgMmvJZ0Pq7jY7MAevSh/bupzmeiO6OEt98F+WO4FLJCnJ5BxQ6nIMQBmvuwvPqfhOA0CmTABMZeI/8NnwC6aYAYO3OetbpjxdYeeAHsXSPc0q9RDuXJG3XWtP7M2PPlHm8hsGuzwLaS0MQOA1bTEY/84HwJEddf+X/7S087d2uTIJ12kb08oKDJ3igSFC7xzBtK/hDRXVjR1lwkGjFQHlC6z9T5eWLuNvo4kMQANpdnF0RvnqOViEXigzwjwqe2ETMbDVDul94j3t96FObvxk4ldYjERJOFnMjcPad1XPRFx2vkx4D96ykbonZqj9/QAVDCEDAJt1QOEPJWLl/Y+snq7CUWaliybkEjSP9ahpJ7+sIqIMIQMCBenO+upaHfxYCvIMjVqiRouwFI8aXkYF/GIsgOYEugwhAhS68M7qOmbxfn4eg56iX9i+1s2C5rtuaCUBiQZfRP8BDCECPpsy6om5TQZuZJsST9UOOW7pE2no4qauGxHBcNAiJW0MIQNAjc1BY5b2R4OsWH6h4Vk8V9n+qIDIpqGSDpKiWUd4BgwhAqeDS+mzLimB0VfLW706y0LP0R6lw7ECJNekTpjFkQ8bDCECuixw9ZlvNXpDGYcFhZ+uLP6hPhFyligAdys9WIqdSr0XC0ETje+vAgT7/CQDG7M29gBIg/1LtJSYAAAAAACYPIUAAAAAAH8XAAACV008A99KmydyrwjkspZyEAm3pv0A4KPFXK1yAo+1kBdIsZonviH2VAQBAF8LAwDkC1QCAAAADBT27Zhtj2R4tkfdriCDBpykz9sjQAwU4KPFXK1yAo+1kBdIsZonviH2VAQUwB8MCHRyYW5zZmVyDBQos62rcmn5whgds8t0Hr9VGTDicEFifVtSOQJCDEABqOtwntx2RZGvhG57+6EKkIV3rVc2W1kFk6T4HqWoasBGueGsae057DDLl8LH71OPAPwQUCd1hFSyvt6UzTvvKQwhAqeDS+mzLimB0VfLW706y0LP0R6lw7ECJNekTpjFkQ8bC0GVRA14/UoBDEDiVGE6wrO9dW2QeTKxUnjmKwlKPquQ7/WqLFa1mBYYUndcvXYHasAf5Ir9+JcHeEXEFbPKeIRmjpQ5Zxm222bjDECnQn481SOOOl1Ks7Q2GjeHKvPdi+M2ufHxnwvUly7bh5t4HQxF3GhNp7IguNOZvqGUjB/pJNql7buN8ReJQTBTDECZoVFnkjJgg+UNmdSpdCWzHEKRNpSWiAgWGQhEA+AGXGuldqCkWJ2RFePPcchDxS5Ha2L/Q0nHODiywss59sQ9DECewTwxXkhVA86NHIIbDtQc4/OekUNSlz7I7h/v0CThBucJYQv51QD1bsDnLAnkJ82P0KaL2e87IRduiv2Aqu9xDEAi0z3DIXvkuyIUTZhVLvNfI7HxA2eSS0xr6nHWwoDPKi//FfPJ8jXNViC/MQcJqlPWQD5tL+bQfxPYOAOiwTp//f0AFQwhAwCbdUDhDyVi5f2PrJ6uwlFmpYsm5BI0j/WoaSe/rCKiDCEDAgXpzvrqWh38WAryDI1aokaLsBSPGl5GBfxiLIDmBLoMIQIUuvDO6jpm8X5+HoOeol/YvtbNgua7bmglAYkGX0T/AQwhAj6bMuqJuU0GbmSbEk/VDjlu6RNp6OKmrhsRwXDQIiVtDCEDQI3NQWOW9keDrFh+oeFZPFfZ/qiAyKahkg6SollHeAYMIQKng0vpsy4pgdFXy1u9OstCz9EepcOxAiTXpE6YxZEPGwwhAroscPWZbzV6QxmHBYWfriz+oT4RcpYoAHcrPViKnUq9FwtBE43vrw==" + rawblock := "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" rawblockBytes, _ := base64.StdEncoding.DecodeString(rawblock) b := New(netmode.TestNet, false) @@ -147,9 +141,6 @@ func TestBinBlockDecodeEncode(t *testing.T) { assert.NoError(t, err) assert.Equal(t, rawblock, base64.StdEncoding.EncodeToString(data)) - // update hidden hash value. - _ = b.ConsensusData.Hash() - testserdes.MarshalUnmarshalJSON(t, b, New(netmode.TestNet, false)) } @@ -160,7 +151,7 @@ func TestBlockSizeCalculation(t *testing.T) { // should be the same.In this test we provide more details then necessary because in case of failure we can easily debug the // root cause of the size calculation missmatch. - rawBlock := "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" + rawBlock := "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" rawBlockBytes, _ := base64.StdEncoding.DecodeString(rawBlock) b := New(netmode.TestNet, false) @@ -202,12 +193,12 @@ func TestBlockSizeCalculation(t *testing.T) { assert.Equal(t, "DEAZyIVwKWzpgvm8bSzWuVF1awS0QBguORR682YoVfkJ05KGG7pz9OsLBZ9/F1BHO7TCIcEcc8Sr9AcqbonrSRoCDEDhhZnqTUi8tXYbrTBrVj8i9Yxl8NraAMID4DJryWdD6u42OzAHr0of27qc5nojujhLffBfljuBSyQpyeQcUOpyDEAZr7sLz6n4TgNApkwATGXiP/DZ8AummAGDtznrW6Y8XWHngB7F0j3NKvUQ7lyRt11rT+zNjz5R5vIbBrs8C2ktDEDgNW0xGP/OB8CRHXX/l/+0tPO3drkyCddpG9PKCgyd4oEhQu8cwbSv4Q0V1Y0dZcJBoxUB5Qus/U+Xli7jb6OJDEADaXZxdEb56jlYhF4oM8I8KnthEzGw1Q7pfeI97fehTm78ZOJXWIxESThZzI3D2ndVz0Rcdr5MeA/espG6J2ao", base64.StdEncoding.EncodeToString(b.Script.InvocationScript)) assert.Equal(t, "FQwhAwCbdUDhDyVi5f2PrJ6uwlFmpYsm5BI0j/WoaSe/rCKiDCEDAgXpzvrqWh38WAryDI1aokaLsBSPGl5GBfxiLIDmBLoMIQIUuvDO6jpm8X5+HoOeol/YvtbNgua7bmglAYkGX0T/AQwhAj6bMuqJuU0GbmSbEk/VDjlu6RNp6OKmrhsRwXDQIiVtDCEDQI3NQWOW9keDrFh+oeFZPFfZ/qiAyKahkg6SollHeAYMIQKng0vpsy4pgdFXy1u9OstCz9EepcOxAiTXpE6YxZEPGwwhAroscPWZbzV6QxmHBYWfriz+oT4RcpYoAHcrPViKnUq9FwtBE43vrw==", base64.StdEncoding.EncodeToString(b.Script.VerificationScript)) - assert.Equal(t, "51ee44e12cdc1d3041a50d352063127fa65d86670686f14cc08f01b3cee7de17", b.Hash().StringLE()) + assert.Equal(t, "63d18734a3edbe92a9480b690734b85aaf9c24361d034afbea37d749cfc62d6a", b.Hash().StringLE()) benc, err := testserdes.EncodeBinary(b) assert.NoError(t, err) // test size of the block - assert.Equal(t, 1564, len(benc)) + assert.Equal(t, 1556, len(benc)) assert.Equal(t, rawBlock, base64.StdEncoding.EncodeToString(benc)) } @@ -230,7 +221,7 @@ func TestBlockEncodeDecode(t *testing.T) { t.Run("bad contents count", func(t *testing.T) { b := newDumbBlock() - b.Transactions = make([]*transaction.Transaction, MaxContentsPerBlock) + b.Transactions = make([]*transaction.Transaction, MaxContentsPerBlock+1) for i := range b.Transactions { b.Transactions[i] = &transaction.Transaction{ Script: []byte("my_pretty_script"), diff --git a/pkg/core/block/consensus_data.go b/pkg/core/block/consensus_data.go deleted file mode 100644 index f948ef45e..000000000 --- a/pkg/core/block/consensus_data.go +++ /dev/null @@ -1,86 +0,0 @@ -package block - -import ( - "encoding/json" - "strconv" - - "github.com/nspcc-dev/neo-go/pkg/crypto/hash" - "github.com/nspcc-dev/neo-go/pkg/io" - "github.com/nspcc-dev/neo-go/pkg/util" -) - -// ConsensusData represents primary index and nonce of block in the chain. -type ConsensusData struct { - // Primary index - PrimaryIndex uint32 - // Random number - Nonce uint64 - // Hash of the ConsensusData (single SHA256) - hash util.Uint256 -} - -// jsonConsensusData is used for JSON I/O of ConsensusData. -type jsonConsensusData struct { - Primary uint32 `json:"primary"` - Nonce string `json:"nonce"` -} - -// DecodeBinary implements Serializable interface. -func (c *ConsensusData) DecodeBinary(br *io.BinReader) { - c.PrimaryIndex = uint32(br.ReadVarUint()) - c.Nonce = br.ReadU64LE() -} - -// EncodeBinary encodes implements Serializable interface. -func (c *ConsensusData) EncodeBinary(bw *io.BinWriter) { - bw.WriteVarUint(uint64(c.PrimaryIndex)) - bw.WriteU64LE(c.Nonce) -} - -// Hash returns the hash of the consensus data. -func (c *ConsensusData) Hash() util.Uint256 { - if c.hash.Equals(util.Uint256{}) { - if c.createHash() != nil { - panic("failed to compute hash!") - } - } - return c.hash -} - -// createHash creates the hash of the consensus data. -func (c *ConsensusData) createHash() error { - buf := io.NewBufBinWriter() - c.EncodeBinary(buf.BinWriter) - if buf.Err != nil { - return buf.Err - } - - b := buf.Bytes() - c.hash = hash.DoubleSha256(b) - return nil -} - -// MarshalJSON implements json.Marshaler interface. -func (c ConsensusData) MarshalJSON() ([]byte, error) { - nonce := strconv.FormatUint(c.Nonce, 16) - for len(nonce) < 16 { - nonce = "0" + nonce - } - return json.Marshal(jsonConsensusData{Primary: c.PrimaryIndex, Nonce: nonce}) -} - -// UnmarshalJSON implements json.Unmarshaler interface. -func (c *ConsensusData) UnmarshalJSON(data []byte) error { - jcd := new(jsonConsensusData) - err := json.Unmarshal(data, jcd) - if err != nil { - return err - } - nonce, err := strconv.ParseUint(jcd.Nonce, 16, 64) - if err != nil { - return err - } - c.PrimaryIndex = jcd.Primary - c.Nonce = nonce - return nil -} diff --git a/pkg/core/helper_test.go b/pkg/core/helper_test.go index 2a266468c..eb118771c 100644 --- a/pkg/core/helper_test.go +++ b/pkg/core/helper_test.go @@ -113,10 +113,6 @@ func newBlockCustom(cfg config.ProtocolConfiguration, f func(b *block.Block), NextConsensus: witness.ScriptHash(), Script: witness, }, - ConsensusData: block.ConsensusData{ - PrimaryIndex: 0, - Nonce: 1111, - }, Transactions: txs, } f(b) @@ -222,10 +218,6 @@ func newDumbBlock() *block.Block { InvocationScript: []byte{0x61}, // NOP }, }, - ConsensusData: block.ConsensusData{ - PrimaryIndex: 0, - Nonce: 1111, - }, Transactions: []*transaction.Transaction{ transaction.New(testchain.Network(), []byte{byte(opcode.PUSH1)}, 0), }, diff --git a/pkg/core/native/native_gas.go b/pkg/core/native/native_gas.go index 30e52f704..8f18c9789 100644 --- a/pkg/core/native/native_gas.go +++ b/pkg/core/native/native_gas.go @@ -85,7 +85,7 @@ func (g *GAS) OnPersist(ic *interop.Context) error { g.burn(ic, tx.Sender(), absAmount) } validators := g.NEO.GetNextBlockValidatorsInternal() - primary := validators[ic.Block.ConsensusData.PrimaryIndex].GetScriptHash() + primary := validators[ic.Block.PrimaryIndex].GetScriptHash() var netFee int64 for _, tx := range ic.Block.Transactions { netFee += tx.NetworkFee diff --git a/pkg/core/test_data/block_1.json b/pkg/core/test_data/block_1.json index a88fb775d..d034cc86f 100644 --- a/pkg/core/test_data/block_1.json +++ b/pkg/core/test_data/block_1.json @@ -1,16 +1,13 @@ { - "raw": "0000000052191c07e42694c3b5cf52cac55f9812ea0dbc1778ced9eca81a4695ac682bfda919f78252fb966091b920c013e6b90da9d3855c1f423b5fff57b0b89ae84c0a2a4982687701000000010000e0a3c55cad72028fb5901748b19a27be21f6540401fd4a010c4019c88570296ce982f9bc6d2cd6b951756b04b440182e39147af3662855f909d392861bba73f4eb0b059f7f1750473bb4c221c11c73c4abf4072a6e89eb491a020c40e18599ea4d48bcb5761bad306b563f22f58c65f0dada00c203e0326bc96743eaee363b3007af4a1fdbba9ce67a23ba384b7df05f963b814b2429c9e41c50ea720c4019afbb0bcfa9f84e0340a64c004c65e23ff0d9f00ba6980183b739eb5ba63c5d61e7801ec5d23dcd2af510ee5c91b75d6b4feccd8f3e51e6f21b06bb3c0b692d0c40e0356d3118ffce07c0911d75ff97ffb4b4f3b776b93209d7691bd3ca0a0c9de2812142ef1cc1b4afe10d15d58d1d65c241a31501e50bacfd4f97962ee36fa3890c40036976717446f9ea3958845e2833c23c2a7b611331b0d50ee97de23dedf7a14e6efc64e257588c44493859cc8dc3da7755cf445c76be4c780fdeb291ba2766a8fdfd00150c2103009b7540e10f2562e5fd8fac9eaec25166a58b26e412348ff5a86927bfac22a20c21030205e9cefaea5a1dfc580af20c8d5aa2468bb0148f1a5e4605fc622c80e604ba0c210214baf0ceea3a66f17e7e1e839ea25fd8bed6cd82e6bb6e68250189065f44ff010c21023e9b32ea89b94d066e649b124fd50e396ee91369e8e2a6ae1b11c170d022256d0c2103408dcd416396f64783ac587ea1e1593c57d9fea880c8a6a1920e92a2594778060c2102a7834be9b32e2981d157cb5bbd3acb42cfd11ea5c3b10224d7a44e98c5910f1b0c2102ba2c70f5996f357a43198705859fae2cfea13e1172962800772b3d588a9d4abd170b41138defaf0204fbfc24031bb336f6004883fd4bb494980000000000983c8500000000007f17000002574d3c03df4a9b2772af08e4b296721009b7a6fd00e0a3c55cad72028fb5901748b19a27be21f6540401005f0b0300e40b54020000000c14f6ed986d8f6478b647ddae2083069ca4cfdb23400c14e0a3c55cad72028fb5901748b19a27be21f6540414c01f0c087472616e736665720c1428b3adab7269f9c2181db3cb741ebf551930e27041627d5b523902420c4001a8eb709edc764591af846e7bfba10a908577ad57365b590593a4f81ea5a86ac046b9e1ac69ed39ec30cb97c2c7ef538f00fc105027758454b2bede94cd3bef290c2102a7834be9b32e2981d157cb5bbd3acb42cfd11ea5c3b10224d7a44e98c5910f1b0b4195440d78fd4a010c40e254613ac2b3bd756d907932b15278e62b094a3eab90eff5aa2c56b598161852775cbd76076ac01fe48afdf897077845c415b3ca7884668e94396719b6db66e30c40a7427e3cd5238e3a5d4ab3b4361a37872af3dd8be336b9f1f19f0bd4972edb879b781d0c45dc684da7b220b8d399bea1948c1fe924daa5edbb8df117894130530c4099a1516792326083e50d99d4a97425b31c429136949688081619084403e0065c6ba576a0a4589d9115e3cf71c843c52e476b62ff4349c73838b2c2cb39f6c43d0c409ec13c315e485503ce8d1c821b0ed41ce3f39e914352973ec8ee1fefd024e106e709610bf9d500f56ec0e72c09e427cd8fd0a68bd9ef3b21176e8afd80aaef710c4022d33dc3217be4bb22144d98552ef35f23b1f10367924b4c6bea71d6c280cf2a2fff15f3c9f235cd5620bf310709aa53d6403e6d2fe6d07f13d83803a2c13a7ffdfd00150c2103009b7540e10f2562e5fd8fac9eaec25166a58b26e412348ff5a86927bfac22a20c21030205e9cefaea5a1dfc580af20c8d5aa2468bb0148f1a5e4605fc622c80e604ba0c210214baf0ceea3a66f17e7e1e839ea25fd8bed6cd82e6bb6e68250189065f44ff010c21023e9b32ea89b94d066e649b124fd50e396ee91369e8e2a6ae1b11c170d022256d0c2103408dcd416396f64783ac587ea1e1593c57d9fea880c8a6a1920e92a2594778060c2102a7834be9b32e2981d157cb5bbd3acb42cfd11ea5c3b10224d7a44e98c5910f1b0c2102ba2c70f5996f357a43198705859fae2cfea13e1172962800772b3d588a9d4abd170b41138defaf", + "raw": "0000000052191c07e42694c3b5cf52cac55f9812ea0dbc1778ced9eca81a4695ac682bfda919f78252fb966091b920c013e6b90da9d3855c1f423b5fff57b0b89ae84c0a2a498268770100000001000004e0a3c55cad72028fb5901748b19a27be21f6540401fd4a010c4019c88570296ce982f9bc6d2cd6b951756b04b440182e39147af3662855f909d392861bba73f4eb0b059f7f1750473bb4c221c11c73c4abf4072a6e89eb491a020c40e18599ea4d48bcb5761bad306b563f22f58c65f0dada00c203e0326bc96743eaee363b3007af4a1fdbba9ce67a23ba384b7df05f963b814b2429c9e41c50ea720c4019afbb0bcfa9f84e0340a64c004c65e23ff0d9f00ba6980183b739eb5ba63c5d61e7801ec5d23dcd2af510ee5c91b75d6b4feccd8f3e51e6f21b06bb3c0b692d0c40e0356d3118ffce07c0911d75ff97ffb4b4f3b776b93209d7691bd3ca0a0c9de2812142ef1cc1b4afe10d15d58d1d65c241a31501e50bacfd4f97962ee36fa3890c40036976717446f9ea3958845e2833c23c2a7b611331b0d50ee97de23dedf7a14e6efc64e257588c44493859cc8dc3da7755cf445c76be4c780fdeb291ba2766a8fdfd00150c2103009b7540e10f2562e5fd8fac9eaec25166a58b26e412348ff5a86927bfac22a20c21030205e9cefaea5a1dfc580af20c8d5aa2468bb0148f1a5e4605fc622c80e604ba0c210214baf0ceea3a66f17e7e1e839ea25fd8bed6cd82e6bb6e68250189065f44ff010c21023e9b32ea89b94d066e649b124fd50e396ee91369e8e2a6ae1b11c170d022256d0c2103408dcd416396f64783ac587ea1e1593c57d9fea880c8a6a1920e92a2594778060c2102a7834be9b32e2981d157cb5bbd3acb42cfd11ea5c3b10224d7a44e98c5910f1b0c2102ba2c70f5996f357a43198705859fae2cfea13e1172962800772b3d588a9d4abd170b41138defaf01004883fd4bb494980000000000983c8500000000007f17000002574d3c03df4a9b2772af08e4b296721009b7a6fd00e0a3c55cad72028fb5901748b19a27be21f6540401005f0b0300e40b54020000000c14f6ed986d8f6478b647ddae2083069ca4cfdb23400c14e0a3c55cad72028fb5901748b19a27be21f6540414c01f0c087472616e736665720c1428b3adab7269f9c2181db3cb741ebf551930e27041627d5b523902420c4001a8eb709edc764591af846e7bfba10a908577ad57365b590593a4f81ea5a86ac046b9e1ac69ed39ec30cb97c2c7ef538f00fc105027758454b2bede94cd3bef290c2102a7834be9b32e2981d157cb5bbd3acb42cfd11ea5c3b10224d7a44e98c5910f1b0b4195440d78fd4a010c40e254613ac2b3bd756d907932b15278e62b094a3eab90eff5aa2c56b598161852775cbd76076ac01fe48afdf897077845c415b3ca7884668e94396719b6db66e30c40a7427e3cd5238e3a5d4ab3b4361a37872af3dd8be336b9f1f19f0bd4972edb879b781d0c45dc684da7b220b8d399bea1948c1fe924daa5edbb8df117894130530c4099a1516792326083e50d99d4a97425b31c429136949688081619084403e0065c6ba576a0a4589d9115e3cf71c843c52e476b62ff4349c73838b2c2cb39f6c43d0c409ec13c315e485503ce8d1c821b0ed41ce3f39e914352973ec8ee1fefd024e106e709610bf9d500f56ec0e72c09e427cd8fd0a68bd9ef3b21176e8afd80aaef710c4022d33dc3217be4bb22144d98552ef35f23b1f10367924b4c6bea71d6c280cf2a2fff15f3c9f235cd5620bf310709aa53d6403e6d2fe6d07f13d83803a2c13a7ffdfd00150c2103009b7540e10f2562e5fd8fac9eaec25166a58b26e412348ff5a86927bfac22a20c21030205e9cefaea5a1dfc580af20c8d5aa2468bb0148f1a5e4605fc622c80e604ba0c210214baf0ceea3a66f17e7e1e839ea25fd8bed6cd82e6bb6e68250189065f44ff010c21023e9b32ea89b94d066e649b124fd50e396ee91369e8e2a6ae1b11c170d022256d0c2103408dcd416396f64783ac587ea1e1593c57d9fea880c8a6a1920e92a2594778060c2102a7834be9b32e2981d157cb5bbd3acb42cfd11ea5c3b10224d7a44e98c5910f1b0c2102ba2c70f5996f357a43198705859fae2cfea13e1172962800772b3d588a9d4abd170b41138defaf", "size" : 1564, "index" : 256, + "primary" : 4, "time" : 1612366104874, "confirmations" : 10883, - "consensusdata" : { - "primary" : 4, - "nonce" : "f636b31b0324fcfb" - }, "previousblockhash" : "0xfd2b68ac95461aa8ecd9ce7817bc0dea12985fc5ca52cfb5c39426e4071c1952", "nextconsensus" : "NgPkjjLTNcQad99iRYeXRUuowE4gxLAnDL", - "hash" : "0x51ee44e12cdc1d3041a50d352063127fa65d86670686f14cc08f01b3cee7de17", + "hash" : "0x63d18734a3edbe92a9480b690734b85aaf9c24361d034afbea37d749cfc62d6a", "witnesses" : [ { "verification" : "FQwhAwCbdUDhDyVi5f2PrJ6uwlFmpYsm5BI0j/WoaSe/rCKiDCEDAgXpzvrqWh38WAryDI1aokaLsBSPGl5GBfxiLIDmBLoMIQIUuvDO6jpm8X5+HoOeol/YvtbNgua7bmglAYkGX0T/AQwhAj6bMuqJuU0GbmSbEk/VDjlu6RNp6OKmrhsRwXDQIiVtDCEDQI3NQWOW9keDrFh+oeFZPFfZ/qiAyKahkg6SollHeAYMIQKng0vpsy4pgdFXy1u9OstCz9EepcOxAiTXpE6YxZEPGwwhAroscPWZbzV6QxmHBYWfriz+oT4RcpYoAHcrPViKnUq9FwtBE43vrw==", diff --git a/pkg/core/util.go b/pkg/core/util.go index 283c9d050..f95dd2bd8 100644 --- a/pkg/core/util.go +++ b/pkg/core/util.go @@ -54,10 +54,6 @@ func createGenesisBlock(cfg config.ProtocolConfiguration) (*block.Block, error) b := &block.Block{ Base: base, Transactions: []*transaction.Transaction{}, - ConsensusData: block.ConsensusData{ - PrimaryIndex: 0, - Nonce: 2083236893, - }, } b.RebuildMerkleRoot() diff --git a/pkg/core/util_test.go b/pkg/core/util_test.go index ceec4237a..8772038ef 100644 --- a/pkg/core/util_test.go +++ b/pkg/core/util_test.go @@ -17,7 +17,7 @@ func TestGenesisBlockMainNet(t *testing.T) { block, err := createGenesisBlock(cfg.ProtocolConfiguration) require.NoError(t, err) - expect := "00c6803707b564153d444bfcdf3a13325fc96dda55cc8a740bbd543a1d752fda" + expect := "d71dfebcc59d42b2f3b3f0e0d6b3b77a4880276db1df92c08c7c1bac94bece35" assert.Equal(t, expect, block.Hash().StringLE()) } diff --git a/pkg/crypto/hash/merkle_tree.go b/pkg/crypto/hash/merkle_tree.go index 0d37a964a..0893a4be2 100644 --- a/pkg/crypto/hash/merkle_tree.go +++ b/pkg/crypto/hash/merkle_tree.go @@ -75,7 +75,7 @@ func buildMerkleTree(leaves []*MerkleTreeNode) *MerkleTreeNode { // panic. func CalcMerkleRoot(hashes []util.Uint256) util.Uint256 { if len(hashes) == 0 { - panic("length of the hashes cannot be zero") + return util.Uint256{} } if len(hashes) == 1 { return hashes[0] diff --git a/pkg/rpc/client/rpc_test.go b/pkg/rpc/client/rpc_test.go index 2390a084b..b58a8d454 100644 --- a/pkg/rpc/client/rpc_test.go +++ b/pkg/rpc/client/rpc_test.go @@ -46,17 +46,17 @@ type rpcClientTestCase struct { check func(t *testing.T, c *Client, result interface{}) } -const base64B1 = "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" +const base64B1 = "AAAAAMU1lpLU9L9XS3U0WvRgGV9aU5WoX8f6MWgNjfz89nyeomtq7Iw0SoX9caDTvpAT4ulAxcy/vWK7q9GH0raCqQfxbcftdwEAAAEAAAAAXhK+qHrrlViE9vnOeEWMzLl8MJUBxgxAVLK3uK5qryZv+jBuH0dBn7VU+sYztObj1sj65/az1v2XCrlLlL2z2LeHccRnn7jAXUE0m80q7QAxEWyhzJPA/QxAOCcAytavTTPv0uQ+rhoBRXvyxaaEdSCZq0VDJCNtI4O9iFXq+Q++GJjzA04z4QZo7KCB8KD8aruBc69i6PoqwwxAR7dzN1DAk9G1RCuSZx7X7U/qqJfT7Wa4Us9kq/40AVpJgwr0RNUGWf1Xh8K53f+tzw1UtHZMoI5YZyJtMEiQY5QTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUC0ETje+vAgACAAAAwNinAAAAAAASfUMAAAAAALAEAAABXhK+qHrrlViE9vnOeEWMzLl8MJUBAFsLAhjd9QUMFKqKz4WdT+QCs05nPyFWgheWpIjrDBReEr6oeuuVWIT2+c54RYzMuXwwlRTAHwwIdHJhbnNmZXIMFIOrBnmtVcBQoTrUP1k26nP16x72QWJ9W1I5AcYMQIoQAeuRy5Lgj4MYiuF9tLhAeYhKf6PrczcbKGeWmz+KNWULI+mQbeDPFWG3mGwPkSBELVqVMrUNqigZLflJhNwMQBuqOk8xrVlAx5A5Va9FlMhu3io+wIrubPoWNr0sklBKh48H9w3WHPfTFBSAW8M9ePou/TVXM40X+U07fy+s+8MMQIlw1AKX/fk1rn1GqjZOqNmhVjQPm6Tk7Cb1fzeBa4baIEy5DmaaM8ayh0tm8N3Vc8JNSwnK91vIXPG/A9RKTKuUEwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrwADAAAAwNinAAAAAACyjEMAAAAAALAEAAABXhK+qHrrlViE9vnOeEWMzLl8MJUBAF8LAwDodkgXAAAADBSqis+FnU/kArNOZz8hVoIXlqSI6wwUXhK+qHrrlViE9vnOeEWMzLl8MJUUwB8MCHRyYW5zZmVyDBQos62rcmn5whgds8t0Hr9VGTDicEFifVtSOQHGDEA7aJyGTIq0pV20LzVWOCreh6XIxLUCWHVgUFsCTxPOPdqtZBHKnejng3d2BRm/lecTyPLeq7KpRCD9awRvadFWDEBjVZRvSGtGcOEjtUxl4AH5XelYlIUG5k+x3QyYKZtWQc96lUX1hohrNkCmWeWNwC2l8eJGpUxicM+WZGODCVp8DEDbQxvmqRTQ+flc6JetmaqHyw8rfoeQNtmEFpw2cNhyAo5L5Ilp2wbVtJNOJPfw72J7E6FhTK8slIKRqXzpdnyKlBMMIQIQOn990BZVhZf3lg0nxRakOU/ZaLnmUVXrSwE+QEBAbgwhAqe8Vf6GhOARl2jRBLoweVvcyGYZ6GSt0mFWcj7Rhc1iDCECs2Ir9AF73+MXxYrtX0x1PyBrfbiWBG+n13S7xL9/jcIMIQPZDAffY+aQzneRLhCrUazJRLZoYCN7YIxPj4MJ5x7mmRQLQRON768=" -const base64TxMoveNeo = "AAIAAACAlpgAAAAAAJ58RAAAAAAAsAQAAAFeEr6oeuuVWIT2+c54RYzMuXwwlQEAWQIY3fUFDBSqis+FnU/kArNOZz8hVoIXlqSI6wwUXhK+qHrrlViE9vnOeEWMzLl8MJUTwAwIdHJhbnNmZXIMFCUFnstIeNOodfkcUc7e0zDUV1/eQWJ9W1I4Af0IAQxACHElLALUapeLfiBHqPqePmCO2wOjxvtccVJDyG9rzZWjJeD7po0FRU/m4NpXcQmGus3HKHOJ9Bn68ovNhIRqRgxAkeH0A6+J46PeJhevxgPjh9GOZO9+chjBGR7PeufOgUaen9AEMX5iD7y3EuGHq6PadM4FZfQQ4N08VOaYkcpUeQxAHIzk+yYxMDUZyoAw5F34et2HNzKKzG3W9mrE4g7tGnscuTOV3IpANY8qSU+MJIcY6dK64BWUUs3mIcFdCpc/sgxAiKKSsS3eKfoSx8RatO1n313fvrDdFiEVs7zCZ3Aqyakj/M8+ua/ExhRc72THRnpVijuyoQToSCusK8rljZWgyJQTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUC0ETje+v" +const base64TxMoveNeo = "AAIAAADA2KcAAAAAABJ9QwAAAAAAsAQAAAFeEr6oeuuVWIT2+c54RYzMuXwwlQEAWwsCGN31BQwUqorPhZ1P5AKzTmc/IVaCF5akiOsMFF4Svqh665VYhPb5znhFjMy5fDCVFMAfDAh0cmFuc2ZlcgwUg6sGea1VwFChOtQ/WTbqc/XrHvZBYn1bUjkBxgxAihAB65HLkuCPgxiK4X20uEB5iEp/o+tzNxsoZ5abP4o1ZQsj6ZBt4M8VYbeYbA+RIEQtWpUytQ2qKBkt+UmE3AxAG6o6TzGtWUDHkDlVr0WUyG7eKj7Aiu5s+hY2vSySUEqHjwf3DdYc99MUFIBbwz14+i79NVczjRf5TTt/L6z7wwxAiXDUApf9+TWufUaqNk6o2aFWNA+bpOTsJvV/N4FrhtogTLkOZpozxrKHS2bw3dVzwk1LCcr3W8hc8b8D1EpMq5QTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUC0ETje+v" -const b1Verbose = `{"id":5,"jsonrpc":"2.0","result":{"size":1641,"nextblockhash":"0x003abea54aa3c5edba7e33fb7ca96452cb65ff8cd36ce1cdfd412a6c4d3ea38a","confirmations":6,"hash":"0xd9518e322440714b0564d6f84a9a39b527b5480e4e7f7932895777a4c8fa0a9e","version":0,"previousblockhash":"0xa496577895eb8c227bb866dc44f99f21c0cf06417ca8f2a877cc5d761a50dac0","merkleroot":"0x2b0f84636d814f3a952de145c8f4028f5664132f2719f5902e1884c9fba59806","time":1596101407001,"index":1,"nextconsensus":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","witnesses":[{"invocation":"DEANAGtuw7+VLVNvmpESGL4+xqlKgBSIWmMBEtABi86ixft2Q7AcaOC89M+yKVIuTel9doVJcCvfx93CcQ63DZqCDEBtwUEkjuzP9h8ZTL0GEKfGr01pazmh8s2TswJge5sAGryYE/+kjw5NCLFmowhPU73qUYQ9jq1zMNMXF+Deqxp/DEDkytkkwJec5n4x2+l5zsZHT6QTXJsByZOWXaGPVJKK8CeDccZba7Mf4MdSkWqSt61xUtlgM2Iqhe/Iuokf/ZEXDEAOH72S12CuAxVu0XNGyj3cgMtad+Bghxvr16T9+ELaWkpR4ko26FdStYC2XiCkzanXTtAD1Id5rREsxfFeKb83","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}],"consensusdata":{"primary":0,"nonce":"0000000000000457"},"tx":[{"hash":"0x32f9bd3a2707475407c41bf5daacf9560e25ed74f6d85b3afb2ef72edb2325ba","size":555,"version":0,"nonce":2,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"10000000","netfee":"4488350","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"Ahjd9QUMFKqKz4WdT+QCs05nPyFWgheWpIjrDBReEr6oeuuVWIT2+c54RYzMuXwwlRPADAh0cmFuc2ZlcgwUJQWey0h406h1+RxRzt7TMNRXX95BYn1bUjg=","witnesses":[{"invocation":"DEAIcSUsAtRql4t+IEeo+p4+YI7bA6PG+1xxUkPIb2vNlaMl4PumjQVFT+bg2ldxCYa6zccoc4n0Gfryi82EhGpGDECR4fQDr4njo94mF6/GA+OH0Y5k735yGMEZHs96586BRp6f0AQxfmIPvLcS4Yero9p0zgVl9BDg3TxU5piRylR5DEAcjOT7JjEwNRnKgDDkXfh63Yc3MorMbdb2asTiDu0aexy5M5XcikA1jypJT4wkhxjp0rrgFZRSzeYhwV0Klz+yDECIopKxLd4p+hLHxFq07WffXd++sN0WIRWzvMJncCrJqSP8zz65r8TGFFzvZMdGelWKO7KhBOhIK6wryuWNlaDI","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]},{"hash":"0xd35d6386ec2f29b90839536f6af9466098d1665e951cdd0a20db6b4629b08369","size":559,"version":0,"nonce":3,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"10000000","netfee":"4492350","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"AwDodkgXAAAADBSqis+FnU/kArNOZz8hVoIXlqSI6wwUXhK+qHrrlViE9vnOeEWMzLl8MJUTwAwIdHJhbnNmZXIMFLyvQdaEx9StbuDZnalwe50fDI5mQWJ9W1I4","witnesses":[{"invocation":"DECKUPl9d502XPI564EC2BroqpN274uV3n1z6kCBCmbS715lzmPbh24LESMsAP2TFohhdhm16aDfNsPi5tkB/FE4DEDzJFts9VYc1lIivGAZZSxACzAV/96Kn2WAaS3bDIlAJHCShsfz+Rn3NuvMyutujYM4vyEipAX9gkjcvFWGKRObDECkI883onhG9aYTxwQWDxsmofuiooRJOic/cJ1H8nqUEvMqATYKgdHaBOJBVYsKq9M9oUv/fj6JFbMDrcasvpiaDECEqkq2b50aEc1NGM9DBAsYLEeZHrM1BwX3a2tBOeeD/KLtmTga1IZogsZgpis2BOToZO6LuN9FJYcn+/iGcC5u","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]}]}}` +const b1Verbose = `{"id":5,"jsonrpc":"2.0","result":{"size":1433,"nextblockhash":"0x85ab779bc19247aa504c36879ce75cb7f662b4e8067fbc83e5d24ef0afd9a84f","confirmations":6,"hash":"0xea6385e943832b65ee225aaeb31933a97f3362505ab84cfe5dbd91cd1672b9b7","version":0,"previousblockhash":"0x9e7cf6fcfc8d0d6831fac75fa895535a5f1960f45a34754b57bff4d4929635c5","merkleroot":"0x07a982b6d287d1abbb62bdbfccc540e9e21390bed3a071fd854a348cec6a6ba2","time":1614602006001,"index":1,"nextconsensus":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","primary":0,"witnesses":[{"invocation":"DEBUsre4rmqvJm/6MG4fR0GftVT6xjO05uPWyPrn9rPW/ZcKuUuUvbPYt4dxxGefuMBdQTSbzSrtADERbKHMk8D9DEA4JwDK1q9NM+/S5D6uGgFFe/LFpoR1IJmrRUMkI20jg72IVer5D74YmPMDTjPhBmjsoIHwoPxqu4Fzr2Lo+irDDEBHt3M3UMCT0bVEK5JnHtftT+qol9PtZrhSz2Sr/jQBWkmDCvRE1QZZ/VeHwrnd/63PDVS0dkygjlhnIm0wSJBj","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}],"tx":[{"hash":"0x7c10b90077bddfe9095b2db96bb4ac33994ed1ca99c805410f55c771eee0b77b","size":489,"version":0,"nonce":2,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"11000000","netfee":"4422930","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"CwIY3fUFDBSqis+FnU/kArNOZz8hVoIXlqSI6wwUXhK+qHrrlViE9vnOeEWMzLl8MJUUwB8MCHRyYW5zZmVyDBSDqwZ5rVXAUKE61D9ZNupz9ese9kFifVtSOQ==","witnesses":[{"invocation":"DECKEAHrkcuS4I+DGIrhfbS4QHmISn+j63M3Gyhnlps/ijVlCyPpkG3gzxVht5hsD5EgRC1alTK1DaooGS35SYTcDEAbqjpPMa1ZQMeQOVWvRZTIbt4qPsCK7mz6Fja9LJJQSoePB/cN1hz30xQUgFvDPXj6Lv01VzONF/lNO38vrPvDDECJcNQCl/35Na59Rqo2TqjZoVY0D5uk5Owm9X83gWuG2iBMuQ5mmjPGsodLZvDd1XPCTUsJyvdbyFzxvwPUSkyr","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]},{"hash":"0x41846075f4c5aec54d70b476befb97b35696700454b1168e1ae8888d8fb204a3","size":493,"version":0,"nonce":3,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"11000000","netfee":"4426930","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"CwMA6HZIFwAAAAwUqorPhZ1P5AKzTmc/IVaCF5akiOsMFF4Svqh665VYhPb5znhFjMy5fDCVFMAfDAh0cmFuc2ZlcgwUKLOtq3Jp+cIYHbPLdB6/VRkw4nBBYn1bUjk=","witnesses":[{"invocation":"DEA7aJyGTIq0pV20LzVWOCreh6XIxLUCWHVgUFsCTxPOPdqtZBHKnejng3d2BRm/lecTyPLeq7KpRCD9awRvadFWDEBjVZRvSGtGcOEjtUxl4AH5XelYlIUG5k+x3QyYKZtWQc96lUX1hohrNkCmWeWNwC2l8eJGpUxicM+WZGODCVp8DEDbQxvmqRTQ+flc6JetmaqHyw8rfoeQNtmEFpw2cNhyAo5L5Ilp2wbVtJNOJPfw72J7E6FhTK8slIKRqXzpdnyK","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]}]}}` -const base64Header1 = "AAAAAMDaUBp2Xcx3qPKofEEGz8Ahn/lE3Ga4eyKM65V4V5akBpil+8mEGC6Q9RknLxNkVo8C9MhF4S2VOk+BbWOEDysZsQ6fcwEAAAEAAABeEr6oeuuVWIT2+c54RYzMuXwwlQH9CAEMQA0Aa27Dv5UtU2+akRIYvj7GqUqAFIhaYwES0AGLzqLF+3ZDsBxo4Lz0z7IpUi5N6X12hUlwK9/H3cJxDrcNmoIMQG3BQSSO7M/2HxlMvQYQp8avTWlrOaHyzZOzAmB7mwAavJgT/6SPDk0IsWajCE9TvepRhD2OrXMw0xcX4N6rGn8MQOTK2STAl5zmfjHb6XnOxkdPpBNcmwHJk5ZdoY9UkorwJ4Nxxltrsx/gx1KRapK3rXFS2WAzYiqF78i6iR/9kRcMQA4fvZLXYK4DFW7Rc0bKPdyAy1p34GCHG+vXpP34QtpaSlHiSjboV1K1gLZeIKTNqddO0APUh3mtESzF8V4pvzeUEwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrwA=" +const base64Header1 = "AAAAAMU1lpLU9L9XS3U0WvRgGV9aU5WoX8f6MWgNjfz89nyeomtq7Iw0SoX9caDTvpAT4ulAxcy/vWK7q9GH0raCqQfxbcftdwEAAAEAAAAAXhK+qHrrlViE9vnOeEWMzLl8MJUBxgxAVLK3uK5qryZv+jBuH0dBn7VU+sYztObj1sj65/az1v2XCrlLlL2z2LeHccRnn7jAXUE0m80q7QAxEWyhzJPA/QxAOCcAytavTTPv0uQ+rhoBRXvyxaaEdSCZq0VDJCNtI4O9iFXq+Q++GJjzA04z4QZo7KCB8KD8aruBc69i6PoqwwxAR7dzN1DAk9G1RCuSZx7X7U/qqJfT7Wa4Us9kq/40AVpJgwr0RNUGWf1Xh8K53f+tzw1UtHZMoI5YZyJtMEiQY5QTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUC0ETje+vAA==" -const header1Verbose = `{"id":5,"jsonrpc":"2.0","result":{"hash":"0xd9518e322440714b0564d6f84a9a39b527b5480e4e7f7932895777a4c8fa0a9e","size":518,"version":0,"previousblockhash":"0xa496577895eb8c227bb866dc44f99f21c0cf06417ca8f2a877cc5d761a50dac0","merkleroot":"0x2b0f84636d814f3a952de145c8f4028f5664132f2719f5902e1884c9fba59806","time":1596101407001,"index":1,"nextconsensus":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","witnesses":[{"invocation":"DEANAGtuw7+VLVNvmpESGL4+xqlKgBSIWmMBEtABi86ixft2Q7AcaOC89M+yKVIuTel9doVJcCvfx93CcQ63DZqCDEBtwUEkjuzP9h8ZTL0GEKfGr01pazmh8s2TswJge5sAGryYE/+kjw5NCLFmowhPU73qUYQ9jq1zMNMXF+Deqxp/DEDkytkkwJec5n4x2+l5zsZHT6QTXJsByZOWXaGPVJKK8CeDccZba7Mf4MdSkWqSt61xUtlgM2Iqhe/Iuokf/ZEXDEAOH72S12CuAxVu0XNGyj3cgMtad+Bghxvr16T9+ELaWkpR4ko26FdStYC2XiCkzanXTtAD1Id5rREsxfFeKb83","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}],"confirmations":6,"nextblockhash":"0x003abea54aa3c5edba7e33fb7ca96452cb65ff8cd36ce1cdfd412a6c4d3ea38a"}}` +const header1Verbose = `{"id":5,"jsonrpc":"2.0","result":{"hash":"0xea6385e943832b65ee225aaeb31933a97f3362505ab84cfe5dbd91cd1672b9b7","size":451,"version":0,"previousblockhash":"0x9e7cf6fcfc8d0d6831fac75fa895535a5f1960f45a34754b57bff4d4929635c5","merkleroot":"0x07a982b6d287d1abbb62bdbfccc540e9e21390bed3a071fd854a348cec6a6ba2","time":1614602006001,"index":1,"nextconsensus":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","witnesses":[{"invocation":"DEBUsre4rmqvJm/6MG4fR0GftVT6xjO05uPWyPrn9rPW/ZcKuUuUvbPYt4dxxGefuMBdQTSbzSrtADERbKHMk8D9DEA4JwDK1q9NM+/S5D6uGgFFe/LFpoR1IJmrRUMkI20jg72IVer5D74YmPMDTjPhBmjsoIHwoPxqu4Fzr2Lo+irDDEBHt3M3UMCT0bVEK5JnHtftT+qol9PtZrhSz2Sr/jQBWkmDCvRE1QZZ/VeHwrnd/63PDVS0dkygjlhnIm0wSJBj","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}],"confirmations":6,"nextblockhash":"0x85ab779bc19247aa504c36879ce75cb7f662b4e8067fbc83e5d24ef0afd9a84f"}}` -const txMoveNeoVerbose = `{"id":5,"jsonrpc":"2.0","result":{"blockhash":"0xd9518e322440714b0564d6f84a9a39b527b5480e4e7f7932895777a4c8fa0a9e","confirmations":6,"blocktime":1596101407001,"vmstate":"","hash":"0x32f9bd3a2707475407c41bf5daacf9560e25ed74f6d85b3afb2ef72edb2325ba","size":555,"version":0,"nonce":2,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"10000000","netfee":"4488350","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"Ahjd9QUMFKqKz4WdT+QCs05nPyFWgheWpIjrDBReEr6oeuuVWIT2+c54RYzMuXwwlRPADAh0cmFuc2ZlcgwUJQWey0h406h1+RxRzt7TMNRXX95BYn1bUjg=","witnesses":[{"invocation":"DEAIcSUsAtRql4t+IEeo+p4+YI7bA6PG+1xxUkPIb2vNlaMl4PumjQVFT+bg2ldxCYa6zccoc4n0Gfryi82EhGpGDECR4fQDr4njo94mF6/GA+OH0Y5k735yGMEZHs96586BRp6f0AQxfmIPvLcS4Yero9p0zgVl9BDg3TxU5piRylR5DEAcjOT7JjEwNRnKgDDkXfh63Yc3MorMbdb2asTiDu0aexy5M5XcikA1jypJT4wkhxjp0rrgFZRSzeYhwV0Klz+yDECIopKxLd4p+hLHxFq07WffXd++sN0WIRWzvMJncCrJqSP8zz65r8TGFFzvZMdGelWKO7KhBOhIK6wryuWNlaDI","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]}}` +const txMoveNeoVerbose = `{"id":5,"jsonrpc":"2.0","result":{"blockhash":"0xea6385e943832b65ee225aaeb31933a97f3362505ab84cfe5dbd91cd1672b9b7","confirmations":6,"blocktime":1614602006001,"vmstate":"HALT","hash":"0x7c10b90077bddfe9095b2db96bb4ac33994ed1ca99c805410f55c771eee0b77b","size":489,"version":0,"nonce":2,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"11000000","netfee":"4422930","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"CwIY3fUFDBSqis+FnU/kArNOZz8hVoIXlqSI6wwUXhK+qHrrlViE9vnOeEWMzLl8MJUUwB8MCHRyYW5zZmVyDBSDqwZ5rVXAUKE61D9ZNupz9ese9kFifVtSOQ==","witnesses":[{"invocation":"DECKEAHrkcuS4I+DGIrhfbS4QHmISn+j63M3Gyhnlps/ijVlCyPpkG3gzxVht5hsD5EgRC1alTK1DaooGS35SYTcDEAbqjpPMa1ZQMeQOVWvRZTIbt4qPsCK7mz6Fja9LJJQSoePB/cN1hz30xQUgFvDPXj6Lv01VzONF/lNO38vrPvDDECJcNQCl/35Na59Rqo2TqjZoVY0D5uk5Owm9X83gWuG2iBMuQ5mmjPGsodLZvDd1XPCTUsJyvdbyFzxvwPUSkyr","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]}}` // getResultBlock1 returns data for block number 1 which is used by several tests. func getResultBlock1() *result.Block { @@ -69,14 +69,14 @@ func getResultBlock1() *result.Block { if err != nil { panic(err) } - b2Hash, err := util.Uint256DecodeStringLE("003abea54aa3c5edba7e33fb7ca96452cb65ff8cd36ce1cdfd412a6c4d3ea38a") + b2Hash, err := util.Uint256DecodeStringLE("85ab779bc19247aa504c36879ce75cb7f662b4e8067fbc83e5d24ef0afd9a84f") if err != nil { panic(err) } return &result.Block{ Block: *b, BlockMetadata: result.BlockMetadata{ - Size: 1641, + Size: 1433, NextBlockHash: &b2Hash, Confirmations: 6, }, @@ -99,6 +99,7 @@ func getTxMoveNeo() *result.TransactionOutputRaw { Timestamp: b1.Timestamp, Blockhash: b1.Block.Hash(), Confirmations: int(b1.Confirmations), + VMState: "HALT", }, } } @@ -170,8 +171,6 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ serverResponse: b1Verbose, result: func(c *Client) interface{} { res := getResultBlock1() - // update hidden hash value. - _ = res.Block.ConsensusData.Hash() return res }, }, @@ -202,8 +201,6 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ serverResponse: b1Verbose, result: func(c *Client) interface{} { res := getResultBlock1() - // update hidden hash value. - _ = res.Block.ConsensusData.Hash() return res }, }, @@ -266,7 +263,7 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ b := getResultBlock1() return &result.Header{ Hash: b.Hash(), - Size: 518, + Size: 451, Version: b.Version, NextBlockHash: b.NextBlockHash, PrevBlockHash: b.PrevHash, @@ -582,7 +579,7 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ { name: "verbose_positive", invoke: func(c *Client) (interface{}, error) { - hash, err := util.Uint256DecodeStringLE("8185b0db7ed77190b93ac8bd44896822cd8f3cfcf702b3f50131e0efd200ef96") + hash, err := util.Uint256DecodeStringLE("7c10b90077bddfe9095b2db96bb4ac33994ed1ca99c805410f55c771eee0b77b") if err != nil { panic(err) } diff --git a/pkg/rpc/client/wsclient_test.go b/pkg/rpc/client/wsclient_test.go index 81c1291aa..20a30edc2 100644 --- a/pkg/rpc/client/wsclient_test.go +++ b/pkg/rpc/client/wsclient_test.go @@ -118,7 +118,7 @@ func TestWSClientEvents(t *testing.T) { `{"jsonrpc":"2.0","method":"transaction_executed","params":[{"container":"0xe1cd5e57e721d2a2e05fb1f08721b12057b25ab1dd7fd0f33ee1639932fdfad7","trigger":"Application","vmstate":"HALT","gasconsumed":"22910000","stack":[],"notifications":[{"contract":"0x1b4357bff5a01bdf2a6581247cf9ed1e24629176","eventname":"contract call","state":{"type":"Array","value":[{"type":"ByteString","value":"dHJhbnNmZXI="},{"type":"Array","value":[{"type":"ByteString","value":"dpFiJB7t+XwkgWUq3xug9b9XQxs="},{"type":"ByteString","value":"MW6FEDkBnTnfwsN9bD/uGf1YCYc="},{"type":"Integer","value":"1000"}]}]}},{"contract":"0x1b4357bff5a01bdf2a6581247cf9ed1e24629176","eventname":"transfer","state":{"type":"Array","value":[{"type":"ByteString","value":"dpFiJB7t+XwkgWUq3xug9b9XQxs="},{"type":"ByteString","value":"MW6FEDkBnTnfwsN9bD/uGf1YCYc="},{"type":"Integer","value":"1000"}]}}]}]}`, `{"jsonrpc":"2.0","method":"notification_from_execution","params":[{"contract":"0x1b4357bff5a01bdf2a6581247cf9ed1e24629176","eventname":"contract call","state":{"type":"Array","value":[{"type":"ByteString","value":"dHJhbnNmZXI="},{"type":"Array","value":[{"type":"ByteString","value":"dpFiJB7t+XwkgWUq3xug9b9XQxs="},{"type":"ByteString","value":"MW6FEDkBnTnfwsN9bD/uGf1YCYc="},{"type":"Integer","value":"1000"}]}]}}]}`, `{"jsonrpc":"2.0","method":"transaction_executed","params":[{"container":"0xf97a72b7722c109f909a8bc16c22368c5023d85828b09b127b237aace33cf099","trigger":"Application","vmstate":"HALT","gasconsumed":"6042610","stack":[],"notifications":[{"contract":"0xe65ff7b3a02d207b584a5c27057d4e9862ef01da","eventname":"contract call","state":{"type":"Array","value":[{"type":"ByteString","value":"dHJhbnNmZXI="},{"type":"Array","value":[{"type":"ByteString","value":"MW6FEDkBnTnfwsN9bD/uGf1YCYc="},{"type":"ByteString","value":"IHKCdK+vw29DoHHTKM+j5inZy7A="},{"type":"Integer","value":"123"}]}]}},{"contract":"0xe65ff7b3a02d207b584a5c27057d4e9862ef01da","eventname":"transfer","state":{"type":"Array","value":[{"type":"ByteString","value":"MW6FEDkBnTnfwsN9bD/uGf1YCYc="},{"type":"ByteString","value":"IHKCdK+vw29DoHHTKM+j5inZy7A="},{"type":"Integer","value":"123"}]}}]}]}`, - `{"jsonrpc":"2.0","method":"block_added","params":[{"size":1641,"nextblockhash":"0x003abea54aa3c5edba7e33fb7ca96452cb65ff8cd36ce1cdfd412a6c4d3ea38a","confirmations":6,"hash":"0xd9518e322440714b0564d6f84a9a39b527b5480e4e7f7932895777a4c8fa0a9e","version":0,"previousblockhash":"0xa496577895eb8c227bb866dc44f99f21c0cf06417ca8f2a877cc5d761a50dac0","merkleroot":"0x2b0f84636d814f3a952de145c8f4028f5664132f2719f5902e1884c9fba59806","time":1596101407001,"index":1,"nextconsensus":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","witnesses":[{"invocation":"DEANAGtuw7+VLVNvmpESGL4+xqlKgBSIWmMBEtABi86ixft2Q7AcaOC89M+yKVIuTel9doVJcCvfx93CcQ63DZqCDEBtwUEkjuzP9h8ZTL0GEKfGr01pazmh8s2TswJge5sAGryYE/+kjw5NCLFmowhPU73qUYQ9jq1zMNMXF+Deqxp/DEDkytkkwJec5n4x2+l5zsZHT6QTXJsByZOWXaGPVJKK8CeDccZba7Mf4MdSkWqSt61xUtlgM2Iqhe/Iuokf/ZEXDEAOH72S12CuAxVu0XNGyj3cgMtad+Bghxvr16T9+ELaWkpR4ko26FdStYC2XiCkzanXTtAD1Id5rREsxfFeKb83","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}],"consensusdata":{"primary":0,"nonce":"0000000000000457"},"tx":[{"hash":"0x32f9bd3a2707475407c41bf5daacf9560e25ed74f6d85b3afb2ef72edb2325ba","size":555,"version":0,"nonce":2,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"10000000","netfee":"4488350","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"Ahjd9QUMFKqKz4WdT+QCs05nPyFWgheWpIjrDBReEr6oeuuVWIT2+c54RYzMuXwwlRPADAh0cmFuc2ZlcgwUJQWey0h406h1+RxRzt7TMNRXX95BYn1bUjg=","witnesses":[{"invocation":"DEAIcSUsAtRql4t+IEeo+p4+YI7bA6PG+1xxUkPIb2vNlaMl4PumjQVFT+bg2ldxCYa6zccoc4n0Gfryi82EhGpGDECR4fQDr4njo94mF6/GA+OH0Y5k735yGMEZHs96586BRp6f0AQxfmIPvLcS4Yero9p0zgVl9BDg3TxU5piRylR5DEAcjOT7JjEwNRnKgDDkXfh63Yc3MorMbdb2asTiDu0aexy5M5XcikA1jypJT4wkhxjp0rrgFZRSzeYhwV0Klz+yDECIopKxLd4p+hLHxFq07WffXd++sN0WIRWzvMJncCrJqSP8zz65r8TGFFzvZMdGelWKO7KhBOhIK6wryuWNlaDI","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]},{"hash":"0xd35d6386ec2f29b90839536f6af9466098d1665e951cdd0a20db6b4629b08369","size":559,"version":0,"nonce":3,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"10000000","netfee":"4492350","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"AwDodkgXAAAADBSqis+FnU/kArNOZz8hVoIXlqSI6wwUXhK+qHrrlViE9vnOeEWMzLl8MJUTwAwIdHJhbnNmZXIMFLyvQdaEx9StbuDZnalwe50fDI5mQWJ9W1I4","witnesses":[{"invocation":"DECKUPl9d502XPI564EC2BroqpN274uV3n1z6kCBCmbS715lzmPbh24LESMsAP2TFohhdhm16aDfNsPi5tkB/FE4DEDzJFts9VYc1lIivGAZZSxACzAV/96Kn2WAaS3bDIlAJHCShsfz+Rn3NuvMyutujYM4vyEipAX9gkjcvFWGKRObDECkI883onhG9aYTxwQWDxsmofuiooRJOic/cJ1H8nqUEvMqATYKgdHaBOJBVYsKq9M9oUv/fj6JFbMDrcasvpiaDECEqkq2b50aEc1NGM9DBAsYLEeZHrM1BwX3a2tBOeeD/KLtmTga1IZogsZgpis2BOToZO6LuN9FJYcn+/iGcC5u","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]}]}]}`, + `{"jsonrpc":"2.0","method":"block_added","params":[{"size":1433,"nextblockhash":"0x85ab779bc19247aa504c36879ce75cb7f662b4e8067fbc83e5d24ef0afd9a84f","confirmations":6,"hash":"0xea6385e943832b65ee225aaeb31933a97f3362505ab84cfe5dbd91cd1672b9b7","version":0,"previousblockhash":"0x9e7cf6fcfc8d0d6831fac75fa895535a5f1960f45a34754b57bff4d4929635c5","merkleroot":"0x07a982b6d287d1abbb62bdbfccc540e9e21390bed3a071fd854a348cec6a6ba2","time":1614602006001,"index":1,"nextconsensus":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","primary":0,"witnesses":[{"invocation":"DEBUsre4rmqvJm/6MG4fR0GftVT6xjO05uPWyPrn9rPW/ZcKuUuUvbPYt4dxxGefuMBdQTSbzSrtADERbKHMk8D9DEA4JwDK1q9NM+/S5D6uGgFFe/LFpoR1IJmrRUMkI20jg72IVer5D74YmPMDTjPhBmjsoIHwoPxqu4Fzr2Lo+irDDEBHt3M3UMCT0bVEK5JnHtftT+qol9PtZrhSz2Sr/jQBWkmDCvRE1QZZ/VeHwrnd/63PDVS0dkygjlhnIm0wSJBj","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}],"tx":[{"hash":"0x7c10b90077bddfe9095b2db96bb4ac33994ed1ca99c805410f55c771eee0b77b","size":489,"version":0,"nonce":2,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"11000000","netfee":"4422930","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"CwIY3fUFDBSqis+FnU/kArNOZz8hVoIXlqSI6wwUXhK+qHrrlViE9vnOeEWMzLl8MJUUwB8MCHRyYW5zZmVyDBSDqwZ5rVXAUKE61D9ZNupz9ese9kFifVtSOQ==","witnesses":[{"invocation":"DECKEAHrkcuS4I+DGIrhfbS4QHmISn+j63M3Gyhnlps/ijVlCyPpkG3gzxVht5hsD5EgRC1alTK1DaooGS35SYTcDEAbqjpPMa1ZQMeQOVWvRZTIbt4qPsCK7mz6Fja9LJJQSoePB/cN1hz30xQUgFvDPXj6Lv01VzONF/lNO38vrPvDDECJcNQCl/35Na59Rqo2TqjZoVY0D5uk5Owm9X83gWuG2iBMuQ5mmjPGsodLZvDd1XPCTUsJyvdbyFzxvwPUSkyr","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]},{"hash":"0x41846075f4c5aec54d70b476befb97b35696700454b1168e1ae8888d8fb204a3","size":493,"version":0,"nonce":3,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"11000000","netfee":"4426930","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"CwMA6HZIFwAAAAwUqorPhZ1P5AKzTmc/IVaCF5akiOsMFF4Svqh665VYhPb5znhFjMy5fDCVFMAfDAh0cmFuc2ZlcgwUKLOtq3Jp+cIYHbPLdB6/VRkw4nBBYn1bUjk=","witnesses":[{"invocation":"DEA7aJyGTIq0pV20LzVWOCreh6XIxLUCWHVgUFsCTxPOPdqtZBHKnejng3d2BRm/lecTyPLeq7KpRCD9awRvadFWDEBjVZRvSGtGcOEjtUxl4AH5XelYlIUG5k+x3QyYKZtWQc96lUX1hohrNkCmWeWNwC2l8eJGpUxicM+WZGODCVp8DEDbQxvmqRTQ+flc6JetmaqHyw8rfoeQNtmEFpw2cNhyAo5L5Ilp2wbVtJNOJPfw72J7E6FhTK8slIKRqXzpdnyK","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]}]}]}`, `{"jsonrpc":"2.0","method":"event_missed","params":[]}`, } srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { diff --git a/pkg/rpc/server/server_test.go b/pkg/rpc/server/server_test.go index 8e800d17b..7124f2702 100644 --- a/pkg/rpc/server/server_test.go +++ b/pkg/rpc/server/server_test.go @@ -60,8 +60,8 @@ type rpcTestCase struct { } const testContractHash = "500858b96054d3c302078882c30e76915aac1c83" -const deploymentTxHash = "fbea49056332ecf1482568e24ed745151ed3fcacbb59afc22d9baff5346e6257" -const genesisBlockHash = "0542f4350c6e236d0509bcd98188b0034bfbecc1a0c7fcdb8e4295310d468b70" +const deploymentTxHash = "e5503038c2cd602c100690e266b75e2a9d3dda90a63791fd5ab3008ff053eaae" +const genesisBlockHash = "9e7cf6fcfc8d0d6831fac75fa895535a5f1960f45a34754b57bff4d4929635c5" const verifyContractHash = "03ffc0897543b9b709e0f8cab4a7682dae0ba943" const verifyContractAVM = "570300412d51083021700c14aa8acf859d4fe402b34e673f2156821796a488ebdb30716813cedb2869db289740" diff --git a/pkg/rpc/server/subscription.go b/pkg/rpc/server/subscription.go index e36f4d1b8..af06839cb 100644 --- a/pkg/rpc/server/subscription.go +++ b/pkg/rpc/server/subscription.go @@ -54,7 +54,7 @@ func (f *feed) Matches(r *response.Notification) bool { case response.BlockEventID: filt := f.filter.(request.BlockFilter) b := r.Payload[0].(*block.Block) - return int(b.ConsensusData.PrimaryIndex) == filt.Primary + return int(b.PrimaryIndex) == filt.Primary case response.TransactionEventID: filt := f.filter.(request.TxFilter) tx := r.Payload[0].(*transaction.Transaction) diff --git a/pkg/rpc/server/subscription_test.go b/pkg/rpc/server/subscription_test.go index 55800466e..58f4dc6d3 100644 --- a/pkg/rpc/server/subscription_test.go +++ b/pkg/rpc/server/subscription_test.go @@ -306,8 +306,7 @@ func TestFilteredBlockSubscriptions(t *testing.T) { require.Equal(t, response.BlockEventID, resp.Event) rmap := resp.Payload[0].(map[string]interface{}) - cd := rmap["consensusdata"].(map[string]interface{}) - primary := cd["primary"].(float64) + primary := rmap["primary"].(float64) require.Equal(t, 3, int(primary)) } diff --git a/pkg/rpc/server/testdata/testblocks.acc b/pkg/rpc/server/testdata/testblocks.acc index 6fc740d620562b196e3bc8475ad58b4e524119ad..3bd6b5394daab5eb85ba2a12ccdab1c0becb42af 100644 GIT binary patch delta 3250 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 jdj<jH;vVJ5Vtam%BH_6p{Vy zjzq6~{q;UY26K+dZ^F0gFsa<_z@B!Unu8!NlWC!G*V+l5*vA$kdBY0BF#@ zx>h1{KVk+_)==h}=7LPRXD2}$c}WVYlC)GKN#b88blZx-N zn#Jlil3E%W7|AzSlHjxuvm?KS%DZR=XwhWY@7Hv6@RUC+o$PUsHX*$8x(V0p$zP(A zFBco{Q?(i?+LC$NXCGmGhTmGb4B)8R^@xb{1!NZ!tcZ$M|-Jg|*d}ZN2s#({(zvwrP`uz{;}9 zZ|=+YcP0lN0MMiCv{sLN<~qXP7kgXFDCW$=z;gE!gkJasDW3?Vz8nvE8a3WFfD*g5 zR8`f>1$9h~92qyv7rDzTQ&BJ;xD!$i>wqwi~!{W`wYm1LR@Phu^i+qdTj_d|YA&bGg z$pUaVxt-pGe3aoGnIC3I9$?TdUxUAgf<*95lIbO(#TCmqHxfd~O)q)S36|aC5ZUe0 zJ)XtrbfRLkK`nZwGPYhX?c8=8%CW`DBt(-{nC`Uh=^v`x8{|+yadbZPcT-~edYJp4 za=TK4j`6JeZ73+n&FR+?ou{7!C8GT|9d0~V#GYtYEr#CNy&QFgp!8_N&_h68yCb;X z!sCTFQt5WsVN+-inzET`6k5w`A$`xn8_de%Uzo47B1MjuM|Pi2RO)m*=nd?tkuCtdn;2J8^eJB&B5GT}mMmFA*IbYKL}O>_ z9Q6Zm^aUA+5^(9a&WdCGS`&N}zAa3>++6wN=1b89{g@bG$Ia??at99K>V;3vFE~_N2?cZ*B!naF`lV-Wj#<}$fGn+GOXnFCh`w`|h zEbf0cWrJlD{rZqA%AINH)Ku2sem*8Y=+xK3KuATD{h4l3ijLZ6`Po@0zqpl{es|-E zhOvnlHLlK9#0e2xr?ghb7!!|xC1%7w{E+L&0hb_S;Y2@S?`!4mJyEsMcM4BK77R1v z=hBE){pWa~A{q_m8j_QaPU8ZBET(F?alVGN(i-N5(P-fH!^M$DY6$@NeB;<|RmLwH zB)7&K-tE>ZuZ6CY*-mTPh_742|>4RL)_M(^DD$I(J?pHRM7ycO<+Ax#o$ zLb!PP~-^sB)ta0Jb>yOJj=?`;>btxe?xK#1z(;>FHX z-_`CL&!qfK{2)p)nIva>GLiA2 zTxrO_Wgh@kTGXj1I;AZ1!rXW3ibNvFimljhvUa&yYp`ghD+LmCrpm{)WOUk3P~q;i zfhBe9X@Gutd?RS!URshnqJJI6ORzn48U)FbeaZArnx0aZ)tgJIk?hYY6mb&u!3(fqLIpjVu@bSIyn=h_F zsK=L<5)Qp!2VO^)6w?JZxSv?N=wS*Q1Jj_Rk~vQo9_3o}LmWJ$TPX3iYzFg`xl=b7 zco1H7-%hAM7zl`<@$@y#3zzVqY03h?5Tj#``ymKPP1Bg-eQS;9i4>b^omW0r6>wVB zixil6R?ekc=v1RQu6-`6q0|aC`}n8fb>vJ-EdaW4zuV_f&ZYbK`5ZvH zR)59j6<*Z&iL9;%QY=ts@V`Idbin^`+M}4P<9uRr_r^-}Zj>`@hF<;C1A?m2ZxA^gd-JZcE6K#{i{{vM|jj z6c+7E+}WS&#@~|J&zz3nGEpUz*NrF4WR0tBTTXB}cvr4nRW_t{d;~zR(@%~&5-TSa zG}03Ifu82-hknCkJb&0U58u$>gU62K?A(UWm@TpMS`o$@Z7m8eZ_97LW8}4xWY%*s zMGDcM1waC;0})1Hzs%HnT(T=jS zQ4%gt>A#2!t6pJc5G>|ugbA5uwkw~X4nZKte)jr+G zooz@^*#t~UZb&T`SMSiX35@;Fn1?B%`Etb$Zd{OPQnDPpV74uArjpP@rKTv^nTPa` zA(c6hjt-9iP=`P?&PQdNW4@G$JZDdt4ZnR>2$C8=S&%pS*@^RSFppdp70(;@P|5O*U2crSN|6e)3>-nFQ1Avx8eczv{NHbi{)SY>; zhw*P_tfG}oRi3<~PD+h#5;$Y9^;iRl{qVf+&3Q+A+4?mZk_QW^6r)|imR$N)4s0+O O;Uo*ux{^N&d;AL$SM5^( diff --git a/scripts/gendump/main.go b/scripts/gendump/main.go index 977cae05a..05646b334 100644 --- a/scripts/gendump/main.go +++ b/scripts/gendump/main.go @@ -168,10 +168,6 @@ func newBlock(bc *core.Blockchain, lastBlock *block.Block, script []byte, txs .. NextConsensus: witness.ScriptHash(), Script: witness, }, - ConsensusData: block.ConsensusData{ - PrimaryIndex: 0, - Nonce: 1111, - }, Transactions: txs, } if bc.GetConfig().StateRootInHeader {