NounsDAOのコントラクト解説(part 2)
みんな大好きNounsのコントラクト解説第二弾です。
(前回はこちらをご覧ください)
前回は、各コントラクトの機能を平面的に解説しましたが、今回はオークションと投票それぞれの処理フローを解説していきます。
オークション
まずはオークションのフローです。
面白いポイントは、落札者がNounを取得する関数を実行した時に、一緒に次のNounをミントして次のオークションが開始されるところです。
ブロックチェーンは種々の問題により、コントラクト自身から時間を指定して起動することができません。この解決策として、外部からの操作によって滞りなく回る仕組みとなっているところが素晴らしいです。
- 3の落札によって呼び出されて、新しいNounがミントされる。
このとき、NounsSeederというコントラクトでNounを構成するパーツ番号を決定し、NounsDescripterV2でパーツ番号に相当する画像を生成する。 - 1でミントしたNounに対して入札する。
最高入札額より2%以上高い金額でないと入札できず、また、オークション終了時間の5分以内に入札するとオークション終了時間が5分延長される。 - 落札後にsettleCurrentAndCreateNewAuctionを実行する。文字通り、現在進行中のオークションを決済(settleCurrent)後、新しいオークションを開始(CreateNewAuction)する。
図の(4)で落札者にNounをトランスファーした後、(1)のミントを実行する。
これがずーっと繰り返されます。
提案と投票
提案の仕組みの面白いポイントは、提案時にスマートコントラクトで実行するトランザクション命令も一緒に登録することです。
提案に報酬額を設定したい場合は、送信先のアドレスにETHやUSDCを送金するトランザクション命令を登録します。投票やオークションのルールを変更したい場合は、コントラクトを入れ替えするトランザクション命令を登録します。
これが、Nounsの運営が人に依存することなく回っている仕組みであり、真のDAOと言われる所以だと思います。
- 提案者はproposeにより、提案内容とトランザクション命令を登録する。
- NounsホルダーはcastVoteにより、賛成/反対/棄権のいずれかを投票するが、この時のガス代を投票者へ返還する仕組みとして、castRefundableVoteが導入された。
- 提案が可決された場合、トランザクション命令をNounsDAOExecuterというトランザクション実行を担うコントラクトへキューイングできる(queue)。
- (3)でキューイング後、改めてトランザクション実行する関数(execute)を実行する必要がある。
(キューイングと実行を分けている理由は、トランザクション登録後に提案者やNoundersによって実行をキャンセルする猶予時間を確保するためだと思う) - 提案者はトランザクションをキャンセルできる。
- Noundersもトランザクションをキャンセルできる。
【補足】Nouns保有数の管理
(1)提案、(2)投票するためには、そのアドレスが一定数のNounを保有するか、Noun保有アドレスから権限委譲されていなければならない。
このNouns保有数を管理しているのが、ERC721Checkpointableで、NounsTokenはこのコントラクトを継承している。
最後に
pNouns⚡️DAOでは、NounsDAOのDAOのコントラクトを使用して、独自の投票システムを開発中です。
興味ある方はこちらもご参照ください。
pNouns⚡️投票システムの機能配置と処理フロー
Discussion