OSDN Git Service

2d data for butxo state (#1921)
[bytom/bytom.git] / protocol / bc / types / spend_commitment.go
1 package types
2
3 import (
4         "fmt"
5         "io"
6
7         "github.com/bytom/bytom/encoding/blockchain"
8         "github.com/bytom/bytom/errors"
9         "github.com/bytom/bytom/protocol/bc"
10 )
11
12 // SpendCommitment contains the commitment data for a transaction output.
13 type SpendCommitment struct {
14         bc.AssetAmount
15         SourceID       bc.Hash
16         SourcePosition uint64
17         VMVersion      uint64
18         ControlProgram []byte
19         StateData      [][]byte
20 }
21
22 func (sc *SpendCommitment) writeExtensibleString(w io.Writer, suffix []byte, assetVersion uint64) error {
23         _, err := blockchain.WriteExtensibleString(w, suffix, func(w io.Writer) error {
24                 return sc.writeContents(w, suffix, assetVersion)
25         })
26         return err
27 }
28
29 func (sc *SpendCommitment) writeContents(w io.Writer, suffix []byte, assetVersion uint64) (err error) {
30         if assetVersion == 1 {
31                 if _, err = sc.SourceID.WriteTo(w); err != nil {
32                         return errors.Wrap(err, "writing source id")
33                 }
34                 if _, err = sc.AssetAmount.WriteTo(w); err != nil {
35                         return errors.Wrap(err, "writing asset amount")
36                 }
37                 if _, err = blockchain.WriteVarint63(w, sc.SourcePosition); err != nil {
38                         return errors.Wrap(err, "writing source position")
39                 }
40                 if _, err = blockchain.WriteVarint63(w, sc.VMVersion); err != nil {
41                         return errors.Wrap(err, "writing vm version")
42                 }
43                 if _, err = blockchain.WriteVarstr31(w, sc.ControlProgram); err != nil {
44                         return errors.Wrap(err, "writing control program")
45                 }
46                 if _, err = blockchain.WriteVarstrList(w, sc.StateData); err != nil {
47                         return errors.Wrap(err, "writing state data")
48                 }
49         }
50         if len(suffix) > 0 {
51                 _, err = w.Write(suffix)
52         }
53         return errors.Wrap(err, "writing suffix")
54 }
55
56 func (sc *SpendCommitment) readFrom(r *blockchain.Reader, assetVersion uint64) (suffix []byte, err error) {
57         return blockchain.ReadExtensibleString(r, func(r *blockchain.Reader) error {
58                 if assetVersion == 1 {
59                         if _, err := sc.SourceID.ReadFrom(r); err != nil {
60                                 return errors.Wrap(err, "reading source id")
61                         }
62                         if err = sc.AssetAmount.ReadFrom(r); err != nil {
63                                 return errors.Wrap(err, "reading asset+amount")
64                         }
65                         if sc.SourcePosition, err = blockchain.ReadVarint63(r); err != nil {
66                                 return errors.Wrap(err, "reading source position")
67                         }
68                         if sc.VMVersion, err = blockchain.ReadVarint63(r); err != nil {
69                                 return errors.Wrap(err, "reading VM version")
70                         }
71                         if sc.VMVersion != 1 {
72                                 return fmt.Errorf("unrecognized VM version %d for asset version 1", sc.VMVersion)
73                         }
74                         if sc.ControlProgram, err = blockchain.ReadVarstr31(r); err != nil {
75                                 return errors.Wrap(err, "reading control program")
76                         }
77                         if sc.StateData, err = blockchain.ReadVarstrList(r); err != nil {
78                                 return errors.Wrap(err, "reading state data")
79                         }
80                         return nil
81                 }
82                 return nil
83         })
84 }