OSDN Git Service

Add confirm tx
[bytom/vapor.git] / blockchain / pseudohsm / sign_with_key.go
1 package pseudohsm
2
3 import (
4         "github.com/vapor/blockchain/txbuilder"
5         "github.com/vapor/crypto/ed25519/chainkd"
6         "github.com/vapor/errors"
7 )
8
9 func SignWithKey(tmpl *txbuilder.Template, xprv chainkd.XPrv) error {
10         for i, sigInst := range tmpl.SigningInstructions {
11                 for j, wc := range sigInst.WitnessComponents {
12                         switch sw := wc.(type) {
13                         case *txbuilder.SignatureWitness:
14                                 err := sw.Sign(tmpl, uint32(i), xprv)
15                                 if err != nil {
16                                         return errors.WithDetailf(err, "adding signature(s) to signature witness component %d of input %d", j, i)
17                                 }
18                         case *txbuilder.RawTxSigWitness:
19                                 err := sw.Sign(tmpl, uint32(i), xprv)
20                                 if err != nil {
21                                         return errors.WithDetailf(err, "adding signature(s) to raw-signature witness component %d of input %d", j, i)
22                                 }
23                         }
24                 }
25         }
26         return materializeWitnessesWithKey(tmpl)
27 }
28
29 func materializeWitnessesWithKey(txTemplate *txbuilder.Template) error {
30         msg := txTemplate.Transaction
31
32         if msg == nil {
33                 return errors.Wrap(txbuilder.ErrMissingRawTx)
34         }
35
36         if len(txTemplate.SigningInstructions) > len(msg.Inputs) {
37                 return errors.Wrap(txbuilder.ErrBadInstructionCount)
38         }
39
40         for i, sigInst := range txTemplate.SigningInstructions {
41                 if msg.Inputs[sigInst.Position] == nil {
42                         return errors.WithDetailf(txbuilder.ErrBadTxInputIdx, "signing instruction %d references missing tx input %d", i, sigInst.Position)
43                 }
44
45                 var witness [][]byte
46                 for j, wc := range sigInst.WitnessComponents {
47                         err := wc.Materialize(&witness)
48                         if err != nil {
49                                 return errors.WithDetailf(err, "error in witness component %d of input %d", j, i)
50                         }
51                 }
52                 msg.SetInputArguments(sigInst.Position, witness)
53         }
54
55         return nil
56 }