MCPcopy Create free account
hub / github.com/DNAProject/DNA / checkTransactionSignatures

Function checkTransactionSignatures

core/validation/transaction_validator.go:59–115  ·  view source on GitHub ↗
(tx *types.Transaction)

Source from the content-addressed store, hash-verified

57}
58
59func checkTransactionSignatures(tx *types.Transaction) error {
60 hash := tx.Hash()
61
62 lensig := len(tx.Sigs)
63 if lensig > constants.TX_MAX_SIG_SIZE {
64 return fmt.Errorf("transaction signature number %d execced %d", lensig, constants.TX_MAX_SIG_SIZE)
65 }
66
67 address := make(map[common.Address]bool, len(tx.Sigs))
68 for _, sigdata := range tx.Sigs {
69 sig, err := sigdata.GetSig()
70 if err != nil {
71 return err
72 }
73
74 m := int(sig.M)
75 kn := len(sig.PubKeys)
76 sn := len(sig.SigData)
77
78 if kn > constants.MULTI_SIG_MAX_PUBKEY_SIZE || sn < m || m > kn || m <= 0 {
79 return errors.New("wrong tx sig param length")
80 }
81
82 if kn == 1 {
83 err := signature.Verify(sig.PubKeys[0], hash[:], sig.SigData[0])
84 if err != nil {
85 return errors.New("signature verification failed")
86 }
87
88 address[types.AddressFromPubKey(sig.PubKeys[0])] = true
89 } else {
90 if err := signature.VerifyMultiSignature(hash[:], sig.PubKeys, m, sig.SigData); err != nil {
91 return err
92 }
93
94 addr, err := types.AddressFromMultiPubKeys(sig.PubKeys, m)
95 if err != nil {
96 return err
97 }
98 address[addr] = true
99 }
100 }
101
102 // check payer in address
103 if address[tx.Payer] == false {
104 return errors.New("signature missing for payer: " + tx.Payer.ToBase58())
105 }
106
107 addrList := make([]common.Address, 0, len(address))
108 for addr := range address {
109 addrList = append(addrList, addr)
110 }
111
112 tx.SignedAddr = addrList
113
114 return nil
115}
116

Callers 1

VerifyTransactionFunction · 0.85

Calls 8

VerifyFunction · 0.92
AddressFromPubKeyFunction · 0.92
VerifyMultiSignatureFunction · 0.92
AddressFromMultiPubKeysFunction · 0.92
ErrorfMethod · 0.80
GetSigMethod · 0.80
ToBase58Method · 0.80
HashMethod · 0.65

Tested by

no test coverage detected