-
Notifications
You must be signed in to change notification settings - Fork 793
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
Default multisig only for receive blocks #1150
Comments
This alters a core principle of Nano where only the user writes to their chain. This also raises an attack vector where representatives can delete blocks from a blockchain by overwriting them with a multisig receive block This can be nullified, of course. It's more a comment on the complexities of the implementation than the design itself. I also don't believe this is even an attack vector to consider as:
|
The weight of the representative may change over time, also you didn't know the weight if you are a light-wallet, for instance. I think the representative could create a receive-block, but only the representative. If a It's must simpler than use a MuSign. The verifier, even a ligh-wallet, could verify if the block was signed by himself ( Actually, the pending blocks could be partially pruned. The node need only the hash, the amount and the public-key of the receiver, it's 80 bytes against 216 bytes of a full state-block. But the PoW still a problem. |
I would have to disagree, the core principle of Nano is to be a currency and do it well, as long it follows this, it's doing fine. Sure you pointed a real problem that could happen, the overwritten block. But that's easily fixed by this multisig blocks having a lower priority than a singlesig. The gains are focused on the pruning, a full historical node for once has little to gain. But as it is expected for the majority of the network's node to be pruned ones, it's a real gain overall. |
As long as the light client has the latest block, it can always traverse the chain of the sender's blocks if need be. I'm also sure there's a lot of ways that a light client could be smart about this, such as limiting the amount of previous send blocks it stores for a single account or pruning them after time. |
Just to separate comments: That's an alternative way of looking at it. Sure it could be used only by the account's representative to sign the But there's a reason I propose MuSign, that being you can split the block PoW into the 12 signers and each representative may do only a 1/12 PoW compared to the threshold, what makes the job easier for each one and still have the same, if not better, block spam prevention mechanism - it takes more time before the block start its propagation with no consequences to the transaction speed accepted - if the owner wants it to be signed faster he can still sign the block himself. I don't know how the For non historical nodes that still leaves us with a lot of blocks on pending not capable of being fully pruned, so by doing the multisig |
One of the reasons Pruning should be solved at a protocol level, clients can do anything with the data even now, but that just sounds like a quick fix for a real problem. |
I would rather take the simpler solution of having the representative do it, over a multisig. By picking 12 people do the works of tens/hundreds of representatives, even if they do 1/12 of the work per TX, they still must do it for more TXs. I also think it should be an opt-in feature as to not overload the more popular representatives, and that we shouldn't use 75% over a flat 51%. |
What if the destination account does not exist? |
Do you mean an invalid account or lack of an open block? The second one is only an issue if we don't use a multisig (unless that just makes it even worse if one of the twelve are offline). I assume it means that send block can't be pruned. |
Unopened accounts are indeed a problem, as they don't have a previously chosen representative. But it can be assigned the same representative of the sender account, as the vote weight was on his possession and he was already assigning to this representative, so at the end of this tx no weight would have moved from this representative and that's safe enough. Multisig is not optional, you can't have people that don't own the private key from the account signing transactions if you don't have Multisig. |
You can have their representative do it. Then it's not a multi-sig. It's just the rep's signature. I was referring to "MuSign" though. Random people writing to my chain with a fixed cooldown time sounds broken as hell. |
As a clarification on how pending entries are stored internally: when a send is created, a pending entry containing the source hash and the amount to be received is created, rai::pending_entry We don’t actually reference the source block from that point on so the source account chain can still be pruned. Bloat of this table is something we should look at. |
Additionally these entries are very small, 32 + 16 bytes. A solution that involves even 1 signature at 64 bytes would be larger. |
This question is focused on upgrading the block type because it supposedly can help to clear this pending entries table as a final solution. If it won't help, or if it makes the tx processing risky or heavier, the focus can be changed. To prevent the bloat of this table on full and pruned nodes, it can be used MuSig stapling on the hash. As @clemahieu said, the entries are 32 + 16 bytes. When you can count a lot of them you could use MuSig stapling and have a line of hash 32 bytes * N (up to 127) entries / N (stapling) = 32 bytes total, while keeping the amount value untouched leaving a line of 16 bytes * N entries = 16 bytes per entry. Reducing thus the total up from 32 * 127 +16 * 127 bytes to 32 + 16 * 127 bytes. At the maximum stapling capacity it would save (6069 bytes - 2064 bytes) 4032 bytes. One could say an R value is needed, but as these hash are not implying any trusted party on them (signature), you only need to check the hash of the block itself. If the pending entry can contain only the source hash, the reduction of the table can be massive from (up to) 6069 to 32 bytes. Right now this is about looking for an easier option where no block needs to be created on chain, and all the pendings can be stored on the same space used to keep one or two |
This may help with the idea |
Every transaction is composed of two blocks, a
send block
and areceive block
. This is perfect to process transactions, since it's an asynchronous network.But while the
receive block
have not yet been signed, thesend block
is stuck on a state that makes it not possible to be pruned. What leaves opened this vector of spam for the pruned network.To solve this situation it could be created a new version of the block which once it's perceived as a pending transaction, the receive block could be signed by someone else in the network as if it was on a multisig signature. For example, if a block is pending it can be assigned 12 representatives (MuSign) to sign the receive block and it would be added to the individual blockchain receiving the transaction.
This would only be possible at this case of
receive block
, any other type of block would only be permitted to be signed by the account owner.Is this possible to be done to individual blockchain? Would only a block update make this happen?
The text was updated successfully, but these errors were encountered: