Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

proposal: add a new MessageOption extension in signing to mark messages expected signers. #10933

Closed
4 tasks
fdymylja opened this issue Jan 12, 2022 · 9 comments · Fixed by #10977
Closed
4 tasks
Assignees
Labels
C: Proto Proto definition and proto release

Comments

@fdymylja
Copy link
Contributor

Summary

This proposes to add a new google.protobuf.MessageOption extension in signing which can be used to mark an sdk.Msgs expected signer in a language agnostic way.

Problem Definition

The GetSigners method of a message depends on the golang implementation. This means that multichain dynamic clients cannot make use of this information and need to manually populate a TXs authentication info, same goes for clients written in a language which is not golang.

This is unscalable long term, and a big maintainance burden, and is a big blocker in the design of generalised multipurpose tooling for working with cosmos-sdk chains.

Proposal

This is backwards compatible.

In cosmos-sdk/proto/cosmos/tx/signing/v1beta1/signing.proto (or it could be another file):

We add the following protobuf extension:

extend google.protobuf.MessageOptions {
  // required_signers must contain the fields of the protobuf
  // message descriptor which is extend through this option
  // that represent the signers of a transaction.
  repeated string required_signers = 11100000;
}

Then in every tx.proto file of the sdk, we use the extension to mark which fields in a message identify a signer,

Example in cosmos-sdk/proto/cosmos/bank/v1beta1/tx.proto:

// MsgSend represents a message to send coins from one account to another.
message MsgSend {
  // this is the added message option which marks signers.
  option (cosmos.tx.signing.v1beta1.required_signers) = "from_address"; 
  
  option (gogoproto.equal)           = false;
  option (gogoproto.goproto_getters) = false;

  string   from_address                    = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];
  string   to_address                      = 2 [(cosmos_proto.scalar) = "cosmos.AddressString"];
  repeated cosmos.base.v1beta1.Coin amount = 3
      [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"];
}

Note: there are more complex signing structures (although not many) such as MsgMultiSend in which the signers are inside the Input message - for this specific case a solution would be to extend Input with the required_signers extension.

Besides this change in the proto files, another change is required for correct implementation which is that during MsgServers registration we also do proper checks on the descriptor that:

  1. required_signers field exist in a message
  2. required_signers field are all of kind string.

cc: @aaronc, @AmauryM, @jackzampolin, @marbar3778


For Admin Use

  • Not duplicate issue
  • Appropriate labels applied
  • Appropriate contributors tagged
  • Contributor assigned/self-assigned
@amaury1093
Copy link
Contributor

Thanks! This is a great addition, I love this. This should make client development easier (ccing @webmaster128 for fyi).

Note: there are more complex signing structures (although not many) such as MsgMultiSend in which the signers are inside the Input message - for this specific case a solution would be to extend Input with the required_signers extension.

Could you also write down how required_signers would look like in that case?

Also: why is this extension in cosmos, and not in cosmos_proto?

@webmaster128
Copy link
Member

Great stuff, thanks a lot for pushing this! Right now we somehow expect the user to know who needs to sign a message or build UIs where only the correct person can sign due to limited message support. Great to see this information in the proto file.

@fdymylja
Copy link
Contributor Author

thank you for the feedback @AmauryM.

Also: why is this extension in cosmos, and not in cosmos_proto?

Although I have no strong opinion in where the extension definition should be, I think signing is a better fit for two reasons:

  1. I intended cosmos_proto as encoding/decoding information.
  2. Tying this to signing feels more right because it is strictly related to how we sign things right now (emphasis on right now), and this extension will eventually evolve based on how signing evolves.

Could you also write down how required_signers would look like in that case?

In MsgMultiSend we specify that inputs contains a signer.

