2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ERC・EIPAdvent Calendar 2023

Day 6

[ERC6239] RDF形式でSBTにより多くの情報を持たせる仕組みを理解しよう!

Posted at

はじめに

初めまして。
CryptoGamesというブロックチェーンゲーム企業でエンジニアをしている cardene(かるでね) です!
スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。

代表的なゲームはクリプトスペルズというブロックチェーンゲームです。

今回は、ERC5192規格のSBTトークンのメタデータに、RDF形式でトークンに関する情報をより詳しく記述する仕組みを提案している規格であるERC6239についてまとめていきます!

以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。

他にも様々なERCについてまとめています。

概要

この提案は、ブロックチェーンの世界でより豊かな情報を持つトークンを作るための新しい方法です。
具体的には、ERC721ERC5192という既存の基準を使って、ソウルバウンドトークン('SBT')という特別な種類のトークンを改善しようとしています。
ERC721は、それぞれがユニークなアイテムやコレクションを表現するためのコントラクトです。
一方、ERC5192は、SBTのための基準で、これらのトークンは所有者が変わることがない、つまり個人に永久に結びついたアイテムです。

この提案のキーポイントは、RDF(リソース記述フレームワーク)という技術を使って、トークンに関する情報を「主語-述語-目的語」という形で詳しく記述することです。
これにより、トークンについてのさまざまな情報や、それらの間の関係性をより明確に表現できます。
例えば、「このトークンは特定のアート作品を代表する」といった情報を簡単に加えることができます。

RDF(Resource Description Framework)

情報をインターネット上で共有し理解するための方法です。
RDFは「主語-述語-目的語」という形で情報を記述します。
この形式は、情報の主体(主語)、その属性や関係(述語)、属性の値や関係の対象(目的語)を明確にすることができます。

たとえば、図書館の本に関する情報をRDFで表現する場合を考えてみましょう。
本のタイトルが「ハリー・ポッターと賢者の石」で、著者が「J.K.ローリング」、出版年が「1997年」であるとします。この情報をRDFで記述すると、以下のようになります。

主語: 「ハリー・ポッターと賢者の石」
述語: 「著者は」
目的語: 「J.K.ローリング」

主語: 「ハリー・ポッターと賢者の石」
述語: 「出版年は」
目的語: 「1997年」

このようにRDFを使用すると、本に関する情報が構造化され、コンピュータが理解しやすい形で表現されます。
さらに、他の図書館や書店、オンラインのデータベースなど、異なる情報源からのデータと容易に結びつけることができます。
例えば、同じ著者の他の作品を探したり、同じ年に出版された異なる本を見つけるなどの検索が容易になります。

また、RDFはウェブ上で情報をつなげるための基盤としても機能し、さまざまなウェブページやデータベース間で情報をリンクし、新たな関係性を発見するための道具として使われます。
これにより、より豊かで複雑な検索や分析が可能になり、知識の発見と共有を促進します。

この技術によって、SBTはただのアイテムではなく、その人の経歴、ロール、経験などを表す豊かな情報を持つことができます。
これは、人々が自分の学歴や職歴、資格などをブロックチェーン上で安全に、かつ変更不可能な方法で共有できるようにする大きな一歩です。
また、この方法は異なるコントラクトやシステム間のやり取りを、意味のある情報を交換する形でスムーズにする助けとなります。

ERC721については以下の記事を参考にしてください。

ERC5192については以下の記事を参考にしてください。

動機

ソウルバウンドトークン(SBT)は、人々の約束、能力、所属などを表すブロックチェーン上のアイテムです。
これらのトークンをさらに進化させるために、ERC721ERC5192という基準を用いて、セマンティックSBTが提案されています。
セマンティックSBTは、**RDF(リソース記述フレームワーク)**という方法を使い、メタデータに「主語-述語-目的語」の形式で情報を追加します。
これにより、人々やトークン間の関係や属性がより詳細に表現されるようになります。

セマンティックSBTの利点は、異なる情報源からのデータを結びつけて一元管理できることです。
これにより、さまざまな情報源から情報を簡単に検索・取得でき、新たな洞察を得ることが可能になります。
例えば、ブロックチェーン上での社会的なつながりを可視化し、信頼できる人々を特定したり、公平な意思決定を支援するなどの応用が考えられます。

