GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — CovenantSQL/types/bp_block.go at develop · CovenantSQL/CovenantSQL Expand file tree/ Copy pathbp_block.goMore file actions 141 lines (118 loc) · 3.86 KB / Copy pathbp_block.goFile metadata and controls141 lines (118 loc) · 3.86 KB 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 /* * Copyright 2018 The CovenantSQL Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package types import ( "time" pi "github.com/CovenantSQL/CovenantSQL/blockproducer/interfaces" "github.com/CovenantSQL/CovenantSQL/crypto/asymmetric" "github.com/CovenantSQL/CovenantSQL/crypto/hash" "github.com/CovenantSQL/CovenantSQL/crypto/verifier" "github.com/CovenantSQL/CovenantSQL/merkle" "github.com/CovenantSQL/CovenantSQL/proto" ) //go:generate hsp // BPHeader defines the main chain block header. type BPHeader struct { Version int32 Producer proto.AccountAddress MerkleRoot hash.Hash ParentHash hash.Hash Timestamp time.Time } // BPSignedHeader defines the main chain header with the signature. type BPSignedHeader struct { BPHeader verifier.DefaultHashSignVerifierImpl } func (s *BPSignedHeader) verifyHash() error { return s.DefaultHashSignVerifierImpl.VerifyHash(&s.BPHeader) } func (s *BPSignedHeader) verify() error { return s.DefaultHashSignVerifierImpl.Verify(&s.BPHeader) } func (s *BPSignedHeader) setHash() error { return s.DefaultHashSignVerifierImpl.SetHash(&s.BPHeader) } func (s *BPSignedHeader) sign(signer *asymmetric.PrivateKey) error { return s.DefaultHashSignVerifierImpl.Sign(&s.BPHeader, signer) } // BPBlock defines the main chain block. type BPBlock struct { SignedHeader BPSignedHeader Transactions []pi.Transaction } // GetTxHashes returns all hashes of tx in block.{Billings, ...}. func (b *BPBlock) GetTxHashes() []*hash.Hash { // TODO(lambda): when you add new tx type, you need to put new tx's hash in the slice // get hashes in block.Transactions hs := make([]*hash.Hash, len(b.Transactions)) for i, v := range b.Transactions { h := v.Hash() hs[i] = &h } return hs } func (b *BPBlock) setMerkleRoot() { var merkleRoot = merkle.NewMerkle(b.GetTxHashes()).GetRoot() b.SignedHeader.MerkleRoot = *merkleRoot } func (b *BPBlock) verifyMerkleRoot() error { var merkleRoot = *merkle.NewMerkle(b.GetTxHashes()).GetRoot() if !merkleRoot.IsEqual(&b.SignedHeader.MerkleRoot) { return ErrMerkleRootVerification } return nil } // SetHash sets the block header hash, including the merkle root of the packed transactions. func (b *BPBlock) SetHash() error { b.setMerkleRoot() return b.SignedHeader.setHash() } // VerifyHash verifies the block header hash, including the merkle root of the packed transactions. func (b *BPBlock) VerifyHash() error { if err := b.verifyMerkleRoot(); err != nil { return err } return b.SignedHeader.verifyHash() } // PackAndSignBlock computes block's hash and sign it. func (b *BPBlock) PackAndSignBlock(signer *asymmetric.PrivateKey) error { b.setMerkleRoot() return b.SignedHeader.sign(signer) } // Verify verifies whether the block is valid. func (b *BPBlock) Verify() error { if err := b.verifyMerkleRoot(); err != nil { return err } return b.SignedHeader.verify() } // Timestamp returns timestamp of block. func (b *BPBlock) Timestamp() time.Time { return b.SignedHeader.Timestamp } // Producer returns the producer of block. func (b *BPBlock) Producer() proto.AccountAddress { return b.SignedHeader.Producer } // ParentHash returns the parent hash field of the block header. func (b *BPBlock) ParentHash() *hash.Hash { return &b.SignedHeader.ParentHash } // BlockHash returns the parent hash field of the block header. func (b *BPBlock) BlockHash() *hash.Hash { return &b.SignedHeader.DataHash } |
| You are visitor 01402520 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |