[Proposal] Ratify the Results of GG18 and Formally Request the Community Multisig Holders to Payout Matching Allocations

Hi, this is Priyank from Nawonmesh. We were in the Climate Round.

I am super perplexed about Nawonmesh’s matching amount calculations. It seems to be way off from our expectations.

Two questions -

  1. We had 300 votes as per our gitcoin grants page. And 240 passport votes as per the ChainEye dashboard. Considering this, the matching amount for us is too low compared to the others in the Climate round. Want to understand the reasons for this huge gap.

  2. I am very sure we opted into the Shell funding while filling the grant application. I even dropped an (unresponded) msg to Jon post-GG18 to check if our email id shared with the Gitcoin team is correct because we were expecting the Shell KYC email. But I don’t see Nawonmesh in the Shell funding list. Was it really a silly miss on our end or did something else go into the decision making of who all are eligible for that?

I raised these concerns to @M0nkeyFl0wer and he told me to post them here.

Regards.

1 Like

Any follow-up on efforts to deliver updated columns?

  • Code/formula used for cluster match QF
  • Pre / Post Sybil Analysis Donor #s and Donation $'s
  • Pre/ Post Cluster-Match QF Matching $'s

Community dashboards and on-chain information is insufficient to correctly compare donations against matchings as they do not account for manual interventions done by Gitcoin team.

I believe that explaining what happened to @priyank and @Yazdani would be clearer, more persuasive and more quantitative if they were given access to dataset containing grant-level information promised by @umarkhaneth.

From voter/grantee perspective it is impossible to analyse what exactly influenced final matching without knowing the starting point. “How much money was donated to this particular grant (that actually counts for purposes of matching)?” feels like a question deserving a clear non-ambigious and quantitiative answer.

2 Likes

Hey, thanks for your answer. My question was about our place at the end of this round compared to now. So now it’s clear, and as a product manager/designer, I would say that Gitcoin should make it way more clear for users so they know the rule. I know that they can find the rule but we can’t see them highlighted in the user flow.

And it’s so simple to highlight them cause there are only 2 rules:

  1. Minimum amount
  2. Minimum GP score
3 Likes

To this point, I wonder if these result posts could continue the precedent of sharing high-level “rules” that the sybil defense is based off of (i.e. logic + ideally code snippets used to surface related accounts, minimum donation definition, etc.) Then if a particular project has additional questions about the rules/logic that their community triggered- this can be addressed in greater detail for their instance.

Since sybil action shouldn’t be conflated with self-attack- I think it would be helpful for groups like @yazdini and @priyank who might want more info on the silencing, and then can verify for themselves the donors who were hitting these rules.

Overall though- I support ratifying these results. In line with expectations and past rounds’ sybil-rates.

4 Likes

Just wanted to express my best wishes to the team behind GG18, what a great round this was! Thank you to @M0nkeyFl0wer @umarkhaneth @jon-spark-eco @MathildaDV and the rest for making sure to support the community whenever and however possible throughout those two weeks :slight_smile:

4 Likes

Delivering here on my promise to share more details.

How to Calculate Cluster Match QF:

  • First, a quick review of simple QF:

    • Sum the square roots of each individual’s contribution to a project
    • Square that sum to get a per-project value
    • Distribute the matching fund proportional to the relative size of each projects square (and enforce a matching cap so that no project takes too much of the pool by itself)
  • Next, cluster-match QF. Cluster-match QF orients matching funds around communities rather than individuals. This is mainly the same overall process however before we square root contributions we cluster them together.

    • Cluster based on the donation profile of a donor. A donation profile is defined as the set of decisions you made on each project: donate or don’t donate. Donors who made all the same decisions are clustered together
    • The contributions to a project by the same cluster are added together as if they were the same voting bloc. Then their square root is taken.
    • After that the process is the same: sum the square roots of all clusters grouped by project, square the sums, and payout the matching fund proportionally.

In Code:

Thank you to @Joel_m for writing this python function:

def donation_profile_clustermatch(donation_df):
  # run cluster match, using donation profiles as the clusters
  # i.e., everyone who donated to the same set of projects gets put under the same square root.

  # donation_df is expected to be a pandas Dataframe where rows are unique donors, columns are projects, 
  # and entry i,j denote user i's total donation to project j 

  # we'll store donation profiles as binary strings.
  # i.e. say there are four projects total. if an agent donated to project 0, project 1, and project 3, they will be put in cluster "1101".
  # here the indices 0,1,2,3 refer to the ordering in the input list of projects.

  projects = donation_df.columns

  clusters = {} # a dictionary that will map clusters to the total donation amounts coming from those clusters.

  # build up the cluster donation amounts
  for (wallet, donations) in donation_df.iterrows():

    # figure out what cluster the current user is in
    c = ''.join('1' if donations[p] > 0 else '0' for p in projects)

    # now update that cluster's donation amounts (or initialize new donation amounts if this is the first donor from that cluster)
    if c in clusters.keys():
      for p in projects:
        clusters[c][p] += donations[p]
    else:
      clusters[c] = {p: donations[p] for p in projects}

  # now do QF on the clustered donations.
  funding = {p: sum(sqrt(clusters[c][p]) for c in clusters.keys()) ** 2 for p in projects}

  return funding

More Numbers

Here are the calculation details including both matching formulas and pre/post squelching voter numbers and donation amounts.

The ‘base’ totals are the numbers after applying our basic rules: have a passport score over 20 and donate at least $1.

The ‘eligible’ totals are the numbers after applying our sybil squelching based on the rules stated above:

I’ll note that while pulling this data together I found a bug in how my data was being aggregated. I fixed this and it affected the results. To me this underscored the necessary importance of transparency. We need to rapidly move toward turning off post-round squelching and relying only on passport + better QF.

11 Likes

Hi Priyank, thanks for your question. I can see how this would be confusing at first.

Looking at your data, I agree that your matching seems low when comparing your number of voters to the number of voters of projects who receive similar matching. Digging deeper into your data, I see this is because of how identical your voters are. Of your 187 eligible voters, 151 (over 80%) of them supported only Nawonmesh.

Under Cluster-Match QF, your results are different from what they would be under Simple QF. While Simple QF places great importance on the number of individuals supporting a project, Cluster-Match QF places importance on the number of communities in support. Why is this a good thing?

It means a single special-interest community can’t dominate the matching pool. QF is meant to allocate funding to public goods based on the breadth of support for those goods. This means it would be wrong to allow a single community to dominate just because it has many people. For example, if enough people from my hometown on Long Island decided we needed to improve our parks and we could quickly each give $1 to a gitcoin grant then we would outvote everyone else to claim a lions share of the matching pool by ourselves. This would be unfortunate for every other community who does not benefit from our project. On the other hand, if the same number of people from all across the world supported us (perhaps our parks are growing medical herbs) then Cluster-Match QF would allocate much more funding. I hope this gives the intuition behind the math.

The other benefit of this QF implementation is that it means sybil attackers have to also donate to other projects in order to earn more matching for their own project, raising more money for public goods.

In the long-run, we can continue to improve our QF implementations and imo this is a big step in the right direction. I do see how it can be confusing. Especially given that we did not announce we would switch to Cluster-Match QF before the round began. I still think now is the right time to do so because it means we can right away begin improving how we are allocating funding.

This was probably just a simple miss. Imo your message here is sufficient to opt-in. I am adding Nawonmesh to the list!

5 Likes

Thank you and rest of Gitcoin team for publishing updated results. This, in my eye, is most informative and logically organized matching report that Gitcoin has produced so far. This greatly increases my confidence in both sybil defense and algorithm presented.

Based on @Joel_m reply to my questions in QED program post post, I can understand rationale for decision to swap algorithms without announcing it first.

Naively clustering by donation profile is only really possible if you don’t tell people you’re going to do it before hand (or if you’re not too worried about people strategizing).

