開発者目線でWeb3サービスまとめ

by AIGRAM

様々なサービスがweb3化している。開発者目線でホワイトペーパーなどから興味のある項目をまとめてみた

目次

Minds

参考ページ

特徴

  • 一言で言うと「web3版Facebook」
  • プログラムコードは全てオープンソース化されている
  • アプリへの貢献度によってトークン(points)をもらえる

アプリへの貢献と報酬

ユーザーは閲覧数、投票数、コメント数、定期購読者数の増加につながる質の高い記事を書いたり、知人を紹介すること(アフィリエイト)によってトークンがもらえる

開発者は公開されているソースコードからバグや脆弱性を見つけることによってトークンがもらえる。

もらえるトークン量は見つけたバグの影響度合いや発生頻度に応じて評価された危険度(OWASP)に基づき決定する。

Mindsのスマートコントラクト

MindsのトークンはEtherscanから確認できる。

ホワイトペーパーには、以下の形式の記事情報をmd5でハッシュ化してブロックチェーンに記録していると書いてあった。

(boost_guid, boost type (newsfeed, offer, sidebar), owner_guid, perma_url, message, title, time_created)

記事が更新されるごとに、このハッシュ値も変化し、記録されるとのこと。 残念ながらスマートコントラクトはリポジトリから見つけることができなかった。

OWASP

  • Open Web Application Security Project の略
  • ソフトウェアのセキュリティ向上を目的とした非営利団体
  • 全ての情報に誰でも無料でアクセスできる
  • OWASP ASVSというWebアプリにおけるセキュアな開発のための検証項目を公開している
  • OWASP ZAPという脆弱性診断ツールを公開している
  • OWASP Testing GuideというWebアプリにおけるテストの教科書を公開している
  • OWASP Top10というWebアプリにおけるセキュリティリスクの高い上位10項目を公開している

Odysee

参考ページ

特徴

  • 一言で言うと「 web3版YouTube」
  • LBRY protocolというブロックチェーン技術を用いたファイル共有・支払いプロトコルを使用
  • ブロックチェーン上にコンテンツが格納され、コンテンツはP2P方式で共有される
  • 動画のアップロードに最小0.01LBCのトークンが必要で、閲覧に必要なLBCトークン量を設定可能

LBRY protocol

  • ブロックチェーンとBitTorrentの技術を使用
  • MIT Lincenseのオープンソースプロジェクト
  • プログラム言語はC++で書かれている

Audius

参照ページ

特徴

  • 一言で言うと「web3版音楽配信プラットフォーム」
  • アーティストが自身でブロックチェーン上に音楽をアップロード・管理する

Audiusの3種類の利用者

Audiusの利用者は3種類に分類される

種類 説明
アーティスト 曲のアップロード/アルバムの作成/コンテンツの共有
ファン 曲を聴く/プライリストの作成/サブスクリプション/フォロー/再共有
サービス提供者 サーバーの提供/曲の配信/ネットワークの援助

サービス提供者

サービス提供者は「Discovery node」や「Content node」を提供する

Discovery node

  • ソースコード
  • 「Discovery node」はユーザーや曲、アルバム、プレイリストなどの情報をindexして保存しておくノードである
  • インデックスしたデータは「PostgreSQL」に保存
  • サーバーにはPythonの「Flask」を使用
  • 定期実行jobはPythonの「Celery」によって管理
  • キャッシュなどの一時的なデータ保存に「Redis」を使用
  • 検索エンジンに「Elastic Search」を使用

Content node

  • ソースコード
  • 「Content node」は曲や画像、メタデータを管理するサーバーである
  • データは「Postgres DB」に保存
  • サーバーにはnodejsの「Express」を使用
  • キャッシュなどの一時的なデータ保存に「Redis」を使用

Celery & Redis

Celery

  • 公式ページ
  • Celeryはタスクジョブを管理するためのパッケージで、同期・非同期的に動作可能
  • 定期的に同期する機能を呼び出すなどで使用する

Redis

  • 公式ページ
  • 「REmote DIctionary Server」の略
  • Redisはインメモリデータベースで、非常に高速に応答できる
  • 明示的に保存しない限りデータが永続化されず、停止と共にデータが消去される
  • データをキー&バリュー形式で保存する

簡単にCeleryとRedisを利用してみる。

Redisを使ってみる

以下のdocker-compose.yamlを用意する

redis起動用のdocker-compose.yaml
1
2
3
4
5
6
7
# redis起動用のdocker-compose.yaml
version: '3.8'
services:
  redis:
    image: "redis:latest"
    ports:
      - "6379:6379"

以下のコマンドでRedisのコンテナを起動する

