-
Notifications
You must be signed in to change notification settings - Fork 137
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
Add support for sending compact slates #366
Add support for sending compact slates #366
Conversation
It was discussed in the past that this would be an RFC. I still think that would be a good idea so we could all weigh in on what belongs in the slate. |
Yes, (perhaps should have been clearer that) that's the plan. I need to have a play around with this and get something working, so the intention is to introduce the RFC alongside this PR once I've formed an opinion on the best approach. |
With the compacted transaction workflow working, the current state of a compact slate is:
Summarizing next steps based on discussions in the wallet dev transaction building channel.
Next steps would be to reduce the initial compacted slate to something like the following:
|
libwallet/src/slate.rs
Outdated
.commit_sum(vec![tx_excess], vec![offset_excess])?) | ||
// if explicit excess is provided, just add to the current | ||
// tx sum without including the offset. Otherwise, calc as normal | ||
if let Some(ex) = self.excess.as_ref() { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
H
Latest state of Slate:
And with a payment proof:
I've updated the top comment with the fuller list of slate changes, last couple of outstanding questions are:
|
Nice work documenting all this and providing samples @yeastplume! I'm putting on a nitpick hat and trying to be "clever" with ways to reduce this even further. I suspect some of this cleverness may be a bit too clever for my own good here, so please forgive me if these are stupid suggestions. IdeasRe-considering
|
Yep, if we decide we need to leave the block version in something like this will work fine. Otherwise it just becomes "version": 4
I would like to keep UUID, but we can de/ser shorter UUIDs into the slate: https://github.com/seigert/shorter-uuid-rs Fine with all of the field renaming.
This is just being output with pretty-printing for reference. They can also be output without whitespace for more compactness, and the whitespace can be re-added for printing at any stage if needed. |
See the RFC for continued discussion of compacting the Slate: This particular PR is already far larger than I'd like it to be, but it implements the parts of the RFC that required some experimentation and validation. Before this one gets much bigger, would prefer to clean it up, merge once we're a little way into the RFC process, then implement the rest in further PRs. |
Ready for review/merge now provided there isn't major pushback on the RFC (which there doesn't appear to be just yet). Apologies again for the length, but further changes towards compacting the slate and conforming to the RFC should be contained in much shorter PRs. |
See mimblewimble/rust-secp256k1-zkp#68 for cause of current test failures, will fix once new version of libsecp is integrated into Grin. |
/// A message for other participants | ||
pub message: Option<String>, | ||
/// Signature, created with private key corresponding to 'public_blind_excess' | ||
#[serde(with = "secp_ser::option_sig_serde")] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These directives and the Serialize trait on the Slate and included structs aren't necessary (only versioned slates are ever de/serialized), will be cleaning this up in a further PR
Created a separate branch |
* Add support for sending compact slates (#366) * WIP add support for sending compact slates * add repopulate_tx function to internal API * first pass at compacted slate working * move slate compaction to separate function * test fixes * support compact slate inits in invoice workflow * add compress flags to send and invoice * attempting to remove is_compact and assume all V4 slates begin as compact * attempting to calculate offsets when full tx data isn't available * update calc_commit to use participant blind data * update doctests for compact slates * start to remove unneeded fields from serialization * make num_participants optional * remove other_version from slate * use grin master branch * remove message field * lock height assumed to be 0 if it doesn't exist * don't serialise receiver signature when null * don't serialize payment_info if not needed * remove participant id from participant info * add note on id field * fix finalize and receive doctests * finalize_tx tests, init_send_tx tests * doctests for process_invoice_tx, retrieve_tx, tx_lock_outputs * finished test changes * update from grin master * rebuild PR from diff (#380) * recreate PR from diff (#381) * serialize tx struct into top level coms object (#382) * remove height (#383) * Add State Slate (#384) * add state field to slate and SlateV4 * set slate state at each transaction stage, add check to tests * serialize slate status properly * V4 Slate field tweaks (#386) * various tweaks to V4 slate * field renaming * serialize slate v4 ID as base64 (#387) * remove amount and fee where not needed (#388) * Final Changes for compact Slate (#389) * add tests for all types of file output, remove message args * default range proof serialization * shorten output features serialization * rename payment proof fields in slate v4 * v4 payment proof serialization * Binary Slates (#385) * start test implementation * add experimental binary serialization to slate * serialize id * serialize fields that can be skipped as a separate struct * factor out sigs serialization * clean up sigs and coms serialization * completed v4 bin serialization * add manual de/ser traits for V4 bin slate * add simple byte array serializer * complete wiring in of bin slate serialization * clarify comment * clarify comment * update version * test output dir name fix * update slate v4 change description * add binary output to command line * Remove unneeded signature data during S2 and I2 stages (#390) * remove unneeded return signature data during S2 * remove unneeded sig data from I2 * Doctest Fixes for compact slate branch (#392) * begin to fix doctests * more doctest fixes * fix receive_tx * update get_stored_tx to accept an UUID instead of a tx object, and operate on a raw Transaction object (#394) * Fixes to async transaction posting (#395) * unstash post_tx changes * add offset during S3 and I3 * Revert slate id serialization to hex-string uuid (#396) * update from master (#397) * v3.x.x - v4.0.0 wallet compatibility fixes (#398) * changes to support http sending to v3 wallets * sending via http/tor TO 3.0.0 wallet works * receiving FROM 3.0.0 wallets works over http/tor * output converted V3 slate when needed * paying invoices from 3.0.0 wallets working * handle all participant info in slate states * sending and receiving standard file transactions between v3 and 4 wallets confirmed working * all file-based workflows working * fixes resulting from tests * remove reminder warnings * remove lock_height, add kernel_features + arguments (#399) * grin-wallet master now building against grin master (#402) (#403) Co-authored-by: Antioch Peverell <[email protected]> * Enhanced offset creation (#407) * initial tests reworking offset creation * invoice flow fixing + tests * further test fixes * change offset name in v4 slate, base64 serialize * logic optimisation * changes based on review feedback Co-authored-by: Antioch Peverell <[email protected]>
* Add support for sending compact slates (mimblewimble#366) * WIP add support for sending compact slates * add repopulate_tx function to internal API * first pass at compacted slate working * move slate compaction to separate function * test fixes * support compact slate inits in invoice workflow * add compress flags to send and invoice * attempting to remove is_compact and assume all V4 slates begin as compact * attempting to calculate offsets when full tx data isn't available * update calc_commit to use participant blind data * update doctests for compact slates * start to remove unneeded fields from serialization * make num_participants optional * remove other_version from slate * use grin master branch * remove message field * lock height assumed to be 0 if it doesn't exist * don't serialise receiver signature when null * don't serialize payment_info if not needed * remove participant id from participant info * add note on id field * fix finalize and receive doctests * finalize_tx tests, init_send_tx tests * doctests for process_invoice_tx, retrieve_tx, tx_lock_outputs * finished test changes * update from grin master * rebuild PR from diff (mimblewimble#380) * recreate PR from diff (mimblewimble#381) * serialize tx struct into top level coms object (mimblewimble#382) * remove height (mimblewimble#383) * Add State Slate (mimblewimble#384) * add state field to slate and SlateV4 * set slate state at each transaction stage, add check to tests * serialize slate status properly * V4 Slate field tweaks (mimblewimble#386) * various tweaks to V4 slate * field renaming * serialize slate v4 ID as base64 (mimblewimble#387) * remove amount and fee where not needed (mimblewimble#388) * Final Changes for compact Slate (mimblewimble#389) * add tests for all types of file output, remove message args * default range proof serialization * shorten output features serialization * rename payment proof fields in slate v4 * v4 payment proof serialization * Binary Slates (mimblewimble#385) * start test implementation * add experimental binary serialization to slate * serialize id * serialize fields that can be skipped as a separate struct * factor out sigs serialization * clean up sigs and coms serialization * completed v4 bin serialization * add manual de/ser traits for V4 bin slate * add simple byte array serializer * complete wiring in of bin slate serialization * clarify comment * clarify comment * update version * test output dir name fix * update slate v4 change description * add binary output to command line * Remove unneeded signature data during S2 and I2 stages (mimblewimble#390) * remove unneeded return signature data during S2 * remove unneeded sig data from I2 * Doctest Fixes for compact slate branch (mimblewimble#392) * begin to fix doctests * more doctest fixes * fix receive_tx * update get_stored_tx to accept an UUID instead of a tx object, and operate on a raw Transaction object (mimblewimble#394) * Fixes to async transaction posting (mimblewimble#395) * unstash post_tx changes * add offset during S3 and I3 * Revert slate id serialization to hex-string uuid (mimblewimble#396) * update from master (mimblewimble#397) * v3.x.x - v4.0.0 wallet compatibility fixes (mimblewimble#398) * changes to support http sending to v3 wallets * sending via http/tor TO 3.0.0 wallet works * receiving FROM 3.0.0 wallets works over http/tor * output converted V3 slate when needed * paying invoices from 3.0.0 wallets working * handle all participant info in slate states * sending and receiving standard file transactions between v3 and 4 wallets confirmed working * all file-based workflows working * fixes resulting from tests * remove reminder warnings * remove lock_height, add kernel_features + arguments (mimblewimble#399) * grin-wallet master now building against grin master (mimblewimble#402) (mimblewimble#403) Co-authored-by: Antioch Peverell <[email protected]> * Enhanced offset creation (mimblewimble#407) * initial tests reworking offset creation * invoice flow fixing + tests * further test fixes * change offset name in v4 slate, base64 serialize * logic optimisation * changes based on review feedback Co-authored-by: Antioch Peverell <[email protected]>
Very WIP at the moment, with the goal being to allow a 'compact slate' mode where the sender only provides their calculated excess instead of all of their inputs/outputs. Will fill out with more detail as we go.
Notes so far:
Changes to slate to support mimimalization:
tx
field becomes an Optiontx
field is omitted from the slate if it is None (null)tx
field and enclosed inputs/outputs do not need to be included in the first leg of a transaction exchange. (All inputs/outputs naturally need to be present at time of posting).num_participants
becomes an Optionnum_participants
may be omitted from the slate if it is None (null), ifnum_participants
is omitted, its value is assumed to be 2lock_height
becomes an Optionlock_height
may be omitted from the slate if it is None (null) iflock_height
is omitted, it's value is assumed to be 0ttl_cutoff_height
may be omitted from the slate if it is None (null),payment_proof
may be omitted from the slate if it is None (null),message
is removed fromparticipant_info
entriesmessage_sig
is removed fromparticipant_info
entriesid
is removed fromparticipant_info
entries. Parties can identify themselves via private keys stored in the transaction context. The initiator must also record whether the transaction was intended to be an invoice in the contextpart_sig
may be omitted from aparticipant_info
entry if it has not yet been filled outreceiver_signature
may be omitted frompayment_proof
if it has not yet been filled out