# Ceramics https://ceramic.network/ 分散型のデータストレージ。IPFSに似た形で複数のノードがデータを管理している。 あくまでブロックチェーンではなく、ファイルの状態を積み上げて保存するプログラム。 一定間隔で状態のMerkleTreeを作りEthereumに書き込むことで、改ざん防止ができるようになっている。 データの管理は、各アカウントごとにStreamというデータ変更履歴ツリーが存在し、 所有者アカウントのみがStreamに書き込みができる(Discretionary Access Controlっぽい)。閲覧は認証なしでできる。 書き込むと、データはIPFSに保存し、CID付きの`StreamID`, `CommitID`を 他のNodeと`CeramicsAnchorService(CAS)`に送る。 CASは受け取ったらMerkleTreeを作りEthereumに書き込む。 書き込んだらAnchorCommitとしてTxハッシュ付きCommitを各Nodeに送り変更を保存してもらう。 ![](https://i.imgur.com/AXFWgLO.png) ![](https://i.imgur.com/bEpG7Lu.png) https://blog.ceramic.network/what-is-ceramic/ ## 値段とか > Hey guys, wanted to know if there is a pricing model for using ceramic network for data storage and querying on mainnet > pricing model - no token on the network yet so right now storing data on ceramic is free, but that will change when we introduce the token. 特に使用量などは無い。トークンとか出すかもしれないが、分散ネットワークを目指す上で慎重に考えたい。 > Is there any plan / roadmap to decentralize gateways? This seems like one of the centralization points. so there aren't any incentives for node operators? If I want to use ceramic in a censorship resistant way I should deploy my own anchor contract and host my own network of nodes? > At this time we don't have an incentive system for node runners. Application developers generally run their own nodes. 今はNodeを動かし続けるインセンティブはない。開発者が自分でノードを立ててる。 これをSaaSとして行う会社がありそうだが、インセンティブつきネットワークにした時にどのように分散ネットワークになるかは研究中。 https://discord.com/channels/682786569857662976/682786570339876877/1067232692476858499 ## 仕組み ### Stream データをファイル、状態ごとにIPFSで保存してる。 StreamTypeという、データ構造、コンテンツ形式、アクセス制御、合意アルゴリズムなど、ストリームのロジックに関する情報がある。 - Tile Document JSON ドキュメントを格納する StreamTypeで、NoSQLのドキュメントストアと同様の機能を提供する。更新は、そのストリームを管理するDIDによって署名されないといけない。 - CAIP-10 Link ブロックチェーンとDIDを紐つけるためのデータを保存するためのStream Type - Custom カスタム ### Ceramic Network libp2p使っている ノードは - StreamのTx(Update)を実行 - StreamStateの保存。 - Commit Log の保存。今後はFilecoin、Arweave、Siaなど、上記の永続化ネットワークが使えるようになる。 - クライアントからのクエリーへの応答。Localにデータがあればそれを返すし、なければ、libp2pを介してネットワークに聞く。 - Streamに対するTxをブロードキャスト。このSteam持つ他のノードに状態変更を通知する などの機能を持つ ### Client - JS HTTPクライアント。HTTPでリモートのCeramicノードに接続するTsライブラリ。 - JS Coreクライアント。Ceramicのフルノードも含まれる。https://github.com/ceramicnetwork/js-ceramic - CLI:Ceramicノードと対話するためのコマンドラインインターフェース。 ### DID method データ追加時にユーザーを認証する方法として以下のものをサポートする。 今後はNFT保有者だけ認証なども追加予定。 https://developers.ceramic.network/learn/advanced/overview/#authentication - PKH DID Method: `did:pkh:**` ブロックチェーンの鍵をそのまま利用できる - 3ID DID Method: `did:3:**` 鍵の更新やRevokeがある - Key DID Method: `did:key:**` 簡素だけど鍵の更新などがないので不便 ## 便利サイト/動いているもの CeramicsNetowrk上て動いてるサービス一覧 https://developers.ceramic.network/learn/highlighted-projects/ ### Forum フォーラムで色々聞くことができる https://forum.ceramic.network/ ### [Orbis](https://orbis.club/) CeramicsNetowrk上て動いてるSocialMediaProtocol. ![](https://i.imgur.com/C0KoEi4.png) ### Cerscan Orbisによって提供されてるサービス。 Mainnetに送られているCommitを表示している ## Demo ローカルで簡単にNodeを立ち上げることができる。 ``` $ npx ceramic daemon [2023-02-09T06:07:57.012Z] IMPORTANT: Starting Ceramic Daemon at version 2.20.0 with config: { "anchor": {}, "http-api": { "cors-allowed-origins": [ ".*" ], "admin-dids": [] }, "ipfs": { "mode": "bundled" }, "logger": { "log-level": 2, "log-to-files": false }, "metrics": { "metrics-exporter-enabled": false }, "network": { "name": "testnet-clay" }, "node": {}, "state-store": { "mode": "fs", "local-directory": "/Users/mizuki/.ceramic/statestore/" }, "indexing": { "db": "sqlite:///Users/mizuki/.ceramic/indexing.sqlite", "allow-queries-before-historical-sync": true } } [2023-02-09T06:07:57.021Z] IMPORTANT: Connecting to IPFS node available as /ip4/127.0.0.1/tcp/4011/p2p/12D3KooWESdzP3xbHhiaGCeBJZYVx8HjdvE3gtCT2n9U7zQTq3Nw, /ip4/192.168.1.188/tcp/4011/p2p/12D3KooWESdzP3xbHhiaGCeBJZYVx8HjdvE3gtCT2n9U7zQTq3Nw [2023-02-09T06:07:57.049Z] IMPORTANT: Connecting to ceramic network 'testnet-clay' using pubsub topic '/ceramic/testnet-clay' [2023-02-09T06:07:59.714Z] WARNING: Can not connect to /dns4/go-ipfs-ceramic-public-clay-external.ceramic.network/tcp/4011/ws/p2p/QmSqeKpCYW89XrHHxtEQEWXmznp6o336jzwvdodbrGeLTk [2023-02-09T06:07:59.714Z] WARNING: HTTPError: connect QmSqeKpCYW89XrHHxtEQEWXmznp6o336jzwvdodbrGeLTk failure: failed to dial QmSqeKpCYW89XrHHxtEQEWXmznp6o336jzwvdodbrGeLTk: * [/ip4/3.133.16.130/tcp/4011/ws] websocket: bad handshake * [/dns4/go-ipfs-ceramic-public-clay-external.ceramic.network/tcp/4011/ws] websocket: bad handshake [2023-02-09T06:08:04.829Z] IMPORTANT: Connected to anchor service 'https://cas-clay.3boxlabs.com' with supported anchor chains ['eip155:100'] [2023-02-09T06:08:05.316Z] WARNING: No pinned streams detected. This is expected if this is the first time this node has been run, but may indicate a problem with the node's persistence setup if it should have pinned streams [2023-02-09T06:08:05.323Z] IMPORTANT: Ceramic API running on 0.0.0.0:7007' [2023-02-09T07:08:05.269Z] WARNING: Can not connect to /dns4/go-ipfs-ceramic-public-clay-external.ceramic.network/tcp/4011/ws/p2p/QmSqeKpCYW89XrHHxtEQEWXmznp6o336jzwvdodbrGeLTk [2023-02-09T07:08:05.269Z] WARNING: HTTPError: connect QmSqeKpCYW89XrHHxtEQEWXmznp6o336jzwvdodbrGeLTk failure: failed to dial QmSqeKpCYW89XrHHxtEQEWXmznp6o336jzwvdodbrGeLTk: * [/ip4/3.133.16.130/tcp/4011/ws] websocket: bad handshake * [/dns4/go-ipfs-ceramic-public-clay-external.ceramic.network/tcp/4011/ws] websocket: bad handshake ``` ### DID作成 ```shell= $ npx glaze did:create ✔ Created DID did:key:z6MkvieF22bn5XNDvWApXQyRfSg1uX1MjgBrGPo4XZAsgg6v with seed dec8bc42d9bc0542cbd2ccf7d2b58fd4989f1795cea124e935b97e8fd79bfa18 ``` `did:key:z6MkvieF22bn5XNDvWApXQyRfSg1uX1MjgBrGPo4XZAsgg6v` が作られる。`seed` はデータ更新などで必要。秘密鍵みたいなもの? これの代わりにEthereumのアドレスでも作れる。 ### データ紐つけ ```shell= $ npx glaze tile:create --key dec8bc42d9bc0542cbd2ccf7d2b58fd4989f1795cea124e935b97e8fd79bfa18 --content '{"name":"mizuki"}' ℹ Using DID did:key:z6MkvieF22bn5XNDvWApXQyRfSg1uX1MjgBrGPo4XZAsgg6v ✔ Created stream kjzl6cwe1jw14bmc17qdlyja6fkea7410xzvqsc9ajnf6iud8q42bcuvm02pmnt. { streamID: 'kjzl6cwe1jw14bmc17qdlyja6fkea7410xzvqsc9ajnf6iud8q42bcuvm02pmnt', content: { name: 'mizuki' } } ``` ### Streamの情報表示 ```shell= npx glaze stream:state kjzl6cwe1jw14bmc17qdlyja6fkea7410xzvqsc9ajnf6iud8q42bcuvm02pmnt ✔ Successfully queried stream kjzl6cwe1jw14bmc17qdlyja6fkea7410xzvqsc9ajnf6iud8q42bcuvm02pmnt { type: 0, content: { name: 'mizuki' }, metadata: { unique: 'uWDjdNQ0cnIPrCFq', controllers: [ 'did:key:z6MkvieF22bn5XNDvWApXQyRfSg1uX1MjgBrGPo4XZAsgg6v' ] }, signature: 2, anchorStatus: 1, log: [ { cid: CID(bagcqcera72odrxsh6at4aqg2vo6vpdwyln7kgnyhy5d7d46z7gtymjyyud4q), type: 0 } ] } ``` ### データの更新 ```shell= npx glaze tile:update kjzl6cwe1jw14bmc17qdlyja6fkea7410xzvqsc9ajnf6iud8q42bcuvm02pmnt --key dec8bc42d9bc0542cbd2ccf7d2b58fd4989f1795cea124e935b97e8fd79bfa18 --content '{"name":"mizuki sonoko"}' ℹ Using DID did:key:z6MkvieF22bn5XNDvWApXQyRfSg1uX1MjgBrGPo4XZAsgg6v ✔ Updated stream { streamID: 'kjzl6cwe1jw14bmc17qdlyja6fkea7410xzvqsc9ajnf6iud8q42bcuvm02pmnt', content: { name: 'mizuki sonoko' } } ``` ### Stream の表示 ```shell= npx glaze stream:state kjzl6cwe1jw14bmc17qdlyja6fkea7410xzvqsc9ajnf6iud8q42bcuvm02pmnt ✔ Successfully queried stream kjzl6cwe1jw14bmc17qdlyja6fkea7410xzvqsc9ajnf6iud8q42bcuvm02pmnt { type: 0, content: { name: 'mizuki' }, metadata: { unique: 'uWDjdNQ0cnIPrCFq', controllers: [ 'did:key:z6MkvieF22bn5XNDvWApXQyRfSg1uX1MjgBrGPo4XZAsgg6v' ] }, signature: 2, anchorStatus: 1, log: [ { cid: CID(bagcqcera72odrxsh6at4aqg2vo6vpdwyln7kgnyhy5d7d46z7gtymjyyud4q), type: 0 }, { cid: CID(bagcqcerasrizpgpyaitbv657qexaziwmjck7ozsu4ea76xlky7rpbhjk2wqa), type: 1 } ], next: { content: { name: 'mizuki sonoko' }, metadata: { unique: 'uWDjdNQ0cnIPrCFq', controllers: [ 'did:key:z6MkvieF22bn5XNDvWApXQyRfSg1uX1MjgBrGPo4XZAsgg6v' ] } } } ``` ### Stream の先頭表示 ```shell= npx glaze tile:show kjzl6cwe1jw14bmc17qdlyja6fkea7410xzvqsc9ajnf6iud8q42bcuvm02pmnt ✔ Retrieved details of stream kjzl6cwe1jw14bmc17qdlyja6fkea7410xzvqsc9ajnf6iud8q42bcuvm02pmnt { name: 'mizuki sonoko' } ``` # Polybase https://polybase.xyz/ Ceramicsに似ているサイト。 分散データストレージとしての比較でしかないので、VC/DIDなどは考えていない。 (にしても営業力が強すぎる) https://forum.ceramic.network/t/ceramic-vs-polybase-spacetime/372 Ceramicが分散型イベントストリーミングプラットフォームであるのに対し、Polybaseは検証可能な分散型データベースというのが基本的な位置づけらしい。 CeramicはApache Kafka、PolybaseはPostgresのようなイメージ。 ZK-Rollupを使っているのでノード管理者から秘匿された状態でデータを管理できる。 ![](https://i.imgur.com/0Mc7Y5A.png)