Redis(docker-compose)の起動コマンド
1
2
# Redis(docker-compose)の起動コマンド
docker-compose up -d

以下のコマンドで Python用Redisパッケージをインストールする

Python用Redisパッケージのインストールコマンド
1
2
# Python用Redisパッケージのインストールコマンド
pip install redis

以下のpythonを作成してRedisの通信と動作を確認

redisとの通信を行う簡単なプログラムの作成
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# redisとの通信を行う簡単なプログラムの作成

import redis

# コンテナのredisと接続
r = redis.Redis(host='localhost', port=6379, db=0)

# keyに対するvalueを記録
r.set('key', 'value')

# keyを使ってvalueを取得 -> b'value' が得られる
value = r.get('key')
print(value)

# データを削除する
r.delete('key')

# 削除したkeyを使って値を取得 -> None が得られる
value = r.get('key')
print(value)

celeryを使ってみる

以下のコマンドでceleryをインストール(参照

インストールコマンド
1
2
# インストールコマンド
pip install -U Celery

検証用のコードを作成する。以下、作成したコードの構成 docker-compose.yamlは先ほど作成したredisのコンテナ

ファイル構成
1
2
3
4
5
6
# ファイル構成
.
├── docker-compose.yaml
├── prog.py
├── server.py
└── tasks.py

celerynのサーバー情報をserver.pyに記載する redisとの接続情報も記録されている

server.py
1
2
3
4
5
6
7
8
# server.py
from celery import Celery

app = Celery(
  '__init__', 
  broker='redis://localhost:6379',
  backend='redis://localhost:6379'
)

バックグラウンドで実行したいtaskをtasks.pyに記載する 単純に5秒後に足し算の結果を返すだけ

tasks.py
1
2
3
4
5
6
7
8
# tasks.py
import time
from server import app

@app.task
def add(x, y):
  time.sleep(5)
  return x + y

非同期的に実行して、10秒間1秒ごとにjobIdと状態を確認するコードをprog.pyに記載する。

prog.py
1
2
3
4
5
6
7
8
9
# prog.py
from tasks import add
import time

res = add.delay(2,2)

for i in range(10):
  print(res.id, res.state)
  time.sleep(1)

redisが起動している状態で、celeryのworkerを起動する tasksはファイル(tasks.py)

celeryのworkerを起動
1
2
# celeryのworkerを起動
celery -A tasks worker -l INFO

prog.pyを実行すると、以下の結果が得られた 5秒間pendingが続き、その後successが得られている 非同期動作が確認できた

非同期job結果
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 非同期job結果
304f5342-158d-4651-95b2-5212524f6d97 PENDING
304f5342-158d-4651-95b2-5212524f6d97 PENDING
304f5342-158d-4651-95b2-5212524f6d97 PENDING
304f5342-158d-4651-95b2-5212524f6d97 PENDING
304f5342-158d-4651-95b2-5212524f6d97 PENDING
304f5342-158d-4651-95b2-5212524f6d97 SUCCESS
304f5342-158d-4651-95b2-5212524f6d97 SUCCESS
304f5342-158d-4651-95b2-5212524f6d97 SUCCESS
304f5342-158d-4651-95b2-5212524f6d97 SUCCESS
304f5342-158d-4651-95b2-5212524f6d97 SUCCESS

今度は10並列でjobを実行してみた

10並列jobコード
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 10並列jobコード
from tasks import add
import time

res = [
  add.delay(2,2)
  for _ in range(10)
]

for i in range(10):
  print("".join([item.state[0] for item in res]))
  time.sleep(1)

10並列の結果は以下の通り 同時に8つ並列実行できていることを確認できた

10並列job結果
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 10並列job結果
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
SSSSSSSSPP
SSSSSSSSPP
SSSSSSSSPP
SSSSSSSSPP
SSSSSSSSPP

Mirror

参照ページ

  • 公式ページ
  • 公式開発者ページ

  • 記事を書いて個人が収益を得られるweb3版ブログプラットフォーム

  • クリエイターが記事を公開する際にチェックボックスにチェックを入れるだけで、簡単に自分の記事をNFT化することができる
  • NFTの供給量と価格はクリエイターが自由に設定可能
  • NFTを使ったクラウドファンディングの仕組みが導入されている
  • 暗号資産ETFにより資金を調達する。支援者への返礼としては、独自のERC20トークンを発行して渡す

Mastodon

  • 短文投稿型SNS
  • 管理者も設置場所も異なる多数のサーバーで運用されている
  • ユーザーは自分で所属サーバーを選び(新たに自分でサーバーを設置することも可能)ネットワークに参加する