pNouns⚡️投票システムの機能配置と処理フロー

2023/01/26に公開

『pNouns⚡️』は”本物のNFT”と”本物のDAO”で、社会の仕組みを根底から変えるかもしれない実験的プロジェクトです。
これはホームページの冒頭で謳っているpNounsのメッセージです。(https://pnouns.wtf/)

過去3回に渡り『本物のDAO』に相応しい投票システムを考えてきた結果、現時点でベストではないかもしれないけど、ベターなかたちがある程度見えてきたので、これを紹介します。

全体像


本物のDAOを目指すため、Ethereumのスマートコントラクトだけで構成したかったのですが、そうすると、年100回投票した場合、9Ether/年程度をガス代で消費してしまうという試算が出たため、ブロックチェーンへの書き込み頻度の高い、pNounsMembersの投票行為をPolygonに配置することにしました。投票行為などのDAO活動によって成長するSBTも合わせてPolygon配置になります。

真ん中のOpenzeppelin Defenderは、セキュアに効率的にブロックチェーンに接続できるプラットフォームサービスです。Openzeppelinという一企業が提供しているものではありますが、ethereum foundationやCompoundなども信頼して利用していている企業のため、pNounsでも信頼して利用することにしたいと思います。

また、将来Ethereumのガス代が安くなってきた時には、Polygonに配置した機能もEthereumに配置換えすれば良いと思います。

処理フロー

Nounsプロポーザルへの投票

本家Nounsで起票されたプロポーザルに対して、pNouns内で投票し、その結果を以って本家Nounsへ投票します。

  1. Nounsでプロポーザルが起票されると、左側のNounsDAOLogicV2のproporsal[id]で外部からプロポーザル内容を参照できるようになる。
  2. pNounsのNounsConnectorで1のプロポーザルを参照して、PNounsDAOLogicのプロポーザルとして登録する(propose)
  3. pNounsNFT保有者は、PolygonのPNounsVoteRecieptに、保有するNFT数に応じた投票数で投票する。
    このとき、PNounsVoterでアドレスごとのNFT保有数を計算する。PNounsVoterは投票権限の移譲を管理する機能も備える。
  4. 投票期限を超えた後、PNounsVoteRecieptのresultに投票結果(賛成・反対・棄権の票数)が格納されているため、これをPNounsDAOLogicのsetVotingResultに登録する。
    投票数が定足数に達している場合は、5,6を続けて実行し、投票数が定足数に達さない場合は終了する。
  5. 投票結果をNounsへ投票するためのトランザクション命令を登録する(PNounsDAOLogicのqueue)。PNounsDAOLogicに登録されると、そのトランザクション命令はPNounsDAOExecutorのqueueTransactionでキューイングされる。
  6. 5でキューイングされたトランザクション命令は、executeを実行することで実際にトランザクション命令が実行される。
  7. 6の実行命令でPNounsDAOExecutorのexecTransactionを実行する。トランザクション命令にはNounsDAOLogicV2のcastVoteを実行する命令が設定されているため、これでNounsへの投票が完結する。
    このとき、Noun#553,#556の投票権限をPNounsDAOExecutorに移譲しておくことで、2票分の投票が可能になる

Nounsへのプロポーザル起票

pNouns独自のプロポーザルの是非をpNouns内で投票し、可決された場合に、本家Nounsへ起票します。

Nounsへのプロポーザルは、NounsDAOLogicV2のproposeを実行することで登録します。
Nounsプロポーザルへの投票では、プロポーザル内容をNounsから取得しましたが、この場合はPNounsDAOLigicへ直接登録します(1)。
その後、プロポーザル内容に対する投票からNounsへの提案までは、先ほどの同じ流れになります。

Nounsでプロポーズが可決された場合、NounsDAOLogicV2のqueueでキューイング、executeで実行しないといけません。これも同様に(1)〜(2)のフローで実施します。

Discussion