6 "github.com/bytom/encoding/blockchain"
7 "github.com/bytom/errors"
8 "github.com/bytom/protocol/bc"
11 // TODO(bobg): Review serialization/deserialization logic for
12 // assetVersions other than 1.
14 type TxOutput struct {
18 // Unconsumed suffixes of the commitment and witness extensible strings.
19 CommitmentSuffix []byte
23 func NewTxOutput(assetID bc.AssetID, amount uint64, controlProgram []byte) *TxOutput {
26 OutputCommitment: OutputCommitment{
27 AssetAmount: bc.AssetAmount{
32 ControlProgram: controlProgram,
37 func (to *TxOutput) readFrom(r *blockchain.Reader, txVersion uint64) (err error) {
38 to.AssetVersion, err = blockchain.ReadVarint63(r)
40 return errors.Wrap(err, "reading asset version")
43 to.CommitmentSuffix, err = to.OutputCommitment.readFrom(r, to.AssetVersion)
45 return errors.Wrap(err, "reading output commitment")
48 // read and ignore the (empty) output witness
49 _, err = blockchain.ReadVarstr31(r)
51 return errors.Wrap(err, "reading output witness")
54 func (to *TxOutput) writeTo(w io.Writer, serflags byte) error {
55 if _, err := blockchain.WriteVarint63(w, to.AssetVersion); err != nil {
56 return errors.Wrap(err, "writing asset version")
59 if err := to.WriteCommitment(w); err != nil {
60 return errors.Wrap(err, "writing output commitment")
63 // write witness (empty in v1)
64 if _, err := blockchain.WriteVarstr31(w, nil); err != nil {
65 return errors.Wrap(err, "writing witness")
70 func (to *TxOutput) WriteCommitment(w io.Writer) error {
71 return to.OutputCommitment.writeExtensibleString(w, to.CommitmentSuffix, to.AssetVersion)
74 func (to *TxOutput) CommitmentHash() bc.Hash {
75 return to.OutputCommitment.Hash(to.CommitmentSuffix, to.AssetVersion)
78 // ComputeOutputID assembles an output entry given a spend commitment
79 // and computes and returns its corresponding entry ID.
80 func ComputeOutputID(sc *SpendCommitment) (h bc.Hash, err error) {
82 if r, ok := recover().(error); ok {
86 src := &bc.ValueSource{
88 Value: &sc.AssetAmount,
89 Position: sc.SourcePosition,
91 o := bc.NewOutput(src, &bc.Program{VmVersion: sc.VMVersion, Code: sc.ControlProgram}, 0)