From 65788d4dc05def12a949822b35d2516497b548c6 Mon Sep 17 00:00:00 2001 From: Ori Newman Date: Mon, 15 Oct 2018 15:17:41 +0300 Subject: [PATCH] [DEV-200] convert nonce to uint64 (#90) --- blockdag/blockindex.go | 2 +- blockdag/blockindex_test.go | 2 +- blockdag/dag_test.go | 12 +- blockdag/example_test.go | 2 +- blockdag/fullblocktests/generate.go | 16 +-- blockdag/testdata/blk_0_to_4.dat | Bin 1637 -> 1657 bytes blockdag/testdata/blk_3A.dat | Bin 390 -> 394 bytes blockdag/testdata/blk_3B.dat | Bin 191 -> 195 bytes blockdag/testdata/blk_3C.dat | Bin 223 -> 227 bytes blockdag/testdata/blk_3D.dat | Bin 435 -> 439 bytes blockdag/utxoset_test.go | 2 +- blockdag/validate_test.go | 12 +- btcjson/dagsvrresults.go | 2 +- dagconfig/genesis.go | 48 +++---- dagconfig/genesis_test.go | 204 ++++++++++++++++++---------- database/example_test.go | 4 +- database/ffldb/interface_test.go | 2 +- database/testdata/blocks1-256.bz2 | Bin 9943 -> 9944 bytes integration/rpctest/blockgen.go | 16 +-- mining/cpuminer/cpuminer.go | 4 +- server/rpc/rpcserver.go | 4 +- server/rpc/rpcserverhelp.go | 2 +- util/block_test.go | 14 +- util/bloom/filter_test.go | 4 +- util/bloom/merkleblock_test.go | 12 +- wire/bench_test.go | 6 +- wire/blockheader.go | 8 +- wire/blockheader_test.go | 19 ++- wire/message_test.go | 4 +- wire/msgblock_test.go | 18 +-- wire/msgheaders_test.go | 12 +- wire/msgmerkleblock_test.go | 18 +-- wire/msgversion_test.go | 4 +- 33 files changed, 260 insertions(+), 193 deletions(-) diff --git a/blockdag/blockindex.go b/blockdag/blockindex.go index ad6e20f79..ef57f06c1 100644 --- a/blockdag/blockindex.go +++ b/blockdag/blockindex.go @@ -104,7 +104,7 @@ type blockNode struct { // platforms. version int32 bits uint32 - nonce uint32 + nonce uint64 timestamp int64 merkleRoot daghash.Hash diff --git a/blockdag/blockindex_test.go b/blockdag/blockindex_test.go index ce270d430..0ed7eb3a8 100644 --- a/blockdag/blockindex_test.go +++ b/blockdag/blockindex_test.go @@ -22,7 +22,7 @@ func TestAncestorErrors(t *testing.T) { func TestFlushToDBErrors(t *testing.T) { // Create a new database and DAG instance to run tests against. - dag, teardownFunc, err := DAGSetup("TestFlushToDBErrors", &dagconfig.MainNetParams) + dag, teardownFunc, err := DAGSetup("TestFlushToDBErrors", &dagconfig.SimNetParams) if err != nil { t.Fatalf("TestFlushToDBErrors: Failed to setup DAG instance: %s", err) } diff --git a/blockdag/dag_test.go b/blockdag/dag_test.go index 50aad9e84..6a4b331b8 100644 --- a/blockdag/dag_test.go +++ b/blockdag/dag_test.go @@ -136,10 +136,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: "00cd35debc62fd60b6fbda1925894db5996c02bcd575a4130fdb4d6071537152", want: true}, + {hash: "2b31fe171eeadcaec5978add980ebb8108fd5d9082e870ff71744842e0dd01bb", want: true}, // Block 100000 should be present (as an orphan). - {hash: "66cdaddc8884c99ccc46c2f34f579903a223cc12b44c239938af47ee0c7193b4", want: true}, + {hash: "64f3da4fe61edb33ad6dd5e857ebcfe296182a0c4aaef01e30b4032b94ec1620", want: true}, // Random hashes should not be available. {hash: "123", want: false}, @@ -469,7 +469,7 @@ func TestCalcSequenceLock(t *testing.T) { } func TestCalcPastMedianTime(t *testing.T) { - netParams := &dagconfig.MainNetParams + netParams := &dagconfig.SimNetParams blockVersion := int32(0x10000000) @@ -539,7 +539,7 @@ func chainedNodes(parents blockSet, numNodes int) []*blockNode { for i := 0; i < numNodes; i++ { // This is invalid, but all that is needed is enough to get the // synthetic tests to work. - header := wire.BlockHeader{Nonce: testNoncePrng.Uint32()} + header := wire.BlockHeader{Nonce: testNoncePrng.Uint64()} header.PrevBlocks = tips.hashes() nodes[i] = newBlockNode(&header, tips, dagconfig.SimNetParams.K) tips = setFromSlice(nodes[i]) @@ -561,7 +561,7 @@ func TestHeightToHashRange(t *testing.T) { // genesis -> 1 -> 2 -> ... -> 15 -> 16 -> 17 -> 18 // \-> 16a -> 17a -> 18a (unvalidated) tip := testTip - blockDAG := newTestDAG(&dagconfig.MainNetParams) + blockDAG := newTestDAG(&dagconfig.SimNetParams) branch0Nodes := chainedNodes(setFromSlice(blockDAG.genesis), 18) branch1Nodes := chainedNodes(setFromSlice(branch0Nodes[14]), 3) for _, node := range branch0Nodes { @@ -653,7 +653,7 @@ func TestIntervalBlockHashes(t *testing.T) { // genesis -> 1 -> 2 -> ... -> 15 -> 16 -> 17 -> 18 // \-> 16a -> 17a -> 18a (unvalidated) tip := testTip - chain := newTestDAG(&dagconfig.MainNetParams) + chain := newTestDAG(&dagconfig.SimNetParams) branch0Nodes := chainedNodes(setFromSlice(chain.genesis), 18) branch1Nodes := chainedNodes(setFromSlice(branch0Nodes[14]), 3) for _, node := range branch0Nodes { diff --git a/blockdag/example_test.go b/blockdag/example_test.go index e1eb1946a..439155869 100644 --- a/blockdag/example_test.go +++ b/blockdag/example_test.go @@ -68,7 +68,7 @@ func ExampleBlockChain_ProcessBlock() { fmt.Printf("Block accepted. Is it an orphan?: %v", isOrphan) // Output: - // Failed to process block: already have block 2f0484f539fb39c0788abdea0805f799364c68cd162935504b80f3696fa99332 + // Failed to process block: already have block 000000f9fa27ce9258baefc92e485fc5744eae341554fd03f25e1e10baa8c9c3 } // This example demonstrates how to convert the compact "bits" in a block header diff --git a/blockdag/fullblocktests/generate.go b/blockdag/fullblocktests/generate.go index 864e59c2f..476e021af 100644 --- a/blockdag/fullblocktests/generate.go +++ b/blockdag/fullblocktests/generate.go @@ -23,8 +23,8 @@ import ( "github.com/daglabs/btcd/dagconfig" "github.com/daglabs/btcd/dagconfig/daghash" "github.com/daglabs/btcd/txscript" - "github.com/daglabs/btcd/wire" "github.com/daglabs/btcd/util" + "github.com/daglabs/btcd/wire" ) const ( @@ -324,7 +324,7 @@ func solveBlock(header *wire.BlockHeader) bool { // sbResult is used by the solver goroutines to send results. type sbResult struct { found bool - nonce uint32 + nonce uint64 } // solver accepts a block header and a nonce range to test. It is @@ -332,7 +332,7 @@ func solveBlock(header *wire.BlockHeader) bool { targetDifficulty := blockdag.CompactToBig(header.Bits) quit := make(chan bool) results := make(chan sbResult) - solver := func(hdr wire.BlockHeader, startNonce, stopNonce uint32) { + solver := func(hdr wire.BlockHeader, startNonce, stopNonce uint64) { // We need to modify the nonce field of the header, so make sure // we work with a copy of the original header. for i := startNonce; i >= startNonce && i <= stopNonce; i++ { @@ -353,11 +353,11 @@ func solveBlock(header *wire.BlockHeader) bool { results <- sbResult{false, 0} } - startNonce := uint32(1) - stopNonce := uint32(math.MaxUint32) - numCores := uint32(runtime.NumCPU()) + startNonce := uint64(1) + stopNonce := uint64(math.MaxUint64) + numCores := uint64(runtime.NumCPU()) noncesPerCore := (stopNonce - startNonce) / numCores - for i := uint32(0); i < numCores; i++ { + for i := uint64(0); i < numCores; i++ { rangeStart := startNonce + (noncesPerCore * i) rangeStop := startNonce + (noncesPerCore * (i + 1)) - 1 if i == numCores-1 { @@ -365,7 +365,7 @@ func solveBlock(header *wire.BlockHeader) bool { } go solver(*header, rangeStart, rangeStop) } - for i := uint32(0); i < numCores; i++ { + for i := uint64(0); i < numCores; i++ { result := <-results if result.found { close(quit) diff --git a/blockdag/testdata/blk_0_to_4.dat b/blockdag/testdata/blk_0_to_4.dat index 8f48ac941083cccc6665d7823be1f7e4bd8c3a53..9e90b879e145beff6e6b9be637ea9299ffcfab40 100644 GIT binary patch delta 342 zcmaFL^OJ}5=e{jB`6jYzi2P&N7tH_!|Nqx3{P_WfApA~0bh*TGxlcE04hpYPnrzRgAaaliVbX7eNoktRKr_I`OkM84 zaZ}@F-D-^}5%w*ug%jc%*Br{9aIsS1pONI{om`XuF)D~2!eR{57_GxpcisVdgWmXV9jAYnPsGA^$Jz!>H zM7S)}Y;xl3`yTIiv|9IuIKEL<2(l8MdDy%CO7X)=CfQ}8let+HM33MyY;qdwe*h** Bj%fe@ delta 312 zcmey#^OT46=e{jBxhAq|2rw-Oh-LtS|NrY1{{H_TKhg1~=5`>T5ril68(idGKQ}t! z&f1E1Vi$x2*61weIMQq!zG;1w(xRUVlNT~62%IR~gJy!(&&fWldYeBm zGch6@bG2^%QJoV>p=&h1%n^<;m}c>^^1oxXMt^}=WWc7refE>3Srr6MBN+m;U1767 Hs}>^wsC#zm diff --git a/blockdag/testdata/blk_3A.dat b/blockdag/testdata/blk_3A.dat index b683b1512a2296f1ef2cf5176b2e979198c90b1e..eca91042d87da3d2edcf63349fee0d36858a159f 100644 GIT binary patch delta 78 zcmZo;?qb&cxo^wOCPoGZAYx$5PGK;Y7n&5#&*SHMO74}iw(UH5dP@9{RgW;KymD=$45*|Jn7I eB~R2<5I9x1CmN`h;s5`7h5!Hm+iy(NWCQ?EWgjX4 diff --git a/blockdag/testdata/blk_3B.dat b/blockdag/testdata/blk_3B.dat index 2b026152896cd42d7ea946084990480d1ceac35c..4315140f2bcab0371d8d71811b1943e757927000 100644 GIT binary patch delta 77 zcmdnbc$iW5=e{jBcQY_BFoJM)3WK@4(4=sF9zWMpa<7!NZGSTI+U*eDTFgFe?o^SS ciMk3Rhne<81JyG8|6i~0_dgiKPmE0h0Q;IAcmMzZ delta 73 zcmX@ixSvt?=e{jBw=*y>FoLk7|EB1E(HYtai?3*`x%gl8(BEAGKTaz}w@l>u&#u2L cd7`d@z^TGL(Ll8f|Nqx3{Qdub{=~#20AG6`MgRZ+ diff --git a/blockdag/testdata/blk_3C.dat b/blockdag/testdata/blk_3C.dat index 34468ae5132b9350a37a4dd9183160dacd920a88..fe95c743bf63751017ec92ddae2199841eacea80 100644 GIT binary patch delta 109 zcmcc5_?Xf6=e{jBZ!<73Faj}Cb_#>JywId@ejY#9Q*y7AwQYYg^4jeX-dfB)ZSGW& zoT5cta?TZEAe z{|7IoV;p%jRqy?AP;%FmswO|W$`%L9Di4hu@hk5kJMRJ5M3GG(5Xy19TL1t60RR7g LAo~CRzmb7rh9fVX diff --git a/blockdag/testdata/blk_3D.dat b/blockdag/testdata/blk_3D.dat index eb91b23cb92228bf13c3a98b3627a7322d8989ca..5a9453f015d8e14749cdef13a2a73744b9444a31 100644 GIT binary patch delta 78 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 literal 9943 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 diff --git a/integration/rpctest/blockgen.go b/integration/rpctest/blockgen.go index 04fc68403..69a64c35c 100644 --- a/integration/rpctest/blockgen.go +++ b/integration/rpctest/blockgen.go @@ -15,8 +15,8 @@ import ( "github.com/daglabs/btcd/dagconfig" "github.com/daglabs/btcd/dagconfig/daghash" "github.com/daglabs/btcd/txscript" - "github.com/daglabs/btcd/wire" "github.com/daglabs/btcd/util" + "github.com/daglabs/btcd/wire" ) // solveBlock attempts to find a nonce which makes the passed block header hash @@ -27,14 +27,14 @@ func solveBlock(header *wire.BlockHeader, targetDifficulty *big.Int) bool { // sbResult is used by the solver goroutines to send results. type sbResult struct { found bool - nonce uint32 + nonce uint64 } // solver accepts a block header and a nonce range to test. It is // intended to be run as a goroutine. quit := make(chan bool) results := make(chan sbResult) - solver := func(hdr wire.BlockHeader, startNonce, stopNonce uint32) { + solver := func(hdr wire.BlockHeader, startNonce, stopNonce uint64) { // We need to modify the nonce field of the header, so make sure // we work with a copy of the original header. for i := startNonce; i >= startNonce && i <= stopNonce; i++ { @@ -61,11 +61,11 @@ func solveBlock(header *wire.BlockHeader, targetDifficulty *big.Int) bool { } } - startNonce := uint32(0) - stopNonce := uint32(math.MaxUint32) - numCores := uint32(runtime.NumCPU()) + startNonce := uint64(0) + stopNonce := uint64(math.MaxUint64) + numCores := uint64(runtime.NumCPU()) noncesPerCore := (stopNonce - startNonce) / numCores - for i := uint32(0); i < numCores; i++ { + for i := uint64(0); i < numCores; i++ { rangeStart := startNonce + (noncesPerCore * i) rangeStop := startNonce + (noncesPerCore * (i + 1)) - 1 if i == numCores-1 { @@ -73,7 +73,7 @@ func solveBlock(header *wire.BlockHeader, targetDifficulty *big.Int) bool { } go solver(*header, rangeStart, rangeStop) } - for i := uint32(0); i < numCores; i++ { + for i := uint64(0); i < numCores; i++ { result := <-results if result.found { close(quit) diff --git a/mining/cpuminer/cpuminer.go b/mining/cpuminer/cpuminer.go index 30677c78c..933eacedd 100644 --- a/mining/cpuminer/cpuminer.go +++ b/mining/cpuminer/cpuminer.go @@ -22,7 +22,7 @@ import ( const ( // maxNonce is the maximum value a nonce can be in a block header. - maxNonce = ^uint32(0) // 2^32 - 1 + maxNonce = ^uint64(0) // 2^64 - 1 // maxExtraNonce is the maximum value an extra nonce used in a coinbase // transaction can be. @@ -237,7 +237,7 @@ func (m *CPUMiner) solveBlock(msgBlock *wire.MsgBlock, blockHeight int32, // Search through the entire nonce range for a solution while // periodically checking for early quit and stale block // conditions along with updates to the speed monitor. - for i := uint32(0); i <= maxNonce; i++ { + for i := uint64(0); i <= maxNonce; i++ { select { case <-quit: return false diff --git a/server/rpc/rpcserver.go b/server/rpc/rpcserver.go index cb69789f5..7c49381ca 100644 --- a/server/rpc/rpcserver.go +++ b/server/rpc/rpcserver.go @@ -69,10 +69,10 @@ const ( // 256-bit integer. uint256Size = 32 - // gbtNonceRange is two 32-bit big-endian hexadecimal integers which + // gbtNonceRange is two 64-bit big-endian hexadecimal integers which // represent the valid ranges of nonces returned by the getblocktemplate // RPC. - gbtNonceRange = "00000000ffffffff" + gbtNonceRange = "000000000000ffffffffffff" // gbtRegenerateSeconds is the number of seconds that must pass before // a new template is generated when the previous block hash has not diff --git a/server/rpc/rpcserverhelp.go b/server/rpc/rpcserverhelp.go index cd239a7c3..80f98adce 100644 --- a/server/rpc/rpcserverhelp.go +++ b/server/rpc/rpcserverhelp.go @@ -317,7 +317,7 @@ var helpDescsEnUS = map[string]string{ "getblocktemplateresult-maxtime": "Maximum allowed time", "getblocktemplateresult-mintime": "Minimum allowed time", "getblocktemplateresult-mutable": "List of mutations the server explicitly allows", - "getblocktemplateresult-noncerange": "Two concatenated hex-encoded big-endian 32-bit integers which represent the valid ranges of nonces the miner may scan", + "getblocktemplateresult-noncerange": "Two concatenated hex-encoded big-endian 64-bit integers which represent the valid ranges of nonces the miner may scan", "getblocktemplateresult-capabilities": "List of server capabilities including 'proposal' to indicate support for block proposals", "getblocktemplateresult-reject-reason": "Reason the proposal was invalid as-is (only applies to proposal responses)", diff --git a/util/block_test.go b/util/block_test.go index f7adac075..11178dfa7 100644 --- a/util/block_test.go +++ b/util/block_test.go @@ -13,8 +13,8 @@ import ( "time" "github.com/daglabs/btcd/dagconfig/daghash" - "github.com/daglabs/btcd/wire" "github.com/daglabs/btcd/util" + "github.com/daglabs/btcd/wire" "github.com/davecgh/go-spew/spew" ) @@ -37,7 +37,7 @@ func TestBlock(t *testing.T) { } // Hash for block 100,000. - wantHashStr := "e91f05cb0ca4c761f74f5488ff6f5039587abf37ae33566259c51c1d21a5666a" + wantHashStr := "b75e32d07046b5290e131686c2b98636483cc4119573926eebc9dc944496d53b" wantHash, err := daghash.NewHashFromStr(wantHashStr) if err != nil { t.Errorf("NewHashFromStr: %v", err) @@ -146,10 +146,10 @@ func TestBlock(t *testing.T) { // Transaction offsets and length for the transaction in Block100000. wantTxLocs := []wire.TxLoc{ - {TxStart: 118, TxLen: 143}, - {TxStart: 261, TxLen: 267}, - {TxStart: 528, TxLen: 265}, - {TxStart: 793, TxLen: 233}, + {TxStart: 122, TxLen: 143}, + {TxStart: 265, TxLen: 267}, + {TxStart: 532, TxLen: 265}, + {TxStart: 797, TxLen: 233}, } // Ensure the transaction location information is accurate. @@ -258,7 +258,7 @@ func TestBlockErrors(t *testing.T) { } // Truncate the block byte buffer to force errors. - shortBytes := block100000Bytes[:118] + shortBytes := block100000Bytes[:122] _, err = util.NewBlockFromBytes(shortBytes) if err != io.EOF { t.Errorf("NewBlockFromBytes: did not get expected error - "+ diff --git a/util/bloom/filter_test.go b/util/bloom/filter_test.go index 44b43fe74..53e04f636 100644 --- a/util/bloom/filter_test.go +++ b/util/bloom/filter_test.go @@ -10,9 +10,9 @@ import ( "testing" "github.com/daglabs/btcd/dagconfig/daghash" - "github.com/daglabs/btcd/wire" "github.com/daglabs/btcd/util" "github.com/daglabs/btcd/util/bloom" + "github.com/daglabs/btcd/wire" ) // TestFilterLarge ensures a maximum sized filter can be created. @@ -496,7 +496,7 @@ func TestFilterInsertP2PubKeyOnly(t *testing.T) { 0x7B, 0x3C, 0x30, 0xC1, 0xF8, 0xFD, 0xD0, 0xD9, 0x72, 0x87, 0x76, 0x38, 0x1B, 0x4D, 0x00, 0x00, 0x00, 0x00, // Time 0x4C, 0x86, 0x04, 0x1B, // Bits - 0x55, 0x4B, 0x85, 0x29, //Nonce + 0x55, 0x4B, 0x85, 0x29, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce 0x07, // NumTxns 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //Txs[0] 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, diff --git a/util/bloom/merkleblock_test.go b/util/bloom/merkleblock_test.go index 98d66783b..bc8da423e 100644 --- a/util/bloom/merkleblock_test.go +++ b/util/bloom/merkleblock_test.go @@ -9,10 +9,10 @@ import ( "testing" "github.com/daglabs/btcd/dagconfig/daghash" - "github.com/daglabs/btcd/wire" "github.com/daglabs/btcd/util" - "github.com/davecgh/go-spew/spew" "github.com/daglabs/btcd/util/bloom" + "github.com/daglabs/btcd/wire" + "github.com/davecgh/go-spew/spew" ) func TestMerkleBlock3(t *testing.T) { @@ -27,7 +27,7 @@ func TestMerkleBlock3(t *testing.T) { 0x6B, 0x2C, 0x3F, 0xF6, 0x0A, 0xBE, 0x18, 0x4F, 0x19, 0x63, 0x67, 0x29, 0x1B, 0x4D, 0x00, 0x00, 0x00, 0x00, //Time 0x4C, 0x86, 0x04, 0x1B, // Bits - 0x8F, 0xA4, 0x5D, 0x63, // Nonce + 0x8F, 0xA4, 0x5D, 0x63, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce 0x01, // NumTxs 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Tx 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -68,9 +68,9 @@ func TestMerkleBlock3(t *testing.T) { 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x0c, 0xc0, 0x69, 0xd6, 0xa3, 0xe3, 0x3e, 0x3f, 0xf8, 0x4a, 0x5c, 0x41, 0xd9, 0xd3, 0xfe, 0xbe, 0x7c, 0x77, 0x0f, 0xdc, 0xc9, 0x6b, 0x2c, 0x3f, 0xf6, 0x0a, 0xbe, 0x18, 0x4f, 0x19, 0x63, 0x67, 0x29, 0x1b, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x86, 0x04, - 0x1b, 0x8f, 0xa4, 0x5d, 0x63, 0x01, 0x00, 0x00, 0x00, 0x01, 0x70, 0x2b, 0x1e, 0x73, 0x5a, 0x15, - 0xbc, 0xd7, 0xdb, 0xc9, 0x6f, 0xe5, 0x0f, 0x86, 0xe9, 0xd1, 0x9b, 0xdf, 0x75, 0x95, 0x30, 0xa6, - 0x95, 0x06, 0x6e, 0xe5, 0x1e, 0xb0, 0xb9, 0x94, 0xe8, 0x01, 0x01, 0x00, + 0x1b, 0x8f, 0xa4, 0x5d, 0x63, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x70, 0x2b, + 0x1e, 0x73, 0x5a, 0x15, 0xbc, 0xd7, 0xdb, 0xc9, 0x6f, 0xe5, 0x0f, 0x86, 0xe9, 0xd1, 0x9b, 0xdf, + 0x75, 0x95, 0x30, 0xa6, 0x95, 0x06, 0x6e, 0xe5, 0x1e, 0xb0, 0xb9, 0x94, 0xe8, 0x01, 0x01, 0x00, } t.Log(spew.Sdump(want)) if err != nil { diff --git a/wire/bench_test.go b/wire/bench_test.go index 2ce7978ef..de2bf5f28 100644 --- a/wire/bench_test.go +++ b/wire/bench_test.go @@ -359,7 +359,7 @@ func BenchmarkReadBlockHeader(b *testing.B) { 0x3a, 0x9f, 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a, // MerkleRoot 0x29, 0xab, 0x5f, 0x49, 0x00, 0x00, 0x00, 0x00, // Timestamp 0xff, 0xff, 0x00, 0x1d, // Bits - 0xf3, 0xe0, 0x01, 0x00, // Nonce + 0xf3, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce 0x00, // TxnCount Varint } r := bytes.NewReader(buf) @@ -429,7 +429,7 @@ func BenchmarkDecodeHeaders(b *testing.B) { } prevBlocks[i] = *hash } - m.AddBlockHeader(NewBlockHeader(1, prevBlocks, hash, 0, uint32(i))) + m.AddBlockHeader(NewBlockHeader(1, prevBlocks, hash, 0, uint64(i))) } // Serialize it so the bytes are available to test the decode below. @@ -575,7 +575,7 @@ func BenchmarkDecodeMerkleBlock(b *testing.B) { if err != nil { b.Fatalf("NewHashFromStr: unexpected error: %v", err) } - m.Header = *NewBlockHeader(1, []daghash.Hash{*hash}, hash, 0, uint32(10000)) + m.Header = *NewBlockHeader(1, []daghash.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 5fd74a8ae..e3837e565 100644 --- a/wire/blockheader.go +++ b/wire/blockheader.go @@ -14,11 +14,11 @@ import ( // BaseBlockHeaderPayload is the base number of bytes a block header can be, // not including the list of previous block headers. -// Version 4 bytes + Timestamp 8 bytes + Bits 4 bytes + Nonce 4 bytes + +// Version 4 bytes + Timestamp 8 bytes + Bits 4 bytes + Nonce 8 bytes + // + NumPrevBlocks 1 byte + MerkleRoot hash. // To get total size of block header len(PrevBlocks) * daghash.HashSize should be // added to this value -const BaseBlockHeaderPayload = 21 + (daghash.HashSize) +const BaseBlockHeaderPayload = 25 + (daghash.HashSize) // MaxNumPrevBlocks is the maximum number of previous blocks a block can reference. // Currently set to 255 as the maximum number NumPrevBlocks can be due to it being a byte @@ -50,7 +50,7 @@ type BlockHeader struct { Bits uint32 // Nonce used to generate the block. - Nonce uint32 + Nonce uint64 } // BlockHash computes the block identifier hash for the given block header. @@ -125,7 +125,7 @@ func (h *BlockHeader) SerializeSize() int { // block hash, merkle root hash, difficulty bits, and nonce used to generate the // block with defaults or calclulated values for the remaining fields. func NewBlockHeader(version int32, prevHashes []daghash.Hash, merkleRootHash *daghash.Hash, - bits uint32, nonce uint32) *BlockHeader { + bits uint32, nonce uint64) *BlockHeader { // Limit the timestamp to one second precision since the protocol // doesn't support better. diff --git a/wire/blockheader_test.go b/wire/blockheader_test.go index a82c9edf1..7f28553c2 100644 --- a/wire/blockheader_test.go +++ b/wire/blockheader_test.go @@ -16,11 +16,10 @@ import ( // TestBlockHeader tests the BlockHeader API. func TestBlockHeader(t *testing.T) { - nonce64, err := RandomUint64() + nonce, err := RandomUint64() if err != nil { t.Errorf("RandomUint64: Error generating nonce: %v", err) } - nonce := uint32(nonce64) hashes := []daghash.Hash{mainNetGenesisHash, simNetGenesisHash} @@ -50,7 +49,7 @@ func TestBlockHeader(t *testing.T) { // TestBlockHeaderWire tests the BlockHeader wire encode and decode for various // protocol versions. func TestBlockHeaderWire(t *testing.T) { - nonce := uint32(123123) // 0x1e0f3 + nonce := uint64(123123) // 0x000000000001e0f3 pver := uint32(70001) // baseBlockHdr is used in the various tests as a baseline BlockHeader. @@ -83,7 +82,7 @@ func TestBlockHeaderWire(t *testing.T) { 0x3a, 0x9f, 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a, 0x29, 0xab, 0x5f, 0x49, 0x00, 0x00, 0x00, 0x00, // Timestamp 0xff, 0xff, 0x00, 0x1d, // Bits - 0xf3, 0xe0, 0x01, 0x00, // Nonce + 0xf3, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce } tests := []struct { @@ -190,7 +189,7 @@ func TestBlockHeaderWire(t *testing.T) { // TestBlockHeaderSerialize tests BlockHeader serialize and deserialize. func TestBlockHeaderSerialize(t *testing.T) { - nonce := uint32(123123) // 0x1e0f3 + nonce := uint64(123123) // 0x01e0f3 // baseBlockHdr is used in the various tests as a baseline BlockHeader. bits := uint32(0x1d00ffff) @@ -222,7 +221,7 @@ func TestBlockHeaderSerialize(t *testing.T) { 0x3a, 0x9f, 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a, 0x29, 0xab, 0x5f, 0x49, 0x00, 0x00, 0x00, 0x00, // Timestamp 0xff, 0xff, 0x00, 0x1d, // Bits - 0xf3, 0xe0, 0x01, 0x00, // Nonce + 0xf3, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce } tests := []struct { @@ -271,7 +270,7 @@ func TestBlockHeaderSerialize(t *testing.T) { // TestBlockHeaderSerializeSize performs tests to ensure the serialize size for // various block headers is accurate. func TestBlockHeaderSerializeSize(t *testing.T) { - nonce := uint32(123123) // 0x1e0f3 + nonce := uint64(123123) // 0x1e0f3 bits := uint32(0x1d00ffff) timestamp := time.Unix(0x495fab29, 0) // 2009-01-03 12:15:05 -0600 CST baseBlockHdr := &BlockHeader{ @@ -298,10 +297,10 @@ func TestBlockHeaderSerializeSize(t *testing.T) { size int // Expected serialized size }{ // Block with no transactions. - {genesisBlockHdr, 53}, + {genesisBlockHdr, 57}, // First block in the mainnet block chain. - {baseBlockHdr, 117}, + {baseBlockHdr, 121}, } t.Logf("Running %d tests", len(tests)) @@ -317,7 +316,7 @@ func TestBlockHeaderSerializeSize(t *testing.T) { } func TestIsGenesis(t *testing.T) { - nonce := uint32(123123) // 0x1e0f3 + nonce := uint64(123123) // 0x1e0f3 bits := uint32(0x1d00ffff) timestamp := time.Unix(0x495fab29, 0) // 2009-01-03 12:15:05 -0600 CST diff --git a/wire/message_test.go b/wire/message_test.go index 82ba8fd95..fcab223e3 100644 --- a/wire/message_test.go +++ b/wire/message_test.go @@ -91,7 +91,7 @@ func TestMessage(t *testing.T) { {msgGetAddr, msgGetAddr, pver, MainNet, 24}, {msgAddr, msgAddr, pver, MainNet, 25}, {msgGetBlocks, msgGetBlocks, pver, MainNet, 61}, - {msgBlock, msgBlock, pver, MainNet, 284}, + {msgBlock, msgBlock, pver, MainNet, 288}, {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, 147}, + {msgMerkleBlock, msgMerkleBlock, pver, MainNet, 151}, {msgReject, msgReject, pver, MainNet, 79}, {msgGetCFilters, msgGetCFilters, pver, MainNet, 61}, {msgGetCFHeaders, msgGetCFHeaders, pver, MainNet, 61}, diff --git a/wire/msgblock_test.go b/wire/msgblock_test.go index cb91abef5..c66420908 100644 --- a/wire/msgblock_test.go +++ b/wire/msgblock_test.go @@ -93,7 +93,7 @@ func TestBlockTxHashes(t *testing.T) { // TestBlockHash tests the ability to generate the hash of a block accurately. func TestBlockHash(t *testing.T) { // Block 1 hash. - hashStr := "f5a1c070bed4d87e1ff0c0040d8d56f9d559aeb4c737978b4c12a83a4c6cd231" + hashStr := "5d8486ede1953cb1bc91720f10421ae670ec66565f1cc0b889fba125f79d5de3" wantHash, err := daghash.NewHashFromStr(hashStr) if err != nil { t.Errorf("NewHashFromStr: %v", err) @@ -227,9 +227,9 @@ func TestBlockWireErrors(t *testing.T) { // Force error in header nonce. {&blockOne, blockOneBytes, pver, 113, io.ErrShortWrite, io.EOF}, // Force error in transaction count. - {&blockOne, blockOneBytes, pver, 117, io.ErrShortWrite, io.EOF}, + {&blockOne, blockOneBytes, pver, 121, io.ErrShortWrite, io.EOF}, // Force error in transactions. - {&blockOne, blockOneBytes, pver, 118, io.ErrShortWrite, io.EOF}, + {&blockOne, blockOneBytes, pver, 122, io.ErrShortWrite, io.EOF}, } t.Logf("Running %d tests", len(tests)) @@ -349,9 +349,9 @@ func TestBlockSerializeErrors(t *testing.T) { // Force error in header nonce. {&blockOne, blockOneBytes, 113, io.ErrShortWrite, io.EOF}, // Force error in transaction count. - {&blockOne, blockOneBytes, 117, io.ErrShortWrite, io.EOF}, + {&blockOne, blockOneBytes, 121, io.ErrShortWrite, io.EOF}, // Force error in transactions. - {&blockOne, blockOneBytes, 118, io.ErrShortWrite, io.EOF}, + {&blockOne, blockOneBytes, 122, io.ErrShortWrite, io.EOF}, } t.Logf("Running %d tests", len(tests)) @@ -420,7 +420,7 @@ func TestBlockOverflowErrors(t *testing.T) { 0x3a, 0x9f, 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a, 0x61, 0xbc, 0x66, 0x49, 0x00, 0x00, 0x00, 0x00, // Timestamp 0xff, 0xff, 0x00, 0x1d, // Bits - 0x01, 0xe3, 0x62, 0x99, // Nonce + 0x01, 0xe3, 0x62, 0x99, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // TxnCount }, pver, &MessageError{}, @@ -470,7 +470,7 @@ func TestBlockSerializeSize(t *testing.T) { size int // Expected serialized size }{ // Block with no transactions. - {noTxBlock, 118}, + {noTxBlock, 122}, // First block in the mainnet block chain. {&blockOne, len(blockOneBytes)}, @@ -556,7 +556,7 @@ var blockOneBytes = []byte{ 0x3a, 0x9f, 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a, 0x61, 0xbc, 0x66, 0x49, 0x00, 0x00, 0x00, 0x00, // Timestamp 0xff, 0xff, 0x00, 0x1d, // Bits - 0x01, 0xe3, 0x62, 0x99, // Nonce + 0x01, 0xe3, 0x62, 0x99, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce 0x01, // TxnCount 0x01, 0x00, 0x00, 0x00, // Version 0x01, // Varint for number of transaction inputs @@ -587,5 +587,5 @@ var blockOneBytes = []byte{ // Transaction location information for block one transactions. var blockOneTxLocs = []TxLoc{ - {TxStart: 118, TxLen: 142}, + {TxStart: 122, TxLen: 142}, } diff --git a/wire/msgheaders_test.go b/wire/msgheaders_test.go index 5e548258d..d7d6ae944 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(16428009) + wantPayload := uint32(16436009) maxPayload := msg.MaxPayloadLength(pver) if maxPayload != wantPayload { t.Errorf("MaxPayloadLength: wrong max payload length for "+ @@ -64,7 +64,7 @@ func TestHeadersWire(t *testing.T) { hashes := []daghash.Hash{mainNetGenesisHash, simNetGenesisHash} merkleHash := blockOne.Header.MerkleRoot bits := uint32(0x1d00ffff) - nonce := uint32(0x9962e301) + nonce := uint64(0x9962e301) bh := NewBlockHeader(1, hashes, &merkleHash, bits, nonce) bh.Version = blockOne.Header.Version bh.Timestamp = blockOne.Header.Timestamp @@ -96,7 +96,7 @@ func TestHeadersWire(t *testing.T) { 0x3a, 0x9f, 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a, 0x61, 0xbc, 0x66, 0x49, 0x00, 0x00, 0x00, 0x00, // Timestamp 0xff, 0xff, 0x00, 0x1d, // Bits - 0x01, 0xe3, 0x62, 0x99, // Nonce + 0x01, 0xe3, 0x62, 0x99, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce 0x00, // TxnCount (0 for headers message) } @@ -226,7 +226,7 @@ func TestHeadersWireErrors(t *testing.T) { hashes := []daghash.Hash{mainNetGenesisHash, simNetGenesisHash} merkleHash := blockOne.Header.MerkleRoot bits := uint32(0x1d00ffff) - nonce := uint32(0x9962e301) + nonce := uint64(0x9962e301) bh := NewBlockHeader(1, hashes, &merkleHash, bits, nonce) bh.Version = blockOne.Header.Version bh.Timestamp = blockOne.Header.Timestamp @@ -252,7 +252,7 @@ func TestHeadersWireErrors(t *testing.T) { 0x3a, 0x9f, 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a, 0x61, 0xbc, 0x66, 0x49, 0x00, 0x00, 0x00, 0x00, // Timestamp 0xff, 0xff, 0x00, 0x1d, // Bits - 0x01, 0xe3, 0x62, 0x99, // Nonce + 0x01, 0xe3, 0x62, 0x99, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce 0x00, // TxnCount (0 for headers message) } @@ -293,7 +293,7 @@ func TestHeadersWireErrors(t *testing.T) { 0x3a, 0x9f, 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a, 0x61, 0xbc, 0x66, 0x49, 0x00, 0x00, 0x00, 0x00, // Timestamp 0xff, 0xff, 0x00, 0x1d, // Bits - 0x01, 0xe3, 0x62, 0x99, // Nonce + 0x01, 0xe3, 0x62, 0x99, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce 0x01, // TxnCount (should be 0 for headers message, but 1 to force error) } diff --git a/wire/msgmerkleblock_test.go b/wire/msgmerkleblock_test.go index b03be6dc0..184d10b97 100644 --- a/wire/msgmerkleblock_test.go +++ b/wire/msgmerkleblock_test.go @@ -224,17 +224,17 @@ func TestMerkleBlockWireErrors(t *testing.T) { // Force error in header nonce. {&merkleBlockOne, merkleBlockOneBytes, pver, 113, io.ErrShortWrite, io.EOF}, // Force error in transaction count. - {&merkleBlockOne, merkleBlockOneBytes, pver, 117, io.ErrShortWrite, io.EOF}, - // Force error in num hashes. {&merkleBlockOne, merkleBlockOneBytes, pver, 121, io.ErrShortWrite, io.EOF}, + // Force error in num hashes. + {&merkleBlockOne, merkleBlockOneBytes, pver, 125, io.ErrShortWrite, io.EOF}, // Force error in hashes. - {&merkleBlockOne, merkleBlockOneBytes, pver, 122, io.ErrShortWrite, io.EOF}, + {&merkleBlockOne, merkleBlockOneBytes, pver, 126, io.ErrShortWrite, io.EOF}, // Force error in num flag bytes. - {&merkleBlockOne, merkleBlockOneBytes, pver, 154, io.ErrShortWrite, io.EOF}, + {&merkleBlockOne, merkleBlockOneBytes, pver, 158, io.ErrShortWrite, io.EOF}, // Force error in flag bytes. - {&merkleBlockOne, merkleBlockOneBytes, pver, 155, io.ErrShortWrite, io.EOF}, + {&merkleBlockOne, merkleBlockOneBytes, pver, 159, io.ErrShortWrite, io.EOF}, // Force error due to unsupported protocol version. - {&merkleBlockOne, merkleBlockOneBytes, pverNoMerkleBlock, 155, wireErr, wireErr}, + {&merkleBlockOne, merkleBlockOneBytes, pverNoMerkleBlock, 159, wireErr, wireErr}, } t.Logf("Running %d tests", len(tests)) @@ -294,7 +294,7 @@ func TestMerkleBlockOverflowErrors(t *testing.T) { // allowed tx hashes. var buf bytes.Buffer WriteVarInt(&buf, pver, maxTxPerBlock+1) - numHashesOffset := 121 + numHashesOffset := 125 exceedMaxHashes := make([]byte, numHashesOffset) copy(exceedMaxHashes, merkleBlockOneBytes[:numHashesOffset]) exceedMaxHashes = append(exceedMaxHashes, buf.Bytes()...) @@ -303,7 +303,7 @@ func TestMerkleBlockOverflowErrors(t *testing.T) { // allowed flag bytes. buf.Reset() WriteVarInt(&buf, pver, maxFlagsPerMerkleBlock+1) - numFlagBytesOffset := 154 + numFlagBytesOffset := 158 exceedMaxFlagBytes := make([]byte, numFlagBytesOffset) copy(exceedMaxFlagBytes, merkleBlockOneBytes[:numFlagBytesOffset]) exceedMaxFlagBytes = append(exceedMaxFlagBytes, buf.Bytes()...) @@ -381,7 +381,7 @@ var merkleBlockOneBytes = []byte{ 0xcd, 0xb6, 0x06, 0xe8, 0x57, 0x23, 0x3e, 0x0e, // MerkleRoot 0x61, 0xbc, 0x66, 0x49, 0x00, 0x00, 0x00, 0x00, // Timestamp 0xff, 0xff, 0x00, 0x1d, // Bits - 0x01, 0xe3, 0x62, 0x99, // Nonce + 0x01, 0xe3, 0x62, 0x99, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce 0x01, 0x00, 0x00, 0x00, // TxnCount 0x01, // Num hashes 0x98, 0x20, 0x51, 0xfd, 0x1e, 0x4b, 0xa7, 0x44, diff --git a/wire/msgversion_test.go b/wire/msgversion_test.go index c451b543c..84642b002 100644 --- a/wire/msgversion_test.go +++ b/wire/msgversion_test.go @@ -493,7 +493,7 @@ var baseVersionEncoded = []byte{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x01, // IP 127.0.0.1 0x20, 0x8d, // Port 8333 in big-endian - 0xf3, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // Nonce + 0xf3, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce 0x10, // Varint for user agent length 0x2f, 0x62, 0x74, 0x63, 0x64, 0x74, 0x65, 0x73, 0x74, 0x3a, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x2f, // User agent @@ -539,7 +539,7 @@ var baseVersionBIP0037Encoded = []byte{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x01, // IP 127.0.0.1 0x20, 0x8d, // Port 8333 in big-endian - 0xf3, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // Nonce + 0xf3, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // Fake Nonce. TODO: (Ori) Replace to a real nonce 0x10, // Varint for user agent length 0x2f, 0x62, 0x74, 0x63, 0x64, 0x74, 0x65, 0x73, 0x74, 0x3a, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x2f, // User agent