SkillAgentSearch skills...

Onpostt

Our protocol is a decentralized and innovative solution for publishing and sharing blocks between servers and relays, focused on social network applications, chats, and front-end websites. Inspired by concepts like Nostr, this protocol was specifically developed for social networks,

Install / Use

/learn @sempicanha/Onpostt
About this skill

Quality Score

0/100

Supported Platforms

Zed

README

Documentação do onpostt

📌 Protocolo Descentralizado por Relays/Servers Blocos sobre Blocos

Sobre o Protocolo

Nosso protocolo é uma solução descentralizada e inovadora para publicação e compartilhamento de blocos entre servers e relays, com foco em aplicações de rede social, chats, e websites no front-end.

Inspirado em conceitos como o Nostr, este protocolo foi desenvolvido especificamente para redes sociais, utilizando uma arquitetura baseada em transmissão via relays/servers e uma estrutura leve de blockchain básica.

Todos os dados são armazenados em blocos descentralizados, assinados digitalmente e, quando necessário, criptografados com a chave privada do usuário, garantindo autenticidade, privacidade e segurança.


🔹 Características Principais

Execução em Node.js
Uso de estrutura de Bancos de Dados como Postgree
Cada bloco é armazenado em como uma estrutura padrao individual, contendo um ID e uma chave pública (pubkey) e a Assinatura do bloco ✅ Consultas organizadas com querys, filtros e parâmetros personalizados
Altamente escalável
Baseado em WebSocket e comunicação P2P


🔒 Segurança e Privacidade

🔹 Criptografia baseada em chaves privadas, garantindo total controle do usuário sobre seus dados
🔹 Descentralização → resistência à censura e eliminação de pontos únicos de falha
🔹 Assinaturas digitais garantem que cada bloco é autêntico e inviolável


📈 Escalabilidade e Flexibilidade

💡 Estrutura modular baseada em JSON permite fácil integração com outras tecnologias
💡 Crescimento escalável sem comprometer a eficiência
💡 Compatível com múltiplos relays WebSocket simultaneamente


🔗 Importação da Biblioteca onpostt.min.js

Para utilizar o protocolo, inclua a seguinte biblioteca no seu projeto:

<script src="onpostt.min.js"></script>

Introdução

onpostt é um objeto(lib) JavaScript que fornece funcionalidades para gerar chaves criptográficas, assinar blocos de dados e interagir com relays via WebSocket. Ele pode ser usado para criar posts, reações, seguir usuários, enviar mensagens e gerenciar perfis de forma segura.

Funcionalidades Principais

  • Gerar chaves criptográficas (privada e pública)
  • Assinar blocos de dados para garantir autenticidade
  • Verificar assinaturas de mensagens
  • Enviar blocos para relays conectados
  • Subscrever a Blocos de relays

2. Métodos

2.1 Geração de Chaves

  • generateKeys(): Retorna um par de chaves (privada e pública)
  • generateKeysCustom(input): Gera chaves a partir de uma string personalizada / use com cautela incluia dados unicos, como cidade, nome de animais favoritos, pessoas, data etc, evite nomes simplis, para evitar coliçoes na geração da chave cunstomizada
  • generatePublicKey(privateKey): Obtém a chave pública de uma chave privada

2.2 Assinatura e Verificação de Blocos

  • var BlockSigned = await onpostt.signBlock(block, privateKey): Assina um bloco e retorna a versão assinada
  • onpostt.sendBlock(BlockSigned, function(response){}): Verifica se a assinatura de um bloco é válida.

2.4 Conexão com Relays

  • connect(hosts): Estabelece conexão com uma lista de relays via WebSocket

2.5 Envio e Recebimento de Blocos

  • sendBlock(block, callbacks): Envia um bloco assinado para os relays conectados
  • sub(filters, callbacks): Subscreve-se a eventos conforme os filtros fornecidos

3. Criação de Blocos Específicos

  • createPost(content, privateKey, app): Cria um bloco de post
  • createReaction(emoji, ref, privateKey, app): Cria um bloco de reação
  • createFollow(followedPubkey, privateKey, app): Cria um bloco de follow
  • createMessage(message, recipientPubkey, privateKey, app): Cria um bloco de mensagem privada
  • createProfile(profileData, privateKey, app): Cria um bloco de perfil
  • createFollowing(privateKey, app): Cria um bloco de seguidores

Exemplo de Uso

📡 Rodando seu Próprio Relay Server

Você pode hospedar seu próprio relay server para se conectar ao protocolo e servir blocos de forma descentralizada. Essa é uma ótima opção para desenvolvedores que desejam ter controle sobre a infraestrutura, aplicar limites personalizados e manter seus próprios dados.

    git clone https://github.com/sempicanha/onpostt
    cd onpostt

🔧 Configuração do Servidor

Edite o arquivo `.env.example` com os parâmetros desejados e renomeie para `.env`.  
Esse arquivo define todas as configurações do servidor, como porta, limites de conexão e dados do banco.  
Personalize conforme a sua necessidade antes de iniciar o servidor.

🔧 DataBase Postgree Configurações

-- Importa o arquivo onpost.sql localizado em ./database/onpost.sql
-- O banco de dados já está totalmente configurado com índices e parâmetros otimizados,
-- garantindo desempenho e funcionamento ideais.