message MsgMultiSend {
  // we signal inputs contains signers, the implementation can see that inputs is repeated of a protoreflect.MessageKind
  option (cosmos.tx.signing.v1beta1.required_signers) = "inputs"; 
 
  option (gogoproto.equal) = false;

  repeated Input  inputs  = 1 [(gogoproto.nullable) = false];
  repeated Output outputs = 2 [(gogoproto.nullable) = false];
}

In Input we signal which is the real signer field.

message Input {
   // we signal in Input that address is a field that contains a signer
   option (cosmos.tx.signing.v1beta1.required_signers) = "address"; 
    
  option (gogoproto.equal)           = false;
  option (gogoproto.goproto_getters) = false;

  string   address                        = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];
  repeated cosmos.base.v1beta1.Coin coins = 2
      [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"];
}

We can avoid signalling in MsgMultiSend that input contains a signer and let the DynamicGetSigners implementation expand the descriptors and find it by itself, but I still think explicit is better than implicit in this case.

@aaronc
Copy link
Member

aaronc commented Jan 12, 2022

I was thinking of putting the option as a bool on the field itself:

message MsgSend {
  string   from_address = 1 [(cosmos.tx.v1.signer) = true];
  ...
}

Any reason to prefer one or the other? I guess the string approach explicitly specifies order, whereas order would be implicit (field number-based probably?) with the field option. With the string approach, you could misspell something or incorrectly specify - either way we'd want some runtime validation at startup.

This is related to deprecating the sdk.Msg interface as discussed in #10368 btw.

@fdymylja
Copy link
Contributor Author

I was thinking of putting the option as a bool on the field itself:

message MsgSend {
  string   from_address = 1 [(cosmos.tx.v1.signer) = true];
  ...
}

Any reason to prefer one or the other? I guess the string approach explicitly specifies order, whereas order would be implicit (field number-based probably?) with the field option. With the string approach, you could misspell something or incorrectly specify - either way we'd want some runtime validation at startup.

This is related to deprecating the sdk.Msg interface as discussed in #10368 btw.

Runtime checks will be a must due to kind assertions.

I have no swtrong opinion on field option vs message option.

Field option pros:

  1. it's not error prone on field naming.

Field option cons:

  1. get signers impl will need to check every field recursively (maybe we could pre-compute it at runtime though?)

Message option pros:

  1. Signals directly on the message which are the signer fields.

Message option cons:

  1. More error prone (although, you do it once only).

If we reach consensus on this part I can start a PR to implement this, there are some libs that could make use of this feature right now (in the immediate term too).

@aaronc
Copy link
Member

aaronc commented Jan 12, 2022

Thanks @fdymylja 🙏. I honestly don't have a strong opinion on field vs message. @AmauryM @webmaster128 ?

Let's please do this in a v1 proto package. Maybe cosmos.msg.v1?

@amaury1093
Copy link
Contributor

Small preference for option (cosmos.tx.signing.v1beta1.required_signers) = "from_address";. It reads better for humans.

@aaronc
Copy link
Member

aaronc commented Jan 12, 2022

option (cosmos.tx.signing.v1beta1.required_signers) = "from_address";

How about option (cosmos.msg.v1.signers) = "from_address"? I like shorter names when possible 😉

@tac0turtle tac0turtle added the C: Proto Proto definition and proto release label Jan 13, 2022
@fdymylja
Copy link
Contributor Author

I will work on it this week or next.

Could we include this into 0.45 (proto changes + msg checks)?
Could we backport this into 0.44 (proto changes only)?

