diff --git a/dapps/valuetransfers/packages/tangle/errors.go b/dapps/valuetransfers/packages/tangle/errors.go index 124ee4c6663fdac70830372b902ec366e1a3c0be..901bb7445429e5c91b253964aad13f3c4e968c5f 100644 --- a/dapps/valuetransfers/packages/tangle/errors.go +++ b/dapps/valuetransfers/packages/tangle/errors.go @@ -19,4 +19,6 @@ var ( ErrTransactionDoesNotSpendAllFunds = errors.New("transaction does not spend all funds from inputs") // ErrInvalidTransactionSignature is returned if the signature of a transaction is invalid. ErrInvalidTransactionSignature = errors.New("missing or invalid transaction signature") + // ErrMaxTransactionInputCountExceeded is returned if the max number of inputs of the transaction is exceeded. + ErrMaxTransactionInputCountExceeded = errors.New("maximum transaction input count exceeded") ) diff --git a/dapps/valuetransfers/packages/tangle/tangle.go b/dapps/valuetransfers/packages/tangle/tangle.go index 8a2a93861bfad300986a8a632addbea7ce724614..bd262f578658cfbef3b83ccdc1d21d27fc04477b 100644 --- a/dapps/valuetransfers/packages/tangle/tangle.go +++ b/dapps/valuetransfers/packages/tangle/tangle.go @@ -1593,6 +1593,11 @@ func (tangle *Tangle) ValidateTransactionToAttach(tx *transaction.Transaction) ( return } + if !tx.InputsCountValid() { + err = ErrMaxTransactionInputCountExceeded + return + } + if !tx.SignaturesValid() { err = ErrInvalidTransactionSignature return diff --git a/dapps/valuetransfers/packages/transaction/transaction.go b/dapps/valuetransfers/packages/transaction/transaction.go index 760ded1db4a41edd801eb03722a6f0aea8d105fa..928827a1f6e93417ee8acddb7029537927522142 100644 --- a/dapps/valuetransfers/packages/transaction/transaction.go +++ b/dapps/valuetransfers/packages/transaction/transaction.go @@ -20,6 +20,11 @@ var ( ErrMaxDataPayloadSizeExceeded = errors.New("maximum data payload size exceeded") ) +const ( + // MaxTransactionInputCount is the maximum number of inputs a transaction can have + MaxTransactionInputCount = 100 +) + // region IMPLEMENT Transaction //////////////////////////////////////////////////////////////////////////////////////////// // Transaction represents a value transfer for IOTA. It consists out of a number of inputs, a number of outputs and their @@ -172,6 +177,11 @@ func (transaction *Transaction) SignaturesValid() bool { return signaturesValid } +// InputsCountValid returns true if the number of inputs in this transaction is not greater than MaxTransactionInputCount. +func (transaction *Transaction) InputsCountValid() bool { + return transaction.inputs.Size() <= MaxTransactionInputCount +} + // EssenceBytes return the bytes of the transaction excluding the Signatures. These bytes are later signed and used to // generate the Signatures. func (transaction *Transaction) EssenceBytes() []byte { diff --git a/dapps/valuetransfers/packages/transaction/transaction_test.go b/dapps/valuetransfers/packages/transaction/transaction_test.go index d260017163dc87b8fda6f6cfd58e74dd2e304a73..164beb5e6add389b15668ad2f149869b7e8d0c6e 100644 --- a/dapps/valuetransfers/packages/transaction/transaction_test.go +++ b/dapps/valuetransfers/packages/transaction/transaction_test.go @@ -204,3 +204,28 @@ func TestPutSignatureInvalid(t *testing.T) { // valid signatures expected assert.Equal(t, true, tx.SignaturesValid()) } + +func TestInputCounts(t *testing.T) { + tx1 := createTransaction(MaxTransactionInputCount + 1, 1) + assert.False(t, tx1.InputsCountValid()) + + tx2 := createTransaction(MaxTransactionInputCount - 1, 1) + assert.True(t, tx2.InputsCountValid()) +} + +func createTransaction(inputCount int, outputCount int) *Transaction { + outputIds := make([]OutputID, 0) + for i := 0; i < inputCount; i++ { + outputIds = append(outputIds, NewOutputID(address.Random(), RandomID())) + } + inputs := NewInputs(outputIds...) + + bal := balance.New(balance.ColorIOTA, 1) + outputMap := make(map[address.Address][]*balance.Balance) + for i := 0; i < outputCount; i++ { + outputMap[address.Random()] = []*balance.Balance{bal} + } + outputs := NewOutputs(outputMap) + + return New(inputs, outputs) +} \ No newline at end of file