ただし、このシステムを実現するためには、社会的メタデータを管理する共通のデータモデルが必要です。
これは、人々の社会的なつながりや属性を信頼できる形でブロックチェーン上に記録し、誰もが簡単にアクセスしやすい形で提供するためのものです。
さらに、SBTエコシステムを発展させるためには、人々の社会的アイデンティティに関連する情報を分散型で維持する方法が求められます。

セマンティックSBTはこれらの課題に対応し、社会的メタデータや証明、アクセス許可をブロックチェーンに保存することで、Ethereum上で社会的アイデンティティとデータをつなげる新しい層を作り出します。
これにより、ブロックチェーン上の大量のデータに意味を与え、人々がより有意義なやり取りを行えるようになります。

Connectedness

セマンティックSBTは、人々や組織が持っている情報や属性を、簡単につなげて理解できるようにするためのツールです。
これは、「主語-述語-目的語」の形で情報を整理するRDFという方法を使って、アカウント(例えば、個人や団体)とその属性(例えば、スキルや経験)との間の関連を保存します。
この形式で情報を保存することにより、コンピューターが自動的に情報を読み取り、整理し、新しいつながりを見つけることが容易になります。

具体的には、セマンティックSBTを使えば、ある人が持っている特定のスキルや、特定のプロジェクトに参加した経験など、人々の持つ様々な特徴を簡単に把握できるようになります。
また、これらの情報がRDF形式で整理されているため、異なる人々や組織間の関係や共通点を素早く見つけ出すことができ、新しい協力関係を築くための助けとなります。

このようにセマンティックSBTは、人々や組織の持つ情報をつなげ、その関係を明確にすることで、より効果的なコミュニケーションや協力の機会を生み出すための強力なツールです。

リンクデータ

セマンティックSBTは、ブロックチェーン上の情報を整理し、誰でも簡単に使えるようにするためのツールです。
具体的には、RDFという共通の形式を使って、人や組織に関するデータを整理します。
これにより、ブロックチェーン上の情報を簡単に探し出し、つなぎ合わせることができるようになります。
このシステムは、異なるアプリケーションやサービス間で情報を共有することを容易にし、その過程で発生するコストや手間を減らします。

例えば、セマンティックSBTを使えば、ある人がどのようなスキルを持っているのか、どんな経験があるのかなどの情報を簡単に見つけることができます。
そして、その情報は他のアプリケーションと共有され、新しいネットワークを作ったり、特定のニーズに合った人材を見つけるなど、さまざまな用途に活用できます。

セマンティックSBTはブロックチェーン上のデータをよりアクセスしやすく、使いやすくするためのものです。
これにより、情報はより価値のあるものになり、人々や組織間でのやり取りや協力が促進されます。

Social Identity

セマンティックSBTは、個人が自分のアイデンティティに関連する情報を、中央の仲介者に頼らずに自ら公開や証明ができるようにするツールです。
これにより、誰もが自分の情報を自由に、独立してコントロールできるようになります。
セマンティックSBT内の情報は一部分だけでもあり、それらは社会的に相互に関連しています。
RDFトリプルを利用することで、これらの情報からコミュニティの傾向や構造を見つけ出すためのアルゴリズムを作ることができます。

具体的には、このシステムを使えば、個人や組織は、自分たちの関係やコミュニティ内でのロールを明確にし、他の人と共有できるようになります。
これにより、より透明で開かれた方法で社会的なつながりを築くことが可能になります。
セマンティックSBTは、情報をつなげて新しい価値を生み出すための道具として、特に社会分野で有効な手段となり得ます。

仕様

以下の表は、トークンが実装する必要があるインターフェースについての説明です。