I will attempt to sanity-check base amounts later, but at the moment I find round data plausible and no longer have any reservations against final report or the process itself.

7 Likes

Thank you @umarkhaneth and squad for sharing the results as well as the rationale on calculations. Cluster matching is definitely a game changer!

I vote to Ratify the round results

As feedback, maybe there can be a zkproof attached to the results so folks can confirm the calculations match the logic provided. That being said I understand that you cannot reveal all the strategies used to identify the red team but I hope we can strike a healthy middle ground.

I’d like to ask what the time distribution looks for producing these results? are there any specific leverage points which could reduce the time to output significantly?

4 Likes

Great nuanced points here as expected from @ale.k , especially about how hard it can be to tell the actor behind sybil action. Also thank you for sanity-checking the results.

Thank you for being so engaged and asking for more transparency. This doesn’t happen without that! Please keep doing it :saluting_face:

Interesting, I don’t know enough about zkproofs to know if this is possible but would be quite cool if so.

One of the big improvements this round was having regendata which makes it much easier to access clean data sets from grants stack, passport, and onchain. I can’t think of other specific leverage points besides having more/better detection methods ready to go in advance of the round ending

3 Likes

:sweat_smile: :rofl: :joy:
It took me couple of seconds to understand the meme :laughing:

2 Likes

I am unsure if I am using the right vocab, but is it fair to assume that clusters are unique to each core round? i.e., the clusters created for allocating the pool for Eth Infra are mutually exclusive from those created for allocations in Climate. Or are clusters agnostic of core rounds and reflective of decisions made on all projects across all core rounds?

3 Likes

Hi Umar,

Appreciate the detailed explanation. I now understand the reasoning behind the Cluster-Match QF. While that seems like an approach in the right direction, I wanted to highlight few concerns on this, citing Nawonmesh as an example.

  1. In my opinion, urgent climate action needs a bottom-up approach through the formation of many grassroots organizations focused on building local climate resilience by solving local challenges, not just globally appealing projects like medical herbs. In such cases, funding support will have to come primarily from their local communities as these projects might not appeal to global donors, although local climate efforts also contribute to global GHG reduction. Cluster-Match QF seems to be incentivising the opposite approach i.e. a top-down approach and makes Gitcoin unsuitable as a funding source for grassroots climate orgs having only local appeal.

  2. The logic of crowdfunding is to get initial social proof from the existing community of the project owners before the larger community jumps in to donate. That is how any web2 crowdfunding platform also works. Now, if that existing community is supposed to prove their legitimacy by also donating to other projects (who they know nothing about), it just creates lot of unnecessary donor friction.

  3. Two-third of India survives in less than $2/day. Nawonmesh is a grassroots project operational in one of the most backward regions of rural India. You can imagine the financial capabilities of the immediate and extended communities Nawonmesh serves. Convincing these people to (a) resonate with a project having no immediate benefits to them and (b) DONATE $1, that too in CRYPTO, was itself very very difficult. Expecting them to give more to unrelated projects is completely unrealistic. If I had asked them to also donate to other projects, they would not have donated to Nawonmesh too as it would have been an overkill for them.

Also, ChainEye dashboard had 240 passport votes for us. but you have mentioned 187 eligible voters. I am unable to understand this gap.

Thanks a lot. Appreciate it man.

4 Likes

Thanks so much for sharing this @umarkhaneth . Really appreciate your time and effort for this. Something similar happened to one of the projects I am associated with > Impact Stream.
Despite the number of votes, the matching amount for us is $10?

I echo @priyank , Cluster-Match QF is defeating the purpose of empowering grassroot level organizations to raise funding from Gitcoin as the only support they can get is from their local community. How will that happen? How will we onboard local orgs solving for challenges on local level? Please excuse my ignorance but would like to learn about this.

3 Likes

from someone who is an ETH core dev:

https://twitter.com/owocki/status/1706341408452554992?s=46
I don’t know who to flag this to but “iron wallet” is not core Ethereum haha it’s in the name :stuck_out_tongue: cc @Owocki
same with INTMAX