@fdymylja fdymylja self-assigned this Jan 17, 2022
@mergify mergify bot closed this as completed in #10977 Jan 28, 2022
mergify bot pushed a commit that referenced this issue Jan 28, 2022
…e agnostic way (#10977)

## Description

Closes: #10933 



---

### 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)
alpe added a commit to CosmWasm/wasmd that referenced this issue Jan 9, 2023
alpe added a commit to CosmWasm/wasmd that referenced this issue Jan 11, 2023
* Upgrade to sdk v0.47 branch

* More integration work

* SDK version upgrade; fixes

* More fixes

* Fixes

* Deactivate failing tests

* SDK + ibc-go version upgrades

* limix gas fix

(cherry picked from commit f7f8417)

* with valset in bench

(cherry picked from commit 35b2a8f)

* Revert staking query handler; fix tests

* Minor cleanup

* Rebased

* Address linter issues

* Set legacy router proper

* Deactivate failing test. Race condition needs to handled in SDK

* Address some code smells

* Bump sdk version

* Use gov v1 internally for votes

* Activate test after sdk fix

* Add group test

* Add config template for wasm fields

* Add Rust backtrace flag for more debug output on simulations

* Set unique node folder for tests

* Revert "Add Rust backtrace flag for more debug output on simulations"

This reverts commit 218c3c6.

* Simulations

* Run also im/export + deterministic sims

* Add package prefix to interfaces

* Add signer annotation (cosmos/cosmos-sdk#10933), minor cleanup

* Bump sdk version

* Review comments

Co-authored-by: vuong <nguyenvuong1122000@gmail.com>
alpe added a commit to CosmWasm/wasmd that referenced this issue Mar 20, 2023
* Start cosmos-sdk v0.47 integration (#1136)

* Upgrade to sdk v0.47 branch

* More integration work

* SDK version upgrade; fixes

* More fixes

* Fixes

* Deactivate failing tests

* SDK + ibc-go version upgrades

* limix gas fix

(cherry picked from commit f7f8417)

* with valset in bench

(cherry picked from commit 35b2a8f)

* Revert staking query handler; fix tests

* Minor cleanup

* Rebased

* Address linter issues

* Set legacy router proper

* Deactivate failing test. Race condition needs to handled in SDK

* Address some code smells

* Bump sdk version

* Use gov v1 internally for votes

* Activate test after sdk fix

* Add group test

* Add config template for wasm fields

* Add Rust backtrace flag for more debug output on simulations

* Set unique node folder for tests

* Revert "Add Rust backtrace flag for more debug output on simulations"

This reverts commit 218c3c6.

* Simulations

* Run also im/export + deterministic sims

* Add package prefix to interfaces

* Add signer annotation (cosmos/cosmos-sdk#10933), minor cleanup

* Bump sdk version

* Review comments

Co-authored-by: vuong <nguyenvuong1122000@gmail.com>

* Bump bufbuild/buf-setup-action from 1.11.0 to 1.12.0

Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.11.0 to 1.12.0.
- [Release notes](https://github.com/bufbuild/buf-setup-action/releases)
- [Commits](bufbuild/buf-setup-action@v1.11.0...v1.12.0)

---
updated-dependencies:
- dependency-name: bufbuild/buf-setup-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit f490595)

* Remove intertx for vanilla ICA

* fix msg format in EVENTS.md

(cherry picked from commit 38d466a)

* Better to sdk coin convertion (#1164)

* Better to sdk coin convertion

* Review feedback

(cherry picked from commit a925a9e)

* Disallow only address permission (#1163)

* Remove AccessTypeOnlyAddress for store msg

* Remove AccessTypeOnlyAddress for update config msg

* Review feedback

Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com>

Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com>
(cherry picked from commit 8991633)

* Integrate wasmvm v1.2.0 (backport #1161) (#1175)

* Integrate wasmvm v1.2.0 (#1161)

* Bump wasmvm version

* Bump wasm test contracts

* Encode weighted votes

* Encode instantiate2

* Handle code info query; better wasmvm errors

* Fix readme

* Make linter happy

* add non cgo build

* Review comments

* Bump wasmvm to release version

Co-authored-by: jhernandezb <contact@jhernandez.me>
(cherry picked from commit 957b38e)

# Conflicts:
#	x/wasm/keeper/handler_plugin_encoders.go
#	x/wasm/keeper/handler_plugin_encoders_test.go
#	x/wasm/keeper/keeper.go
#	x/wasm/keeper/keeper_test.go

* Adress merge conflicts

Co-authored-by: Alexander Peters <alpe@users.noreply.github.com>

* Bump bufbuild/buf-setup-action from 1.12.0 to 1.13.0

Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.12.0 to 1.13.0.
- [Release notes](https://github.com/bufbuild/buf-setup-action/releases)
- [Commits](bufbuild/buf-setup-action@v1.12.0...v1.13.0)

---
updated-dependencies:
- dependency-name: bufbuild/buf-setup-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit ffa0e5e)

* Emit events for setContractAdmin + setAccessConfig (#1179)

(cherry picked from commit c9e7830)

* Dependency upgrades (#1172)

* Bump sdk version to lastest

* Bump ibc-go  version to lastest

* Remove channel hack

* Update to ibc-go v7 + protoVer=0.11.5

* Bump bufbuild/buf-setup-action from 1.13.0 to 1.13.1

Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.13.0 to 1.13.1.
- [Release notes](https://github.com/bufbuild/buf-setup-action/releases)
- [Commits](bufbuild/buf-setup-action@v1.13.0...v1.13.1)

---
updated-dependencies:
- dependency-name: bufbuild/buf-setup-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit de27e7f)

* Fix typos (backport #1185) (#1194)

* Fix typos

(cherry picked from commit c88b819)

# Conflicts:
#	proto/cosmwasm/wasm/v1/tx.proto

* Fix merge conflict

---------

Co-authored-by: Alex Peters <alpe@users.noreply.github.com>

* Bump bufbuild/buf-setup-action from 1.13.1 to 1.14.0 (#1200)

Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.13.1 to 1.14.0.
- [Release notes](https://github.com/bufbuild/buf-setup-action/releases)
- [Commits](bufbuild/buf-setup-action@v1.13.1...v1.14.0)

---
updated-dependencies:
- dependency-name: bufbuild/buf-setup-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit f3fc31c)

* list-contract-by-code bugfix

(cherry picked from commit 2ccffed)

* fix: stargate querier does not reset the state

(cherry picked from commit fd03235)

* test: add unit test

(cherry picked from commit 6d8018a)

* Add Windows client support (#1197)

* Add Windows client support

* Separate server and windows client

---------

Co-authored-by: Alex Peters <alpe@users.noreply.github.com>
(cherry picked from commit 8a20779)

* Bump bufbuild/buf-setup-action from 1.14.0 to 1.15.0

Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.14.0 to 1.15.0.
- [Release notes](https://github.com/bufbuild/buf-setup-action/releases)
- [Commits](bufbuild/buf-setup-action@v1.14.0...v1.15.0)

---
updated-dependencies:
- dependency-name: bufbuild/buf-setup-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit e5fab3d)

* Rename windows client binary

(cherry picked from commit de09c7f)

* Return IBC packet sequence number (backport #1225) (#1233)

* Return IBC packet sequence number (#1225)

* Return IBC packet sequence number

* Fix review feedbacks

* Remove names to return values in DispatchMsg method

* Fix comments

(cherry picked from commit 4f1c57f)

# Conflicts:
#	x/wasm/keeper/handler_plugin.go

* Fix merge conflict

---------

Co-authored-by: pinosu <95283998+pinosu@users.noreply.github.com>
Co-authored-by: Alex Peters <alpe@users.noreply.github.com>

* Test rust panic for regression

(cherry picked from commit a52e604)

* Fix client checksum verification (#1234)

* Fix client checksum verification

* Review comments

(cherry picked from commit 1a8019b)

# Conflicts:
#	x/wasm/client/cli/gov_tx.go

* Fix merge conflict

* Fix linters

* Configure sonarcloud analysis

(cherry picked from commit 85cf161)

* Bump bufbuild/buf-setup-action from 1.15.0 to 1.15.1

Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.15.0 to 1.15.1.
- [Release notes](https://github.com/bufbuild/buf-setup-action/releases)
- [Commits](bufbuild/buf-setup-action@v1.15.0...v1.15.1)

---
updated-dependencies:
- dependency-name: bufbuild/buf-setup-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit 730ea5a)

* Make `CaptureIbcEvents` in ibctesting public.

Before this change, it wasn't possible to implement the
`chain.SendMsgs` method without
[copying](https://github.com/public-awesome/ics721/blob/main/e2e/suite_helpers.go#L81-L98)
them over.

(cherry picked from commit b64fa07)

* Upgrade to wasmvm 1.2.1 (backport #1245) (#1254)

* Upgrade to wasmvm 1.2.1 (#1245)

* Use wasmvm store adapter

* Bump wasmvm to v1.2.1

(cherry picked from commit 850f901)

# Conflicts:
#	go.mod
#	go.sum
#	x/wasm/keeper/keeper.go

* Resolve conflicts

---------

Co-authored-by: Alexander Peters <alpe@users.noreply.github.com>

* WIP All cometbft (#1244)

* Dep upgrade; use CometBft

* Remove duplicte message events

* Add changelog for v0.31.0 (#1188)

* Start changelog for v0.31.0

* Add ICA upgrade

* Add proto version link to buf.build

* Update changelog (#1239)

* Update changelog

* Update changelog with latest changes

* Set release date

---------

Co-authored-by: pinosu <95283998+pinosu@users.noreply.github.com>
(cherry picked from commit bc0e817)

* Remove new message type event

* Support msg update params gov proposal (#1247)

* Add MsgUpdateParams support

* Implement UpdateParams msg

* Fix test UpdateParams

* Add migration test

* Fix

* Fix lint issues

* Revert changes according to review feedback

* Remove more x/params dependencies

* Remove x/params from genesis test

* Formatting

* Restore old changes

* fix lint

* Fix tests and restructure migrations

* Rename alias for convention

---------

Co-authored-by: Alex Peters <alpe@users.noreply.github.com>

* Fix test data generator (#1263)

* linting 47 pr (#1261)

* lint cosmwasm for sdk 47

* fix

* remove setGenesis

* remove additional unused functions

* pass tests

* use SDK's errors module

* unecessary conversions

* unnecessary conversions

* remove unneeded event manager

* complete linting of tests for 47

* add test for reimportation

* check errors

* Update x/wasm/keeper/proposal_integration_test.go

Co-authored-by: Alexander Peters <alpe@users.noreply.github.com>

* apply suggestion

* suggestions

* lints

* don't return error in when making new transactions

* no todo's in the code

* Fix test data generator

* Update x/wasm/types/genesis_test.go

Co-authored-by: Alexander Peters <alpe@users.noreply.github.com>

* use the full string invalid address (2 words) always

---------

Co-authored-by: Alexander Peters <alpe@users.noreply.github.com>

* Regenerate from proto; remove dead code; polish code

* Set SDK version to v0.47x.0 (#1262)

* Set SDK version to v0.47x.0

* Set chainID

* Minor updates

* Set chainID for simulations

* Buf mod update

* Use sdk tag instead of hash in buf

* Bump ibc-go to v7.0.0

* faddat/re merge main (#1274)

undefined

---------

Co-authored-by: vuong <nguyenvuong1122000@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: llllllluc <58892938+llllllluc@users.noreply.github.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Co-authored-by: Gjermund Garaba <gjermund@garaba.net>
Co-authored-by: Nikhil Suri <nikhilsuri@comcast.net>
Co-authored-by: Paul <p22626262@gmail.com>
Co-authored-by: pinosu <95283998+pinosu@users.noreply.github.com>
Co-authored-by: ekez <zekemedley@gmail.com>
Co-authored-by: Jacob Gadikian <jacobgadikian@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C: Proto Proto definition and proto release
Projects
No open projects
5 participants