OSDN Git Service

new repo
[bytom/vapor.git] / protocol / bc / types / bytom / tx.go
1 package bytom
2
3 import (
4         "github.com/vapor/crypto/sha3pool"
5         "github.com/vapor/errors"
6 )
7
8 // Tx is a wrapper for the entries-based representation of a transaction.
9 type Tx struct {
10         *TxHeader
11         ID       Hash
12         Entries  map[Hash]Entry
13         InputIDs []Hash // 1:1 correspondence with TxData.Inputs
14
15         SpentOutputIDs []Hash
16         GasInputIDs    []Hash
17 }
18
19 // SigHash ...
20 func (tx *Tx) SigHash(n uint32) (hash Hash) {
21         hasher := sha3pool.Get256()
22         defer sha3pool.Put256(hasher)
23
24         tx.InputIDs[n].WriteTo(hasher)
25         tx.ID.WriteTo(hasher)
26         hash.ReadFrom(hasher)
27         return hash
28 }
29
30 // Convenience routines for accessing entries of specific types by ID.
31 var (
32         ErrEntryType    = errors.New("invalid entry type")
33         ErrMissingEntry = errors.New("missing entry")
34 )
35
36 // Output try to get the output entry by given hash
37 func (tx *Tx) Output(id Hash) (*Output, error) {
38         e, ok := tx.Entries[id]
39         if !ok || e == nil {
40                 return nil, errors.Wrapf(ErrMissingEntry, "id %x", id.Bytes())
41         }
42         o, ok := e.(*Output)
43         if !ok {
44                 return nil, errors.Wrapf(ErrEntryType, "entry %x has unexpected type %T", id.Bytes(), e)
45         }
46         return o, nil
47 }
48
49 // Spend try to get the spend entry by given hash
50 func (tx *Tx) Spend(id Hash) (*Spend, error) {
51         e, ok := tx.Entries[id]
52         if !ok || e == nil {
53                 return nil, errors.Wrapf(ErrMissingEntry, "id %x", id.Bytes())
54         }
55         sp, ok := e.(*Spend)
56         if !ok {
57                 return nil, errors.Wrapf(ErrEntryType, "entry %x has unexpected type %T", id.Bytes(), e)
58         }
59         return sp, nil
60 }
61
62 // Issuance try to get the issuance entry by given hash
63 func (tx *Tx) Issuance(id Hash) (*Issuance, error) {
64         e, ok := tx.Entries[id]
65         if !ok || e == nil {
66                 return nil, errors.Wrapf(ErrMissingEntry, "id %x", id.Bytes())
67         }
68         iss, ok := e.(*Issuance)
69         if !ok {
70                 return nil, errors.Wrapf(ErrEntryType, "entry %x has unexpected type %T", id.Bytes(), e)
71         }
72         return iss, nil
73 }