Giter Club home page Giter Club logo

rss3-protocol's Introduction

RSS3

RSS3

RSS3 is a next-generation feed standard that aims to support efficient and decentralized information distribution.

Version RSS3

We've seen the Web1 era when everyone was happy to use RSS as a standard format for syndication and the Web2 era when RSS declined and the closure of information between platforms are created.

We all agree that information should be more freely distributed in the Web3 era, and to facilitate this we need a common format that we can all use to syndicate information, reducing the cost of use and development.

Latest draft

๐ŸŽ‡ RSS3 Protocol v0.4.0 is in hot discussion

Current version: v0.3.1

RSS3 exists in the form of files on the user side. There are two types of RSS3 files - RSS3Index and RSS3List, and each persona-generated file is signed by the persona.

The index file is the entry file named after persona's ethereum address that defines:

  • items: The activities of a persona which will be constructed into a feed. Custom items are the content posted by the persona natively on RSS3, while auto items are activities from different networks (e.g. transferring an NFT)
  • profile: The persona's name, avatar, bio and verified accounts
  • assets: Assets are the digital assets owned by the persona collected by nodes, such as NFTs. Self-declared custom assets are supported.
  • links: Links are relationships toward other objects
Quick Look Interfaces in TypeScript
// File ids
type RSS3ID = string; // Same as ethereum address
type RSS3CustomItemsListID = string; // `${RSS3ID}-list-items.custom-${index}`
type RSS3AutoItemsListID = string; // `${RSS3ID}-list-items.auto-0`
type RSS3CustomAssetsListID = string; // `${RSS3ID}-list-assets.custom-${index}`
type RSS3AutoAssetsListID = string; // `${RSS3ID}-list-assets.auto-0`
type RSS3LinksListID = string; // `${RSS3ID}-list-links.${links.id}-${index}`
type RSS3BacklinksListID = string; // `${RSS3ID}-list-backlinks.${backlinks.id}-0`
type RSS3ItemBacklinksListID = string; // `${RSS3ID}-list-item.${item.index}.backlinks.${backlinks.id}-0`

type ThirdPartyAddress = string[]; // A series of url or ipfs hash that link to an identical file

type AccountID = string; // ${platform}-${identity}, for example, EVM+-0x1234567890123456789012345678901234567890 or Twitter-rss3_
type RSS3CustomItemID = string; // `${RSS3ID}-item-custom-${index}`
type RSS3AutoItemID = string; // `${RSS3ID}-item-auto-${index}`

type RSS3List =  RSS3CustomItemsList | RSS3AutoItemsList | RSS3CustomAssetsList | RSS3AutoAssetsList | RSS3LinksList | RSS3BacklinksList | RSS3ItemBacklinksList;
type RSS3ListID = RSS3CustomItemsListID | RSS3AutoItemsListID | RSS3CustomAssetsListID | RSS3AutoAssetsListID | RSS3LinksListID | RSS3BacklinksListID | RSS3ItemBacklinksListID;
type RSS3FileID = RSS3ID | RSS3ListID;
type RSS3File = RSS3Index | RSS3List;

// Common attributes for each files
interface RSS3Base {
    version: 'rss3.io/version/v0.3.1'; // Proposal version for current file. It should be like `rss3.io/version/v1.0.0`
    id: RSS3FileID;
    date_created: string; // Specifies the created date in RFC 3339 format
    date_updated: string; // Specifies the updated date in RFC 3339 format
}

interface RSS3SignedBase extends RSS3Base {
    signature: string; // Signed by persona's private key; The signature content is the Keccak-256 hash of the array of object sorted by alphabetical and excluding objects containing `auto: true` field and the `signature` field itself(for example {a: "1", c: "2", b: {d: "3"}, e: {auto: true}} -> [["a", "1"], ["b", ["d", "3"]], ["c", "2"]]) or the string `Hi, RSS3. I'm your agent ${agent_id}` if using agent signature; Used for the object integration verification for both server side and persona side
    agent_id?: string; // A random ed25519 public key generated by the client
    agent_signature?: string; // A signature signed by `agent_id`'s private key, its content is the same as `signature`
}

interface RSS3UnsignedBase extends RSS3Base {
    auto: true;
}

// RSS3 index file, main entrance for a persona
interface RSS3Index extends RSS3SignedBase {
    id: RSS3ID;
    controller?: string; // A contract address indicating ownership of the file

    profile?: {
        name?: string;
        avatar?: ThirdPartyAddress;
        bio?: string;
        accounts?: {
            tags?: string[];
            id: AccountID;
            signature?: string; // Signature of [["address", id], ["id", account.id], ["tags", account.tags]], optional for no public-key cryptography platform
        }[];
    };

    links?: {
        tags?: string[];
        id: string; // Link id, for example: following superfollowing
        list?: RSS3LinksListID; // Personas who belong to this link
    }[];

