This repository publishes the code for the web tool used in the "Anti-Collusion QF Workshop" hosted by taka (Shuansuke Takagi) at Funding the Commons Taipei held in Taiwan on Nov 9 (Taipei time: GMT+8).
https://speakerdeck.com/tkgshn/ftc-taipei-anti-collusion-qf-workshop
This workshop introduces Plural QF as a more multidimensional and collusion-resistant version of the funding distribution mechanism known as Quadratic Funding (QF).
Introduction
Introduction to QF and its use cases.
- Concept and importance of QF
- The mechanism of QF for funding distribution and its mathematical foundations
- Attack vectors on QF
- Countermeasures
Simulation
Participants experience both QF and Plural QF by role-playing as donors.
- Distribute [Persona Cards] with details like age, hobbies, gender, etc., each having an amount that the persona can use.
- Simulate donations in a fictional city with various public good projects based on the persona received.
- Group discussions for participants to express opinions from the perspective of their persona.
- Compare the amounts received by each project in regular QF vs Plural QF.
- Calculations for regular QF (not considering donor identity).
- Calculations for Plural QF, clustering by age, then by gender, income, etc.
Discussion
- Participants discuss which method they think is fairer and more effective based on the simulation results.
- Exchange opinions on the importance of vote numbers and diversity from a political-philosophical perspective.
Recap
- Discuss with participants where each method is effective or could cause issues.
- Participants share insights gained through the simulation and discussion.
- Solicit ideas and proposals for improving QF and Plural QF.
- Provide resources for further research and practice on QF and Plural QF.
This tool is intended for use in face-to-face workshops.
Workshop participants will scan the QR code printed on the persona cards distributed on the day to offer an interactive experience of donating to public good projects using the specified budget.
- Profile setup via URL with parameters: Participants scan the QR code printed on the persona cards to access the donation page. Each QR code has unique parameters for setting up profiles.
- Donation simulation: Participants make donations within the budget to various projects and submit the amounts.
- Aggregation page: Check the aggregated results of donations and participant numbers on the /admin page.
- TypeScript
- Next.js
- Postgres
- Heroku
API
- admin.ts: API for displaying the /admin page.
- donate.ts: API for retrieving donation data saved in the DB.
- qf-calculation.ts: API for performing QF calculations.
- pluralqf-calculation.ts: API for performing Plural QF calculations.
- project.ts: API for retrieving project data saved in JSON.
- user_donations.ts: API for retrieving user donation data saved in the DB.
Page
- admin.tsx: /admin page.
- index.tsx: Donation page.
Here's the translation of the remaining part of the README into English, maintaining the format:
- Scan the QR code printed on the persona card.
- Make donations within the budget on the donation page and press the submit button.
- The administrator can check the aggregated donation results on the /admin page.
When hosted on Heroku, the DATABASE_URL changes over time. It is automatically overwritten in the Config Vars on Heroku for remote environments, but needs to be manually overwritten in .env.local for local environments.
Use the following command to generate (if the file doesn't exist) .env.local and write DATABASE_URL into it:
heroku config:get DATABASE_URL -a pluralqfworkshop > .env.local
heroku pg:psql postgresql-opaque-08560 --app pluralqfworkshop
npm install
Update based on the error message if the version doesn't match.
npm run dev
After this, you will be prompted to open http://localhost:3000, but accessing this URL without parameters will result in the following error:
Unhandled Runtime Error Error: Hydration failed because the initial UI does not match what was rendered on the server. Warning: Did not expect server HTML to contain the text node "NaN" in . See more info here: https://nextjs.org/docs/messages/react-hydration-error
Instead, access the donation page (http://localhost:3000/?user_id=8&budget=50&age=89) or the admin page (http://localhost:3000/admin).
twitter: 0xtkgshn
このリポジトリーは、Nov 9(Taipei time: GMT+8)に台湾で開催されるFunding the Commons Taipeiでtaka (Shuansuke Takagi)がホストする「Anti-Collusion QF Workshop」で利用するWebツールのコードを公開しています。
このワークショップではQuadratic Funding(QF)という資金分配メカニズムをテーマに、より多次元的かつ談合などにも強いバージョンとしてPlural QFについて紹介します。
導入
QFについての紹介と、ユースケースについて紹介します。
- QFの概念とその重要性
- QFを利用した資金分配のメカニズムとその数学的基礎
- QFの攻撃ベクトル
- 対策方法
シュミレーション
QFとPlural QFの両方を寄付者になりきって体験してもらう。
- 参加者に年齢や趣味、性別...などを記載した[ペルソナカード]を配布する。各カードには「そのペルソナが利用できる額」も書かれている。
- 仮想の都市を想定し、いくつかの公共財プロジェクトがある中で「(自分が受け取ったカードに書かれている)ペルソナが寄付しそうなもの」をシュミレーションして寄付を行う
- グループディスカッションをして、参加者がペルソナの視点から意見を述べる
- 各プロジェクトが得た金額を通常のQF vs Plural QFで比較する
- 通常のQF(寄付者のアイデンティティを考慮しない)バージョンの計算
- Plural QFとして、年齢でクラスタリングした場合の計算 その後、男女で、収入で...などさまざまなクラスタリングが可能
ディスカッション
- 参加者に、シミュレーションの結果に基づいて、どちらの方法がより公平で効果的だと思うかを議論してもらいます。
- 政治哲学的な観点から、票数と多様性の重要性についての意見を交換します。
Recap
- 参加者と一緒に、どのような状況でそれぞれが有効か、または問題が生じる可能性があるかを議論します。
- 参加者に、シミュレーションの体験やディスカッションを通じて得た洞察を共有してもらいます。
- QFとPlural QFを改善するためのアイデアや提案を募集します。
- QFとPlural QFに関するさらなる研究や実践のためのリソースを提供します
このツールは対面でのワークショップで利用することを想定しています。
ワークショップ参加者は当日配布されるペルソナカードに書かれた QR コードをスキャンして、指定された予算を使って公共財プロジェクトに寄付するインタラクティブな体験を提供します。
- パラメータ付き URL によるプロファイル設定: 参加者はペルソナカードに印刷された QR コードをスキャンして、寄付ページにアクセスします。各 QR コードはユニークなパラメータがついていて、それをもとにプロファイルを設定します
- 寄付シミュレーション: 参加者は予算内で各プロジェクトに寄付を行い、その額を入力して submit します。
- 集計ページ: /admin ページで各プロジェクトの寄付額と参加人数の集計結果を確認できます。
- TypeScript
- Next.js
- Postgres
- Heroku
API
- admin.ts: /adminページを表示するのに使うAPI
- donate.ts: DBに保存されている寄付データ取得API
- qf-calclation.ts: QFの計算を行うAPI
- pluralqf-calclation.ts: Plural QFの計算を行うAPI
- project.ts: JSONに保存されているプロジェクトデータ取得API
- user_donations.ts: DBに保存されているユーザーの寄付データ取得API
Page
- admin.tsx: /adminページ
- index.tsx: 寄付ページ
- ペルソナカードに印刷された QR コードをスキャンします。
- 寄付ページで予算内で寄付を行い、submit ボタンを押します。
- 管理者は/admin ページで寄付の集計結果を確認します。
Herokuにホストしている場合、DATABASE_URLは時間経過によって変更されます。リモート環境ではHeroku上のConfig Varsに自動的に上書きされますが、ローカル環境では.env.localに手動で上書きする必要があります。
以下のコマンドを使うことで、(ファイルがない場合は).env.localを生成し、DATABASE_URLを書き込むことができます。
heroku config:get DATABASE_URL -a pluralqfworkshop > .env.local
heroku pg:psql postgresql-opaque-08560 --app pluralqfworkshop
npm install
バージョンが合わない場合は、エラー文をもとにアップデートしてください
npm run dev
この後、http://localhost:3000を開くように表示されますが、このURLはパラメータがついてないのでアクセスすると以下のエラーが発生します:
Unhandled Runtime Error Error: Hydration failed because the initial UI does not match what was rendered on the server. Warning: Did not expect server HTML to contain the text node "NaN" in . See more info here: https://nextjs.org/docs/messages/react-hydration-error
代わりに、寄付ページ(http://localhost:3000/?user_id=8&budget=50&age=89)や、管理者ページ(http://localhost:3000/admin)にアクセスしてください。
twitter: 0xtkgshn