Skip to content

Conversation

@GeneFerneau
Copy link

@GeneFerneau GeneFerneau commented Jul 21, 2021

RFC to support shared ownership for two-party N-of-N multisignature outputs

Describes the protocol for creating a multiparty bulletproof and commitment for multisignature outputs

Requires a soft-fork due to changes in slate formatting incompatible with the current slate version

Link to rendered text

RFC to support shared ownership for two-party N-of-N multisignature
outputs

Describes the protocol for creating a multiparty bulletproof and
commitment for multisignature outputs

Requires a soft-fork due to changes in slate formatting incompatible
with the current slate version
```
(multisig_key_b_pub, multisig_key_b_sec) = b.keychain().derive_key(multisig_key_id)

part_commit_b = PedersenCommit(value, multisig_key_b_sec)
Copy link
Member

@phyro phyro Apr 17, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible for B to cancel the pubkey of A here? e.g.

part_commit_b = PedersenCommit(value, multisig_key_b_sec) - (part_commit_a - value*H)

or something similar? The attempt would be to create a commit_sum output that contains only the blinding factor of the party B. I'm not able to follow the bulletproof parts that follow because I'm not familiar with BPs, but perhaps the receiver could throw away the final bulletproof and simply construct the bulletproof alone since they know both values. This would also require B to also cancel the same key in the partial excess pubkey of B since A expects their private key to be a part of that.

The receiver then adds the Pedersen commitments together to get the `commit_sum`. The `commit_sum` is used for the remainder of the multiparty bulletproof building protocol, and is the commitment for the finalized bulletproof.

```
commit_sum = secp.commit_sum([part_commit_a, part_commit_b], [])
Copy link
Contributor

@DavidBurkett DavidBurkett Oct 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

part_commit_a + part_commit_b = PedersenCommit(2*value, multisig_key_a_sec + multisig_key_b_sec)

The value is committed to twice. So, unless they are referring to 2 different values, either part_commit_a shouldn't include it, or part_commit_b shouldn't, or they should split it.


Versioned slates allow for the incremental addition of new features to Grin transaction building. A new slate version 5 is proposed to include changes for multisignature outputs and atomic swaps.

Originally slate versions corresponded with hard forks in the Grin protocol, but there are no longer any scheduled hard forks. This means a soft fork is required to implement these changes.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is just a wallet protocol change. No fork of any kind is needed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants