Request for information about disputes #GDR-15

I don’t normally comment on disputes, and it’s been a while since I posted last time on the Forum. But seeing this whole shebang really got me a bit angry tbh.

There are three cases of indexers self signaling on the network

  1. Minatofund - published self-created subgraphs rigged to fail as soon as he sent a txn into the contract. He then signaled and indexed them, and as soon as some other indexer jumped on it, he then would unsignal, trigger the smart contract bug, and leave the indexer with no rewards and lost time

  2. The guy who rugged Graphtronauts indexer. Signaled multiple subgraphs with nakashu.eth/freakashu.eth, indexes them with 0x62eecb89c407a731e06e2b2c25563e2a8f96dfaa and as soon as someone jumped on those subs, he would then rug them.

  3. Inflex/DecisionBasis - he signaled some old versions or deprecated subgraphs to index them, but he didn’t rug anyone. The subgraphs were there for a long time

Now, we have the following resolutions:

  • Minatofund got slashed

  • The guy who rugged them (and others) doesn’t have any disputes open.

  • Inflex is about to get slashed for half a million GRT for the least amount of offensive actions compared to the other two

Now if Derek wanted to prove a point, he should’ve picked the other dude that was purposedly attacking the network. But I guess he didn’t want to do it, for obvious reasons.

Why? Because Inflex/dB has 3M GRT self stake, whereas that rugger indexer has 270K GRT self stake. You get to fill up your pockets with way more money by slashing the bigger indexer, no? :slightly_smiling_face:

2 Likes

Only one or two additional allocations were ever made at the same time & sat alone with one other indexer for almost a month. + 1 more and signal vanished with still very high subgraph proportion. Did he allow other/s ? Yes. Were others allowed when APR was not personally satisfactory? No. << still way higher then network average.

Should be disputed.

2 Likes

Not sure these rugging claims make sense given that other indexer (ellipfra) always had larger allocation than mine. Also nodeify allocation lasted for one week. Doesn’t seem like immediate pulling.

1 Like

If we are going full transparency, did you remove all signal and split it into 4k chunks because I allocated and your APR was no longer what you wanted? You did not dispute above before.

2 Likes

I removed the signal to explore logarithmic saturation for multiple subgraphs and smaller allocations. Barely related to your allocation. You just happened to allocate 7 days before that idea came to my mind.

I already mentioned above that my current allocations are with similar self-signalling pattern. Full transparency. Everything is onchain.

1 Like

I was not aware of the Graphtronauts indexer that also got rugged in a similar fashion. If it’s a similar situation, I think this is also open for a dispute. I’d be happy to inspect and fill this one out as well.

A better way for us to ‘line our pockets’ would be to copy the malicious behavior. Find empty subgraphs that no one is using with low entity counts (to help save on infra costs), place our own signal and allocation until it gets diluted then move it elsewhere. After 2-3 months we’d make more than simply disputing the bad behavior - though we would have to forgo the query traffic that we are currently servicing (which is about 25% of the collected query fees over the past 30 epochs).

2 Likes

Some approximations:
My current signal-boosted allocation gives me ~430 GRT per million allocated per day.
It is now possible to allocate in high-signalled subgraphs (snapshot, Hopr, loopring) and get ~350 GRT per million allocated per day. Difference is 80 GRT per million per day.
Your total stake is 63M GRT, and efficient cut is 15.1%, meaning your efficient self-stake is ~9.5M GRT. So, with self-signal-boost you can squeeze extra 80*9.5 = 760 GRT daily.
Slashing above sums to ~450k GRT, as a fisherman you get half (I think), so you’d need 225,000/760 = 296 days (or ~10 months) of self-boosted allocations to get on par with that.
If I’m wrong with any of these estimations - please correct me.

2 Likes

Hello guys, i was hesitant to post here since its not so black and white, but here are my thoughts:

  • the network is in the early stages where query fees dont make up for majority of rewards so this kind of gaming is possible, which (i hope) later wont be

  • even though this kind of gaming is possible i dont think that makes it ok, the same as its not ok for me to buy a gun and shoot someone or drive my car into or over someone… while both are possible, theyre def not ok, and in both cases i would suffer consequences for it

  • what has been done here is not in favour of the product or the network, no matter how you look at it (but in my eyes it also doesnt harm it severely, not like the other two payne pointed out)

  • curation to me is simply flawed in many aspects, the fact that anyone can do it, the fact that anyone can rug others and then theyre stuck in there with a loss, the fact that curation signal doesnt follow query volume at all, and i could find some further reasons

I am hesitant to go either side, but i do think a precedent should be set here and this shouldnt end in a draw. To me the severity of these actions doesnt warrant a slash for the amount in question though. But at the same time we should deter people from doing this as it doesnt serve the network. Maybe instead of full slash a smaller one, or losing the rewards gained this way should do, if it goes that way?

Bottom line is we dont want indexers to do this, but rather stick to supporting actual subgraphs instead of dead or unused ones.

5 Likes

By the way, I wanted to clarify what specifically in this case is considered bad behavior?

  • the indexer signaled for itself;
  • the indexer signaled for itself and indexed the old and useless version of the subgraph
  • the indexer removed the self-signals when the proportion changed and the profitability became unsatisfactory
  • the indexer signaled for itself, indexed the old and useless version of the subgraph, removed the self-signals when the proportion changed and the profitability became unsatisfactory.
3 Likes

nice decomposition.
I think my case gets first two bulletpoints.
I now see that signalling into old&useless subgraphs is not the healthiest thing for network (alhtough is permitted). Should we automatically deny old versions of subgraphs (or give the developer such option when deploying new version), as well as automatically deny all subgraphs that are not serving queries for long period of time? Sounds reasonable, not sure how practical it is.
As per rugging - implementing thawing for signals could greatly reduce pain in curation market.

1 Like

We should just remove curation entirely as it doesn’t really serve any purpose right now. Subgraphs with high query fees are not at the top of the market, now apparently you can’t signal and index subgraphs because you get slashed. What’s the purpose of the curation market then?

2 Likes

the guy keeps rugging, I urge you to open 163 disputes on his allocations

1 Like

Effective self stake is 17,666,719.1855 not 9
Self stake + 15% of delegated stake = effective self stake

5007 GRT per day from that effective stake

5007÷17.666719186 = 283.414251808

283.41 per million earned atm. Signal proportions are not static and usually degrade as more indexers allocate. 350 is extremely generous with that stake size.

430−283.414251808 = 146.585748192 per day per million from malicious signal

146.585748192×17.666719186 = 2589.689249978 per day extra from malicious signal

225000÷2589 = 86.906141367 days to earn as much as a potential won dispute just from self-signal bonus.

So almost 3 months as above ^

Granted we can play with numbers more and use averages to get a closer estimation, either way its much closer to 3 then 10. The magnitude of increase highlights why this is an important discussion.

If we are to allow indexers to use humble amounts of GRT to create a do nothing network where does that leave us as indexers? Spin those Epyc’s down, self-signal, and index deprecated single entity count subgraphs on a raspberry pi?

If we are to say this is okay, we are telling the entire network this is how you get ahead.

A cruel twist of fate in my eyes to see mips rewards given to aspiring indexers that have yet formed strong community attachments and incentivized to act dishonestly.

Arbitration is what we have in this current moment.

Was this allowed by the protocol? Yes
Was this allowed by the arbitration charter? In my opinion no.
If wishful current canon is code is law, then why do we have one?

Motivation

The Arbitrator is a protocol role that is assigned via decentralized governance, and as such there are certain parts of its behavior that are not specified in smart contract code running on-chain.

2 Likes

Your calculations are correct, seems that I took graphscan fee cut for protocol cut, and incorrectly deducted effective stake.

It’s true that if one sticks to few subgraphs generating queries, they can barely generate 300grt per mil allocated per day. However, if one is purely guided by signal and manages his allocation costs, 400 grt/mil/day is completely realistic (and includes indexing small trashy subgraphs, which have no use in the network, but have leftover signal).

Anyhow, I don’t see any reasons for this dispute not to be ruled as draw as long as there is no dispute and no decision on actions of indexer 0x62eecb89c407a731e06e2b2c25563e2a8f96dfaa who self-boosts and reuses signal (or rugs, if you wish) as soon as allocation is diluted (signal comes from nakashu.eth).

Little more info about this 0x62 guy:

  1. Yesterday I’ve spread 50 allocations among most profitable subgraphs (without intentional self-signalling), and 5 of them were immediately signal-rugged by this guy.
  2. He grew up his stake from 200k to 240k in one month, and his strategy is self-signalling and indexing with small sums, and rotate signals/allocations once allocations are diluted.
  3. Amount of self-boosted allocations and signal rugging is to be determined, but he has ~160 allocations, and ~60 signals currently.

While I don’t think it is illegal, and I personally don’t think that should be punished with slashing (imo code is law), I propose that someone highly motivated in TheGraph protocol development to open some disputes against 0x62. Economically you will likely loose money, as disputes are normally not a quick return, and slashing amount here is very small (unless you slash all of his allocations, but consider gas costs then too).

Self-signal&indexing is a very tough topic, and I think slashing should be case-based.
As pointed by ryabina above, situations may have different severity, and I think we should move from high-severity towards low-severity to establish the boundary in this grey area. And once we do, we shall make sure to make these rules public and well-known, and may be even accomodate smart contract logic to prevent that.

1 Like

A lot of discussions here, very interesting topics raised, and there is clear evidence that this case, followed by 0x62 case cannot be left without action (e.g. draw).

The precedent shall be set up, warning potential future bad actors trying to drill the protocol inflation by self-signalling hits-and-tricks.

  1. Minatofund - clear bad actor - slashed
  2. Inflex/DecisionBasis - bad actor, trying to change the topic of discussion - to be slashed.
  3. 0x62 guy, discussed “in addition” to Inflex - to be thoroughly investigated and slashed as well.

These 3 cases will form the good ground for future healthy development of the network.

1 Like

“Trying to change the topic of the discussion” - really? Lol.

1 Like

What Happened & The Timeline:

The subgraph involved was the first version of the convex subgraph which was published as QmdEPVzdgsTudRRWYYYyJsrqj9jS5X32GDBmZ1qcg1sW8C. 3644 blocks after publishing, the subgraph was deprecated and migrated to a new version, bringing all existing curation signal with it. decisionbasis allocated to this original version 1260 blocks after it was published, meaning it was deprecated 2384 blocks after he allocated to it. 4368 blocks after deprecation, the last indexer not named decisionbasis vacated the subgraph deployment. 359 blocks after this and through chainalysis, decisionbasis himself on curator address 0x2c452073377ec65b4b8c7dfa995624d60028cd53 signaled 24750 GRT onto the deprecated QmdEPVzdgsTudRRWYYYyJsrqj9jS5X32GDBmZ1qcg1sW8C deployment (event A on chart), where he held 100% of the allocation power of this subgraph’s pool for 6804 blocks until another indexer joined, reducing his share to 73.3% on a 4.7M GRT allocation. 11365 blocks later, a couple indexers reduced decisionbasis' share of the allocation pool to 64.8% where it continued to sit for another 124206 blocks until decisionbasis pumped the curation signal to 44550 GRT, prompting a large allocation from an unaffiliated indexer to join the pool 14341 blocks after the signal change, drastically reducing decisionbasis' share to 31%. His share of the pool was fairly consistent for the next 142636 blocks until he spontaneously reduced the signal by 41.8%, bringing it down to 25943 GRT from 44550 GRT (event B on chart). This likely prompted an indexer to close their large 8.8M allocation 554 blocks later and reopening with a smaller 3.7M allocation, giving decisionbasis 46% of the allocation pool. 1449 blocks after this indexer’s change in allocation size, decisionbasis pumped the signal by 76.3% to 45743 where his share of the allocation pool stayed relatively consistent until he pumped the signal again 86280 blocks later to 60253 GRT - an increase of 31.7% - while also increasing his allocation size from 5.7M to 7.7M. This increase in signal also attracted other several indexers and the pool was eventually increased to 20M within 18533 blocks where it continued to stay for another 43626 blocks until the signal was completely removed 200 blocks after decisionbasis closed his final allocation (event C on chart).

Unpacking why indexers involved with this are angry and also why disputes were filed:

Rugging and Manipulation

This is the main reason why the Fisherman began to research and look deeper into the situation at hand. The nodeify indexer joined the allocation pool on Nov 15th - 3 days after the latest signal pump on the 12th, only to have the subgraph go dead in signal less than a week after joining the pool. Their increase in allocation share (4.4M) was likely a reason why decisionbasis finally abandoned the deprecated subgraph signaling + allocating scheme on this particular subgraph.