インターフェース 識別子 説明
ERC165 0x01ffc9a7 トークンがどのインターフェースをサポートしているかを判定するための標準。
これにより、トークンの機能を自動的に検出し、互換性を確認できます。
ERC721 0x80ac58cd ユニークで代替不可能なトークン(NFT)を作成するための基本的なインターフェース。
個々のトークンが独自の識別子を持ち、異なる所有権を有します。
ERC721Metadata 0x5b5e139f トークンに追加情報を提供する拡張機能。
トークンの名前、説明、画像URLなどのメタデータを含めることができます。
ERC5192 0xb45a3c0e トークンが特定の「状態」を持つことをサポートするインターフェース。
例えば、所有者が変わらないソウルバウンドトークンなど、状態に応じた特別な特性を持たせることができます。

これらのインターフェースを実装することによって、トークンは多様な機能や情報を持ち、さまざまなプラットフォームやアプリケーションで広く活用されるようになります。
開発者やユーザーは、これらの標準に従うことで、トークンがどのように機能するかを容易に理解し、予測することができます。

ERC165については以下の記事を参考にしてください。

RDF Statement

RDF(Resource Description Framework) ステートメントは、情報をウェブ上で共有するための様々な形式で表現されます。
ここでは、最も一般的に使用される6つの形式を選択しました。
それらは、nt(N-Triples)ttl(Turtle)rdf(RDF/XML)rj(RDF/JSON)nq(N-Quads)trig(TriG) です。

RDFステートメントの完全な形式は以下の通りです。

rdfStatements = {[format]}<statements>

この形式では、{}で囲まれた部分は任意(OPTIONAL)で、<>で囲まれた部分は必須(REQUIRED)です。
これは、ステートメントを書く時に、フォーマットを指定するかどうかが選択できることを意味しています。

使用可能なフォーマットは以下の通りです。

format: nt/ttl/rdf/rj/nq/trig

フォーマットが選択されていない場合は、デフォルトで**ttl(Turtle)**形式のステートメントが使用されます。
このように、特にフォーマットを指定しない場合は、Turtle形式で情報を表現するということになります。

この説明から、RDFステートメントを様々な方法で表現でき、それぞれの形式が独自の特徴と利用シーンを持っていることがわかります。
開発者は、自分のニーズや好みに合わせて最適なフォーマットを選択できます。

nt(N-Triples)

nt(N-Triples) は、RDF(Resource Description Framework) データを表現するためのシンプルな形式です。
この形式では、主語、述語、目的語を空白で区切り、トリプルの終わりにはピリオド「.」を使います。

基本的な構造は以下の通りです。

subject predicate object .

この形式では、主語はIRIREF(リソースを一意に識別するための国際化されたリソース識別子)またはBLANK_NODE_LABEL(匿名のリソースを識別するためのラベル)の形式です。
述語はIRIREF形式で、目的語はIRIREFBLANK_NODE_LABELSTRING_LITERAL_QUOTE(文字列リテラル)の形式です。

例えば、以下のような記述があります。

<http://example.org/entity/user1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/entity/User> .
<http://example.org/entity/user1> <http://example.org/property/name> "Alice" .

これらの例は、特定のユーザー(user1)が「User」というタイプであり、その名前が「Alice」であることを表しています。
このようにnt形式は非常にシンプルで、RDFデータの基本的な要素を明確にするのに適しています。

ttl(Turtle)

ttl(Turtle)は、nt(N-Triples)よりも読みやすく、書きやすいRDFデータの表現形式です。
IRI参照(IRIREF)を簡略化するためにプレフィックスを使用し、同じ主語に対する同じ述語を繰り返すことなくマージすることができます。
さらに、「a」を使用して<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>を表現することもできます。

例えば、以下のようなTurtle形式の記述があります。

@prefix : <http://example.org/entity/> .
@prefix p: <http://example.org/property/> .

:user1 a :User;
       p:name ”Alice” .

この例では、まず@prefixを使って、頻繁に使用されるIRI参照に短い別名(プレフィックス)を割り当てています。
ここでは、<http://example.org/entity/>には:が、<http://example.org/property/>にはp:が割り当てられています。

次に、:user1http://example.org/entity/user1を指す)は:Userhttp://example.org/entity/Userを指す)のタイプであり、名前がAliceであることを示しています。
ここで、「a」はrdf:typeの短縮形として使用され、p:name"Alice"という値を持つプロパティです。

この形式は、データをより簡潔に、かつ直感的に表現することを可能にし、人間にも機械にも理解しやすい構造を提供します。