    backlinks?: {
        // Backlinks for this persona, for example: following link's backlink means followers.
        auto: true;
        id: string; // The same as links.id
        list: RSS3BacklinksListID; // File ID of backlink list that belong to this link. See **RSS3List** for more details
    }[];

    items?: {
        list_custom?: RSS3CustomItemsListID; // Items automatically indexed by nodes
        list_auto?: RSS3AutoItemsListID; // Items posted by personas themselves
    };

    assets?: {
        list_custom?: RSS3CustomAssetsListID; // Assets automatically indexed by nodes
        list_auto?: RSS3AutoAssetsListID; // Assets posted by personas themselves
    };
}

type RSS3Profile = Required<RSS3Index>['profile'];
type RSS3Account = Required<RSS3Profile>['accounts'][number];
type RSS3Links = Required<RSS3Index>['links'];

// RSS3 list files, used for list of links, backlinks, items, assets, itemsbacklinks
interface RSS3ListBase<IDType, ElementType> {
    id: IDType;
    list?: ElementType[];
    list_next?: IDType;
}

type RSS3CustomItemsList = RSS3SignedBase & RSS3ListBase<RSS3CustomItemsListID, RSS3CustomItem>;
type RSS3AutoItemsList = RSS3UnsignedBase & RSS3ListBase<RSS3AutoItemsListID, RSS3AutoItem>;
type RSS3CustomAssetsList = RSS3SignedBase & RSS3ListBase<RSS3CustomAssetsListID, RSS3CustomAsset>;
type RSS3AutoAssetsList = RSS3UnsignedBase & RSS3ListBase<RSS3AutoAssetsListID, RSS3AutoAsset>;
type RSS3LinksList = RSS3SignedBase & RSS3ListBase<RSS3LinksListID, RSS3ID>;
type RSS3BacklinksList = RSS3UnsignedBase & RSS3ListBase<RSS3BacklinksListID, RSS3ID>;
type RSS3ItemBacklinksList = RSS3UnsignedBase & RSS3ListBase<RSS3ItemBacklinksListID, RSS3CustomItemID>;

// Asset
type RSS3Asset = RSS3CustomAsset | RSS3AutoAsset;
type RSS3CustomAsset = string; // A type of asset posted by persona itself, custom-${identity}-${type}-${uniqueID}, for example, persona's cute(q) Garage Kit(gk) (uniqueID 10035911): custom-gk-q-10035911
type RSS3AutoAsset = string; // A type of asset that is automatically generated by a node, ${platform}-${identity}-${type}-${uniqueID}, for example, a NFT(uniqueID 0x456.5) in the Ethereum chain owned by apersona's EVM+ account(0x123): EVM+-0x123-Ethereum.NFT-0x456.5

// Item
type RSS3Item = RSS3CustomItem | RSS3AutoItem;

interface RSS3ItemBase {
    date_created: string; // Specifies the published date in RFC 3339 format
    date_updated: string; // Specifies the modified date in RFC 3339 format

    title?: string;
    summary?: string;

    backlinks?: {
        // Interactive items from other personas.
        auto: true;
        id: string;
        list: RSS3ItemBacklinksListID; // File ID of items list that belong to this context. See **RSS3List** for more details
    }[];
}

interface RSS3CustomItem extends RSS3ItemBase {
    // A type of content posted by persona itself
    id: RSS3CustomItemID; // `${RSS3ID}-item-custom-${index}`
    tags?: string[];
    authors?: RSS3ID[];

    link?: {
        id: string; // Link id for the non-original item, for example: comment like
        target: RSS3CustomItemID | RSS3AutoItemID; // Target of the non-original item
    };

    contents?: {
        // Contents of current item, possibly multiple different types of content
        tags?: string[];
        address: ThirdPartyAddress;
        mime_type: string; // [MIME type](https://en.wikipedia.org/wiki/Media_type) of current content
        name?: string;
        size_in_bytes?: string;
        duration_in_seconds?: string;
    }[];
}

interface RSS3AutoItem extends RSS3ItemBase {
    // A type of content that is automatically generated by a node to represent a change of an asset
    id: RSS3AutoItemID; // `${RSS3ID}-item-auto-${index}`

    target: {
        field: string; // 'items-auto-${AccountID}', `assets-${RSS3Asset}` 'links-following', 'profile-avatar', `profile-accounts-${RSS3Account.id}`, etc
        action: {
            type: 'add' | 'remove' | 'update';
            payload?: string; // If the type is `add` or `remove`, then it is the added or removed content, empty means the content is itself, if the type is `update`, then it is the content after updating
            proof?: string; // Additional information used to make this target unique
        };
    };
}

๐ŸŽ‰ View full details

Historical drafts

Changelog

Contributing

RSS3 is a community-based project, built with an open ecosystem and creative developers, and we thank every one for the participation.

Contact

Twitter Follow Discord

[email protected]

rss3-protocol's People

Contributors

diygod avatar usagiryu avatar chungzh avatar joshuattl avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.