maybe worth digging in on how they got in the round?

4 Likes

Hey Rohit, that’s right on the money. We cluster based on the donations only within a single core round at a time. It’d be a cool experiment to try clustering based on donations to all core rounds and seeing if this gives better results.

Hey Priyank! If our goal is the greatest global GHG reduction then shouldn’t we be searching for projects which most reduce global GHGs and funding those, regardless of if they’re local or not? Climate knowledge is not my forte and I’ll defer to @M0nkeyFl0wer for his opinion on this.

Cluster-Match QF is very bottoms-up however rather than trying to fund the largest single community it focuses on funding those who serve the most communities. You’re right that this may make it unsuitable for orgs with only local appeal (like parks on Long Island). There may be better funding sources out there for local orgs imo. Gitcoin has always been digital-first.

I agree! That’s not the answer I would seek. Instead, if I’m participating in a global funding round I’d ask what the appeal of my project is to people outside my local community and how I can create value for a more diverse supporter base. The behavior we want to reward is cooperation across differences. If a project is supported by people who are very different then that is a strong signal.

I can’t speak to how the ChainEye dashboard was built. If it’s just based on passport score then they’re missing the post-round squelching we do as described here.

Hi Sejal! Thanks for posting on our forum. Did you see the detailed spreadsheet? Impact Stream’s matching increased when going to Cluster Match QF.

This mechanism disempowers uniform, established monoliths and actually empowers grassroots organizations if they’re made of diverse, different members. For example, in the Web3 Community and Education round greenpill network with it’s global, distributed chapters saw an increase in matching funding of $3,787.93 when going to cluster match QF

Hey Owocki! thanks for sharing – will take a look

4 Likes

Thank you to everyone who puts their effort into to making Gitcoin and Quadratic Funding a meaningful way to fund public goods and projects. Every time the Tor Project participates in these funding rounds, I am impressed by the amount of collective effort goes into making them run, communicating clearly with the community, and improving over time.

Cluster-Match QF takes the projects you vote for as signals of the communities you belong to. It then calculates matching amounts for each supporter and unique community combination. This method provides more significant matching funding to projects that receive support from more diverse communities.

Awesome. Thank you for making it clear the evolution of QF and the reasoning behind the changes.

Congrats to all the grantees!

5 Likes

There might be one possibility with cluster-matching QF that could benefit local communities. The new algorithm increases the total cost for Sybil attackers and tilts the scale for the system to be “cheaper to defend than attack.” It might be a worthwhile exercise (possibly a prospectively funded project in Citizens Round if anyone is interested) to evaluate if we can lower the requirement for Passport Score in the frontend with cluster-matching QF as an additional rear-guard mechanism to nullify Sybil contributions.

To validate this, someone would need to rerun the squelching with one or two lower passport scores and analyze the impact on the final distribution. If the data supports this hypothesis, a lower score will reduce some friction local communities have in onboarding contributors to Gitcoin Grants.

Here is some background in the 2-minute snippet from @owocki’s conversation with Joel Miller:

3 Likes

hey @umarkhaneth, cluster QF def feels like a step in the right direction.

Just trying to wrap my head around whats happening - Cluster QF filters donors having voted for multiple projects and counts them for QF , so does it also exclude a few donors that projects might have had that have just donated to that single project or that figure needs to cross a certain threshold?

Post Cluster sybil analysis the QF formula applied is the same and you are not tweaking the matching multiple depending on multiplicity of votes from a donor yet?

The difference between base and eligible voters represents the no of votes that projects rcvd from donors just voting for that particular project?

2 Likes

First, Thanks for the hard work done for doing the cluster match QF :slight_smile:

I just have a question: " the same cluster are added together as if they were the same voting bloc", I do not quite understand it. Say if one cluster/community has 100 voters, it is considered as one voter?

I understand that the votes from the same cluster should be given less weight, but treating them as from one voter is not quite fair especially for some local communities.

3 Likes