diff --git a/bchain/coins/bch/bcashrpc.go b/bchain/coins/bch/bcashrpc.go index 89e7c74b..ce374430 100644 --- a/bchain/coins/bch/bcashrpc.go +++ b/bchain/coins/bch/bcashrpc.go @@ -101,7 +101,10 @@ func (b *BCashRPC) GetBlock(hash string, height uint32) (*bchain.Block, error) { if err != nil { return nil, errors.Annotatef(err, "hash %v", hash) } + // size is not returned by GetBlockHeader and would be overwritten + size := block.Size block.BlockHeader = *header + block.Size = size return block, nil } diff --git a/bchain/coins/btg/bgoldparser.go b/bchain/coins/btg/bgoldparser.go index ab4e38b5..f6433a40 100644 --- a/bchain/coins/btg/bgoldparser.go +++ b/bchain/coins/btg/bgoldparser.go @@ -5,6 +5,7 @@ import ( "blockbook/bchain/coins/btc" "blockbook/bchain/coins/utils" "bytes" + "encoding/binary" "io" "github.com/btcsuite/btcd/chaincfg/chainhash" @@ -75,11 +76,13 @@ func GetChainParams(chain string) *chaincfg.Params { // headerFixedLength is the length of fixed fields of a block (i.e. without solution) // see https://github.com/BTCGPU/BTCGPU/wiki/Technical-Spec#block-header const headerFixedLength = 44 + (chainhash.HashSize * 3) +const timestampOffset = 100 +const timestampLength = 4 // ParseBlock parses raw block to our Block struct func (p *BGoldParser) ParseBlock(b []byte) (*bchain.Block, error) { r := bytes.NewReader(b) - err := skipHeader(r, 0) + time, err := getTimestampAndSkipHeader(r, 0) if err != nil { return nil, err } @@ -95,24 +98,41 @@ func (p *BGoldParser) ParseBlock(b []byte) (*bchain.Block, error) { txs[ti] = p.TxFromMsgTx(t, false) } - return &bchain.Block{Txs: txs}, nil + return &bchain.Block{ + BlockHeader: bchain.BlockHeader{ + Size: len(b), + Time: time, + }, + Txs: txs, + }, nil } -func skipHeader(r io.ReadSeeker, pver uint32) error { - _, err := r.Seek(headerFixedLength, io.SeekStart) +func getTimestampAndSkipHeader(r io.ReadSeeker, pver uint32) (int64, error) { + _, err := r.Seek(timestampOffset, io.SeekStart) if err != nil { - return err + return 0, err + } + + buf := make([]byte, timestampLength) + if _, err = io.ReadFull(r, buf); err != nil { + return 0, err + } + time := binary.LittleEndian.Uint32(buf) + + _, err = r.Seek(headerFixedLength-timestampOffset-timestampLength, io.SeekCurrent) + if err != nil { + return 0, err } size, err := wire.ReadVarInt(r, pver) if err != nil { - return err + return 0, err } _, err = r.Seek(int64(size), io.SeekCurrent) if err != nil { - return err + return 0, err } - return nil + return int64(time), nil } diff --git a/bchain/coins/btg/bgoldparser_test.go b/bchain/coins/btg/bgoldparser_test.go index 8834cfc0..e37fecd7 100644 --- a/bchain/coins/btg/bgoldparser_test.go +++ b/bchain/coins/btg/bgoldparser_test.go @@ -12,72 +12,86 @@ import ( "testing" ) -var testParseBlockTxs = map[int][]string{ - 104000: []string{ - "331d4ef64118e9e5be75f0f51f1a4c5057550c3320e22ff7206f3e1101f113d0", - "1f4817d8e91c21d8c8d163dabccdd1875f760fd2dc34a1c2b7b8fa204e103597", - "268163b1a1092aa0996d118a6027b0b6f1076627e02addc4e66ae30239936818", - "27277a1049fafa2a46368ad02961d37da633416b014bcd42a1f1391753cbf559", - "276d2d331585d0968762d9788f71ae71524ccba3494f638b2328ac51e52edd3d", - "28d9f85089834c20507cc5e4ec54aaaf5b79feab80cad24a48b8296b6d327a43", - "2a2d66d3d9e8b6f154958a388377f681abd82ce98785a5bbf2e27d0ca454da3f", - "39c9e995a12b638b541d21ed9f9e555716709add6a97c8ba63fe26e4d26bdc3f", - "4a768efc6cc0716932800115989376c2ce3e5e17668b08bd2f43031105a6ac6e", - "4bc41fa0188d988d853a176eb847a541c5adf35348eab21d128904aab36e8574", - "4cad1bd38cc7be880f3a968af6f13a3aeb5dbdb51a774b7d1ae3d6d6bfd114e4", - "6bc558801583bfdb656106889c4b8bd783168133784666338c57e5b2a675a922", - "75eb5c1aa89b18ce71f363f95147942b46645ca9b1e472784fcb8c9a096f4f5c", - "91755365cff22c4eed09a57a8fb7b2faa5c1caa5fa750c89f830a2bb56fa4c68", - "9417d34969891f2a0b9aa3a1226505edf3b429fa1acd21a140d358a217d11d55", - "950fbb5f413af9f7c6e5dabfacf68b715c9851b5cf6ab6806960f7cc7cad2f9d", - "99b134dae55ddfab1f5d5243c2e60030a9ed969ba5915f98840b877f8af28ce0", - "9d7b15eaaccce66e25efe7e2979454ae4968b61281d50f32be9872d2d256c244", - "a54df5296f1d1a6101cee0869ffda03502e417fc72475b7902a6dfd5b9329399", - "adba400f14b476f0c2b11340ee1fa440208b49fd99c1072136198b5c43664826", - "bd7d8fee068bd45b06b4c17ccdf577b4bc2b21c9c4e0cee8453409b0e63b4f5d", - "beabd2d68b66a9b47b6aff23b569c1b59e429074f06bdd4993e9d3c2cb69c992", - "bfa81174d549eb7ed15be3f965686aff3084f22523c52fbed03c3fc3e18b7cda", - "e42472099cb039b1c2248b611ce212580338550977e02bd77accdf29bfd86e96", - "f056e02b12d99377f724a4987cde68ecf6f234fd7e2bdf4324172c03d015ba25", - "f1815cfb1ef4cfe13ff5ec2c15b5bc55fde043db85daca1bb34cc1b491193308", - "f225abce64f75383686fa08abe47242e59e97809a31c8fd7a88acce1e6cbcd27", - "f93f1b125bfa2da5ccaaf30ff96635b905b657d48a5962c24be93884a82ef354", - "fef75d015f2e9926d1d4bf82e567b91e51af66a6e636d03a072f203dd3062ae5", - "051b60a6accead85da54b8d18f4b2360ea946da948d3a27836306d2927fed13e", - "28e47b050ec4064cdbd3364f3be9445d52635e9730691ef71ed1db0f0147afd6", - "446ebde2457102bcbc2c86cac6ff582c595b00346fd0b27ea5a645240020504b", - "46c8fafe2b7bb1646aeefa229b18fa7ffe20fee0a30c4a9ef3e63c36c808f6f7", - "550d96cf82fbe91dcc9b96e7aa404f392ee47400c22a98a7631d29eee43fceaa", - "59b6b78a72cc33cd29741894b3007b1330fc7f7945bdc0a7a4044ed1dd289c19", - "5a3aa07474338cf193c1d7aacdc37f3311c971857ba8cfd308e8fabf5e473882", - "82e014b1a9c6cb7729274653ce748c66953de6abb3d1411471515b41b727cf75", - "8d70af4f135696da396c9aa9f936b54195bfbe6ff0e08b3b210ca0b52bc167d2", - "9949c2f2f3b96a557ef6e14004cbd239a0744c056faca34bdff01e125b4380e8", - "d09a8c83123ce1cb6ff837e7670aab5f50c5155d9706dd26f7e0761fd20c5536", - "f601482efc5b2dd3d0031e318e840cd06f7cab0ffff8cc37a5bf471b515ddfb7", - "f88d3c0ebe8b294f11e70d2ae6d2f0048437bfb20dae7e69d545a4c72d3432dd", - "2b9e574b90556250b20a79d9c94ceaff3dfd062291c34c3fa79c7ca8d85a3500", - "b9484ef8e38ceafe8d2b09ecf59562d262b15d185844b2d00db362718d52b2c2", - "07a4af0a81b55313a1c16da7d808829d689436fd078fa9559b6d1603dd72474e", - "3393bdcc3a7232b37d0fb6b56d603a2b9b0419e461bf989f1c375859a5d0156a", - "33ad36d79d63b575c7532c516f16b19541f5c637caf7073beb7ddf604c3f39cc", +type testBlock struct { + size int + time int64 + txs []string +} + +var testParseBlockTxs = map[int]testBlock{ + 104000: testBlock{ + size: 15776, + time: 1295705889, + txs: []string{ + "331d4ef64118e9e5be75f0f51f1a4c5057550c3320e22ff7206f3e1101f113d0", + "1f4817d8e91c21d8c8d163dabccdd1875f760fd2dc34a1c2b7b8fa204e103597", + "268163b1a1092aa0996d118a6027b0b6f1076627e02addc4e66ae30239936818", + "27277a1049fafa2a46368ad02961d37da633416b014bcd42a1f1391753cbf559", + "276d2d331585d0968762d9788f71ae71524ccba3494f638b2328ac51e52edd3d", + "28d9f85089834c20507cc5e4ec54aaaf5b79feab80cad24a48b8296b6d327a43", + "2a2d66d3d9e8b6f154958a388377f681abd82ce98785a5bbf2e27d0ca454da3f", + "39c9e995a12b638b541d21ed9f9e555716709add6a97c8ba63fe26e4d26bdc3f", + "4a768efc6cc0716932800115989376c2ce3e5e17668b08bd2f43031105a6ac6e", + "4bc41fa0188d988d853a176eb847a541c5adf35348eab21d128904aab36e8574", + "4cad1bd38cc7be880f3a968af6f13a3aeb5dbdb51a774b7d1ae3d6d6bfd114e4", + "6bc558801583bfdb656106889c4b8bd783168133784666338c57e5b2a675a922", + "75eb5c1aa89b18ce71f363f95147942b46645ca9b1e472784fcb8c9a096f4f5c", + "91755365cff22c4eed09a57a8fb7b2faa5c1caa5fa750c89f830a2bb56fa4c68", + "9417d34969891f2a0b9aa3a1226505edf3b429fa1acd21a140d358a217d11d55", + "950fbb5f413af9f7c6e5dabfacf68b715c9851b5cf6ab6806960f7cc7cad2f9d", + "99b134dae55ddfab1f5d5243c2e60030a9ed969ba5915f98840b877f8af28ce0", + "9d7b15eaaccce66e25efe7e2979454ae4968b61281d50f32be9872d2d256c244", + "a54df5296f1d1a6101cee0869ffda03502e417fc72475b7902a6dfd5b9329399", + "adba400f14b476f0c2b11340ee1fa440208b49fd99c1072136198b5c43664826", + "bd7d8fee068bd45b06b4c17ccdf577b4bc2b21c9c4e0cee8453409b0e63b4f5d", + "beabd2d68b66a9b47b6aff23b569c1b59e429074f06bdd4993e9d3c2cb69c992", + "bfa81174d549eb7ed15be3f965686aff3084f22523c52fbed03c3fc3e18b7cda", + "e42472099cb039b1c2248b611ce212580338550977e02bd77accdf29bfd86e96", + "f056e02b12d99377f724a4987cde68ecf6f234fd7e2bdf4324172c03d015ba25", + "f1815cfb1ef4cfe13ff5ec2c15b5bc55fde043db85daca1bb34cc1b491193308", + "f225abce64f75383686fa08abe47242e59e97809a31c8fd7a88acce1e6cbcd27", + "f93f1b125bfa2da5ccaaf30ff96635b905b657d48a5962c24be93884a82ef354", + "fef75d015f2e9926d1d4bf82e567b91e51af66a6e636d03a072f203dd3062ae5", + "051b60a6accead85da54b8d18f4b2360ea946da948d3a27836306d2927fed13e", + "28e47b050ec4064cdbd3364f3be9445d52635e9730691ef71ed1db0f0147afd6", + "446ebde2457102bcbc2c86cac6ff582c595b00346fd0b27ea5a645240020504b", + "46c8fafe2b7bb1646aeefa229b18fa7ffe20fee0a30c4a9ef3e63c36c808f6f7", + "550d96cf82fbe91dcc9b96e7aa404f392ee47400c22a98a7631d29eee43fceaa", + "59b6b78a72cc33cd29741894b3007b1330fc7f7945bdc0a7a4044ed1dd289c19", + "5a3aa07474338cf193c1d7aacdc37f3311c971857ba8cfd308e8fabf5e473882", + "82e014b1a9c6cb7729274653ce748c66953de6abb3d1411471515b41b727cf75", + "8d70af4f135696da396c9aa9f936b54195bfbe6ff0e08b3b210ca0b52bc167d2", + "9949c2f2f3b96a557ef6e14004cbd239a0744c056faca34bdff01e125b4380e8", + "d09a8c83123ce1cb6ff837e7670aab5f50c5155d9706dd26f7e0761fd20c5536", + "f601482efc5b2dd3d0031e318e840cd06f7cab0ffff8cc37a5bf471b515ddfb7", + "f88d3c0ebe8b294f11e70d2ae6d2f0048437bfb20dae7e69d545a4c72d3432dd", + "2b9e574b90556250b20a79d9c94ceaff3dfd062291c34c3fa79c7ca8d85a3500", + "b9484ef8e38ceafe8d2b09ecf59562d262b15d185844b2d00db362718d52b2c2", + "07a4af0a81b55313a1c16da7d808829d689436fd078fa9559b6d1603dd72474e", + "3393bdcc3a7232b37d0fb6b56d603a2b9b0419e461bf989f1c375859a5d0156a", + "33ad36d79d63b575c7532c516f16b19541f5c637caf7073beb7ddf604c3f39cc", + }, }, - 532144: []string{ - "574348e23301cc89535408b6927bf75f2ac88fadf8fdfb181c17941a5de02fe0", - "9f048446401e7fac84963964df045b1f3992eda330a87b02871e422ff0a3fd28", - "9516c320745a227edb07c98087b1febea01c3ba85122a34387896fc82ba965e4", - "9d37e1ab5a28c49ce5e7ece4a2b9df740fb4c3a84bdec93b3023148cf20f0de7", - "a3cd0481b983ba402fed8805ef9daf5063d6d4e5085b82eca5b4781c9e362d6a", - "7f2c2567e8de0321744817cfeb751922d7e8d82ef71aa01164c84fb74a463a53", - "cd064315e3f5d07920b3d159160c218d0bb5b7b4be606265767b208ae7e256eb", - "a9523400f341aa425b0fcc00656ec1fa5421bf3545433bff98a8614fc9a99d1f", - "ec766daacbb05a8f48a3205e5c6494a7c817bd35eefff9aaf55e0dd47fe6e8fc", - "0837a4116872abf52caa52d1ff7608674ba5b09a239a1f43f3a25ba4052e4c77", - "a3e23a0344fe6ba7083fc6afb940517cdb666dce00389cbd8598bd599199cdda", - "048d951cef84d35d68f0bc3b575662caf23fee692e8035bd5efe38ab67e0d6c2", - "11307491b24d42ddd7ea27fc795d444b65c3936be31b904a97da68fabc85e5b8", - "84ad99dc0884e03fc71f163eebf515a1eb79d00b1aad7a1126b22747960a8275", - "728c8d0858e506d4a1a9b506f7b974b335e6c54047af9f40d4cb1a0561f783e1", + 532144: testBlock{ + size: 12198, + time: 1528372417, + txs: []string{ + "574348e23301cc89535408b6927bf75f2ac88fadf8fdfb181c17941a5de02fe0", + "9f048446401e7fac84963964df045b1f3992eda330a87b02871e422ff0a3fd28", + "9516c320745a227edb07c98087b1febea01c3ba85122a34387896fc82ba965e4", + "9d37e1ab5a28c49ce5e7ece4a2b9df740fb4c3a84bdec93b3023148cf20f0de7", + "a3cd0481b983ba402fed8805ef9daf5063d6d4e5085b82eca5b4781c9e362d6a", + "7f2c2567e8de0321744817cfeb751922d7e8d82ef71aa01164c84fb74a463a53", + "cd064315e3f5d07920b3d159160c218d0bb5b7b4be606265767b208ae7e256eb", + "a9523400f341aa425b0fcc00656ec1fa5421bf3545433bff98a8614fc9a99d1f", + "ec766daacbb05a8f48a3205e5c6494a7c817bd35eefff9aaf55e0dd47fe6e8fc", + "0837a4116872abf52caa52d1ff7608674ba5b09a239a1f43f3a25ba4052e4c77", + "a3e23a0344fe6ba7083fc6afb940517cdb666dce00389cbd8598bd599199cdda", + "048d951cef84d35d68f0bc3b575662caf23fee692e8035bd5efe38ab67e0d6c2", + "11307491b24d42ddd7ea27fc795d444b65c3936be31b904a97da68fabc85e5b8", + "84ad99dc0884e03fc71f163eebf515a1eb79d00b1aad7a1126b22747960a8275", + "728c8d0858e506d4a1a9b506f7b974b335e6c54047af9f40d4cb1a0561f783e1", + }, }, } @@ -104,7 +118,7 @@ func helperLoadBlock(t *testing.T, height int) []byte { func TestParseBlock(t *testing.T) { p := NewBGoldParser(GetChainParams("main"), &btc.Configuration{}) - for height, txs := range testParseBlockTxs { + for height, tb := range testParseBlockTxs { b := helperLoadBlock(t, height) blk, err := p.ParseBlock(b) @@ -112,11 +126,19 @@ func TestParseBlock(t *testing.T) { t.Fatal(err) } - if len(blk.Txs) != len(txs) { - t.Errorf("ParseBlock() number of transactions: got %d, want %d", len(blk.Txs), len(txs)) + if blk.Size != tb.size { + t.Errorf("ParseBlock() block size: got %d, want %d", blk.Size, tb.size) } - for ti, tx := range txs { + if blk.Time != tb.time { + t.Errorf("ParseBlock() block time: got %d, want %d", blk.Time, tb.time) + } + + if len(blk.Txs) != len(tb.txs) { + t.Errorf("ParseBlock() number of transactions: got %d, want %d", len(blk.Txs), len(tb.txs)) + } + + for ti, tx := range tb.txs { if blk.Txs[ti].Txid != tx { t.Errorf("ParseBlock() transaction %d: got %s, want %s", ti, blk.Txs[ti].Txid, tx) } diff --git a/bchain/coins/dogecoin/dogecoinparser.go b/bchain/coins/dogecoin/dogecoinparser.go index 6975c688..f727e52b 100644 --- a/bchain/coins/dogecoin/dogecoinparser.go +++ b/bchain/coins/dogecoin/dogecoinparser.go @@ -75,5 +75,11 @@ func (p *DogecoinParser) ParseBlock(b []byte) (*bchain.Block, error) { txs[ti] = p.TxFromMsgTx(t, false) } - return &bchain.Block{Txs: txs}, nil + return &bchain.Block{ + BlockHeader: bchain.BlockHeader{ + Size: len(b), + Time: h.Timestamp.Unix(), + }, + Txs: txs, + }, nil } diff --git a/bchain/coins/dogecoin/dogecoinparser_test.go b/bchain/coins/dogecoin/dogecoinparser_test.go index f9c1037e..5638f664 100644 --- a/bchain/coins/dogecoin/dogecoinparser_test.go +++ b/bchain/coins/dogecoin/dogecoinparser_test.go @@ -259,89 +259,111 @@ func Test_UnpackTx(t *testing.T) { } } -var testParseBlockTxs = map[int][]string{ +type testBlock struct { + size int + time int64 + txs []string +} + +var testParseBlockTxs = map[int]testBlock{ // block without auxpow - 12345: []string{ - "9d1662dcc1443af9999c4fd1d6921b91027b5e2d0d3ebfaa41d84163cb99cad5", - "8284292cedeb0c9c509f9baa235802d52a546e1e9990040d35d018b97ad11cfa", - "3299d93aae5c3d37c795c07150ceaf008aefa5aad3205ea2519f94a35adbbe10", - "3f03016f32b63db48fdc0b17443c2d917ba5e307dcc2fc803feeb21c7219ee1b", - "a889449e9bc618c131c01f564cd309d2217ba1c5731480314795e44f1e02609b", - "29f79d91c10bc311ff5b69fe7ba57101969f68b6391cf0ca67d5f37ca1f0601b", - "b794ebc7c0176c35b125cd8b84a980257cf3dd9cefe2ed47da4ed1d73ee568f3", - "0ec479ba3c954dd422d75c4c5488a6edc3c588deb10ebdbfa8bd8edb7afcfea0", - "f357b6e667dfa456e7988bfa474377df25d0e0bfe07e5f97fc97ea3a0155f031", - "4ff189766f0455721a93d6be27a91eafa750383c800cb053fad2f86c434122d2", - "446d164e2ec4c9f2ac6c499c110735606d949a3625fb849274ac627c033eddbc", - "c489edebd8a2e17fd08f2801f528b95663aaafe15c897d56686423dd430e2d1f", - "3f42a7f1a356897da324d41eed94169c79438212bb9874eea58e9cbaf07481df", - "62c88fdd0fb111676844fcbaebc9e2211a0c990aa7e7529539cb25947a307a1b", - "522c47e315bc1949826339c535d419eb206aec4a332f91dfbd25c206f3c9527b", - "18ea78346e7e34cbdf2d2b6ba1630f8b15f9ef9a940114a3e6ee92d26f96691e", - "43dc0fbd1b9b87bcfc9a51c89457a7b3274855c01d429193aff1181791225f3c", - "d78cdfaadbe5b6b591529cb5c6869866a4cabe46ef82aa835fd2432056b4a383", - "d181759c7a3900ccaf4958f1f25a44949163ceefc306006502efc7a1de6f579e", - "8610b9230188854c7871258163cd1c2db353443d631c5512bff17224a24e95bf", - "e82f40a6bea32122f1d568d427c92708dcb684bdb3035ff3905617230e5ae5b8", - "c50ae6c127f8c346c60e7438fbd10c44c3629f3fe426646db77a2250fb2939f9", - "585202c03894ecaf25188ba4e5447dadd413f2010c2dc2a65c37598dbc6ad907", - "8bd766fde8c65e2f724dad581944dde4e23e4dbb4f7f7faf55bc348923f4d5ee", - "2d2fa25691088181569e508dd8f683b21f2b80ceefb5ccbd6714ebe2a697139f", - "5954622ffc602bec177d61da6c26a68990c42c1886627b218c3ab0e9e3491f4a", - "01b634bc53334df1cd9f04522729a34d811c418c2535144c3ed156cbc319e43e", - "c429a6c8265482b2d824af03afe1c090b233a856f243791485cb4269f2729649", - "dbe79231b916b6fb47a91ef874f35150270eb571af60c2d640ded92b41749940", - "1c396493a8dfd59557052b6e8643123405894b64f48b2eb6eb7a003159034077", - "2e2816ffb7bf1378f11acf5ba30d498efc8fd219d4b67a725e8254ce61b1b7ee", + 12345: testBlock{ + size: 8582, + time: 1387104223, + txs: []string{ + "9d1662dcc1443af9999c4fd1d6921b91027b5e2d0d3ebfaa41d84163cb99cad5", + "8284292cedeb0c9c509f9baa235802d52a546e1e9990040d35d018b97ad11cfa", + "3299d93aae5c3d37c795c07150ceaf008aefa5aad3205ea2519f94a35adbbe10", + "3f03016f32b63db48fdc0b17443c2d917ba5e307dcc2fc803feeb21c7219ee1b", + "a889449e9bc618c131c01f564cd309d2217ba1c5731480314795e44f1e02609b", + "29f79d91c10bc311ff5b69fe7ba57101969f68b6391cf0ca67d5f37ca1f0601b", + "b794ebc7c0176c35b125cd8b84a980257cf3dd9cefe2ed47da4ed1d73ee568f3", + "0ec479ba3c954dd422d75c4c5488a6edc3c588deb10ebdbfa8bd8edb7afcfea0", + "f357b6e667dfa456e7988bfa474377df25d0e0bfe07e5f97fc97ea3a0155f031", + "4ff189766f0455721a93d6be27a91eafa750383c800cb053fad2f86c434122d2", + "446d164e2ec4c9f2ac6c499c110735606d949a3625fb849274ac627c033eddbc", + "c489edebd8a2e17fd08f2801f528b95663aaafe15c897d56686423dd430e2d1f", + "3f42a7f1a356897da324d41eed94169c79438212bb9874eea58e9cbaf07481df", + "62c88fdd0fb111676844fcbaebc9e2211a0c990aa7e7529539cb25947a307a1b", + "522c47e315bc1949826339c535d419eb206aec4a332f91dfbd25c206f3c9527b", + "18ea78346e7e34cbdf2d2b6ba1630f8b15f9ef9a940114a3e6ee92d26f96691e", + "43dc0fbd1b9b87bcfc9a51c89457a7b3274855c01d429193aff1181791225f3c", + "d78cdfaadbe5b6b591529cb5c6869866a4cabe46ef82aa835fd2432056b4a383", + "d181759c7a3900ccaf4958f1f25a44949163ceefc306006502efc7a1de6f579e", + "8610b9230188854c7871258163cd1c2db353443d631c5512bff17224a24e95bf", + "e82f40a6bea32122f1d568d427c92708dcb684bdb3035ff3905617230e5ae5b8", + "c50ae6c127f8c346c60e7438fbd10c44c3629f3fe426646db77a2250fb2939f9", + "585202c03894ecaf25188ba4e5447dadd413f2010c2dc2a65c37598dbc6ad907", + "8bd766fde8c65e2f724dad581944dde4e23e4dbb4f7f7faf55bc348923f4d5ee", + "2d2fa25691088181569e508dd8f683b21f2b80ceefb5ccbd6714ebe2a697139f", + "5954622ffc602bec177d61da6c26a68990c42c1886627b218c3ab0e9e3491f4a", + "01b634bc53334df1cd9f04522729a34d811c418c2535144c3ed156cbc319e43e", + "c429a6c8265482b2d824af03afe1c090b233a856f243791485cb4269f2729649", + "dbe79231b916b6fb47a91ef874f35150270eb571af60c2d640ded92b41749940", + "1c396493a8dfd59557052b6e8643123405894b64f48b2eb6eb7a003159034077", + "2e2816ffb7bf1378f11acf5ba30d498efc8fd219d4b67a725e8254ce61b1b7ee", + }, }, // 1st block with auxpow - 371337: []string{ - "4547b14bc16db4184fa9f141d645627430dd3dfa662d0e6f418fba497091da75", - "a965dba2ed06827ed9a24f0568ec05b73c431bc7f0fb6913b144e62db7faa519", - "5e3ab18cb7ba3abc44e62fb3a43d4c8168d00cf0a2e0f8dbeb2636bb9a212d12", - "f022935ac7c4c734bd2c9c6a780f8e7280352de8bd358d760d0645b7fe734a93", - "ec063cc8025f9f30a6ed40fc8b1fe63b0cbd2ea2c62664eb26b365e6243828ca", - "02c16e3389320da3e77686d39773dda65a1ecdf98a2ef9cfb938c9f4b58f7a40", + 371337: testBlock{ + size: 1704, + time: 1410464577, + txs: []string{ + "4547b14bc16db4184fa9f141d645627430dd3dfa662d0e6f418fba497091da75", + "a965dba2ed06827ed9a24f0568ec05b73c431bc7f0fb6913b144e62db7faa519", + "5e3ab18cb7ba3abc44e62fb3a43d4c8168d00cf0a2e0f8dbeb2636bb9a212d12", + "f022935ac7c4c734bd2c9c6a780f8e7280352de8bd358d760d0645b7fe734a93", + "ec063cc8025f9f30a6ed40fc8b1fe63b0cbd2ea2c62664eb26b365e6243828ca", + "02c16e3389320da3e77686d39773dda65a1ecdf98a2ef9cfb938c9f4b58f7a40", + }, }, // block with auxpow - 567890: []string{ - "db20feea53be1f60848a66604d5bca63df62de4f6c66220f9c84436d788625a8", - "cf7e9e27c0f56f0b100eaf5c776ce106025e3412bd5927c6e1ce575500e24eaa", - "af84e010c1cf0bd927740d08e5e8163db45397b70f00df07aea5339c14d5f3aa", - "7362e25e8131255d101e5d874e6b6bb2faa7a821356cb041f1843d0901dffdbd", - "3b875344302e8893f6d5c9e7269d806ed27217ec67944940ae9048fc619bdae9", - "e3b95e269b7c251d87e8e241ea2a08a66ec14d12a1012762be368b3db55471e3", - "6ba3f95a37bcab5d0cb5b8bd2fe48040db0a6ae390f320d6dcc8162cc096ff8f", - "3211ccc66d05b10959fa6e56d1955c12368ea52b40303558b254d7dc22570382", - "54c1b279e78b924dfa15857c80131c3ddf835ab02f513dc03aa514f87b680493", + 567890: testBlock{ + size: 3833, + time: 1422855443, + txs: []string{ + "db20feea53be1f60848a66604d5bca63df62de4f6c66220f9c84436d788625a8", + "cf7e9e27c0f56f0b100eaf5c776ce106025e3412bd5927c6e1ce575500e24eaa", + "af84e010c1cf0bd927740d08e5e8163db45397b70f00df07aea5339c14d5f3aa", + "7362e25e8131255d101e5d874e6b6bb2faa7a821356cb041f1843d0901dffdbd", + "3b875344302e8893f6d5c9e7269d806ed27217ec67944940ae9048fc619bdae9", + "e3b95e269b7c251d87e8e241ea2a08a66ec14d12a1012762be368b3db55471e3", + "6ba3f95a37bcab5d0cb5b8bd2fe48040db0a6ae390f320d6dcc8162cc096ff8f", + "3211ccc66d05b10959fa6e56d1955c12368ea52b40303558b254d7dc22570382", + "54c1b279e78b924dfa15857c80131c3ddf835ab02f513dc03aa514f87b680493", + }, }, // recent block - 2264125: []string{ - "76f0126562c99e020b5fba41b68dd8141a4f21eef62012b76a1e0635092045e9", - "7bb6688bec16de94014574e3e1d3f6f5fb956530d6b179b28db367f1fd8ae099", - "d7e2ee30c3d179ac896651fc09c1396333f41d952d008af8d5d6665cbea377bf", - "8e4783878df782003c43d014fcbb9c57d2034dfd1d9fcd7319bb1a9f501dbbb7", - "8d2a4ae226b6f23eea545957be5d71c68cd08674d96a3502d4ca21ffadacb5a9", - "a0da2b49de881133655c54b1b5c23af443a71c2b937e2d9bbdf3f498247e6b7b", - "c780a19b9cf46ed70b53c5d5722e8d33951211a4051cb165b25fb0c22a4ae1ff", - "ce29c2644d642bb4fedd09d0840ed98c9945bf292967fede8fcc6b26054b4058", - "a360b0566f68c329e2757918f67ee6421d3d76f70f1b452cdd32266805986119", - "17e85bd33cc5fb5035e489c5188979f45e75e92d14221eca937e14f5f7d7b074", - "3973eb930fd2d0726abbd81912eae645384268cd3500b9ec84d806fdd65a426a", - "b91cc1c98e5c77e80eec9bf93e86af27f810b00dfbce3ee2646758797a28d5f2", - "1a8c7bd3389dcbbc1133ee600898ed9e082f7a9c75f9eb52f33940ed7c2247ef", - "9b1782449bbd3fc3014c363167777f7bdf41f5ef6db192fbda784b29603911b0", - "afab4bcdc1a32891d638579c3029ae49ee72be3303425c6d62e1f8eaebe0ce18", - "5f839f9cd5293c02ff4f7cf5589c53dec52adb42a077599dc7a2c5842a156ca9", - "756d2dfd1d2872ba2531fae3b8984008506871bec41d19cb299f5e0f216cfb9b", - "6aa82514ab7a9cc624fabf3d06ccbd46ecb4009b3c784768e6243d7840d4bf93", - "d1430b3f7ecf147534796c39ba631ea22ac03530e25b9428367c0dc381b10863", - "2aeb69b1eb9eef8039da6b97d7851e46f57325851e6998ef5a84fc9a826c2c74", - "fc61d13eef806af8da693cfa621fe92110694f1514567b186a35c54e7ef4a188", - "a02dd44e60ba62fa00c83a67116f8079bf71062939b207bee0808cb98b30cf22", - "279f97cfc606fe62777b44614ff28675ce661687904e068e3ec79f619c4fdae7", - "d515d271849717b091a9c46bf11c47efb9d975e72b668c137786a208cf0a9739", - "a800da44e6eed944043561fe22ee0a6e11341e6bc1a8ec2789b83930cc9b170e", + 2264125: testBlock{ + size: 8531, + time: 1529099968, + txs: []string{ + "76f0126562c99e020b5fba41b68dd8141a4f21eef62012b76a1e0635092045e9", + "7bb6688bec16de94014574e3e1d3f6f5fb956530d6b179b28db367f1fd8ae099", + "d7e2ee30c3d179ac896651fc09c1396333f41d952d008af8d5d6665cbea377bf", + "8e4783878df782003c43d014fcbb9c57d2034dfd1d9fcd7319bb1a9f501dbbb7", + "8d2a4ae226b6f23eea545957be5d71c68cd08674d96a3502d4ca21ffadacb5a9", + "a0da2b49de881133655c54b1b5c23af443a71c2b937e2d9bbdf3f498247e6b7b", + "c780a19b9cf46ed70b53c5d5722e8d33951211a4051cb165b25fb0c22a4ae1ff", + "ce29c2644d642bb4fedd09d0840ed98c9945bf292967fede8fcc6b26054b4058", + "a360b0566f68c329e2757918f67ee6421d3d76f70f1b452cdd32266805986119", + "17e85bd33cc5fb5035e489c5188979f45e75e92d14221eca937e14f5f7d7b074", + "3973eb930fd2d0726abbd81912eae645384268cd3500b9ec84d806fdd65a426a", + "b91cc1c98e5c77e80eec9bf93e86af27f810b00dfbce3ee2646758797a28d5f2", + "1a8c7bd3389dcbbc1133ee600898ed9e082f7a9c75f9eb52f33940ed7c2247ef", + "9b1782449bbd3fc3014c363167777f7bdf41f5ef6db192fbda784b29603911b0", + "afab4bcdc1a32891d638579c3029ae49ee72be3303425c6d62e1f8eaebe0ce18", + "5f839f9cd5293c02ff4f7cf5589c53dec52adb42a077599dc7a2c5842a156ca9", + "756d2dfd1d2872ba2531fae3b8984008506871bec41d19cb299f5e0f216cfb9b", + "6aa82514ab7a9cc624fabf3d06ccbd46ecb4009b3c784768e6243d7840d4bf93", + "d1430b3f7ecf147534796c39ba631ea22ac03530e25b9428367c0dc381b10863", + "2aeb69b1eb9eef8039da6b97d7851e46f57325851e6998ef5a84fc9a826c2c74", + "fc61d13eef806af8da693cfa621fe92110694f1514567b186a35c54e7ef4a188", + "a02dd44e60ba62fa00c83a67116f8079bf71062939b207bee0808cb98b30cf22", + "279f97cfc606fe62777b44614ff28675ce661687904e068e3ec79f619c4fdae7", + "d515d271849717b091a9c46bf11c47efb9d975e72b668c137786a208cf0a9739", + "a800da44e6eed944043561fe22ee0a6e11341e6bc1a8ec2789b83930cc9b170e", + }, }, } @@ -368,7 +390,7 @@ func helperLoadBlock(t *testing.T, height int) []byte { func TestParseBlock(t *testing.T) { p := NewDogecoinParser(GetChainParams("main"), &btc.Configuration{}) - for height, txs := range testParseBlockTxs { + for height, tb := range testParseBlockTxs { b := helperLoadBlock(t, height) blk, err := p.ParseBlock(b) @@ -376,11 +398,19 @@ func TestParseBlock(t *testing.T) { t.Fatal(err) } - if len(blk.Txs) != len(txs) { - t.Errorf("ParseBlock() number of transactions: got %d, want %d", len(blk.Txs), len(txs)) + if blk.Size != tb.size { + t.Errorf("ParseBlock() block size: got %d, want %d", blk.Size, tb.size) } - for ti, tx := range txs { + if blk.Time != tb.time { + t.Errorf("ParseBlock() block time: got %d, want %d", blk.Time, tb.time) + } + + if len(blk.Txs) != len(tb.txs) { + t.Errorf("ParseBlock() number of transactions: got %d, want %d", len(blk.Txs), len(tb.txs)) + } + + for ti, tx := range tb.txs { if blk.Txs[ti].Txid != tx { t.Errorf("ParseBlock() transaction %d: got %s, want %s", ti, blk.Txs[ti].Txid, tx) } diff --git a/bchain/coins/namecoin/namecoinparser.go b/bchain/coins/namecoin/namecoinparser.go index 270f1ed6..726d6841 100644 --- a/bchain/coins/namecoin/namecoinparser.go +++ b/bchain/coins/namecoin/namecoinparser.go @@ -75,5 +75,11 @@ func (p *NamecoinParser) ParseBlock(b []byte) (*bchain.Block, error) { txs[ti] = p.TxFromMsgTx(t, false) } - return &bchain.Block{Txs: txs}, nil + return &bchain.Block{ + BlockHeader: bchain.BlockHeader{ + Size: len(b), + Time: h.Timestamp.Unix(), + }, + Txs: txs, + }, nil } diff --git a/bchain/coins/namecoin/namecoinparser_test.go b/bchain/coins/namecoin/namecoinparser_test.go index dcf34b5f..8eff0e00 100644 --- a/bchain/coins/namecoin/namecoinparser_test.go +++ b/bchain/coins/namecoin/namecoinparser_test.go @@ -53,11 +53,21 @@ func Test_GetAddrDescFromAddress_Mainnet(t *testing.T) { } } -var testParseBlockTxs = map[int][]string{ - 40000: []string{ - "e193a821393b20b99f4a4e05a481368ef8a8cfd43d0c45bdad7f53bc9535e844", - "ddcbf95797e81dd04127885bd001e96695b717e11c52721f6e8ee53f6dea8a6f", - "31ff728f24200f59fa4958e6c26de03d172b320e6eef2b8abecf6f94d01dd4ae", +type testBlock struct { + size int + time int64 + txs []string +} + +var testParseBlockTxs = map[int]testBlock{ + 40000: testBlock{ + size: 1385, + time: 1327728573, + txs: []string{ + "e193a821393b20b99f4a4e05a481368ef8a8cfd43d0c45bdad7f53bc9535e844", + "ddcbf95797e81dd04127885bd001e96695b717e11c52721f6e8ee53f6dea8a6f", + "31ff728f24200f59fa4958e6c26de03d172b320e6eef2b8abecf6f94d01dd4ae", + }, }, } @@ -84,7 +94,7 @@ func helperLoadBlock(t *testing.T, height int) []byte { func TestParseBlock(t *testing.T) { p := NewNamecoinParser(GetChainParams("main"), &btc.Configuration{}) - for height, txs := range testParseBlockTxs { + for height, tb := range testParseBlockTxs { b := helperLoadBlock(t, height) blk, err := p.ParseBlock(b) @@ -92,11 +102,19 @@ func TestParseBlock(t *testing.T) { t.Fatal(err) } - if len(blk.Txs) != len(txs) { - t.Errorf("ParseBlock() number of transactions: got %d, want %d", len(blk.Txs), len(txs)) + if blk.Size != tb.size { + t.Errorf("ParseBlock() block size: got %d, want %d", blk.Size, tb.size) } - for ti, tx := range txs { + if blk.Time != tb.time { + t.Errorf("ParseBlock() block time: got %d, want %d", blk.Time, tb.time) + } + + if len(blk.Txs) != len(tb.txs) { + t.Errorf("ParseBlock() number of transactions: got %d, want %d", len(blk.Txs), len(tb.txs)) + } + + for ti, tx := range tb.txs { if blk.Txs[ti].Txid != tx { t.Errorf("ParseBlock() transaction %d: got %s, want %s", ti, blk.Txs[ti].Txid, tx) } diff --git a/bchain/coins/utils/parserutils.go b/bchain/coins/utils/parserutils.go index 4fbe422c..c59979ed 100644 --- a/bchain/coins/utils/parserutils.go +++ b/bchain/coins/utils/parserutils.go @@ -33,7 +33,7 @@ func DecodeTransactions(r io.Reader, pver uint32, enc wire.MessageEncoding, blk if txCount > maxTxPerBlock { str := fmt.Sprintf("too many transactions to fit into a block "+ "[count %d, max %d]", txCount, maxTxPerBlock) - return &wire.MessageError{Func: "btg.decodeTransactions", Description: str} + return &wire.MessageError{Func: "utils.decodeTransactions", Description: str} } blk.Transactions = make([]*wire.MsgTx, 0, txCount)