Extend parsing of block in coins
This commit is contained in:
parent
8c1ccda82e
commit
6c08d7c51c
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user