7 "github.com/bytom/protocol/bc"
8 "github.com/bytom/protocol/bc/legacy"
9 "github.com/bytom/protocol/vm"
10 "github.com/bytom/protocol/vm/vmutil"
13 func TestValidateBlock1(t *testing.T) {
14 b1 := newInitialBlock(t)
15 err := ValidateBlock(b1, nil, b1.ID, dummyValidateTx)
17 t.Errorf("ValidateBlock(%v, nil) = %v, want nil", b1, err)
21 func TestValidateBlock1Err(t *testing.T) {
22 b1 := newInitialBlock(t)
23 transactionsRoot := bc.NewHash([32]byte{1})
24 b1.TransactionsRoot = &transactionsRoot // make b1 be invalid
25 err := ValidateBlock(b1, nil, b1.ID, dummyValidateTx)
27 t.Errorf("ValidateBlock(%v, nil) = nil, want error", b1)
31 func TestValidateBlock2(t *testing.T) {
32 b1 := newInitialBlock(t)
34 err := ValidateBlock(b2, b1, b2.ID, dummyValidateTx)
36 t.Errorf("ValidateBlock(%v, %v) = %v, want nil", b2, b1, err)
40 func TestValidateBlock2Err(t *testing.T) {
41 b1 := newInitialBlock(t)
43 transactionsRoot := bc.NewHash([32]byte{1})
44 b2.TransactionsRoot = &transactionsRoot // make b2 be invalid
45 err := ValidateBlock(b2, b1, b2.ID, dummyValidateTx)
47 t.Errorf("ValidateBlock(%v, %v) = nil, want error", b2, b1)
51 func TestValidateBlockSig2(t *testing.T) {
52 b1 := newInitialBlock(t)
54 err := ValidateBlockSig(b2, b1.NextConsensusProgram)
56 t.Errorf("ValidateBlockSig(%v, %v) = %v, want nil", b2, b1, err)
60 func TestValidateBlockSig2Err(t *testing.T) {
61 b1 := newInitialBlock(t)
63 prog := []byte{byte(vm.OP_FALSE)} // make b2 be invalid
64 err := ValidateBlockSig(b2, prog)
66 t.Errorf("ValidateBlockSig(%v, %v) = nil, want error", b2, b1)
70 func dummyValidateTx(*bc.Tx) error {
74 func newInitialBlock(tb testing.TB) *bc.Block {
75 script, err := vmutil.BlockMultiSigProgram(nil, 0)
80 root, err := bc.MerkleRoot(nil) // calculate the zero value of the tx merkle root
86 BlockHeader: legacy.BlockHeader{
89 TimestampMS: bc.Millis(time.Now()),
90 BlockCommitment: legacy.BlockCommitment{
91 TransactionsMerkleRoot: root,
92 ConsensusProgram: script,
96 return legacy.MapBlock(b)
99 func generate(tb testing.TB, prev *bc.Block) *bc.Block {
101 BlockHeader: legacy.BlockHeader{
103 Height: prev.Height + 1,
104 PreviousBlockHash: prev.ID,
105 TimestampMS: prev.TimestampMs + 1,
106 BlockCommitment: legacy.BlockCommitment{
107 ConsensusProgram: prev.NextConsensusProgram,
113 b.TransactionsMerkleRoot, err = bc.MerkleRoot(nil)
118 return legacy.MapBlock(b)