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/OnposttREADME
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 cunstomizadageneratePublicKey(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 assinadaonpostt.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 conectadossub(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 postcreateReaction(emoji, ref, privateKey, app): Cria um bloco de reaçãocreateFollow(followedPubkey, privateKey, app): Cria um bloco de followcreateMessage(message, recipientPubkey, privateKey, app): Cria um bloco de mensagem privadacreateProfile(profileData, privateKey, app): Cria um bloco de perfilcreateFollowing(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
