cosmos-sdk/x
Amaury 8fc9f76329
feat: Add AuxTxBuilder (#10455)
<!--
The default pull request template is for types feat, fix, or refactor.
For other templates, add one of the following parameters to the url:
- template=docs.md
- template=other.md
-->

## Description

Closes: #10443 

For creating an intermediary/auxiliary tx (e.g. by the tipper in tipped transactions), using the existing `client.TxBuilder` is awkward. We propose a new client-side builder for this purpose.

API Usage (e.g. how the tipper would programmtically use this):
```go
// Note: there's no need to use clientCtx.TxConfig anymore!

bldr := clienttx.NewAuxTxBuilder()
err := bldr.SetMsgs(msgs...)
bldr.SetAddress("cosmos1...")
bldr.SetMemo(...)
bldr.SetTip(...)
bldr.SetPubKey(...)
err := bldr.SetSignMode(...) // DIRECT_AUX or AMINO, or else error
// ... other setters are available

// Get the bytes to sign.
signBz, err := bldr.GetSignBytes()

// Sign the bz using your favorite method.
sig, err := privKey.sign(signBz)

// Set the signature
bldr.SetSig(sig)

// Get the final auxSignerData to be sent to the fee payer
auxSignerData, err:= bldr.GetAuxSignerData()
```

auxSignerData is a protobuf message, whose JSON reprensentation looks like:

```json
{
  "address": "cosmos1...",
  "mode": "SIGN_MODE_{DIRECT_AUX,LEGACY_AMINO_JSON}",
  "sign_doc": {
    "body_bytes": "{base64 bytes}",
    "public_key": {
      "@type": "cosmos.sepc256k1.PubKey",
      "key": "{base64 bytes}"
    },
    "chain_id": "...",
    "account_number": 24,
    "sequence": 42,
    "tip": {
      "amount": [{ "denom": "uregen", "amount": 1000 }],
      "tipper": "cosmos1..."
    }
  },
  "sig": "{base64 bytes}"
}
```

Then the fee payer would use the TxBuilder to construct the final TX, with a new helper method: `AddAuxSignerData`:

```go
// get auxSignerData from AuxTxBuilder
auxSignerData := ...

txBuilder := txConfig.NewTxBuilder()
err := txBuilder.AddAuxSignerData(auxSignerData)

// Set fee payer data
txBuilder.SetFee()
txBuilder.SetGasLimit()
txBuilder.SetFeePayer()

sigs, err := txBuilder.GetSignaturesV2()
auxSig := sigs[0] // the aux signer's signature

// Set all signer infos (1st round of calling SetSignatures)
txBuilder.SetSignatures(
  auxSig,                   // The aux SignatureV2
  signing.SignatureV2{...}, // The feePayer's SignatureV2
)

// Sign
signBz, err = encCfg.TxConfig.SignModeHandler().GetSignBytes(...)
feepayerSig, err := feepayerPriv.Sign(signBz)

// Set all signatures (2nd round of calling SetSignatures)
txBuilder.SetSignatures(
  auxSig,                   // The aux SignatureV2
  signing.SignatureV2{feepayerSig, ...}, // The feePayer's SignatureV2
)
```

---

### Author Checklist

*All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.*

I have...

- [ ] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] added `!` to the type prefix if API or client breaking change
- [ ] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#pr-targeting))
- [ ] provided a link to the relevant issue or specification
- [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/master/docs/building-modules)
- [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#testing)
- [ ] added a changelog entry to `CHANGELOG.md`
- [ ] included comments for [documenting Go code](https://blog.golang.org/godoc)
- [ ] updated the relevant documentation or specification
- [ ] reviewed "Files changed" and left comments if necessary
- [ ] confirmed all CI checks have passed

### Reviewers Checklist

*All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.*

I have...

- [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] confirmed `!` in the type prefix if API or client breaking change
- [ ] confirmed all author checklist items have been addressed 
- [ ] reviewed state machine logic
- [ ] reviewed API design and naming
- [ ] reviewed documentation is accurate
- [ ] reviewed tests and test coverage
- [ ] manually tested (if applicable)
2021-11-11 11:25:13 +00:00
..
auth feat: Add AuxTxBuilder (#10455) 2021-11-11 11:25:13 +00:00
authz style: lint go and markdown (#10060) 2021-10-30 13:43:04 +00:00
bank fix: query account balance by ibc denom (#10394) 2021-11-11 10:37:33 +00:00
capability perf: avoid unnecessary byteslice->string before fmt %s verb (#10364) 2021-10-14 08:53:38 +00:00
crisis style: lint go and markdown (#10060) 2021-10-30 13:43:04 +00:00
distribution style: lint go and markdown (#10060) 2021-10-30 13:43:04 +00:00
epoching style: lint go and markdown (#10060) 2021-10-30 13:43:04 +00:00
evidence style: lint go and markdown (#10060) 2021-10-30 13:43:04 +00:00
feegrant style: lint go and markdown (#10060) 2021-10-30 13:43:04 +00:00
genutil perf: avoid unnecessary byteslice->string before fmt %s verb (#10364) 2021-10-14 08:53:38 +00:00
gov style: lint go and markdown (#10060) 2021-10-30 13:43:04 +00:00
group feat: Add Table-Store (aka ORM) package - Index and Iterator (#10451) 2021-11-09 18:01:27 +00:00
mint feat(mint): Implement custom inflation function. (#10441) 2021-11-08 10:56:10 +00:00
nft feat(x/nft): add data field in Class type of NFT module (#10501) 2021-11-10 14:16:46 +00:00
params fix: Check error for RegisterQueryHandlerClient in all modules RegisterGRPCGatewayRoutes (#10439) 2021-10-28 11:01:25 +00:00
simulation feat: Allow futureOps to queue more Ops (#10469) 2021-11-11 09:32:06 +00:00
slashing style: lint go and markdown (#10060) 2021-10-30 13:43:04 +00:00
staking style: lint go and markdown (#10060) 2021-10-30 13:43:04 +00:00
upgrade style: lint go and markdown (#10060) 2021-10-30 13:43:04 +00:00
README.md docs: fix module spec ordering (#9870) 2021-08-09 08:09:17 +00:00

List of Modules

Here are some production-grade modules that can be used in Cosmos SDK applications, along with their respective documentation:

  • Auth - Authentication of accounts and transactions for Cosmos SDK application.
  • Authz - Authorization for accounts to perform actions on behalf of other accounts.
  • Bank - Token transfer functionalities.
  • Capability - Object capability implementation.
  • Crisis - Halting the blockchain under certain circumstances (e.g. if an invariant is broken).
  • Distribution - Fee distribution, and staking token provision distribution.
  • Evidence - Evidence handling for double signing, misbehaviour, etc.
  • Feegrant - Grant fee allowances for executing transactions.
  • Governance - On-chain proposals and voting.
  • Mint - Creation of new units of staking token.
  • Params - Globally available parameter store.
  • Slashing - Validator punishment mechanisms.
  • Staking - Proof-of-Stake layer for public blockchains.
  • Upgrade - Software upgrades handling and coordination.

To learn more about the process of building modules, visit the building modules reference documentation.

IBC

The IBC module for the SDK has moved to its own repository.