47 lines
1.3 KiB
Markdown
47 lines
1.3 KiB
Markdown
<!--
|
|
order: 3
|
|
-->
|
|
|
|
# Messages
|
|
|
|
TODO make this file conform to typical messages spec
|
|
|
|
## Handlers
|
|
|
|
The auth module presently has no transaction handlers of its own, but does expose
|
|
the special `AnteHandler`, used for performing basic validity checks on a transaction,
|
|
such that it could be thrown out of the mempool. Note that the ante handler is called on
|
|
`CheckTx`, but *also* on `DeliverTx`, as Tendermint proposers presently have the ability
|
|
to include in their proposed block transactions which fail `CheckTx`.
|
|
|
|
### Ante Handler
|
|
|
|
```go
|
|
anteHandler(ak AccountKeeper, fck FeeCollectionKeeper, tx sdk.Tx)
|
|
if !tx.(StdTx)
|
|
fail with "not a StdTx"
|
|
|
|
if isCheckTx and tx.Fee < config.SubjectiveMinimumFee
|
|
fail with "insufficient fee for mempool inclusion"
|
|
|
|
if tx.ValidateBasic() != nil
|
|
fail with "tx failed ValidateBasic"
|
|
|
|
if tx.Fee > 0
|
|
account = GetAccount(tx.GetSigners()[0])
|
|
coins := acount.GetCoins()
|
|
if coins < tx.Fee
|
|
fail with "insufficient fee to pay for transaction"
|
|
account.SetCoins(coins - tx.Fee)
|
|
fck.AddCollectedFees(tx.Fee)
|
|
|
|
for index, signature in tx.GetSignatures()
|
|
account = GetAccount(tx.GetSigners()[index])
|
|
bytesToSign := StdSignBytes(chainID, acc.GetAccountNumber(),
|
|
acc.GetSequence(), tx.Fee, tx.Msgs, tx.Memo)
|
|
if !signature.Verify(bytesToSign)
|
|
fail with "invalid signature"
|
|
|
|
return
|
|
```
|