From d7a2ab52a165e19a6595758f1e6e34a0efcd1221 Mon Sep 17 00:00:00 2001 From: Ori Newman Date: Mon, 13 May 2019 16:23:28 +0300 Subject: [PATCH] [NOD-173] Add UTXO commitment to block header (#297) --- blockdag/blocknode.go | 3 +++ blockdag/common_test.go | 1 + blockdag/dag_test.go | 6 +++-- blockdag/dagio.go | 1 + blockdag/example_test.go | 2 +- blockdag/testdata/blk_0_to_4.dat | Bin 1948 -> 2108 bytes blockdag/testdata/blk_3A.dat | Bin 457 -> 489 bytes blockdag/testdata/blk_3B.dat | Bin 344 -> 376 bytes blockdag/testdata/blk_3C.dat | Bin 376 -> 408 bytes blockdag/testdata/blk_3D.dat | Bin 502 -> 534 bytes blockdag/validate_test.go | 28 ++++++++++++++++---- dagconfig/genesis.go | 26 +++++++++--------- dagconfig/genesis_test.go | 8 ++++-- database/example_test.go | 2 +- database/ffldb/blockio_test.go | 4 +-- database/ffldb/db_test.go | 4 +-- database/testdata/blocks1-256.bz2 | Bin 9978 -> 9972 bytes database/testdata/generator.go | 1 + integration/rpctest/blockgen.go | 1 + mempool/estimatefee_test.go | 7 ++++- mining/mining.go | 1 + mining/simulator/mineloop.go | 2 +- peer/peer_test.go | 4 +-- util/block_test.go | 18 ++++++++----- util/bloom/filter_test.go | 4 +++ util/bloom/merkleblock_test.go | 10 ++++++- wire/bench_test.go | 4 +-- wire/blockheader.go | 14 +++++++--- wire/blockheader_test.go | 18 ++++++++++--- wire/common_test.go | 7 +++++ wire/message_test.go | 6 ++--- wire/msgblock_test.go | 42 ++++++++++++++++++++---------- wire/msgheaders_test.go | 28 ++++++++++++++++---- wire/msgmerkleblock_test.go | 36 ++++++++++++++++--------- 34 files changed, 206 insertions(+), 82 deletions(-) diff --git a/blockdag/blocknode.go b/blockdag/blocknode.go index 7e1ee6ef3..4ed64992b 100644 --- a/blockdag/blocknode.go +++ b/blockdag/blocknode.go @@ -104,6 +104,7 @@ type blockNode struct { hashMerkleRoot *daghash.Hash idMerkleRoot *daghash.Hash acceptedIDMerkleRoot *daghash.Hash + utxoCommitment *daghash.Hash // status is a bitfield representing the validation state of the block. The // status field, unlike the other fields, may be written to and so should @@ -132,6 +133,7 @@ func initBlockNode(node *blockNode, blockHeader *wire.BlockHeader, parents block node.hashMerkleRoot = blockHeader.HashMerkleRoot node.idMerkleRoot = blockHeader.IDMerkleRoot node.acceptedIDMerkleRoot = blockHeader.AcceptedIDMerkleRoot + node.utxoCommitment = blockHeader.UTXOCommitment } else { node.hash = &daghash.ZeroHash } @@ -183,6 +185,7 @@ func (node *blockNode) Header() *wire.BlockHeader { HashMerkleRoot: node.hashMerkleRoot, IDMerkleRoot: node.idMerkleRoot, AcceptedIDMerkleRoot: node.acceptedIDMerkleRoot, + UTXOCommitment: node.utxoCommitment, Timestamp: time.Unix(node.timestamp, 0), Bits: node.bits, Nonce: node.nonce, diff --git a/blockdag/common_test.go b/blockdag/common_test.go index 41f1f38c6..c0954d45e 100644 --- a/blockdag/common_test.go +++ b/blockdag/common_test.go @@ -207,6 +207,7 @@ func newTestNode(parents blockSet, blockVersion int32, bits uint32, timestamp ti HashMerkleRoot: &daghash.ZeroHash, IDMerkleRoot: &daghash.ZeroHash, AcceptedIDMerkleRoot: &daghash.ZeroHash, + UTXOCommitment: &daghash.ZeroHash, } return newBlockNode(header, parents, phantomK) } diff --git a/blockdag/dag_test.go b/blockdag/dag_test.go index 3e3b56494..755665634 100644 --- a/blockdag/dag_test.go +++ b/blockdag/dag_test.go @@ -192,10 +192,10 @@ func TestHaveBlock(t *testing.T) { {hash: dagconfig.SimNetParams.GenesisHash.String(), want: true}, // Block 3b should be present (as a second child of Block 2). - {hash: "3a81c2f7064370dddaeaf7bc7e4d282702cefb2b6e11c84942c3791c76cdd3e8", want: true}, + {hash: "0a20af2fa5ce154a60faca96e9fa125fc52e0ca8f98484708d0413203626edaf", want: true}, // Block 100000 should be present (as an orphan). - {hash: "746deb238f38dfc82ea2e1dbd85c079ceb581fc2912aae37d6c3675a12545df4", want: true}, + {hash: "18bcf45b8c0dbccd7690a728f3486c6d5fc84971688f89f4554297b6a278e554", want: true}, // Random hashes should not be available. {hash: "123", want: false}, @@ -558,6 +558,7 @@ func chainedNodes(parents blockSet, numNodes int) []*blockNode { IDMerkleRoot: &daghash.ZeroHash, HashMerkleRoot: &daghash.ZeroHash, AcceptedIDMerkleRoot: &daghash.ZeroHash, + UTXOCommitment: &daghash.ZeroHash, } header.ParentHashes = tips.hashes() nodes[i] = newBlockNode(&header, tips, dagconfig.SimNetParams.K) @@ -908,6 +909,7 @@ func TestValidateFeeTransaction(t *testing.T) { HashMerkleRoot: BuildHashMerkleTreeStore(utilTxs).Root(), IDMerkleRoot: BuildIDMerkleTreeStore(utilTxs).Root(), AcceptedIDMerkleRoot: &daghash.ZeroHash, + UTXOCommitment: &daghash.ZeroHash, }, Transactions: transactions, } diff --git a/blockdag/dagio.go b/blockdag/dagio.go index 359cf727f..d4ac0a636 100644 --- a/blockdag/dagio.go +++ b/blockdag/dagio.go @@ -625,6 +625,7 @@ func (dag *BlockDAG) deserializeBlockNode(blockRow []byte) (*blockNode, error) { hashMerkleRoot: header.HashMerkleRoot, idMerkleRoot: header.IDMerkleRoot, acceptedIDMerkleRoot: header.AcceptedIDMerkleRoot, + utxoCommitment: header.UTXOCommitment, } node.children = newSet() diff --git a/blockdag/example_test.go b/blockdag/example_test.go index 70154f423..994c12071 100644 --- a/blockdag/example_test.go +++ b/blockdag/example_test.go @@ -67,5 +67,5 @@ func ExampleBlockDAG_ProcessBlock() { fmt.Printf("Block accepted. Is it an orphan?: %v", isOrphan) // Output: - // Failed to process block: already have block 4aa46622896ef2f0c59aaff0c05f87984a3e640a8e79f9167f4c1b959fd14706 + // Failed to process block: already have block 5804d0207bdbfd88dd035271fab95944585eb57017b0709d5a0a10a7edb37795 } diff --git a/blockdag/testdata/blk_0_to_4.dat b/blockdag/testdata/blk_0_to_4.dat index 5960849714f2ef9b507fa250939d75d91c926333..ed95364c7858de92bb4e73951c37bf091db8c9b6 100644 GIT binary patch literal 2108 zcmeylZ_7&CN(SzOl-fp

$QZh6XXB4a|y|V z%%B7;u)Prj(*OT|y#m-lKsLy65Z8fZaDo3oz{kMAtsh_%?4h4jlANLs5&{86hEJ?o zU_%0N=?01a1O`L_#8LsqspXsBE*Id6np?0zykKiwgiGYkUxh);cRT*xu2#6f5-~Z= zX8qR8TQ?_cj61gCP@Axv=Ksadwn?npWpMTA(iQo!gyiu#gc!MnNC5>?&qRDc1qMx8u`-TBGG~rTUfL0P>;)lttS%rya1m0tGePw+ z6CdtDL6n9&p#TB}IC0?)cJ?<#0gyv$H<-@4C&9c%CfB}zosJiD1c_2LA}+3j)K z{&l~FXWbPI(h=NtE+j;^cIWa?Mb7Wq;&()z?Ow4#aZC9ATNX)`F-I@#R1|pW&iu|k z<%tL(d3+8bMs6`>5gi;%X+#qWAQB_`I!Cs7+UmJ%oD%2qV>VxSb!6$wzdHQ<)>G~* zNYI)Qw1H+39hj~Zxo)2FhRPPR0P#r%#qkoV;%{dpaNdlV5%FzdQ1q{CNhfjH(N@+{H9)Emj zvP9s~2Xh+-SGLBR%b)*zWh%?uZ}?o^S5aXQn6rwk5qcFH^th-^l&o{^q3B%ax3F z_5H2d>=?h@dsfY|7+;$&9yyMGIlpnItgWieUH`#!BO!UbE&)o;!V<2`#D{B85T)Tt zC;&hKN?f>tT|KvT&GFY=3+>hP&YujbeLuaYd7fKl(p|3H?|07qs9O3F93IeELSzKV zvXvsX@7xRXY<`8`cNH`#US_DbZ{26Xjy3qg4<#bqCPcV!yH0J9&GoP5zvuM+$^0hv z;#cD5oaRruwXyW3TlSWsW=%W)im3nW$GhU!u32rX8-0eSGNbiN?@NVnh6+OR_#6U~ zn~fBaOi;xnL}YLm1qUX{+b5aY~%akJ)_T)sdwy|LXAbTTi*OAVF(J z&<3y1FyTiT>LXmZt)*h%_oH9p>czgnu8RPtfWU|NC>47NhknFjL2n%6`%L~ jRh$1)jfacTuzu3=BX!k|c2UQ6a|R@@SocqqLPB(FcPB@W0ga{XI*QqVCx&GDs_nh88ncu`-{7U?s)BH)dHkRIW zn}7Z7qPzG13bqKm`r7g<*ud78)o04YtC`C@)69=ld6W^7pIE5CJDcl549K?s|LYYP PC+;dyAY|!eKgQVryc18O diff --git a/blockdag/testdata/blk_3B.dat b/blockdag/testdata/blk_3B.dat index c76b58251afc5b188706c4e438c0e3e84f82c781..551991afcd311891b4362c0932d83d199d0132f3 100644 GIT binary patch literal 376 zcmeylZ_CXBMg|ZNV61s|Gk@yE36`_lh;Hr9<)Mo6HvM>- zQXTc{a+v>xSsim9AJ&^^_{6FOHY5;>Mz|1I1)%@}nFn+o1i-ao GV*mi$zGwOX literal 344 zcmeylZ_CX9Mg|ZNV04=h;lk}YwM919zncG^)B7j$o7jtAiJxt-e?N=P1T4IW}P*M%66^#A|$3QSOSOd!WW z90(P`M*Rl@zThx!{Q#q25B;Q)X8zQR6D()9$7%c5{T7~eS2RdRaND_%5Z&6H%R?3S`keU0 z*C%<_cIS`ImER>c1TXOr%{Vu&U02Wjjl-sFr^MxVjaEM|>D?~8_Q#7gTb|7;o2b;E zdG-5>;7un}(>dD+$%CCi0kPQjMhr;%|Nr$05I-?6Fo75_4o1tXyV1ephP9R%PrjR64To^S5aXQn6rwk5qcFH^th-^l&o{^q3B%ax4WCPcV! zyH0J9&GoP5zvuM+$^0hv;#cD5oaRruwXyW3TZ5UdoWhE!(+wnd2Js84eh8ocF?O!+ z^olE8Wm)XJp63Y3gPnngn9X$|1|#k^!j^MU)AtAc8JC}zl z9=)b=Xx&MlSjUd&x3{+G>}J@UD$v5_v9tDsbl`^{t4|SW0ga{XI*QqVCx&GDs_nh88ncu`-{7U?s)BH)dHkRIW zJF&&E^yfE@rE#2#Y}Xxo)o}RenpgaWj3Mt>mae`bzi|&C`H6)JytBD3#DHx3|G!>= QVdAb51wxii_G3H&0IaD{I{*Lx diff --git a/blockdag/validate_test.go b/blockdag/validate_test.go index 5ebcc2f02..c19c5f158 100644 --- a/blockdag/validate_test.go +++ b/blockdag/validate_test.go @@ -234,6 +234,12 @@ func TestCheckBlockSanity(t *testing.T) { 0x4e, 0x06, 0xba, 0x64, 0xd7, 0x61, 0xda, 0x25, 0x1a, 0x0e, 0x21, 0xd4, 0x64, 0x49, 0x02, 0xa2, }, + UTXOCommitment: &daghash.Hash{ + 0x80, 0xf7, 0x00, 0xe3, 0x16, 0x3d, 0x04, 0x95, + 0x5b, 0x7e, 0xaf, 0x84, 0x7e, 0x1b, 0x6b, 0x06, + 0x4e, 0x06, 0xba, 0x64, 0xd7, 0x61, 0xda, 0x25, + 0x1a, 0x0e, 0x21, 0xd4, 0x64, 0x49, 0x02, 0xa2, + }, Timestamp: time.Unix(0x5cd18053, 0), Bits: 0x207fffff, Nonce: 0x0, @@ -520,7 +526,7 @@ func TestCheckSerializedHeight(t *testing.T) { msgTx := coinbaseTx.Copy() msgTx.TxIn[0].SignatureScript = test.sigScript - msgBlock := wire.NewMsgBlock(wire.NewBlockHeader(1, []*daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, 0, 0)) + msgBlock := wire.NewMsgBlock(wire.NewBlockHeader(1, []*daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, 0, 0)) msgBlock.AddTransaction(msgTx) block := util.NewBlock(msgBlock) block.SetHeight(test.wantHeight) @@ -627,7 +633,12 @@ func TestValidateParents(t *testing.T) { b := generateNode(a) c := generateNode(genesisNode) - fakeBlockHeader := &wire.BlockHeader{IDMerkleRoot: &daghash.ZeroHash, HashMerkleRoot: &daghash.ZeroHash, AcceptedIDMerkleRoot: &daghash.ZeroHash} + fakeBlockHeader := &wire.BlockHeader{ + IDMerkleRoot: &daghash.ZeroHash, + HashMerkleRoot: &daghash.ZeroHash, + AcceptedIDMerkleRoot: &daghash.ZeroHash, + UTXOCommitment: &daghash.ZeroHash, + } // Check direct parents relation err := validateParents(fakeBlockHeader, setFromSlice(a, b)) @@ -771,9 +782,10 @@ var Block100000 = wire.MsgBlock{ 0x81, 0xb8, 0xa0, 0x68, 0x77, 0xc4, 0x02, 0x1e, 0x3c, 0xb1, 0x16, 0x8f, 0x5f, 0x6b, 0x45, 0x87, }, - Timestamp: time.Unix(0x5c404bc3, 0), - Bits: 0x207fffff, - Nonce: 0xdffffffffffffff9, + UTXOCommitment: &daghash.ZeroHash, + Timestamp: time.Unix(0x5c404bc3, 0), + Bits: 0x207fffff, + Nonce: 0xdffffffffffffff9, }, Transactions: []*wire.MsgTx{ { @@ -1068,6 +1080,12 @@ var BlockWithWrongTxOrder = wire.MsgBlock{ 0x0b, 0x79, 0xf5, 0x29, 0x6d, 0x1c, 0xaa, 0x90, 0x2f, 0x01, 0xd4, 0x83, 0x9b, 0x2a, 0x04, 0x5e, }, + UTXOCommitment: &daghash.Hash{ + 0x00, 0x69, 0x2d, 0x16, 0xb5, 0xd7, 0xe4, 0xf3, + 0xcd, 0xc7, 0xc9, 0xaf, 0xfb, 0xd2, 0x1b, 0x85, + 0x0b, 0x79, 0xf5, 0x29, 0x6d, 0x1c, 0xaa, 0x90, + 0x2f, 0x01, 0xd4, 0x83, 0x9b, 0x2a, 0x04, 0x5e, + }, Timestamp: time.Unix(0x5cd16eaa, 0), Bits: 0x207fffff, Nonce: 0x2, diff --git a/dagconfig/genesis.go b/dagconfig/genesis.go index e0972644a..377ae551c 100644 --- a/dagconfig/genesis.go +++ b/dagconfig/genesis.go @@ -41,10 +41,10 @@ var genesisCoinbaseTx = wire.NewNativeMsgTx(1, genesisTxIns, genesisTxOuts) // genesisHash is the hash of the first block in the block chain for the main // network (genesis block). var genesisHash = daghash.Hash([daghash.HashSize]byte{ - 0x06, 0x47, 0xd1, 0x9f, 0x95, 0x1b, 0x4c, 0x7f, - 0x16, 0xf9, 0x79, 0x8e, 0x0a, 0x64, 0x3e, 0x4a, - 0x98, 0x87, 0x5f, 0xc0, 0xf0, 0xaf, 0x9a, 0xc5, - 0xf0, 0xf2, 0x6e, 0x89, 0x22, 0x66, 0xa4, 0x4a, + 0x95, 0x77, 0xb3, 0xed, 0xa7, 0x10, 0x0a, 0x5a, + 0x9d, 0x70, 0xb0, 0x17, 0x70, 0xb5, 0x5e, 0x58, + 0x44, 0x59, 0xb9, 0xfa, 0x71, 0x52, 0x03, 0xdd, + 0x88, 0xfd, 0xdb, 0x7b, 0x20, 0xd0, 0x04, 0x58, }) // genesisMerkleRoot is the hash of the first transaction in the genesis block @@ -65,9 +65,10 @@ var genesisBlock = wire.MsgBlock{ HashMerkleRoot: &genesisMerkleRoot, IDMerkleRoot: &genesisMerkleRoot, AcceptedIDMerkleRoot: &daghash.Hash{}, - Timestamp: time.Unix(0x5cd00a98, 0), + UTXOCommitment: &daghash.Hash{}, + Timestamp: time.Unix(0x5cd83da0, 0), Bits: 0x207fffff, - Nonce: 0x0, + Nonce: 0x1, }, Transactions: []*wire.MsgTx{genesisCoinbaseTx}, } @@ -118,10 +119,10 @@ var devNetGenesisCoinbaseTx = genesisCoinbaseTx // devGenesisHash is the hash of the first block in the block chain for the development // network (genesis block). var devNetGenesisHash = daghash.Hash([daghash.HashSize]byte{ - 0x90, 0x9c, 0x51, 0x90, 0x39, 0x02, 0x5e, 0x11, - 0x52, 0xa6, 0x54, 0xff, 0xc8, 0x40, 0xdf, 0x67, - 0x2a, 0xe8, 0x20, 0x72, 0xed, 0x6a, 0x5e, 0x3f, - 0xf4, 0x8e, 0xf8, 0xdb, 0x02, 0x02, 0x00, 0x00, + 0x53, 0x68, 0x95, 0xd4, 0xf7, 0xc7, 0x3b, 0x94, + 0x64, 0xfa, 0x98, 0xc7, 0xcb, 0x92, 0x53, 0x71, + 0x5e, 0x14, 0xd1, 0x83, 0x01, 0xd4, 0x1e, 0x17, + 0xd4, 0xc4, 0xd3, 0x50, 0xa7, 0x64, 0x00, 0x00, }) // devNetGenesisMerkleRoot is the hash of the first transaction in the genesis block @@ -137,9 +138,10 @@ var devNetGenesisBlock = wire.MsgBlock{ HashMerkleRoot: &devNetGenesisMerkleRoot, IDMerkleRoot: &devNetGenesisMerkleRoot, AcceptedIDMerkleRoot: &daghash.Hash{}, - Timestamp: time.Unix(0x5cd00a98, 0), + UTXOCommitment: &daghash.Hash{}, + Timestamp: time.Unix(0x5cd83da0, 0), Bits: 0x1e7fffff, - Nonce: 0x2f0e8, + Nonce: 0xfe2a, }, Transactions: []*wire.MsgTx{devNetGenesisCoinbaseTx}, } diff --git a/dagconfig/genesis_test.go b/dagconfig/genesis_test.go index 9de5ea864..b3eddfff0 100644 --- a/dagconfig/genesis_test.go +++ b/dagconfig/genesis_test.go @@ -133,9 +133,13 @@ var genesisBlockBytes = []byte{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x0a, 0xd0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x3d, 0xd8, 0x5c, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7f, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, diff --git a/database/example_test.go b/database/example_test.go index 93b1afcd1..b5cc906af 100644 --- a/database/example_test.go +++ b/database/example_test.go @@ -175,5 +175,5 @@ func Example_blockStorageAndRetrieval() { fmt.Printf("Serialized block size: %d bytes\n", len(loadedBlockBytes)) // Output: - // Serialized block size: 225 bytes + // Serialized block size: 257 bytes } diff --git a/database/ffldb/blockio_test.go b/database/ffldb/blockio_test.go index e1e3acd18..6cd6ba618 100644 --- a/database/ffldb/blockio_test.go +++ b/database/ffldb/blockio_test.go @@ -16,7 +16,7 @@ import ( func TestDeleteFile(t *testing.T) { testBlock := util.NewBlock(wire.NewMsgBlock( - wire.NewBlockHeader(1, []*daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, 0, 0))) + wire.NewBlockHeader(1, []*daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, 0, 0))) tests := []struct { fileNum uint32 @@ -69,7 +69,7 @@ func TestDeleteFile(t *testing.T) { // and makes sure no panic occurs, as well as ensures the writeCursor was updated correctly. func TestHandleRollbackErrors(t *testing.T) { testBlock := util.NewBlock(wire.NewMsgBlock( - wire.NewBlockHeader(1, []*daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, 0, 0))) + wire.NewBlockHeader(1, []*daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, 0, 0))) testBlockSize := uint32(testBlock.MsgBlock().SerializeSize()) tests := []struct { diff --git a/database/ffldb/db_test.go b/database/ffldb/db_test.go index ab1f2d768..cf0c4a8c0 100644 --- a/database/ffldb/db_test.go +++ b/database/ffldb/db_test.go @@ -553,7 +553,7 @@ func TestForEachBucket(t *testing.T) { // TestStoreBlockErrors tests all error-cases in *tx.StoreBlock(). // The non-error-cases are tested in the more general tests. func TestStoreBlockErrors(t *testing.T) { - testBlock := util.NewBlock(wire.NewMsgBlock(wire.NewBlockHeader(1, []*daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, 0, 0))) + testBlock := util.NewBlock(wire.NewMsgBlock(wire.NewBlockHeader(1, []*daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, 0, 0))) tests := []struct { name string @@ -716,7 +716,7 @@ func TestWritePendingAndCommitErrors(t *testing.T) { rollbackCalled = false err = pdb.Update(func(dbTx database.Tx) error { return dbTx.StoreBlock(util.NewBlock(wire.NewMsgBlock( - wire.NewBlockHeader(1, []*daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, 0, 0)))) + wire.NewBlockHeader(1, []*daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, 0, 0)))) }) if err == nil { t.Errorf("No error returned when blockIdx.Put() should have returned an error") diff --git a/database/testdata/blocks1-256.bz2 b/database/testdata/blocks1-256.bz2 index fd73506072c4d0230efea78366d47e86c680c847..ad970d81368e50f39171f7b364868dad7dfd6ee3 100644 GIT binary patch literal 9972 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 TX&3N5bNQ+qfR6fLJ)Zr4c~!;_ diff --git a/database/testdata/generator.go b/database/testdata/generator.go index fa65f221b..4a0ea45b6 100644 --- a/database/testdata/generator.go +++ b/database/testdata/generator.go @@ -49,6 +49,7 @@ func generateBlock(parent *wire.MsgBlock) *wire.MsgBlock { HashMerkleRoot: &genesisMerkleRoot, IDMerkleRoot: &daghash.ZeroHash, AcceptedIDMerkleRoot: &daghash.ZeroHash, + UTXOCommitment: &daghash.ZeroHash, Timestamp: time.Unix(0x5b28c4c8, 0), // 2018-06-19 08:54:32 +0000 UTC Bits: 0x2e00ffff, // 503382015 [000000ffff000000000000000000000000000000000000000000000000000000] Nonce: 0xc0192550, // 2148484547 diff --git a/integration/rpctest/blockgen.go b/integration/rpctest/blockgen.go index 2ae73007b..25a31d6d9 100644 --- a/integration/rpctest/blockgen.go +++ b/integration/rpctest/blockgen.go @@ -191,6 +191,7 @@ func CreateBlock(parentBlock *util.Block, inclusionTxs []*util.Tx, HashMerkleRoot: hashMerkleTree.Root(), IDMerkleRoot: idMerkleTree.Root(), AcceptedIDMerkleRoot: &daghash.ZeroHash, + UTXOCommitment: &daghash.ZeroHash, Timestamp: ts, Bits: net.PowLimitBits, } diff --git a/mempool/estimatefee_test.go b/mempool/estimatefee_test.go index a6c48fd34..d2fc6f471 100644 --- a/mempool/estimatefee_test.go +++ b/mempool/estimatefee_test.go @@ -70,7 +70,12 @@ func (eft *estimateFeeTester) newBlock(txs []*wire.MsgTx) { eft.height++ block := util.NewBlock(&wire.MsgBlock{ - Header: wire.BlockHeader{IDMerkleRoot: &daghash.ZeroHash, HashMerkleRoot: &daghash.ZeroHash, AcceptedIDMerkleRoot: &daghash.ZeroHash}, + Header: wire.BlockHeader{ + IDMerkleRoot: &daghash.ZeroHash, + HashMerkleRoot: &daghash.ZeroHash, + AcceptedIDMerkleRoot: &daghash.ZeroHash, + UTXOCommitment: &daghash.ZeroHash, + }, Transactions: txs, }) block.SetHeight(eft.height) diff --git a/mining/mining.go b/mining/mining.go index 191930684..48da9c140 100644 --- a/mining/mining.go +++ b/mining/mining.go @@ -660,6 +660,7 @@ func (g *BlkTmplGenerator) NewBlockTemplate(payToAddress util.Address) (*BlockTe HashMerkleRoot: hashMerkleTree.Root(), IDMerkleRoot: idMerkleTree.Root(), AcceptedIDMerkleRoot: &daghash.ZeroHash, + UTXOCommitment: &daghash.ZeroHash, Timestamp: ts, Bits: reqDifficulty, } diff --git a/mining/simulator/mineloop.go b/mining/simulator/mineloop.go index 64a40193f..6774480f7 100644 --- a/mining/simulator/mineloop.go +++ b/mining/simulator/mineloop.go @@ -37,7 +37,7 @@ func parseBlock(template *btcjson.GetBlockTemplateResult) (*util.Block, error) { bits := uint32(bitsInt64) // parse rest of block - msgBlock := wire.NewMsgBlock(wire.NewBlockHeader(template.Version, parentHashes, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, uint32(bits), 0)) + msgBlock := wire.NewMsgBlock(wire.NewBlockHeader(template.Version, parentHashes, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, uint32(bits), 0)) for i, txResult := range append([]btcjson.GetBlockTemplateResultTx{*template.CoinbaseTxn}, template.Transactions...) { reader := hex.NewDecoder(strings.NewReader(txResult.Data)) diff --git a/peer/peer_test.go b/peer/peer_test.go index 551c28375..2bb8bddee 100644 --- a/peer/peer_test.go +++ b/peer/peer_test.go @@ -494,7 +494,7 @@ func TestPeerListeners(t *testing.T) { { "OnBlock", wire.NewMsgBlock(wire.NewBlockHeader(1, - []*daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, 1, 1)), + []*daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, 1, 1)), }, { "OnInv", @@ -560,7 +560,7 @@ func TestPeerListeners(t *testing.T) { { "OnMerkleBlock", wire.NewMsgMerkleBlock(wire.NewBlockHeader(1, - []*daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, 1, 1)), + []*daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, 1, 1)), }, // only one version message is allowed // only one verack message is allowed diff --git a/util/block_test.go b/util/block_test.go index 73a944c33..d922bda4f 100644 --- a/util/block_test.go +++ b/util/block_test.go @@ -38,7 +38,7 @@ func TestBlock(t *testing.T) { } // Hash for block 100,000. - wantHashStr := "c4bb55d2eaae7c7505b199097ef163ab940aa41228bbdb6f8b6d8a5b71bc432c" + wantHashStr := "df1b3cc747f665f36df84bdaa54a9ea695fbe12e102156fc1fc61d89366bc2d7" wantHash, err := daghash.NewHashFromStr(wantHashStr) if err != nil { t.Errorf("NewHashFromStr: %v", err) @@ -147,10 +147,10 @@ func TestBlock(t *testing.T) { // Transaction offsets and length for the transaction in Block100000. wantTxLocs := []wire.TxLoc{ - {TxStart: 186, TxLen: 163}, - {TxStart: 349, TxLen: 287}, - {TxStart: 636, TxLen: 285}, - {TxStart: 921, TxLen: 253}, + {TxStart: 218, TxLen: 163}, + {TxStart: 381, TxLen: 287}, + {TxStart: 668, TxLen: 285}, + {TxStart: 953, TxLen: 253}, } // Ensure the transaction location information is accurate. @@ -259,7 +259,7 @@ func TestBlockErrors(t *testing.T) { } // Truncate the block byte buffer to force errors. - shortBytes := block100000Bytes[:186] + shortBytes := block100000Bytes[:218] _, err = util.NewBlockFromBytes(shortBytes) if err != io.EOF { t.Errorf("NewBlockFromBytes: did not get expected error - "+ @@ -337,6 +337,12 @@ var Block100000 = wire.MsgBlock{ 0x66, 0x57, 0xa9, 0x25, 0x2a, 0xac, 0xd5, 0xc0, 0xb2, 0x94, 0x09, 0x96, 0xec, 0xff, 0x95, 0x22, }, + UTXOCommitment: &daghash.Hash{ + 0x10, 0x3B, 0xC7, 0xE3, 0x67, 0x11, 0x7B, 0x3C, + 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, + 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, + 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, + }, Timestamp: time.Unix(1529483563, 0), // 2018-06-20 08:32:43 +0000 UTC Bits: 0x1e00ffff, // 503382015 Nonce: 0x000ae53f, // 714047 diff --git a/util/bloom/filter_test.go b/util/bloom/filter_test.go index 283568486..92c10c08a 100644 --- a/util/bloom/filter_test.go +++ b/util/bloom/filter_test.go @@ -543,6 +543,10 @@ func TestFilterInsertP2PubKeyOnly(t *testing.T) { 0x3C, 0xE3, 0x70, 0xD9, 0x5F, 0x09, 0x3B, 0xC7, 0xE3, 0x67, 0x11, // AcceptedIDMerkleRoot 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, 0x65, 0x9C, 0x79, 0x7B, 0x3C, 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, + 0x10, 0x3B, 0xC7, 0xE3, 0x67, 0x11, 0x7B, 0x3C, // UTXOCommitment + 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, + 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, + 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, 0x76, 0x38, 0x1B, 0x4D, 0x00, 0x00, 0x00, 0x00, // Time 0x4C, 0x86, 0x04, 0x1B, // Bits 0x55, 0x4B, 0x85, 0x29, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce diff --git a/util/bloom/merkleblock_test.go b/util/bloom/merkleblock_test.go index e707fe8df..f7ff2d1dd 100644 --- a/util/bloom/merkleblock_test.go +++ b/util/bloom/merkleblock_test.go @@ -31,6 +31,10 @@ func TestMerkleBlock3(t *testing.T) { 0x3C, 0xE3, 0x70, 0xD9, 0x5F, 0x09, 0x3B, 0xC7, 0xE3, 0x67, 0x11, // AcceptedIDMerkleRoot 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, 0x65, 0x9C, 0x79, 0x7B, 0x3C, 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, + 0x10, 0x3B, 0xC7, 0xE3, 0x67, 0x11, 0x7B, 0x3C, // UTXOCommitment + 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, + 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, + 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, 0x67, 0x29, 0x1B, 0x4D, 0x00, 0x00, 0x00, 0x00, //Time 0x4C, 0x86, 0x04, 0x1B, // Bits 0x8F, 0xA4, 0x5D, 0x63, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce @@ -88,7 +92,11 @@ func TestMerkleBlock3(t *testing.T) { 0xd9, 0x5f, 0x09, 0x3b, 0xc7, 0xe3, 0x67, 0x11, 0x7f, 0x16, 0xc5, 0x96, 0x2e, 0x8b, 0xd9, 0x63, 0x65, 0x9c, 0x79, 0x7b, 0x3c, 0x30, 0xc1, 0xf8, - 0xfd, 0xd0, 0xd9, 0x72, 0x87, 0x67, 0x29, 0x1b, + 0xfd, 0xd0, 0xd9, 0x72, 0x87, 0x10, 0x3b, 0xc7, + 0xe3, 0x67, 0x11, 0x7b, 0x3c, 0x30, 0xc1, 0xf8, + 0xfd, 0xd0, 0xd9, 0x72, 0x87, 0x7f, 0x16, 0xc5, + 0x96, 0x2e, 0x8b, 0xd9, 0x63, 0x65, 0x9c, 0x79, + 0x3c, 0xe3, 0x70, 0xd9, 0x5f, 0x67, 0x29, 0x1b, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x86, 0x04, 0x1b, 0x8f, 0xa4, 0x5d, 0x63, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0xe2, 0x03, diff --git a/wire/bench_test.go b/wire/bench_test.go index 9449172ee..f5298ed48 100644 --- a/wire/bench_test.go +++ b/wire/bench_test.go @@ -426,7 +426,7 @@ func BenchmarkDecodeHeaders(b *testing.B) { } parentHashes[i] = hash } - m.AddBlockHeader(NewBlockHeader(1, parentHashes, hash, hash, hash, 0, uint64(i))) + m.AddBlockHeader(NewBlockHeader(1, parentHashes, hash, hash, hash, hash, 0, uint64(i))) } // Serialize it so the bytes are available to test the decode below. @@ -572,7 +572,7 @@ func BenchmarkDecodeMerkleBlock(b *testing.B) { if err != nil { b.Fatalf("NewHashFromStr: unexpected error: %v", err) } - m.Header = *NewBlockHeader(1, []*daghash.Hash{hash}, hash, hash, hash, 0, uint64(10000)) + m.Header = *NewBlockHeader(1, []*daghash.Hash{hash}, hash, hash, hash, hash, 0, uint64(10000)) for i := 0; i < 105; i++ { hash, err := daghash.NewHashFromStr(fmt.Sprintf("%x", i)) if err != nil { diff --git a/wire/blockheader.go b/wire/blockheader.go index cc064e482..540c4a02f 100644 --- a/wire/blockheader.go +++ b/wire/blockheader.go @@ -16,10 +16,10 @@ import ( // not including the list of parent block headers. // Version 4 bytes + Timestamp 8 bytes + Bits 4 bytes + Nonce 8 bytes + // + NumParentBlocks 1 byte + HashMerkleRoot hash + IDMerkleRoot hash + -// + AcceptedIDMerkleRoot hash. +// + AcceptedIDMerkleRoot hash + UTXOCommitment hash. // To get total size of block header len(ParentHashes) * daghash.HashSize should be // added to this value -const BaseBlockHeaderPayload = 25 + 3*(daghash.HashSize) +const BaseBlockHeaderPayload = 25 + 4*(daghash.HashSize) // MaxNumParentBlocks is the maximum number of parent blocks a block can reference. // Currently set to 255 as the maximum number NumParentBlocks can be due to it being a byte @@ -48,6 +48,9 @@ type BlockHeader struct { // accepted form the block.Blues AcceptedIDMerkleRoot *daghash.Hash + // UTXOCommitment is an ECMH UTXO commitment to the block UTXO. + UTXOCommitment *daghash.Hash + // Time the block was created. Timestamp time.Time @@ -127,6 +130,7 @@ func (h *BlockHeader) SerializeSize() int { // block with defaults or calclulated values for the remaining fields. func NewBlockHeader(version int32, parentHashes []*daghash.Hash, hashMerkleRoot *daghash.Hash, idMerkleRoot *daghash.Hash, acceptedIDMerkleRoot *daghash.Hash, + utxoCommitment *daghash.Hash, bits uint32, nonce uint64) *BlockHeader { // Limit the timestamp to one second precision since the protocol @@ -137,6 +141,7 @@ func NewBlockHeader(version int32, parentHashes []*daghash.Hash, hashMerkleRoot HashMerkleRoot: hashMerkleRoot, IDMerkleRoot: idMerkleRoot, AcceptedIDMerkleRoot: acceptedIDMerkleRoot, + UTXOCommitment: utxoCommitment, Timestamp: time.Unix(time.Now().Unix(), 0), Bits: bits, Nonce: nonce, @@ -165,8 +170,9 @@ func readBlockHeader(r io.Reader, pver uint32, bh *BlockHeader) error { bh.HashMerkleRoot = &daghash.Hash{} bh.IDMerkleRoot = &daghash.Hash{} bh.AcceptedIDMerkleRoot = &daghash.Hash{} + bh.UTXOCommitment = &daghash.Hash{} return readElements(r, bh.HashMerkleRoot, bh.IDMerkleRoot, - bh.AcceptedIDMerkleRoot, (*int64Time)(&bh.Timestamp), + bh.AcceptedIDMerkleRoot, bh.UTXOCommitment, (*int64Time)(&bh.Timestamp), &bh.Bits, &bh.Nonce) } @@ -184,5 +190,5 @@ func writeBlockHeader(w io.Writer, pver uint32, bh *BlockHeader) error { } } return writeElements(w, bh.HashMerkleRoot, bh.IDMerkleRoot, - bh.AcceptedIDMerkleRoot, sec, bh.Bits, bh.Nonce) + bh.AcceptedIDMerkleRoot, bh.UTXOCommitment, sec, bh.Bits, bh.Nonce) } diff --git a/wire/blockheader_test.go b/wire/blockheader_test.go index 446cce2ca..9633d567b 100644 --- a/wire/blockheader_test.go +++ b/wire/blockheader_test.go @@ -29,7 +29,7 @@ func TestBlockHeader(t *testing.T) { acceptedIDMerkleRoot := exampleAcceptedIDMerkleRoot bits := uint32(0x1d00ffff) bh := NewBlockHeader(1, hashes, merkleHash, idMerkleRoot, - acceptedIDMerkleRoot, bits, nonce) + acceptedIDMerkleRoot, exampleUTXOCommitment, bits, nonce) // Ensure we get the same data back out. if !reflect.DeepEqual(bh.ParentHashes, hashes) { @@ -64,6 +64,7 @@ func TestBlockHeaderWire(t *testing.T) { HashMerkleRoot: mainNetGenesisMerkleRoot, IDMerkleRoot: exampleIDMerkleRoot, AcceptedIDMerkleRoot: exampleAcceptedIDMerkleRoot, + UTXOCommitment: exampleUTXOCommitment, Timestamp: time.Unix(0x495fab29, 0), // 2009-01-03 12:15:05 -0600 CST Bits: bits, Nonce: nonce, @@ -93,6 +94,10 @@ func TestBlockHeaderWire(t *testing.T) { 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, + 0x10, 0x3B, 0xC7, 0xE3, 0x67, 0x11, 0x7B, 0x3C, // UTXOCommitment + 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, + 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, + 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, 0x29, 0xab, 0x5f, 0x49, 0x00, 0x00, 0x00, 0x00, // Timestamp 0xff, 0xff, 0x00, 0x1d, // Bits 0xf3, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce @@ -180,6 +185,7 @@ func TestBlockHeaderSerialize(t *testing.T) { HashMerkleRoot: mainNetGenesisMerkleRoot, IDMerkleRoot: exampleIDMerkleRoot, AcceptedIDMerkleRoot: exampleAcceptedIDMerkleRoot, + UTXOCommitment: exampleUTXOCommitment, Timestamp: time.Unix(0x495fab29, 0), // 2009-01-03 12:15:05 -0600 CST Bits: bits, Nonce: nonce, @@ -209,6 +215,10 @@ func TestBlockHeaderSerialize(t *testing.T) { 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, + 0x10, 0x3B, 0xC7, 0xE3, 0x67, 0x11, 0x7B, 0x3C, // UTXOCommitment + 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, + 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, + 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, 0x29, 0xab, 0x5f, 0x49, 0x00, 0x00, 0x00, 0x00, // Timestamp 0xff, 0xff, 0x00, 0x1d, // Bits 0xf3, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce @@ -269,6 +279,7 @@ func TestBlockHeaderSerializeSize(t *testing.T) { HashMerkleRoot: mainNetGenesisMerkleRoot, IDMerkleRoot: mainNetGenesisMerkleRoot, AcceptedIDMerkleRoot: &daghash.ZeroHash, + UTXOCommitment: &daghash.ZeroHash, Timestamp: timestamp, Bits: bits, Nonce: nonce, @@ -280,6 +291,7 @@ func TestBlockHeaderSerializeSize(t *testing.T) { HashMerkleRoot: mainNetGenesisMerkleRoot, IDMerkleRoot: mainNetGenesisMerkleRoot, AcceptedIDMerkleRoot: &daghash.ZeroHash, + UTXOCommitment: &daghash.ZeroHash, Timestamp: timestamp, Bits: bits, Nonce: nonce, @@ -289,10 +301,10 @@ func TestBlockHeaderSerializeSize(t *testing.T) { size int // Expected serialized size }{ // Block with no transactions. - {genesisBlockHdr, 121}, + {genesisBlockHdr, 153}, // First block in the mainnet block DAG. - {baseBlockHdr, 185}, + {baseBlockHdr, 217}, } t.Logf("Running %d tests", len(tests)) diff --git a/wire/common_test.go b/wire/common_test.go index 9bd7a876b..c1135a17f 100644 --- a/wire/common_test.go +++ b/wire/common_test.go @@ -56,6 +56,13 @@ var exampleAcceptedIDMerkleRoot = &daghash.Hash{ 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, } +var exampleUTXOCommitment = &daghash.Hash{ + 0x10, 0x3B, 0xC7, 0xE3, 0x67, 0x11, 0x7B, 0x3C, + 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, + 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, + 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, +} + // TestElementWire tests wire encode and decode for various element types. This // is mainly to test the "fast" paths in readElement and writeElement which use // type assertions to avoid reflection when possible. diff --git a/wire/message_test.go b/wire/message_test.go index 455723034..4fad13c03 100644 --- a/wire/message_test.go +++ b/wire/message_test.go @@ -68,7 +68,7 @@ func TestMessage(t *testing.T) { msgFilterAdd := NewMsgFilterAdd([]byte{0x01}) msgFilterClear := NewMsgFilterClear() msgFilterLoad := NewMsgFilterLoad([]byte{0x01}, 10, 0, BloomUpdateNone) - bh := NewBlockHeader(1, []*daghash.Hash{mainNetGenesisHash, simNetGenesisHash}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, 0, 0) + bh := NewBlockHeader(1, []*daghash.Hash{mainNetGenesisHash, simNetGenesisHash}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, &daghash.Hash{}, 0, 0) msgMerkleBlock := NewMsgMerkleBlock(bh) msgReject := NewMsgReject("block", RejectDuplicate, "duplicate block") msgGetCFilters := NewMsgGetCFilters(GCSFilterExtended, 0, &daghash.Hash{}) @@ -91,7 +91,7 @@ func TestMessage(t *testing.T) { {msgGetAddr, msgGetAddr, pver, MainNet, 26}, {msgAddr, msgAddr, pver, MainNet, 27}, {msgGetBlocks, msgGetBlocks, pver, MainNet, 61}, - {msgBlock, msgBlock, pver, MainNet, 372}, + {msgBlock, msgBlock, pver, MainNet, 404}, {msgInv, msgInv, pver, MainNet, 25}, {msgGetData, msgGetData, pver, MainNet, 25}, {msgNotFound, msgNotFound, pver, MainNet, 25}, @@ -107,7 +107,7 @@ func TestMessage(t *testing.T) { {msgFilterAdd, msgFilterAdd, pver, MainNet, 26}, {msgFilterClear, msgFilterClear, pver, MainNet, 24}, {msgFilterLoad, msgFilterLoad, pver, MainNet, 35}, - {msgMerkleBlock, msgMerkleBlock, pver, MainNet, 215}, + {msgMerkleBlock, msgMerkleBlock, pver, MainNet, 247}, {msgReject, msgReject, pver, MainNet, 79}, {msgGetCFilters, msgGetCFilters, pver, MainNet, 65}, {msgGetCFHeaders, msgGetCFHeaders, pver, MainNet, 65}, diff --git a/wire/msgblock_test.go b/wire/msgblock_test.go index dc2f0a736..34859e7ea 100644 --- a/wire/msgblock_test.go +++ b/wire/msgblock_test.go @@ -27,10 +27,11 @@ func TestBlock(t *testing.T) { hashMerkleRoot := blockOne.Header.HashMerkleRoot idMerkleRoot := blockOne.Header.IDMerkleRoot acceptedIDMerkleRoot := blockOne.Header.AcceptedIDMerkleRoot + utxoCommitment := blockOne.Header.UTXOCommitment bits := blockOne.Header.Bits nonce := blockOne.Header.Nonce bh := NewBlockHeader(1, parentHashes, hashMerkleRoot, idMerkleRoot, - acceptedIDMerkleRoot, bits, nonce) + acceptedIDMerkleRoot, utxoCommitment, bits, nonce) // Ensure the command is expected value. wantCmd := "block" @@ -76,7 +77,7 @@ func TestBlock(t *testing.T) { // TestBlockHash tests the ability to generate the hash of a block accurately. func TestBlockHash(t *testing.T) { // Block 1 hash. - hashStr := "d632f80af4f507bed094a424902e37cc4b1e447e4ede731f0f4b446edebaf381" + hashStr := "8a3a27a37c9e3342b4b38ae9ef29e59fe37b59618adafbf36a106b6d62f80654" wantHash, err := daghash.NewHashFromStr(hashStr) if err != nil { t.Errorf("NewHashFromStr: %v", err) @@ -224,16 +225,18 @@ func TestBlockWireErrors(t *testing.T) { {&blockOne, blockOneBytes, pver, 101, io.ErrShortWrite, io.EOF}, // Force error in accepted ID merkle root. {&blockOne, blockOneBytes, pver, 133, io.ErrShortWrite, io.EOF}, - // Force error in timestamp. + // Force error in utxo commitment. {&blockOne, blockOneBytes, pver, 165, io.ErrShortWrite, io.EOF}, + // Force error in timestamp. + {&blockOne, blockOneBytes, pver, 197, io.ErrShortWrite, io.EOF}, // Force error in difficulty bits. - {&blockOne, blockOneBytes, pver, 173, io.ErrShortWrite, io.EOF}, + {&blockOne, blockOneBytes, pver, 205, io.ErrShortWrite, io.EOF}, // Force error in header nonce. - {&blockOne, blockOneBytes, pver, 177, io.ErrShortWrite, io.EOF}, + {&blockOne, blockOneBytes, pver, 209, io.ErrShortWrite, io.EOF}, // Force error in transaction count. - {&blockOne, blockOneBytes, pver, 185, io.ErrShortWrite, io.EOF}, + {&blockOne, blockOneBytes, pver, 217, io.ErrShortWrite, io.EOF}, // Force error in transactions. - {&blockOne, blockOneBytes, pver, 186, io.ErrShortWrite, io.EOF}, + {&blockOne, blockOneBytes, pver, 218, io.ErrShortWrite, io.EOF}, } t.Logf("Running %d tests", len(tests)) @@ -350,16 +353,18 @@ func TestBlockSerializeErrors(t *testing.T) { {&blockOne, blockOneBytes, 101, io.ErrShortWrite, io.EOF}, // Force error in accepted ID merkle root. {&blockOne, blockOneBytes, 133, io.ErrShortWrite, io.EOF}, - // Force error in timestamp. + // Force error in utxo commitment. {&blockOne, blockOneBytes, 165, io.ErrShortWrite, io.EOF}, + // Force error in timestamp. + {&blockOne, blockOneBytes, 197, io.ErrShortWrite, io.EOF}, // Force error in difficulty bits. - {&blockOne, blockOneBytes, 173, io.ErrShortWrite, io.EOF}, + {&blockOne, blockOneBytes, 205, io.ErrShortWrite, io.EOF}, // Force error in header nonce. - {&blockOne, blockOneBytes, 177, io.ErrShortWrite, io.EOF}, + {&blockOne, blockOneBytes, 209, io.ErrShortWrite, io.EOF}, // Force error in transaction count. - {&blockOne, blockOneBytes, 185, io.ErrShortWrite, io.EOF}, + {&blockOne, blockOneBytes, 217, io.ErrShortWrite, io.EOF}, // Force error in transactions. - {&blockOne, blockOneBytes, 186, io.ErrShortWrite, io.EOF}, + {&blockOne, blockOneBytes, 218, io.ErrShortWrite, io.EOF}, } t.Logf("Running %d tests", len(tests)) @@ -431,6 +436,10 @@ func TestBlockOverflowErrors(t *testing.T) { 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, + 0x10, 0x3B, 0xC7, 0xE3, 0x67, 0x11, 0x7B, 0x3C, // UTXOCommitment + 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, + 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, + 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, 0x61, 0xbc, 0x66, 0x49, 0x00, 0x00, 0x00, 0x00, // Timestamp 0xff, 0xff, 0x00, 0x1d, // Bits 0x01, 0xe3, 0x62, 0x99, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce @@ -483,7 +492,7 @@ func TestBlockSerializeSize(t *testing.T) { size int // Expected serialized size }{ // Block with no transactions. - {noTxBlock, 186}, + {noTxBlock, 218}, // First block in the mainnet block chain. {&blockOne, len(blockOneBytes)}, @@ -509,6 +518,7 @@ var blockOne = MsgBlock{ HashMerkleRoot: mainNetGenesisMerkleRoot, IDMerkleRoot: exampleIDMerkleRoot, AcceptedIDMerkleRoot: exampleAcceptedIDMerkleRoot, + UTXOCommitment: exampleUTXOCommitment, Timestamp: time.Unix(0x4966bc61, 0), // 2009-01-08 20:54:25 -0600 CST Bits: 0x1d00ffff, // 486604799 Nonce: 0x9962e301, // 2573394689 @@ -572,6 +582,10 @@ var blockOneBytes = []byte{ 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, + 0x10, 0x3B, 0xC7, 0xE3, 0x67, 0x11, 0x7B, 0x3C, // UTXOCommitment + 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, + 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, + 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, 0x61, 0xbc, 0x66, 0x49, 0x00, 0x00, 0x00, 0x00, // Timestamp 0xff, 0xff, 0x00, 0x1d, // Bits 0x01, 0xe3, 0x62, 0x99, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce @@ -608,5 +622,5 @@ var blockOneBytes = []byte{ // Transaction location information for block one transactions. var blockOneTxLocs = []TxLoc{ - {TxStart: 186, TxLen: 162}, + {TxStart: 218, TxLen: 162}, } diff --git a/wire/msgheaders_test.go b/wire/msgheaders_test.go index 60ba771ed..26205d1e0 100644 --- a/wire/msgheaders_test.go +++ b/wire/msgheaders_test.go @@ -29,7 +29,7 @@ func TestHeaders(t *testing.T) { // Ensure max payload is expected value for latest protocol version. // Num headers (varInt) + max allowed headers (header length + 1 byte // for the number of transactions which is always 0). - wantPayload := uint32(16564009) + wantPayload := uint32(16628009) maxPayload := msg.MaxPayloadLength(pver) if maxPayload != wantPayload { t.Errorf("MaxPayloadLength: wrong max payload length for "+ @@ -65,10 +65,11 @@ func TestHeadersWire(t *testing.T) { hashMerkleRoot := blockOne.Header.HashMerkleRoot idMerkleRoot := blockOne.Header.IDMerkleRoot acceptedIDMerkleRoot := blockOne.Header.AcceptedIDMerkleRoot + utxoCommitment := blockOne.Header.UTXOCommitment bits := uint32(0x1d00ffff) nonce := uint64(0x9962e301) bh := NewBlockHeader(1, hashes, hashMerkleRoot, idMerkleRoot, - acceptedIDMerkleRoot, bits, nonce) + acceptedIDMerkleRoot, utxoCommitment, bits, nonce) bh.Version = blockOne.Header.Version bh.Timestamp = blockOne.Header.Timestamp @@ -105,6 +106,10 @@ func TestHeadersWire(t *testing.T) { 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, + 0x10, 0x3B, 0xC7, 0xE3, 0x67, 0x11, 0x7B, 0x3C, // UTXOCommitment + 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, + 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, + 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, 0x61, 0xbc, 0x66, 0x49, 0x00, 0x00, 0x00, 0x00, // Timestamp 0xff, 0xff, 0x00, 0x1d, // Bits 0x01, 0xe3, 0x62, 0x99, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce @@ -175,10 +180,11 @@ func TestHeadersWireErrors(t *testing.T) { hashMerkleRoot := blockOne.Header.HashMerkleRoot idMerkleRoot := blockOne.Header.IDMerkleRoot acceptedIDMerkleRoot := blockOne.Header.AcceptedIDMerkleRoot + utxoCommitment := blockOne.Header.UTXOCommitment bits := uint32(0x1d00ffff) nonce := uint64(0x9962e301) bh := NewBlockHeader(1, hashes, hashMerkleRoot, idMerkleRoot, - acceptedIDMerkleRoot, bits, nonce) + acceptedIDMerkleRoot, utxoCommitment, bits, nonce) bh.Version = blockOne.Header.Version bh.Timestamp = blockOne.Header.Timestamp @@ -205,6 +211,14 @@ func TestHeadersWireErrors(t *testing.T) { 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, 0x09, 0x3B, 0xC7, 0xE3, 0x67, 0x11, 0x7B, 0x3C, 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, + 0x09, 0x3B, 0xC7, 0xE3, 0x67, 0x11, 0x7B, 0x3C, // AcceptedIDMerkleRoot + 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, + 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, + 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, + 0x10, 0x3B, 0xC7, 0xE3, 0x67, 0x11, 0x7B, 0x3C, // UTXOCommitment + 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, + 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, + 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, 0x61, 0xbc, 0x66, 0x49, 0x00, 0x00, 0x00, 0x00, // Timestamp 0xff, 0xff, 0x00, 0x1d, // Bits 0x01, 0xe3, 0x62, 0x99, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce @@ -225,7 +239,7 @@ func TestHeadersWireErrors(t *testing.T) { // Intentionally invalid block header that has a transaction count used // to force errors. bhTrans := NewBlockHeader(1, hashes, hashMerkleRoot, idMerkleRoot, - acceptedIDMerkleRoot, bits, nonce) + acceptedIDMerkleRoot, utxoCommitment, bits, nonce) bhTrans.Version = blockOne.Header.Version bhTrans.Timestamp = blockOne.Header.Timestamp @@ -255,6 +269,10 @@ func TestHeadersWireErrors(t *testing.T) { 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, + 0x10, 0x3B, 0xC7, 0xE3, 0x67, 0x11, 0x7B, 0x3C, // UTXOCommitment + 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, + 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, + 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, 0x61, 0xbc, 0x66, 0x49, 0x00, 0x00, 0x00, 0x00, // Timestamp 0xff, 0xff, 0x00, 0x1d, // Bits 0x01, 0xe3, 0x62, 0x99, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce @@ -277,7 +295,7 @@ func TestHeadersWireErrors(t *testing.T) { // Force error with greater than max headers. {maxHeaders, maxHeadersEncoded, pver, 3, wireErr, wireErr}, // Force error with number of transactions. - {transHeader, transHeaderEncoded, pver, 178, io.ErrShortWrite, io.EOF}, + {transHeader, transHeaderEncoded, pver, 210, io.ErrShortWrite, io.EOF}, // Force error with included transactions. {transHeader, transHeaderEncoded, pver, len(transHeaderEncoded), nil, wireErr}, } diff --git a/wire/msgmerkleblock_test.go b/wire/msgmerkleblock_test.go index d5c2bae24..26d8734bd 100644 --- a/wire/msgmerkleblock_test.go +++ b/wire/msgmerkleblock_test.go @@ -25,10 +25,11 @@ func TestMerkleBlock(t *testing.T) { hashMerkleRoot := blockOne.Header.HashMerkleRoot idMerkleRoot := blockOne.Header.IDMerkleRoot acceptedIDMerkleRoot := blockOne.Header.AcceptedIDMerkleRoot + utxoCommitment := blockOne.Header.UTXOCommitment bits := blockOne.Header.Bits nonce := blockOne.Header.Nonce bh := NewBlockHeader(1, parentHashes, hashMerkleRoot, idMerkleRoot, - acceptedIDMerkleRoot, bits, nonce) + acceptedIDMerkleRoot, utxoCommitment, bits, nonce) // Ensure the command is expected value. wantCmd := "merkleblock" @@ -120,10 +121,11 @@ func TestMerkleBlockCrossProtocol(t *testing.T) { hashMerkleRoot := blockOne.Header.HashMerkleRoot idMerkleRoot := blockOne.Header.IDMerkleRoot acceptedIDMerkleRoot := blockOne.Header.AcceptedIDMerkleRoot + utxoCommitment := blockOne.Header.UTXOCommitment bits := blockOne.Header.Bits nonce := blockOne.Header.Nonce bh := NewBlockHeader(1, parentHashes, hashMerkleRoot, idMerkleRoot, - acceptedIDMerkleRoot, bits, nonce) + acceptedIDMerkleRoot, utxoCommitment, bits, nonce) msg := NewMsgMerkleBlock(bh) @@ -209,22 +211,24 @@ func TestMerkleBlockWireErrors(t *testing.T) { {&merkleBlockOne, merkleBlockOneBytes, pver, 101, io.ErrShortWrite, io.EOF}, // Force error in accepted ID merkle root. {&merkleBlockOne, merkleBlockOneBytes, pver, 133, io.ErrShortWrite, io.EOF}, - // Force error in timestamp. + // Force error in utxo commitment. {&merkleBlockOne, merkleBlockOneBytes, pver, 165, io.ErrShortWrite, io.EOF}, + // Force error in timestamp. + {&merkleBlockOne, merkleBlockOneBytes, pver, 197, io.ErrShortWrite, io.EOF}, // Force error in difficulty bits. - {&merkleBlockOne, merkleBlockOneBytes, pver, 173, io.ErrShortWrite, io.EOF}, + {&merkleBlockOne, merkleBlockOneBytes, pver, 205, io.ErrShortWrite, io.EOF}, // Force error in header nonce. - {&merkleBlockOne, merkleBlockOneBytes, pver, 177, io.ErrShortWrite, io.EOF}, + {&merkleBlockOne, merkleBlockOneBytes, pver, 209, io.ErrShortWrite, io.EOF}, // Force error in transaction count. - {&merkleBlockOne, merkleBlockOneBytes, pver, 185, io.ErrShortWrite, io.EOF}, + {&merkleBlockOne, merkleBlockOneBytes, pver, 217, io.ErrShortWrite, io.EOF}, // Force error in num hashes. - {&merkleBlockOne, merkleBlockOneBytes, pver, 189, io.ErrShortWrite, io.EOF}, + {&merkleBlockOne, merkleBlockOneBytes, pver, 221, io.ErrShortWrite, io.EOF}, // Force error in hashes. - {&merkleBlockOne, merkleBlockOneBytes, pver, 190, io.ErrShortWrite, io.EOF}, - // Force error in num flag bytes. {&merkleBlockOne, merkleBlockOneBytes, pver, 222, io.ErrShortWrite, io.EOF}, + // Force error in num flag bytes. + {&merkleBlockOne, merkleBlockOneBytes, pver, 254, io.ErrShortWrite, io.EOF}, // Force error in flag bytes. - {&merkleBlockOne, merkleBlockOneBytes, pver, 223, io.ErrShortWrite, io.EOF}, + {&merkleBlockOne, merkleBlockOneBytes, pver, 255, io.ErrShortWrite, io.EOF}, } t.Logf("Running %d tests", len(tests)) @@ -281,16 +285,17 @@ func TestMerkleBlockOverflowErrors(t *testing.T) { // allowed tx hashes. var buf bytes.Buffer WriteVarInt(&buf, maxTxPerBlock+1) - numHashesOffset := 189 + numHashesOffset := 221 exceedMaxHashes := make([]byte, numHashesOffset) copy(exceedMaxHashes, merkleBlockOneBytes[:numHashesOffset]) + spew.Dump(exceedMaxHashes) exceedMaxHashes = append(exceedMaxHashes, buf.Bytes()...) // Create bytes for a merkle block that claims to have more than the max // allowed flag bytes. buf.Reset() WriteVarInt(&buf, maxFlagsPerMerkleBlock+1) - numFlagBytesOffset := 222 + numFlagBytesOffset := 254 exceedMaxFlagBytes := make([]byte, numFlagBytesOffset) copy(exceedMaxFlagBytes, merkleBlockOneBytes[:numFlagBytesOffset]) exceedMaxFlagBytes = append(exceedMaxFlagBytes, buf.Bytes()...) @@ -334,6 +339,7 @@ var merkleBlockOne = MsgMerkleBlock{ }, IDMerkleRoot: exampleIDMerkleRoot, AcceptedIDMerkleRoot: exampleAcceptedIDMerkleRoot, + UTXOCommitment: exampleUTXOCommitment, Timestamp: time.Unix(0x4966bc61, 0), // 2009-01-08 20:54:25 -0600 CST Bits: 0x1d00ffff, // 486604799 Nonce: 0x9962e301, // 2573394689 @@ -363,7 +369,7 @@ var merkleBlockOneBytes = []byte{ 0x72, 0xff, 0x3d, 0x8e, 0xdb, 0xbb, 0x2d, 0xe0, 0xbf, 0xa6, 0x7b, 0x13, 0x97, 0x4b, 0xb9, 0x91, 0x0d, 0x11, 0x6d, 0x5c, 0xbd, 0x86, 0x3e, 0x68, - 0x98, 0x20, 0x51, 0xfd, 0x1e, 0x4b, 0xa7, 0x44, // MerkleRoot + 0x98, 0x20, 0x51, 0xfd, 0x1e, 0x4b, 0xa7, 0x44, // HashMerkleRoot 0xbb, 0xbe, 0x68, 0x0e, 0x1f, 0xee, 0x14, 0x67, 0x7b, 0xa1, 0xa3, 0xc3, 0x54, 0x0b, 0xf7, 0xb1, 0xcd, 0xb6, 0x06, 0xe8, 0x57, 0x23, 0x3e, 0x0e, @@ -375,6 +381,10 @@ var merkleBlockOneBytes = []byte{ 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, + 0x10, 0x3B, 0xC7, 0xE3, 0x67, 0x11, 0x7B, 0x3C, // UTXOCommitment + 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, + 0x7F, 0x16, 0xC5, 0x96, 0x2E, 0x8B, 0xD9, 0x63, + 0x65, 0x9C, 0x79, 0x3C, 0xE3, 0x70, 0xD9, 0x5F, 0x61, 0xbc, 0x66, 0x49, 0x00, 0x00, 0x00, 0x00, // Timestamp 0xff, 0xff, 0x00, 0x1d, // Bits 0x01, 0xe3, 0x62, 0x99, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce