# 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://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.

### 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を使っているのでノード管理者から秘匿された状態でデータを管理できる。