rdf(RDF/XML)

rdf(RDF/XML)は、RDFデータをXML形式で表現する方法です。
この形式では、rdf:RDFをトップレベルの要素として使用し、xmlnsを使ってプレフィックス(名前空間)を定義します。
各ノード(エンティティ)はrdf:Descriptionで始まり、rdf:about属性でそのノードを識別します。
そして、ノードのプロパティはその内部に追加され、IRI形式の値はrdf:resourceで、文字列値は直接テキストとして記述されます。

基本的な構造は以下の通りです。

<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/ 02/22-rdf-syntax-ns#">

 <rdf:Description rdf:about="subject" >
  <predicate rdf:resource="object"/>
   <predicate >object</predicate>
 </rdf:Description>
</rdf:RDF>

例えば、以下のような記述があります。

<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/ 02/22-rdf-syntax-ns#"
           xmlns:p="http://example.org/property/">

 <rdf:Description rdf:about="http://example.org/entity/user1" >
   <rdf:type rdf:resource="http://example.org/entity/"/>
  <p:name >Alice</p:name>
 </rdf:Description>
</rdf:RDF>

この例では、ユーザー1(http://example.org/entity/user1)が「User」という種類のエンティティであり、名前が「Alice」であることを表しています。
rdf:typeはそのエンティティのタイプを示し、p:nameはそのエンティティの名前を示しています。
このように、rdf(RDF/XML)はXMLの標準的な文法を使用してRDFデータを構造的かつ明瞭に表現することができます。

rj(RDF/JSON)

rj(RDF/JSON)は、RDFデータをJSON形式で表現する方法です。
この形式では、トリプル(主語、述語、目的語の組み合わせ)がJSONオブジェクトとして記述されます。
基本的な構造は以下の通りです。

{"subject":{"predicate":[object]}}

ここで、各ルートオブジェクト(主語)はユニークな主キーとして機能し、重複は許されません。
つまり、同じ主語をキーとする重複は存在せず、また、1つの主語の下に同じ述語が重複することもありません。

例えば、以下のような記述があります。

{
 "http://example.org/entity/user1": {
   "http://www.w3.org/1999/02/22-rdf-syntax-ns#type": [
     "http://example.org/entity/User"
   ],
   "http://example.org/property/name": [
     "Alice"
   ]
 }
}

この例では、http://example.org/entity/user1という主語に対して、2つの述語があります。
1つはそのエンティティのタイプを示すhttp://www.w3.org/1999/02/22-rdf-syntax-ns#typeで、もう1つは名前を示すhttp://example.org/property/nameです。
タイプはhttp://example.org/entity/Userで、名前はAliceです。

このように、rj(RDF/JSON)はJSONの柔軟性と構造の明快さを活かしてRDFデータを表現し、プログラムが解析しやすい形で情報を提供します。

nq(N-Quads)

nq(N-Quads)は、nt(N-Triples)に基づくRDFデータの形式で、それぞれのRDFトリプル(主語、述語、目的語の組み合わせ)が属するデータセットを記述するグラフラベルを追加した形式です。
このグラフラベルは、IRIREF(リソースを一意に識別するための国際化されたリソース識別子)またはBLANK_NODE_LABEL(匿名のリソースを識別するためのラベル)の形式を取ります。

基本的な構造は以下の通りです。

subject predicate object graphLabel.

たとえば、以下のような記述があります。

<http://example.org/entity/user1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/entity/User> <http://example.org/graphs/example> .
<http://example.org/entity/user1> <http://example.org/property/name> "Alice" <http://example.org/graphs/example> .

この例では、2つのトリプルがあり、それぞれが<http://example.org/graphs/example>というグラフラベルに関連付けられています。
1つ目のトリプルは、http://example.org/entity/user1http://example.org/entity/Userのタイプであることを示しており、2つ目のトリプルは、同じエンティティの名前が「Alice」であることを示しています。

このように、nq(N-Quads)は、RDFデータをより詳細に整理し、特定のデータセットやコンテキストに関連付けることを可能にします。
これにより、複数のデータセットや異なる文脈のデータを効率的に扱い、管理することができます。

trig(TriG)

trig(TriG)ttl(Turtle)を拡張した形式で、RDFトリプルが属するデータセットを記述するグラフラベルを含んでいます。
トリプル文は波括弧{}で囲まれています。

例えば、以下のような記述があります。

@prefix : <http://example.org/entity/> .
@prefix p: <http://example.org/property/> .

<http://example.org/graphs/example>
  {
       :user1 a :User;
              p:name "Alice" .
   }

この例では、プレフィックスを使用してIRI参照を短縮し、特定のグラフ(http://example.org/graphs/example)内で、:user1という主語に対して2つの述語があります。
1つは:Userというオブジェクトを指すa(rdf:typeの短縮形)で、もう一つはAliceというオブジェクトを指すp:nameです。

コントラクトイベント(CreateRDF, UpdateRDF, RemoveRDF)やrdfOfメソッドでは、rdfStatementsはデフォルトでttl形式で使用されます。
上記でリストされている他の形式を使用する場合は、形式を識別するためにフォーマット識別子を追加する必要があります。フォーマット識別子は[で始まり]で終わります。
例えば、nt形式のrdfStatementsにはプレフィックス[nt]を含める必要があります。

[nt]subject predicate object .

このように、trig(TriG)ttlの機能に加えて、データをより複雑でリッチなコンテキストで表現する能力を提供し、データの管理と利用の柔軟性を高めます。

コントラクトインターフェース

/**
 * @title Semantic Soulbound Token
 * Note: the ERC-165 identifier for this interface is 0xfbafb698
 */
interface ISemanticSBT{
    /**
     * @dev This emits when minting a Semantic Soulbound Token.
     * @param tokenId The identifier for the Semantic Soulbound Token.
     * @param rdfStatements The RDF statements for the Semantic Soulbound Token. 
     */
    event CreateRDF (
        uint256 indexed tokenId,
        string  rdfStatements
    );
    /**
     * @dev This emits when updating the RDF data of Semantic Soulbound Token. RDF data is a collection of RDF statements that are used to represent information about resources.
     * @param tokenId The identifier for the Semantic Soulbound Token.
     * @param rdfStatements The RDF statements for the semantic soulbound token. 
     */
    event UpdateRDF (
        uint256 indexed tokenId,
        string  rdfStatements
    );
    /**
     * @dev This emits when burning or revoking Semantic Soulbound Token.
     * @param tokenId The identifier for the Semantic Soulbound Token.
     * @param rdfStatements The RDF statements for the Semantic Soulbound Token. 
     */
    event RemoveRDF (
        uint256 indexed tokenId,
        string  rdfStatements
    );
    /**
     * @dev Returns the RDF statements of the Semantic Soulbound Token. 
     * @param tokenId The identifier for the Semantic Soulbound Token.
     * @return rdfStatements The RDF statements for the Semantic Soulbound Token. 
     */
    function rdfOf(uint256 tokenId) external view returns (string memory rdfStatements);
}

ERC721メタデータの拡張であるISemanticRDFSchemaは、この規格ではオプション機能であり、RDFデータのスキーマURIを取得するために使用されます。

interface ISemanticRDFSchema{
    /**
     * @notice Get the URI of schema for this contract.
     * @return The URI of the contract which point to a configuration profile.
     */
    function schemaURI() external view returns (string memory);
}

メソッド

rdfOf (uint256 tokenId)

このメソッドは、特定のトークンIDを持つセマンティックソウルバウンドトークン(SBT)についての情報を問い合わせるために使います。
戻ってくるRDFデータは、リソースに関する情報を主語、述語、目的語の組み合わせで表すRDFステートメントの集合です。
これはW3CのRDF標準に基づいており、1つのRDFステートメント(トリプルとも呼ばれます)が一つの情報単位として機能します。

schemaURI()

この任意のメソッドは、RDFデータの構造を定義するスキーマのURIを取得するために使用されます。
RDFスキーマはRDFの基本語彙を拡張し、RDFデータをモデル化するための語彙を提供します。
このスキーマは、ArweaveやIPFSのような分散型ストレージに保存することが推奨され、そのURIはコントラクトに記録されます。
このメソッドを通じて、そのURIを問い合わせることができます。

これらのメソッドにより、開発者やユーザーはセマンティックSBTに関する詳細な情報や、その情報がどのように構築されているかを理解して取得することができます。
rdfOfは具体的なトークンに関するデータを提供し、schemaURIはそのデータがどのような構造であるかを示すメタデータを提供します。
これにより、情報の取得と理解がより容易になります。

イベント

CreateRDF

セマンティックソウルバウンドトークンを新たに生成する時に発行されるイベントです。
このイベントは、新しく作成されたRDFデータをシステムの他の部分やユーザーが使えるようにするために通知します。
この時、RDFデータ(主語、述語、目的語の3つで構成される情報)がイベントと共に提供されます。

UpdateRDF

既存のセマンティックソウルバウンドトークンのRDFデータを更新する時に発行されるイベントです。
このイベントは、更新されたRDFデータをシステムの他の部分やユーザーが知ることができるようにし、それに応じた操作を行うよう通知します。
ここでも、更新されたRDFデータは主語、述語、目的語の形式で提供されます。

RemoveRDF

セマンティックソウルバウンドトークンを削除または無効化する時に発行されるイベントです。
このイベントは、削除されたRDFデータをシステムの他の部分やユーザーが知ることができるようにし、それに応じた操作を行うよう通知します。
この場合も、関連するRDFデータは主語、述語、目的語の形式で提供されます。

これらのイベントは、セマンティックソウルバウンドトークンに関連する情報の生成、更新、削除が行われた時に、関連するシステムやユーザーに対して必要な情報を伝達し、適切な対応を促すために設計されています。
これにより、情報の流れがスムーズになり、トークンに関連するアクションが効率的かつ正確に行われるようになります。

補足

RDFは、主語、述語、目的語を用いて情報の関係性を表す柔軟で拡張可能なデータモデルです。
セマンティックウェブの標準やリンクデータの概念を取り入れており、その柔軟性とクエリ機能により、グラフデータのモデリングによく使用されます。
RDFを利用することで、ウェブ上のさまざまなデータソースとグラフデータを簡単に統合でき、より包括的で相互運用可能なモデルを作成することが可能です。
RDFは、用語、カテゴリ、プロパティ、関係などの豊かな情報を記述できるため、より詳細なセマンティック記述が可能になります。
また、標準化された形式と言語を使用してメタデータを記述するため、セマンティック情報がより統一され、標準化されます。
これにより、異なるシステム間での互換性が高まり、正確で信頼性の高いセマンティックネットワークの構築を促進します。
さらに、セマンティック推論をサポートすることで、既存のデータから社会グラフ内のノード間の新たな関係や接続を自動的に推測することが可能です。

RDFステートメントには複数の表現形式があり、EIPでは最も広く採用されている6つの形式である、TurtleN-TriplesRDF/XMLRDF/JSONN-QuadsTriGを挙げています。
これらの形式は、RDFステートメントを表現、保存、解析する際にそれぞれ異なる利点と適用性を持ちます。
中でもTurtleは、その人間に優しい可読性と簡潔さからRDFステートメントの人気の形式となっています。
通常、このEIPではRDFステートメントのデフォルト形式としてTurtleが使用されます。
Turtle形式はRDFステートメントの理解と保守を容易にし、ストレージの必要性を減らすため、複雑なRDFグラフを表現するのに適しています。

互換性

この提案は、ERC721およびERC5192と完全な互換性があります。

セキュリティ

この規格の実装に直接関係するセキュリティ上の考慮事項はありません。

引用

Jessica Chang (@JessicaChg), "ERC-6239: Semantic Soulbound Tokens," Ethereum Improvement Proposals, no. 6239, December 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-6239.

最後に

今回は「ERC5192規格のSBTトークンのメタデータに、RDF形式でトークンに関する情報をより詳しく記述する仕組みを提案している規格であるERC6239」についてまとめてきました!
いかがだったでしょうか?

質問などがある方は以下のTwitterのDMなどからお気軽に質問してください!

Twitter @cardene777

他の媒体でも情報発信しているのでぜひ他も見ていってください!

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?