George Tankersley
6 years ago
6 changed files with 94 additions and 5 deletions
@ -0,0 +1,47 @@ |
|||
package parser |
|||
|
|||
import ( |
|||
"fmt" |
|||
|
|||
"github.com/gtank/ctxd/parser/internal/bytestring" |
|||
"github.com/pkg/errors" |
|||
) |
|||
|
|||
type block struct { |
|||
hdr *blockHeader |
|||
vtx []*transaction |
|||
} |
|||
|
|||
func NewBlock() *block { |
|||
return &block{} |
|||
} |
|||
|
|||
func (b *block) ParseFromSlice(data []byte) (rest []byte, err error) { |
|||
hdr := NewBlockHeader() |
|||
data, err = hdr.ParseFromSlice(data) |
|||
if err != nil { |
|||
return nil, errors.Wrap(err, "parsing block header") |
|||
} |
|||
|
|||
s := bytestring.String(data) |
|||
var txCount int |
|||
if ok := s.ReadCompactSize(&txCount); !ok { |
|||
return nil, errors.New("could not read tx_count") |
|||
} |
|||
data = []byte(s) |
|||
|
|||
vtx := make([]*transaction, 0, txCount) |
|||
for i := 0; len(data) > 0; i++ { |
|||
tx := NewTransaction() |
|||
data, err = tx.ParseFromSlice(data) |
|||
if err != nil { |
|||
return nil, errors.Wrap(err, fmt.Sprintf("parsing transaction %d", i)) |
|||
} |
|||
vtx = append(vtx, tx) |
|||
} |
|||
|
|||
b.hdr = hdr |
|||
b.vtx = vtx |
|||
|
|||
return data, nil |
|||
} |
@ -0,0 +1,42 @@ |
|||
package parser |
|||
|
|||
import ( |
|||
"bufio" |
|||
"encoding/hex" |
|||
"fmt" |
|||
"os" |
|||
"testing" |
|||
|
|||
"github.com/pkg/errors" |
|||
) |
|||
|
|||
func TestBlockParser(t *testing.T) { |
|||
testBlocks, err := os.Open("testdata/blocks") |
|||
if err != nil { |
|||
t.Fatal(err) |
|||
} |
|||
defer testBlocks.Close() |
|||
|
|||
scan := bufio.NewScanner(testBlocks) |
|||
for i := 0; scan.Scan(); i++ { |
|||
blockDataHex := scan.Text() |
|||
blockData, err := hex.DecodeString(blockDataHex) |
|||
if err != nil { |
|||
t.Error(err) |
|||
continue |
|||
} |
|||
|
|||
block := NewBlock() |
|||
blockData, err = block.ParseFromSlice(blockData) |
|||
if err != nil { |
|||
t.Error(errors.Wrap(err, fmt.Sprintf("parsing block %d", i))) |
|||
continue |
|||
} |
|||
|
|||
// Some basic sanity checks
|
|||
if block.hdr.Version != 4 { |
|||
t.Error("Read wrong version in a test block.") |
|||
break |
|||
} |
|||
} |
|||
} |
Loading…
Reference in new issue