cosmos-sdk/docs/core
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
..
baseapp_state_types.png Merge PR #4748: Write-Through Inter-Block Cache 2019-09-04 13:33:32 -04:00
baseapp_state-begin_block.png Merge PR #4748: Write-Through Inter-Block Cache 2019-09-04 13:33:32 -04:00
baseapp_state-checktx.png Merge PR #4748: Write-Through Inter-Block Cache 2019-09-04 13:33:32 -04:00
baseapp_state-commit.png Merge PR #4748: Write-Through Inter-Block Cache 2019-09-04 13:33:32 -04:00
baseapp_state-deliver_tx.png Merge PR #4748: Write-Through Inter-Block Cache 2019-09-04 13:33:32 -04:00
baseapp_state-initchain.png Merge PR #4748: Write-Through Inter-Block Cache 2019-09-04 13:33:32 -04:00
baseapp.md docs: 10180 Fix SDK (#10237) 2021-09-28 19:33:58 +02:00
cli.md docs: 10180 Fix SDK (#10237) 2021-09-28 19:33:58 +02:00
context.md docs: 10180 Fix SDK (#10237) 2021-09-28 19:33:58 +02:00
encoding.md docs: 10180 Fix SDK (#10237) 2021-09-28 19:33:58 +02:00
events.md docs: 10180 Fix SDK (#10237) 2021-09-28 19:33:58 +02:00
grpc_rest.md docs: 10180 Fix SDK (#10237) 2021-09-28 19:33:58 +02:00
node.md docs: 10180 Fix SDK (#10237) 2021-09-28 19:33:58 +02:00
ocap.md docs: 10180 Fix SDK (#10237) 2021-09-28 19:33:58 +02:00
proto-docs.md feat: Add AuxTxBuilder (#10455) 2021-11-11 11:25:13 +00:00
README.md documentation for in-place migrations with x/upgrade module (#8967) 2021-04-14 08:49:17 +00:00
runtx_middleware.md docs: 10180 Fix SDK (#10237) 2021-09-28 19:33:58 +02:00
simulation.md docs: 10180 Fix SDK (#10237) 2021-09-28 19:33:58 +02:00
store.md feat: ADR-038 Part 2: StreamingService interface, file writing implementation, and configuration (#8664) 2021-10-24 21:37:37 +00:00
telemetry.md perf: Remove more telemetry ops, update docs (#10334) 2021-10-11 08:23:42 +00:00
transactions.md docs: 10180 Fix SDK (#10237) 2021-09-28 19:33:58 +02:00
upgrade.md chore(upgrade): cleaning (#10413) 2021-10-22 10:56:08 +00:00

Core Concepts

This repository contains reference documentation on the core concepts of the Cosmos SDK.

  1. BaseApp
  2. Transaction
  3. Context
  4. Node Client
  5. Store
  6. Encoding
  7. gRPC, REST and Tendermint Endpoints
  8. Command-Line Interface
  9. Events
  10. Telemetry
  11. Object-Capabilities
  12. RunTx recovery middleware
  13. Simulation
  14. Protobuf documentation
  15. In-Place Store Migrations

After reading about the core concepts, check the IBC documentation to learn more about the IBC core concepts and how to integrate IBC in your application.