📘

Nouns Daoのソースコード解説

2022/09/17に公開

概要

Nouns Daoの実装の注目ポイントをまとめました。

仕様

Nouns は、オンチェーン・アバター・コミュニティの形成を改善するための実験的な試みです。Cryptopunks などのプロジェクトがデジタルコミュニティとアイデンティティの構築を試みているのに対し、Nouns はアイデンティティ、コミュニティ、ガバナンス、コミュニティが使用できる金庫を構築することを試みています。

Nouns DAO

  • NFT(nouns)が1日毎に生成されオークションにかけられる。
  • オークションの売上はtreasuryに溜まっていく。
  • アートワークはオンチェーンに保存される。
  • NFT(nouns)にレア度的な差異はない。

Nounders(コントラクトを作った人達)には10日に1度NFT(nouns)が無料で付与される。

@cryptoseneca
@gremplin
@punk4156
@eboyarts
@punk4464
solimander
@dhof
@devcarrot
@TimpersHD
@lastpunk9999

Proposals

treasuryに溜まったイーサでやりたいことリスト
Proposal毎に投票が行われ、可決されたものが実行される
NFT(nouns)は投票券(1票)としての役割を持つ。
Nouns DAO

(例)コーヒーブランドを作るプロポーザル
Nouns DAO

Nouns Foundation(Nounders?)は提案拒否権(The proposal veto right)を持っている。
「個人的な利益のために不公平にtreasuryを引き出す」などの不正があったときのみ行使される。

コントラクト(ソース)

主なコントラクト一覧

https://github.com/nounsDAO/nouns-monorepo/tree/master/packages/nouns-contracts#contracts

各機能の実装

ドット絵の生成

プレイグラウンド
こんな感じの画像が生成される
https://nouns.wtf/playground

各パーツのIDを決める(NounsSeeder)
https://github.com/nounsDAO/nouns-monorepo/blob/master/packages/nouns-contracts/contracts/NounsSeeder.sol#L28-L56

SeedからSVGImageを取得する(NounsDescriptor)
https://github.com/nounsDAO/nouns-monorepo/blob/master/packages/nouns-contracts/contracts/NounsDescriptor.sol#L287-L296

SeederとDescriptorのコントラクトはNounsTokenのオーナーであれば好きに変更できる
※ロックすると変更できなくなる
https://github.com/nounsDAO/nouns-monorepo/blob/master/packages/nouns-contracts/contracts/NounsToken.sol#L212-L250

10個に1つNoundersに付与される処理

https://github.com/nounsDAO/nouns-monorepo/blob/master/packages/nouns-contracts/contracts/NounsToken.sol#L143-L154

ERC721Checkpointableについて

NounsToken.solはERC721Checkpointableを継承している
delegateメソッドで投票権を他のアドレスを譲渡できるっぽい
中身は結構複雑で難しい

https://github.com/nounsDAO/nouns-monorepo/blob/master/packages/nouns-contracts/contracts/base/ERC721Checkpointable.sol#L108-L115

オークションの終了と開始

https://github.com/nounsDAO/nouns-monorepo/blob/master/packages/nouns-contracts/contracts/NounsAuctionHouse.sol#L84-L90

入札

https://github.com/nounsDAO/nouns-monorepo/blob/master/packages/nouns-contracts/contracts/NounsAuctionHouse.sol#L100-L136

確定すると売上はNounsDAOExecutorに送られる

NounsDAOProxy

Proposalsを取り扱うコントラクト
実装はNounsDAOLogicV1に書いてありNounsDAOProxyは処理をデリゲートしている(付け替え可能)
https://github.com/nounsDAO/nouns-monorepo/blob/master/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L69

Proposalsの作成

totalSupplyは投票数
proposalThreshold貯れば可決
https://github.com/nounsDAO/nouns-monorepo/blob/master/packages/nouns-contracts/contracts/governance/NounsDAOLogicV1.sol#L165-L268

投票

https://github.com/nounsDAO/nouns-monorepo/blob/master/packages/nouns-contracts/contracts/governance/NounsDAOLogicV1.sol#L445-L452

Proposalsの状態確認

投票中、可決、否決
https://github.com/nounsDAO/nouns-monorepo/blob/master/packages/nouns-contracts/contracts/governance/NounsDAOLogicV1.sol#L416-L443

確定したProposalsをqueueに入れる

NounsDAOExecutorに対して一旦キューに入れる
NounsDAOExecutorはTimelockという仕組みを持っていて、一定期間実行を保留している?
admin権限ならキャンセルできるっぽいので、一応目視で監視する仕組み?
https://github.com/nounsDAO/nouns-monorepo/blob/master/packages/nouns-contracts/contracts/governance/NounsDAOLogicV1.sol#L270-L292

Proposalsの確定(送金処理の呼び出し)

https://github.com/nounsDAO/nouns-monorepo/blob/master/packages/nouns-contracts/contracts/governance/NounsDAOLogicV1.sol#L308-L329

proposalに対する拒否権の発動

https://github.com/nounsDAO/nouns-monorepo/blob/master/packages/nouns-contracts/contracts/governance/NounsDAOLogicV1.sol#L359-L382

実際の送金処理

https://github.com/nounsDAO/nouns-monorepo/blob/master/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L142-L179

感想

nounsは増えていくので1票の価値は薄まり
値段は下がっていくものだと思ったのだがそうでもなさそう

https://www.coingecko.com/en/nft/nouns

NounsDAOProxyの実装を自由に書き換えられるということは、Proposalsに対する処理を好きに書き換えれる。
つまりトレジャリーのイーサは実質はnoundersなら好きに動かせる。
10人のnoundersを信頼できないと成立しない仕組み

結構巨大なプログラム群だが、これをバグなく運用するのは相当難しそう。

Discussion