package mainchain import ( "github.com/vapor/protocol/bc" "github.com/vapor/protocol/vm" "github.com/vapor/protocol/vm/vmutil" ) // Constraint types express a constraint on an input of a proposed // transaction, and know how to turn that constraint into part of a // signature program in that input's witness. type constraint interface { // Code produces bytecode expressing the constraint. The code, when // executed, must consume nothing from the stack and leave a new // boolean value on top of it. code() []byte } // outpointConstraint requires the outputID (and therefore, the outpoint) being spent to equal the // given value. type outputIDConstraint bc.Hash func (o outputIDConstraint) code() []byte { builder := vmutil.NewBuilder() builder.AddData(bc.Hash(o).Bytes()) builder.AddOp(vm.OP_OUTPUTID) builder.AddOp(vm.OP_EQUAL) prog, _ := builder.Build() // error is impossible return prog } // PayConstraint requires the transaction to include a given output // at the given index, optionally with the given refdatahash. type payConstraint struct { Index int bc.AssetAmount Program []byte } func (p payConstraint) code() []byte { builder := vmutil.NewBuilder() builder.AddInt64(int64(p.Index)) builder.AddInt64(int64(p.Amount)).AddData(p.AssetId.Bytes()).AddInt64(1).AddData(p.Program) builder.AddOp(vm.OP_CHECKOUTPUT) prog, _ := builder.Build() // error is impossible return prog }