When looking at the evidence we can see there are multiple rugging and manipulation events that took place here to decisionbasis' advantage:

  • Taking advantage of the subgraph deprecation process (indirect rug) by waiting for indexers to abandon their allocations, then adding signal once the dust settles in order to take ownership of the entire pool.

  • Spontaneous signal-adding when the timing is right on 2 separate occasions, especially after foreign allocations come online (it’s not economical for an indexer to adjust to a larger allocation within a week after placement in this size range).

  • Taking advantage of subgraph deprecation in itself. I’d venture to say some indexers either filter out deprecated subgraphs, or don’t even know how to find them (it’s obscure on the official Graph Subgraphs page for each individual subgraph due to the page defaulting to the latest published version). This alone works as a form of deterrence.

  • Direct rugging to provoke economic actions from honest indexers. This is a big one as this was demonstrated at least once with intent, and then a 2nd time when abandoning the subgraph. In the first intentional instance, decisionbasis spontaneously pulled the signal by 41.8% which actually prompted an indexer to reduce their allocation size considerably. Shortly after this change was made by said indexer, decisionbasis brought the removed signal back online - successfully achieving a goal of “bouncing” an indexer off for economical gain. In the 2nd instance, decisionbasis' scheme was finally becoming saturated by outside indexers and the plug was pulled entirely, leaving honest indexers stuck with young allocations.

decisionbasis' argument:

decisionbasis' argument is that there are no official rules against self-signal boosting, and if there were official rules against this, he’d not partake in these signal + allocation schemes, and that code is law. He argues that he didn’t bother to obfuscate his curation address, he doesn’t launch broken or new subgraphs, and anyone is welcome to join the allocation pool to dilute his earnings if they wish to do so. This is testing the ethical line drawn where you know you’re doing something that’s frowned upon, but you proceed to do it because no official precedent has been set - especially in the form of rules - with hopes of not being punished as a result of such. I can clearly understand where he’s coming from, but there are a handful of key items above that don’t make this as clear-cut as “no rule, no foul.”

  • The first key item is leveraging various rugging techniques. If decisionbasis was playing an honest version of this questionable game, he wouldn’t be tweaking signal in attempts to catch other indexers off guard or trick them into leaving the subgraph entirely.

  • The second key item is leveraging a deprecated subgraph as a form of deception, especially one that just had its signal migrated and allocations vacated.

Both of these items qualify as intentional malicious behavior since they negatively affect other indexers who are acting in good faith locating and allocating to economic opportunities.

1 Like

Overall the outline above is correct. I never had in mind to harm other indexers or the network in general, but it is clear that pure race to the highest profitability may implicitly be harmful for the network. But please consider the following:

Number of disputes: 5
Slashing percentage = 2.5%
Total slashing percentage = 12.5%
Slashable stake = 5,000,000 GRT
Total slashing amount = 625,000 GRT
Total rewards for “questionable” allocations = 56,000 GRT
Approximate “harm” to the network (if we assume that reward was double the network average) = 28,000GRT.

Can someone please agree that such “punishment” is a bit exaggerated? If we consider the 0x62 person, one must lay out >2M GRT to open disputes for all of his allocations, and slashing will be limited to his 300k stake, while “harm” to the network is considerably more than in my case. I am pointing out the fact that not only the curation is flawed, the dispute system itself needs to be modified so that slashing is somehow proportional to the “harm” done.

While paragraph above is a whole other topic for discussion, can another scenario, where I burn the rewards for allocations in question and disputes are resolved in a draw be considered?

By the way, during the allocations in question my stake was ~1.2M, at the moment of opening of the dispute it was ~3.3M, and now it is ~5M. As far as I can see from the dispute smartcontract, _slash only cares about current stake.

2 Likes

I’m not sure how I feel about only burning the potential rewards, however slashing based on current self stake rather than self stake at the point of infraction seems like it could be overly punitive, interested to hear what others think.

3 Likes

Stake that was added after the allocation was closed should not be subject to slashing risks in my opinion (and definitely not stake that was added after the dispute started).

Should the arbitration council agree that a slash should occur here, I would advocate towards splitting judgement amongst the allocations (ie 1 slash and 4 losses/draw) since there isn’t a current stateful representation of indexer’s self stake at the time of allocation/dispute.

I think splitting would be a better route as it sets a more solid precedence for future actors.

1 Like