Notarize AT Protocol records on Ethereum using EAS (experiment)
1# AT Protocol Notary (atnotary) 2 3Create permanent, verifiable attestations of [AT Protocol](https://atproto.com/) records using [Ethereum Attestation Service](https://attest.org/) (EAS). 4 5## Why 6 7- **Standardized attestations** - interoperable format used across ecosystem 8- **On-chain verification** - stored on Ethereum/Base, immutable and public 9- **Composable** - other projects can reference and build on attestations 10- **Infrastructure** - explorers, indexers, and tooling already exist 11- **Multi-chain** - works on Ethereum, Base, Optimism, Arbitrum 12 13## What Gets Attested 14 15- `recordURI` - Full AT Protocol URI 16- `cid` - AT Protocol's content identifier 17- `contentHash` - DAG-CBOR hash 18- `pds` - Personal Data Server URL 19- `timestamp` - When attested 20 21## Install 22 23```bash 24npm install -g atnotary 25``` 26 27## Setup 28 291. **Create config file:** 30 31```bash 32atnotary config 33``` 34 352. **Edit `.atnotary.yaml`:** 36 37```yaml 38privateKey: "0x..." # private key for writing 39network: base-sepolia # default network 40``` 41 423. **Get testnet ETH:** 43 - Sepolia: https://sepoliafaucet.com/ 44 - Base Sepolia: https://bridge.base.org/ 45 46**That's it!** Default schemas are provided for all networks. 47 48### Custom Schema (Optional) 49 50If you want to deploy your own schema: 51 52```bash 53atnotary init --network sepolia 54``` 55 56Then add the `schemaUID` to your `.atnotary.yaml` file. 57 58## Usage 59 60```bash 61# notarize 62atnotary notarize "at://did:plc:xxx/app.bsky.feed.post/abc" 63 64# verify 65atnotary verify "0xabc..." --network sepolia 66 67# compare with current state 68atnotary verify "0xabc..." --compare 69``` 70 71## Library Usage 72 73```typescript 74import { ATProtocolNotary } from 'atnotary'; 75 76const notary = new ATProtocolNotary({ 77 privateKey: "0x...", // optional, just for writing 78}, 'sepolia'); 79 80const result = await notary.notarizeRecord('at://...'); 81const attestation = await notary.verifyAttestation('0x...'); 82const comparison = await notary.compareWithCurrent(attestation); 83``` 84 85## Networks 86 87- Ethereum Sepolia (testnet) 88- Base Sepolia (testnet) 89- Base (mainnet) 90 91## Use Cases 92 93- Political accountability 94- Journalism evidence 95- Open source governance 96- Content authorship proof 97- Legal documentation 98 99## License 100 101MIT