🚀 Iniciando o servidor

O servidor é iniciado com:

npm start

1. Conectar-se a um Relay

Caso o Relay não não tenha websocket ativado você pode comentar o socket se voce é um ADM do servidor configure o .env de acordo com suas exigencias:

const servers = {
  host: ["http://localhost:3000" ],
  socket: ["ws://localhost:3000" ]
};

2. Criar e Publicar um Bloco na rede.

        async function post() {
            var privateKey = '21e28dfffa49daf6373527c579ee16dea1afd7c8a2f95d9eb2e6aeb0a8d6d3d2';
            var pubkey = onpostt.generatePublicKey(privateKey);  
        
            var block = {
                pubkey: pubkey,
                mode: "post",
                query: [
                    ["username", "lanpião.dev"],
                    ["site", "google.com"]
                ],
                content: 'Rei do Cangaço',
                app: 'mariabonita.com.br'
            };
        
            var BlockSigned = await onpostt.signBlock(block, privateKey);
            console.log('Block Assinado:', BlockSigned);

            onpostt.sendBlock(BlockSigned, function(response) {
                console.log('Resposta do relay:', response);
            });
        }
        post()

3. Carregar Blocos

        onpostt.list({
            mode: 'post',
            query: [["username", "lanpião.dev"]],
            app: "mariabonita.com.br",
            limit: 10,
            offset: 0
        }, function(handleEvent) {
            console.log('Eventos de lanpião.dev:', handleEvent);
        });

Consultas avançadas usando os Parâmetros permitidos

Esta função busca blocos do tipo `post`, com suporte a filtros avançados via `query` e controle de paginação. os paramentros é valido para todos os modos, list, sub

##Parâmetros disponíveis


    onpostt.list({
        mode: 'post', // Tipos permitidos: post, profile, like, follow, message, comment, delete
    
        // query: [
            ["username", "lanpião.dev"], //opcional depende de como você deseja consultar seus blocos
            ["site", "mariabonita.com.br"], //opcional depende de como você deseja consultar seus blocos

           ], // Filtro por campos específicos via 'query'
    
        // offset: 5, // Define a partir de qual posição os blocos serão carregados (útil para paginação)
        // limit: 10, // Limita a quantidade de blocos retornados (máximo pode ser definido pelo servidor)
    
        // since: 1752240053, // Retorna blocos com timestamp >= (created_at)
        // until: 1752240053, // Retorna blocos com timestamp <= (created_at)
    
        // app: "mariabonita.com.br", // Filtra blocos criados por um app específico
    }, function(handleEvent) {
        console.log('Todos Posts pela data:', handleEvent);
    });

🔹 Exemplos de Saída do Sistema

📌 Exemplo de Saída de um Bloco Assinado (signBlock)

        {
          "pubkey": "03dca175856ff79a1eb5d3b368b6840af29c38c36bf3291d07573ddcdf59110523",
          "created_at": 1700000000,
          "mode": "post",
          "query": [
            ["username", "lanpião.dev"],
            ["site", "google.com"]
          ],
          "content": "Rei do Cangaço",
          "app": "mariabonita.com.br",
          "id": "91707575e4b2b325a67b03a57a8bf1218c7b7ac7399ac5705af5c21dca8de18a",
          "sig": "3045022100f0c64e3f9c07b9b1e832ecc06dfd041e0..."
        }

Publicar ou Atualizar um Bloco do Tipo Perfil

Ao publicar um bloco com `block.mode = 'profile'`, o novo bloco **não edita nem apaga** o anterior diretamente.  
Em vez disso, ele **substitui** o bloco anterior na rede. Apenas o bloco mais recente é considerado válido,  
enquanto os anteriores são automaticamente ignorados.
    async function postProfile() {
        var privateKey = '21e28dfffa49daf6373527c579ee16dea1afd7c8a2f95d9eb2e6aeb0a8d6d3d2';
        var pubkey = onpostt.generatePublicKey(privateKey);  
    
        var block = {
            pubkey: pubkey,  // Chave pública do usuário
            mode: "profile", // Tipo de evento (1 = Post)
            content: {
                name: 'Jackson Santos devs s',
                picture: 'https://i.etsystatic.com/39063034/r/il/89f3fe/5287734117/il_570xN.5287734117_5dus.jpg',
                about: 'Sou Dev JS'
            }, // Conteúdo da postagem
            query:[],
            app: 'mariabonita.com.br' // Nome do aplicativo que está publicando
        };
    
        var BlockSigned = await onpostt.signBlock(block, privateKey);
        console.log('Block Assinado:', BlockSigned);

        onpostt.sendBlock(BlockSigned, function(response) {
            console.log('Resposta do relay:', response);
        });
    }
    postProfile()

Buscar um Perfil na Rede

Neste exemplo, a busca do perfil foi feita diretamente pela `pubkey`, sem o uso de `query`.  
Apenas a chave pública do perfil foi utilizada para obter as inf
View on GitHub
GitHub Stars9
CategoryProduct
Updated6mo ago
Forks2

Languages

JavaScript

Security Score

82/100

Audited on Sep 14, 2025

No findings