検証可能性は Bluesky / AT Protocol の重要なコンセプトです。
投稿の検証
com.atproto.repo.getRecord で取得した投稿データの CID がレコードと一致するか検証できます。
$block = [
'uri' => 'at://did:plc:***/app.bsky.feed.post/***',
'cid' => 'bafyreih5y47li4zuvvzevmq4xl7woqxchfc2pnfclv3kfz3zefb2qd3bzm',
'value' => [
'text' => 'Hello, Bluesky!',
'$type' => 'app.bsky.feed.post',
'createdAt' => '2025-01-01T00:00:00.000Z',
],
];
use Revolution\Bluesky\Core\CBOR;
use Revolution\Bluesky\Core\CID;
$cid = data_get($block, 'cid');
$record = data_get($block, 'value');
// DAG-CBOR にエンコード
$cbor = CBOR::encode($record);
$bool = CID::verify($cbor, $cid);
サンプル実装: DownloadRecordCommand
画像ファイルの検証
画像を含む投稿では、$link が画像の CID になります。
$block = [
'uri' => 'at://did:plc:***/app.bsky.feed.post/***',
'cid' => 'b+++',
'value' => [
'text' => '画像付き投稿',
'$type' => 'app.bsky.feed.post',
'embed' => [
'$type' => 'app.bsky.embed.images',
'images' => [
[
'alt' => '',
'image' => [
'ref' => [
'$link' => 'b***image'
],
'size' => 100000,
'$type' => 'blob',
'mimeType' => 'image/jpeg'
],
'aspectRatio' => [
'width' => 1000,
'height' => 1000
]
]
]
],
'createdAt' => '2025-01-01T00:00:00.000Z'
]
];
com.atproto.sync.getBlob でダウンロードした画像の生データを検証します。
use Revolution\Bluesky\Core\CID;
// 画像の CID は $link から取得
$cid = data_get($block, 'value.embed.images.0.image.ref.$link');
$file = file_get_contents('path/to/b***image.jpg');
$bool = CID::verify($file, $cid, codec: CID::RAW);
サンプル実装: DownloadBlobsCommand
CAR ファイルの検証
CAR ファイルにはユーザーのすべてのレコードが含まれます。
com.atproto.sync.getRepo でダウンロードした CAR ファイルが対象ユーザーのものかどうか検証できます。
use Revolution\Bluesky\Core\CAR;
use Revolution\Bluesky\Crypto\DidKey;
use Revolution\Bluesky\Facades\Bluesky;
use Revolution\Bluesky\Support\DidDocument;
$did = 'did:plc:***';
// 検証には didDoc の公開鍵が必要
$didDoc = DidDocument::make(Bluesky::identity()->resolveDID($did)->json());
$didKey = DidKey::parse($didDoc->publicKey());
$car = 'CAR ファイルの生データまたはファイルへのストリーム';
$signed = CAR::signedCommit($car);
$bool = CAR::verifySignedCommit($signed, $didKey);
サンプル実装: DownloadRepoCommand
CAR ファイルの展開後の検証
CAR ファイルを展開して取得したレコードの検証は、最初の投稿の例と同じ方法で行います。
サンプル実装: UnpackRepoCommand
Last modified on April 24, 2026