(tx *types.Transaction)
| 57 | } |
| 58 | |
| 59 | func 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 |
no test coverage detected