先日、emojiDAOによるERC-721トークン拡張規格であるEIP-4907の提案が承認されたことを受け、Rilascioでも正式にサポートすることを発表いたしました。
https://prtimes.jp/main/html/rd/p/000000005.000100604.html
今回は、ERC-4907のコアコンセプトや関連の実装、標準規格化される意義について、多少技術的な観点から簡単にまとめましたので、ぜひ読んでください。
https://twitter.com/DoubleProtocol/status/1541977207320576001?s=20&t=IcDPy5WhQH7cfwonOtRmQQ
ERC-4907のコアコンセプトは、NFTのロールを「Owner」と「User」に分割し、さらにUserに「expire」として有効期限を設けることで、所有権と一時的な使用権を表現しようとする設計思想を共通の規格として整理した点にあるかと思います。
というのも、ERC-4907で実装している「有効期限を条件に、戻り値としてのアドレスを分岐」という仕組みは、当該規格の提案以前からSpecificな形で実装されてきたものでした。
当該規格では、userOfメソッドを実行した際に、ユーザーに紐づいた有効期限と現在時刻を比較し、レンタル期限内であればUserのアドレスを返し、そうでなければaddress(0)が返る仕組みになっています。
//ERC-4907
function userOf(uint256 tokenId) public view virtual returns(address){
if( uint256(_users[tokenId].expires) >= block.timestamp){
return _users[tokenId].user;
}
else{
return address(0);
}
}
また、2022年始め頃にテストネット版をリリースした「Rentable」でも同様の実装がされています。
https://hashhub-research.com/articles/2022-02-04-about-rentable
//Rentable
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
/*省略*/
if (lease.eta > 0 && lease.eta > block.number) {
return super.ownerOf(tokenId);
} else {
return address(0);
}
}
興味ある方は是非ソースコードを参照してみてください(面白いです)
https://etherscan.io/address/0xB1d46a10CD78776E61B1475bf73886Ff48aA6922#code
弊社の「Rialscio」でも同様の条件分岐を設けていました。
//Rilascio
function ownerOf(uint256 _tokenId) public view virtual override returns (address) {
/*省略*/
if(_rentalEndTime > block.timestamp){
return IRilascio(_rilascio).getRentConditions(_rentId).borrowerAddress;
} else {
return _rilascio;
}
}
ERC-4907は、プロジェクト別に存在していた具体的な実装や設計思想を、共通の規格として提案した点で、領域に大きなインパクトを与えると感じています。
しかし、レンタルを実際に行い、レンタルしたNFTをサービスで利用するためには、依然としてパブリッシャーによる技術的対応が必要になります。
例えば、NFTの所有権を検証する際には、以下のような実装を行うかと思います。
/*省略*/
const contract = new ethers.Contract(***contractAddress***, ABI, signer);
//特定のトークンIDについて検証
const ownerAddr = await contract.ownerOf(***tokenId***);
//あるいは、所有数について検証
const balances = await contract.balanceOf(***owner***);
また、Rentableも同様です。
RentableはオリジナルNFTをラップして貸し出しているため、メタデータやメソッドはオリジナルNFTを参照しつつもコントラクトアドレスが異なるため、同じくパブリッシャーによる技術的対応が必要になります。
/*省略*/
const contract = new ethers.Contract(***wrappedContractAddress***, ABI, signer);
//特定のトークンIDについて検証
const ownerAddr = await contract.ownerOf(tokenId);
//あるいは、所有数について検証
const balances = await contract.balanceOf(owner);
さらに、ラップこそしていないが、エスクローに問い合わせる形式を取っているreNFTも同様に技術的対応が必要になるため、SDKを公開しています。
https://docs.renft.io/docs/Developers/collateral-free
このような、パブリッシャーによる技術的な対応は、ERC-4907前後でも当然のように必要となり、レンタルへの切り替えには少々負担があるかと思います。
上記で取り上げたように、あくまでERC-4907はレンタルを実装できるようなストレージとロジックを追加で定義したものであり、レンタルをした上でユーティリティを行使するためには、サービスパブリッシャー側の技術的対応が必要でした。
ERC-4907が提案される前は、各プロダクトによるオレオレ規格を設計して提案する必要があるため、パブリッシャーからすれば「オタクの規格を採用したとして、どれだけのユーザーが追従するか?」というリスクがありました。
しかし、このような標準規格が実装されることで、Openseaやx2y2などが同じようにコレクションやトークンを参照できるようなことが、レンタルNFTにおいても可能になるという意義があると思います。
ERC-4907を提案しているEmojiDAO代表のShrugさんの記事もぜひ読んでみてください。
NFTを取り巻く権利について、過去の事例と目指すべきあり方について丁寧に解説されています。
https://medium.com/double-protocol/3-steps-of-making-nfts-rentable-1-8d8f82485706
私たちが開発を進めているNFTレンタルプロトコルの『Rilascio(リラシオ)』は、ERC-4907に準拠した無担保型のNFTレンタルプロトコルです。
すでに発行されているNFTは、ラップしたNFTを発行することでレンタルを可能にしていて、これから新規に発行するNFTについては、ラップせずにオリジナルを貸し借りできるようになっています。
Rialscioは単なる貸し借りのプロトコルではなく、NFTの所有権と使用権を分割したことによって、NFTレンディングプロトコルとのコンポーザビリティが確保された、資産効率が最も高いNFTレンタルプロトコルになっています。

詳しくは以下のドキュメントをご覧ください。
https://docs.rilasc.io/v/japanese/
以下のリンクからDiscordに参加することで、テスターに応募できますので、是非よろしくお願いいたします。
https://discord.com/invite/9nmDtTe2TD
レンタルを志向する個別の実装を共通化したERC-4907の意義と、依然として残るサービスパブリッシャーによる対応について

