The transaction system in Stellar is something I find very elegant. It's very expressive, and very powerful, for what it does.
The way you can have multiple parties come together in one transaction, and do things atomically in one go (OTC trades/swaps/shuffles, e.g.), which would in other systems take multiple rounds of carefully thought-out transactions.
The way you bundle operations into atomic packets, where every operation has to succeed, and how you can do conditional transactions using that.
The way signature thresholds and signing weights can be use to express much more complex schemes than just your regular old n-of-m.
The way user specified signers sign for accounts, and not necessarily just the private key corresponding to an account.
Somehow signature aggregation didn't make it into the system. I think it should have.
I've seen systems where you post a transaction on the chain, and then signers post their signatures on the chain, and when a required number of signers have signed the transaction is executed.
Stellar decided against a solution like that, and I'd agree.
Signature aggregation is messaging about transactions.
I guess I'm a bit of a purist here, but I think that is something that is better taken care of off-chain.
First of all, you have no bloating of the ledger with ephemeral data. A proposed transaction is only live until either the transaction is accepted by enough signers (and subsequently published), or until it's cancelled (manually, or by a time out).
Not having to worry about data sizes also brings you a lot more flexibility, and security; You can encrypt proposed transactions so only the signers can examine them, sending each signer an encrypted blob only they can decrypt.
You're not dependent on ledger updates for disseminating information between signers, so your information flow is a lot quicker.
No complications with sequence numbers
I think what ought to have been done, is for signature aggregation to have been integrated into the Horizon service.
- Horizon is what everyone is interacting with already.
- Instead of posting a fully signed transaction, you'd post a partially signed transaction.
- Signing requests would be broadcast to signers using event streams, just like the various ledger events are.
Since that didn't happen, the second best thing is having a 3rd party decentralized network for off-chain signing, working in the same way.
Decentralized networks aren't anything new, we know how to deal with them. You'd get some amount of people to run nodes, and have clients remember a number of nodes they have been in touch with + a couple of seeds. The nodes make sure to synchronize transaction proposals, signatures, and signing requests.
Again, ideally that would have been part of Horizon, to get things working seamlessly.
I think elegance is worth striving for, and that's why I'd go off-chain anytime. On-chain is like putting lipstick on Mona Lisa.