Skip to content
This repository was archived by the owner on May 22, 2023. It is now read-only.
This repository was archived by the owner on May 22, 2023. It is now read-only.

Abandoned deposit reward strategy #576

@Agoristen

Description

@Agoristen

The attacker, hereby referred to as "abandoner" will exploit the system to increase his own rewards. His attack will be targeted against innocent node operators, hereby referred to as "victims".

This exploit is currently highly incentivized due to the way keep rewards is to be paid. Rewards are paid based on # of successful deposit + redeems performed within a given period (30 days). Currently, the abondoner will use this exploit to increase his own reward count and therefore rewards.

It works like this:
When a deposit is initiated it locks up bonds for 3 signers. By firing deposits in rapid succession the abandoner is able to force other nodes out of capacity, essentially rendering himself the sole node operator for his chosen lot size. This has centralization risk since all new deposits now will be routed through his own nodes, but furthermore it has a negative impact on the reward schedule as one single actor is able to acquire a higher percent of the rewards than is expected based on assigned KEEP and ETH bond.

While we are yet to see a large scale attack based on this exploit. There are been smaller attempts from less crafty adversaries.

Here is an example from today:
Example of abandoned deposits

These are all deposits initiated by the same user and are all subsequently abandend.

If the deposit is abandoned, one of the three victims (signers) will have to run notifyFundingTimedOut to get their funds back. However, if they run notifyFundingTimedOut before retrieveSignerPubkey is called they will be slashed for approximately 0.05 ETH each (~0.144 ETH / 3). The abandoner is not incentivized to run retrieveSignerPubkey, in fact he is rewarded for not doing so, as it means the 0.144 ETH is returned to him on notify.

The victims must perform the following tasks for each abandoned deposit:

  1. In the Awaiting Funding state they need to call retrieveSignerPubkey manually on the contract
  2. In the Awaiting Funding Proof state they need to call notifyFundingTimedOut

Currently, this problem is not widespread knowledge, which causes victims to call notify without first calling retrieveSignerPubkey, causing themselves (and their co-signers) a slashing. But more stressing is the fact that abandoner is highly incentivized to call Notify after 3 hours to get his full amount returned and slash the victims, Victims therefore has to continually monitor and call retrieveSignerPubkey before the abandoner is able to do so. In practice, they will have to call this before it's been 3 hours to protect themselves against slashing.

Currently, an attack of this type costs roughly 0.06 ETH in txn fee, and each abandoned deposit locks up 150% of lot size between 3 signers. At current capacity, you can lock out the majority of 10 BTC lot nodes with 10-20 abandoned deposits, a negligible cost compared to the advantage gained of a successfully deployed attack. To date there has been only 190 timeouts on the network, however it is expected that the problem will increase as this becomes understood to be an advantage. In fact, timeouts today alone accounts for 25% of all timeouts (total 47) - a clear indication that abandoning is becoming a more rampant issue in the system.

This exploit could be mitigated by requiring depositor to put up a small bond which will be returned after successful deposit. For example 0.1 ETH that will be distributed to the notifier (a person calling both retrieveSignerPubkey and notifyFundingTimedOut). A notifier would therefore become an incentivized job on the network and would help clearing the timeout deposits in a timely fashion and opening up capacity in the network for legitimate depositors all while simultaneously preventing a successful large scale attack to be deployed.

An alternative approach could be to set a higher bond, such as 0.15-0.25 ETH. If deposit is abandonend, this amount will be distributed among the signers on notifyFundingTimedOut to cover their fees and reduce the incentive for abandoning. However I think the current scheme where 1 signer has to take the hit is not a good way to go about it. Doing this work should be rewarded, or else it will not be performed unless absolutely necessary. The result of not rewarding notify timeout is less available capacity in the network.

To be clear, I not advocating for changing of the reward schedule. But I would like for this issue to be better explored and documented for users in the UI and tools first and foremost. It should further be considered if this can be mitigated by introducing a deposit bond. In addition to a bond, the issue will be mitigated to some extent by having more nodes and more capital in the system. Reducing lot size to max 1 BTC would accomplish the same effect as growing the network, but the disadvantages due to higher relative minting costs makes this a no-go in my view.

From the victims perspective. The only way to fight this exploit today is to increase ETH bond and constantly monitor and notify the abandonend deposits, resulting in higher risk and/or real costs to victims.

Some may argue that this is only a problem during the initial 24 months of reward emission, however with the costs being relatively low, I could see this be exploit be used for attacks of more sinister nature than we currently see from reward seekers.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions