{"id":13448892,"url":"https://github.com/aergoio/aergolite","last_synced_at":"2025-04-19T14:13:10.390Z","repository":{"id":53874947,"uuid":"182079286","full_name":"aergoio/aergolite","owner":"aergoio","description":"AergoLite: Trustless SQLite Replication","archived":false,"fork":false,"pushed_at":"2022-02-17T04:05:01.000Z","size":27350,"stargazers_count":113,"open_issues_count":1,"forks_count":16,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-04-16T08:10:29.095Z","etag":null,"topics":["blockchain","database","distributed","immutable","relational","replication","sqlite3","trustless"],"latest_commit_sha":null,"homepage":"https://aergolite.aergo.io","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aergoio.png","metadata":{"files":{"readme":"README-pt.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-04-18T11:58:38.000Z","updated_at":"2025-04-03T10:49:13.000Z","dependencies_parsed_at":"2022-08-13T03:10:53.879Z","dependency_job_id":null,"html_url":"https://github.com/aergoio/aergolite","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aergoio%2Faergolite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aergoio%2Faergolite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aergoio%2Faergolite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aergoio%2Faergolite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aergoio","download_url":"https://codeload.github.com/aergoio/aergolite/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249709548,"owners_count":21313949,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blockchain","database","distributed","immutable","relational","replication","sqlite3","trustless"],"created_at":"2024-07-31T06:00:23.842Z","updated_at":"2025-04-19T14:13:10.369Z","avatar_url":"https://github.com/aergoio.png","language":"C","funding_links":[],"categories":["Relational Databases","backup and replicate"],"sub_categories":["Blockchain"],"readme":"\u003cp align=\"right\"\u003e\u003ca href=\"README.md\"\u003eEnglish\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ca href=\"README-zh.md\"\u003e中文\u003c/a\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cimg width=\"65%\" src=\"https://user-images.githubusercontent.com/7624275/92685476-2390b800-f30e-11ea-9edc-980b0e66c0ad.png\" alt=\"AergoLite\"\u003e\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eSQLite com Blockchain\u003c/h1\u003e\n\n\u003cblockquote align=\"center\"\u003e\u003cp\u003e\u003cem\u003eA maneira mais fácil de implantar um blockchain para armazenamento de dados relacionais em seu aplicativo ou dispositivo\u003c/em\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\nO AergoLite nos permite ter um banco de dados SQLite replicado protegido por um blockchain privado e leve.\n\nCada aplicativo possui uma réplica local do banco de dados.\n\nNovas transações do banco de dados são distribuídas para todos os pares e uma vez que eles alcançam um consenso sobre a ordem de execução, todos os nós executam as transações. Como a ordem de execução dessas transações é a mesma, todos os nós têm o mesmo conteúdo do banco de dados resultante.\n\nOs aplicativos também podem gravar no banco de dados local quando estão off-line. As transações do banco de dados são armazenadas em uma fila local e enviadas para a rede assim que a conectividade for restabelecida. O aplicativo fará a leitura do novo estado do banco de dados após as modificações off-line, podendo verificar se as transações off-line foram processadas pelo consenso global. Se rejeitado, o banco de dados retornará ao estado anterior.\n\nAergoLite usa **tecnologia blockchain especial** focada em **dispositivos com recursos limitados**.\n\nO protocolo de consenso usa uma **função aleatória verificável (VRF)** para determinar qual nó produzirá o próximo bloco, e os nós não podem descobrir qual nó foi selecionado com antecedência. Tornando-o seguro contra ataques de negação de serviço (DoS).\n\nAergoLite usa **finalidade absoluta**. Uma vez que os nós chegam a um consenso sobre um novo bloco e as transações são confirmadas, não há caminho de volta. Também não há necessidade de criar novos blocos se não houver transações a serem processadas (ao contrário da finalidade probabilística).\n\nApenas o último bloco é necessário para verificar o blockchain e a integridade do estado do banco de dados, portanto, os nós não precisam manter e verificar todo o histórico de blocos e transações.\nTambém é possível configurar alguns nós para manter todo o histórico por motivos de auditoria.\n\nEle também usa um **hash do estado do banco de dados**. Isso permite que os nós verifiquem se eles têm exatamente o mesmo conteúdo no banco de dados, protege contra modificações intencionais no arquivo do banco de dados e também funciona como uma verificação de integridade para detectar falhas na mídia de armazenamento.\n\nEste hash final é atualizado usando apenas as páginas modificadas em cada novo bloco. Não é necessário carregar todo o banco de dados para calcular o novo estado. A verificação de integridade também só é feita quando uma nova página do banco de dados é carregada. Isso aumenta drasticamente o desempenho do banco de dados.\n\nA solução resultante não requer grande armazenamento em disco, usa pouco tempo de processador e pouca memória.\n\nO tráfego de rede também é leve para reduzir o consumo de energia. Novos pacotes são transferidos apenas quando há novas transações de banco de dados.\n\nEssa tecnologia nos permite ter um blockchain privado em IoT e dispositivos móveis.\n\nO AergoLite também é fácil de usar. Você não precisa saber como funciona um blockchain para usá-lo.\n\nSistemas Operacionais suportados:\n\n* Mac\n* Linux\n* Windows\n* Android\n* iOS\n* OpenWrt\n\nLinguagens de programação suportadas:\n\n* C\n* C++\n* Java\n* Javascript (Node.js)\n* Python\n* .Net (C# e VB)\n* Ruby\n* Swift\n* Lua\n* Go\n\nE provavelmente qualquer outra linguagem que tenha suporte para SQLite.\n\nA maioria dessas linguagens é suportada por meio de wrappers existentes.\n\n\n## Binários pré-compilados\n\nVerifique em [releases](https://github.com/aergoio/aergolite/releases)\n\n\n## Imagens Docker\n\n* [Base](https://hub.docker.com/r/aergo/aergolite) (com bibliotecas e o shell SQLite, também pode ser usado para adicionar aplicativos C / C++)\n* [Python](https://hub.docker.com/r/aergo/aergolite-python)\n* [Node.js](https://hub.docker.com/r/aergo/aergolite-nodejs)\n\nPara construir as imagens localmente:\n\n```\nmake docker\n```\n\n\n## Compilando e instalando\n\n### No Linux e Mac\n\nPrimeiro instale as ferramentas necessárias com este comando:\n\n**Ubuntu e Debian**\n\n```\nsudo apt-get install git gcc make automake libtool libreadline-dev\n```\n\n**CentOS**\n\n```\nsudo yum install git gcc make automake libtool readline-devel\n```\n\n**Alpine**\n\n```\nsudo apk add git gcc make automake libtool readline-dev\n```\n\n**Mac**\n\n```\nbrew install automake libtool readline\n```\n\n\nEm seguida, copie e cole em um terminal:\n\n```\n# Instalar libuv\n\ngit clone --depth=1 https://github.com/libuv/libuv\ncd libuv\n./autogen.sh\n./configure\nmake\nsudo make install\nsudo ldconfig\ncd ..\n\n# Instalar binn\n\ngit clone --depth=1 https://github.com/liteserver/binn\ncd binn\nmake\nsudo make install\ncd ..\n\n# Instalar libsecp256k1-vrf\n\ngit clone --depth=1 https://github.com/aergoio/secp256k1-vrf\ncd secp256k1-vrf\n./autogen.sh\n./configure --disable-benchmark\nmake\nsudo make install\ncd ..\n\n# Instalar AergoLite\n\ngit clone --depth=1 https://github.com/aergoio/aergolite\ncd aergolite\nmake\nsudo make install\ncd -\n```\n\n### No Windows usando MinGW\n\nCopie e cole em um terminal MSYS2 MinGW:\n\n```\n# Compilar libuv\n\ngit clone --depth=1 https://github.com/libuv/libuv\ncd libuv\n./autogen.sh\n./configure\nmake\nmake install\ncd ..\n\n# Compilar binn\n\ngit clone --depth=1 https://github.com/liteserver/binn\ncd binn\nmake\nmake install\ncd ..\n\n# Compilar libsecp256k1-vrf\n\ngit clone --depth=1 https://github.com/aergoio/secp256k1-vrf\ncd secp256k1-vrf\n./autogen.sh\n./configure --with-bignum=no --disable-benchmark\nmake\nmake install\ncd ..\n\n# Compilar AergoLite\n\ngit clone --depth=1 https://github.com/aergoio/aergolite\ncd aergolite\nmake\nmake install\n```\n\n### Para Android\n\nUse o [SQLite Android Bindings](https://github.com/aergoio/aergolite-tools/tree/master/wrappers/SQLite_Android_Bindings)\npara gerar um arquivo `aar` e incluí-lo no projeto Android Studio.\nUm exemplo de projeto está disponível [aqui](https://github.com/aergoio/aergolite-tools/tree/master/projects/AndroidStudio-NativeInterface)\n\n\n### Para iOS\n\nGere bibliotecas estáticas e dinâmicas com o comando:\n\n```\n./makeios\n```\n\nEles podem ser incluídos como um módulo em projetos iOS.\nVocê também pode copiá-los para a subpasta `AergoLite` do\nWrapper [AergoLite.swift](https://github.com/aergoio/AergoLite.swift)\n\n\n## Testes automatizados\n\nEsses testes simulam até 100 nós em seu computador.\n\nAntes de executar os testes, você precisará aumentar o limite de arquivos abertos em seu terminal:\n\n```\nulimit -Sn 16000\n```\n\nEntão você pode executar os testes automatizados com:\n\n```\nmake test\n```\n\nPara imprimir mensagens de depuração em um arquivo de log, você deve recompilar a biblioteca no modo de depuração antes de executar os testes:\n\n```\nmake clean\nmake debug\n```\n\nA execução de testes com Valgrind também está disponível:\n\n```\nmake valgrind\n```\n\n\n## Usando\n\nA biblioteca compilada tem suporte para arquivos de banco de dados SQLite nativos e para bancos de dados SQLite com suporte a blockchain, de modo que o aplicativo pode abrir bancos de dados SQLite nativos e aqueles com blockchain ao mesmo tempo.\n\nA biblioteca funciona exatamente da mesma maneira para um banco de dados SQLite normal.\n\nPara abrir um banco de dados com suporte a blockchain, usamos um parâmetro URI: `blockchain`\n\nExemplo:\n\n```\n\"file:test.db?blockchain=on\"\n```\n\n\n## Administrador do Blockchain\n\nAergoLite implementa um blockchain privado. Isso significa que você ou sua organização podem ter\nseu(s) próprio(s) blockchain(s) privado(s) nos quais você tem controle do que pode acontecer.\n\nA entidade que tem controle sobre o blockchain é chamada de administrador do blockchain. Isto\né um usuário que possui seu próprio par de chaves pública e privada.\n\nO administrador do blockchain pode:\n\n* Adicionar nós à rede blockchain\n* Executar comandos SQL reservados\n\nEm versões futuras, também será capaz de:\n\n* Remover nós da rede blockchain\n* Adicionar usuários à rede\n* Criar contratos inteligentes para permitir que os nós executem comandos SQL bloqueados\n\nVocê precisará informar a chave pública do administrador do blockchain em cada nó participante.\n\nIsso garante que:\n\n1. Os nós podem verificar se os comandos recebidos vêm do administrador do blockchain\n2. Um nó não se conectará a uma rede que não seja sua\n\nIsso é feito através do parâmetro `admin`, onde a chave pública pode estar no formato nativo ou hexadecimal.\n\nExemplo:\n\n```\n\"file:test.db?blockchain=on\u0026admin=95F9AB75CA1...\"\n```\n\n\n## Imutabilidade\n\nSoluções baseadas em confiança permitem que usuários ou nós específicos executem qualquer comando SQL no banco de dados.\nEles não são seguros porque um invasor adquirindo o controle de um único nó pode excluir e/ou\nsobrescrever dados em toda a rede.\n\nUm blockchain real sem confiança em um nó específico e imutável deve controlar o que os nós podem fazer.\n\nO AergoLite, por padrão, permite que os nós apenas adicionem dados no banco de dados. Eles não podem atualizer ou apagar dados. Eles só podem executar comandos SQL do tipo `INSERT`.\nApenas o administrador pode executar todos os comandos SQL.\n\nVersões futuras podem permitir que os nós executem contratos inteligentes criados pelo administrador que podem incluir qualquer comando SQL.\n\nToda essa proteção impõe a necessidade à um invasor de controlar a maioria dos nós da rede para poder atacá-la. Quanto mais nós na rede, mais difícil é o ataque.\n\n\n## Proteção de chave privada\n\nCada nó gera um par distinto de chave pública e privada. Eles são identificados e autorizados por meio de sua chave pública.\n\nPor enquanto, a chave privada de cada nó é armazenada criptografada no dispositivo. Versões futuras podem oferecer suporte à proteção de chave privada baseada em hardware.\n\nPrecisamos informar a senha usada para descriptografar a chave privada usando o parâmetro URI `password`.\n\nExemplo:\n\n```\n\"file:test.db?blockchain=on\u0026admin=95F9AB75CA1...\u0026password=testing\"\n```\n\nA senha pode ser diferente em cada nó.\n\nOpcionalmente, seu aplicativo pode ser responsável por gerar e armazenar a chave privada para cada nó. Neste caso pode informar a chave privada em formato hexadecimal para a biblioteca via URI usando o parâmetro `privkey`:\n\n```\n\"file:test.db?blockchain=on\u0026admin=95F9AB75CA1...\u0026privkey=AABBCCDD...\"\n```\n\nIsso pode ser útil ao usar AergoLite em contêiners, onde cada instância deve ter uma chave privada diferente.\n\nO administrador do blockchain é responsável por armazenar sua chave privada de forma segura. Recomendamos não armazená-la em um dos nós do blockchain e também não em formato simples. Deve ser criptografada e armazenada em um dispositivo externo ou mídia. Uma carteira de papel também é uma boa ideia. A melhor opção é usar uma carteira de hardware.\n\n\n## Carteira de hardware\n\n![ledger-app-aergolite-sql](https://user-images.githubusercontent.com/7624275/75842624-98a79180-5daf-11ea-8427-f0c3e7788f41.jpg)\n\nPara o maior nível de segurança, o administrador do blockchain pode proteger sua chave privada usando um Ledger Nano S.\n\nNesse caso, ele usa o dispositivo para assinar suas transações.\n\nPara mais detalhes, verifique as [instruções](https://github.com/aergoio/aergolite/wiki/Using-a-Hardware-Wallet)\n\n\n## Descoberta de nós\n\nUm nó precisa descobrir seus pares na rede blockchain.\n\nEspecificamos o método de descoberta de nó usando o parâmetro URI `discovery`.\n\nExistem 2 opções de descoberta de nós:\n\n### 1. Transmissão UDP local\n\nEste método envia um pacote de transmissão UDP na rede local para a porta especificada.\n\nTodos os nós da mesma rede local devem usar o mesmo número de porta.\n\nExemplo:\n\n```\n\"file:test.db?blockchain=on\u0026discovery=local:4329\"\n```\n\n### 2. Nós conhecidos\n\nNeste método, alguns nós têm um endereço IP fixo e os outros nós se conectam a eles.\n\nOs nós com endereço conhecido também devem se ligar a uma porta TCP definida. Isso é informado usando o parâmetro `bind`.\n\nExemplo para um nó conhecido:\n\n```\n\"file:test.db?blockchain=on\u0026bind=5501\"\n```\n\nOs outros nós devem ter um parâmetro `discovery` explícito contendo o endereço dos nós conhecidos.\n\nExemplo para os outros nós:\n\n```\n\"file:test.db?blockchain=on\u0026discovery=\u003cendereço-IP\u003e:\u003cporta\u003e\"\n```\n\nTambém podemos especificar os endereços de vários nós conhecidos:\n\n```\n\"file:test.db?blockchain=on\u0026discovery=\u003cendereço-IP\u003e:\u003cporta\u003e,\u003cendereço-IP\u003e:\u003cporta\u003e\"\n```\n\nDepois que uma conexão é estabelecida e o nó é aceito, eles trocam uma lista de endereços de nós ativos.\n\n### 3. Misturando os dois métodos\n\nTambém podemos usar os 2 métodos acima ao mesmo tempo. Isso pode ser útil quando temos alguns nós na LAN e outros externos.\n\nPodemos fixar o endereço de um ou mais nós para que eles possam ser encontrados por nós de fora da rede local.\n\nOs nós na LAN descobrirão os nós locais via transmissão UDP e podem se conectar a nós conhecidos fora da LAN ou receber conexões deles.\n\nOs nós conhecidos podem se ligar a uma porta, encontrar nós locais por meio de transmissão e também se conectar a nós externos conhecidos. Exemplo:\n\n```\n\"file:test.db?blockchain=on\u0026bind=1234\u0026discovery=local:1234,\u003coutside_ip1\u003e:\u003cport1\u003e,\u003coutside_ip2\u003e:\u003cport2\u003e\"\n```\n\nOs nós sem endereço fixo usarão a descoberta local e a conexão com nós conhecidos externos:\n\n```\n\"file:test.db?blockchain=on\u0026discovery=local:1234,\u003coutside_ip1\u003e:\u003cport1\u003e,\u003coutside_ip2\u003e:\u003cport2\u003e\"\n```\n\nSe os nós nesta LAN estão apenas recebendo conexões de fora, o parâmetro `discovery` deve conter apenas o método de descoberta local.\n\n\n## Listando nós conectados\n\nVocê pode listar os nós em sua rede blockchain privada usando o comando:\n\n```\nPRAGMA nodes\n```\n\nEle listará todos os nós autorizados, conectados ou não, e também os nós conectados que ainda não foram autorizados.\n\n\n## Adicionando nós à rede\n\nDepois de listar os nós conectados com o comando acima, o administrador do blockchain pode autorizar os nós usando o comando:\n\n```\nPRAGMA add_node=\"\u003cchave pública\u003e\"\n```\n\nApenas o administrador do blockchain pode adicionar nós à rede.\n\nO primeiro nó a ser autorizado deve ser aquele no qual o comando está sendo executado.\n\nAs autorizações para outros nós devem ser executadas em nós já autorizados.\n\nO comando acima será enviado para o dispositivo Ledger para ser assinado se o dispositivo estiver conectado, caso contrário, ele irá disparar o callback de assinatura da transação onde a transação deve ser assinada usando a chave privada do administrador do blockchain.\n\n\n## Especificando o tipo de nó\n\nPor padrão, um nó é autorizado como um nó **leve** (não mantém o histórico de blocos). Para autorizá-lo como um nó **completo**, adicione `full:` antes da chave pública do nó:\n\n```\nPRAGMA add_node=\"full:\u003cchave pública\u003e\"\n```\n\nPara modificar o tipo de um nó depois que ele já foi autorizado, use o comando `node_type`, com este formato:\n\n```\nPRAGMA node_type=\"\u003ctipo\u003e:\u003cnós\u003e\"\n```\n\nO tipo pode ser `full` ou` light`. E \"nós\" é uma lista separada por vírgulas de identificadores de nós (chave pública ou id de nó) ou `*` para todos os nós autorizados.\n\nAqui estão alguns exemplos:\n\n```\nPRAGMA node_type=\"full:Am12..abc1\"\nPRAGMA node_type=\"full:Am12..abc1,Am12..abc2,Am12..abc3\"\nPRAGMA node_type=\"full:1287649477,3817592406,2373041549\"\nPRAGMA node_type=\"full:*\"\nPRAGMA node_type=\"light:1287649477\"\n```\n\n\n## Assinando transações\n\nNo AergoLite, as transações blockchain são construídas usando os comandos SQL das transações do banco de dados.\n\nCada transação do banco de dados gera uma transação blockchain.\n\nEssas transações precisam ser assinadas para serem aceitas pela rede e incluídas no blockchain.\n\nDuas entidades podem assinar transações:\n\n* O administrador\n* Cada nó autorizado\n\nSe a transação exigir direitos especiais, a biblioteca AergoLite a enviará para ser assinada pelo administrador. Caso contrário, ele o assinará automaticamente usando a chave privada do nó.\n\nSe nenhum dispositivo Ledger for usado em sua rede, então pelo menos um nó precisa registrar uma função que será usada para assinar transações do administrador.\n\nExemplo em Python:\n\n```python\ndef on_sign_transaction(data):\n  print \"transação a ser assinada: \" + data\n  signature = sign(data, privkey)\n  return hex(pubkey) + \":\" + hex(signature)\n\ncon.create_function(\"sign_transaction\", 1, on_sign_transaction)\n```\n\n\u003e **ATENÇÃO:** A função callback é chamada pelo **thread de trabalho** !!\n\u003e Seu aplicativo deve assinar a transação e retornar da função o mais rápido possível!\n\nSe um comando especial que requer privilégio de administrador for executado em um nó, mas não for assinado por ele, a transação será rejeitada.\n\n\n### Estado do banco de dados\n\nSeu aplicativo **deve** verificar se o banco de dados local está pronto para leitura e gravação antes que qualquer comando SQL seja executado.\n\nEssa verificação é feita com o comando:\n\n```\nPRAGMA db_is_ready\n```\n\nEle retorna `1` quando o aplicativo pode ler e gravar no banco de dados, caso contrário, retorna` 0`.\n\n\n### Estado do Blockchain\n\nEle contém informações sobre o blockchain local, o banco de dados local e a rede.\n\nEle pode ser consultado localmente usando o comando:\n\n```\nPRAGMA blockchain_status\n```\n\nEle retornará um resultado no formato JSON como o seguinte:\n\n```\n{\n  \"use_blockchain\": true,\n\n  \"blockchain\": {\n    \"last_block\": 150,\n    \"state_hash\": \"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\",\n    \"integrity\": {\n      \"state\": \"OK\",\n      \"chain\": \"pruned\"\n    }\n  },\n\n  \"node\": {\n    \"id\": 1366464921,\n    \"pubkey\": \"AmNdtXoBk6mYwgq2XDsx8pW9cvmoTQ3bp7v7kJxBcckvrC8HWBrE\",\n    \"type\": \"light\",\n    \"local_transactions\": {\n      \"processed\": 17,\n      \"unprocessed\": 2,\n      \"total\": 19\n    }\n  },\n\n  \"mempool\": {\n    \"num_transactions\": 2\n  },\n\n  \"network\": {\n    num_authorized_nodes: 25,\n    num_connected_peers: 21\n  },\n\n  \"downstream_state\": \"in sync\",\n  \"upstream_state\": \"in sync\"\n}\n```\n\n### Estado da lista de espera (mempool)\n\nEle retorna as transações pendentes no mempool local.\n\n```\nPRAGMA mempool\n```\n\nEle retornará um resultado no formato JSON como o seguinte:\n\n```\n[{\n  \"id\": 17698765927658,\n  \"node_id\": 123,\n  \"nonce\": 18,\n  \"timestamp\": \"2020-11-30 09:55:13\",\n  \"commands\": [\n    \"INSERT INTO test VALUES ('hello world!')\"\n  ]\n}]\n```\n\n### Informações de nó definidas pelo aplicativo\n\nSeu aplicativo pode definir informações específicas para cada nó usando este comando:\n\n```\nPRAGMA node_info=\u003ctexto\u003e\n```\n\nO valor de texto pode ser um identificador de nó único ou pode conter muitas informações serializadas em qualquer formato de texto. Apenas seus aplicativos irão usá-lo.\n\nEssas informações são mantidas na memória localmente e também enviadas aos pontos conectados. Não é salvo no banco de dados e é dinâmico: na próxima vez que este comando for executado com um valor diferente, ele substituirá o anterior.\n\nO último valor definido para este nó pode ser recuperado localmente usando o comando `PRAGMA node_info`.\n\nÉ possível visualizar os valores dos nós conectados no resultado do comando `PRAGMA nodes` no campo `extra`.\n\n\n### Último \"nonce\"\n\nCada transação gerada em um nó específico possui um número sequencial único chamado nonce.\n\nÉ possível recuperar o último nonce do nó atual com o comando:\n\n```\nPRAGMA last_nonce\n```\n\nSe o número retornado for zero, significa que este nó ainda não gerou nenhuma transação.\n\n\n### Status da transação\n\nPara recuperar o status de uma transação local:\n\n```\nPRAGMA transaction_status(\u003cnonce\u003e)\n```\n\nOnde `\u003cnonce\u003e` deve ser substituído pelo nonce da transação. Por exemplo: `PRAGMA transaction_status (3)`\n\nEste comando retorna:\n\nEm nós completos:\n\n* `unprocessed`: a transação ainda não foi processada pela rede\n* `included`: um consenso foi alcançado e a transação foi incluída em um bloco\n* `rejected`: um consenso foi alcançado e a transação foi rejeitada\n\nEm nós leves:\n\n* `unprocessed`: a transação ainda não foi processada pela rede\n* `processed`: a transação foi processada pela rede e um consenso foi alcançado sobre o seu resultado\n\nOs nós leves não mantêm informações sobre transações específicas.\n\n\n### Notificação de transação processada\n\nPara ser informado se determinada transação foi incluída em um bloco ou rejeitada, o aplicativo deve utilizar uma função de callback. É configurado como uma `função definida pelo usuário`:\n\nExemplo em Python:\n\n```python\ndef on_processed_transaction(nonce, status):\n  print \"transação \" + str(nonce) + \": \" + status\n  return None\n\ncon.create_function(\"transaction_notification\", 2, on_processed_transaction)\n```\n\nExemplo em C:\n\n```C\nstatic void on_processed_transaction(sqlite3_context *context, int argc, sqlite3_value **argv){\n  long long int nonce = sqlite3_value_int64(argv[0]);\n  char *status = sqlite3_value_text(argv[1]);\n\n  printf(\"transação %lld: %s\\n\", nonce, status);\n\n  sqlite3_result_null(context);\n}\n\nsqlite3_create_function(db, \"transaction_notification\", 2, SQLITE_UTF8 | SQLITE_DETERMINISTIC,\n  NULL, \u0026on_processed_transaction, NULL, NULL);\n```\n\n\u003e **ATENÇÃO:** A função callback é chamada pelo **thread de trabalho** !!\n\u003e Seu aplicativo não deve usar a conexão ao banco de dados nela e\n\u003e deve assinar a transação e retornar da função o mais rápido possível!\n\n\n### Notificação de atualização\n\nSeu aplicativo pode ser informado sempre que ocorrer uma atualização no banco de dados local devido ao recebimento de um novo bloco no blockchain.\n\nA notificação é feita usando uma função de retorno de chamada definida usando uma `função definida pelo usuário`:\n\nExemplo em Python:\n\n```python\ndef on_db_update(arg):\n  print \"Atualização recebida\"\n  return None\n\ncon.create_function(\"update_notification\", 1, on_db_update)\n```\n\nExemplo em C:\n\n```C\nstatic void on_db_update(sqlite3_context *context, int argc, sqlite3_value **argv){\n  puts(\"atualização recebida\");\n  sqlite3_result_null(context);\n}\n\nsqlite3_create_function(db, \"update_notification\", 1, SQLITE_UTF8 | SQLITE_DETERMINISTIC,\n  NULL, \u0026on_db_update, NULL, NULL);\n```\n\n\u003e **ATENÇÃO:** A função callback é chamada pelo **thread de trabalho** !!\n\u003e Seu aplicativo não deve usar a conexão ao banco de dados nela e\n\u003e deve assinar a transação e retornar da função o mais rápido possível!\n\n\n## Intervalo entre blocos\n\nOs blocos são criados por nós selecionados aleatoriamente em cada rodada.\n\nAergoLite não produz blocos vazios. Se não houver nenhuma transação a ser processada, nenhum bloco será criado.\n\nUm cronômetro para a criação de um novo bloco é ativado quando uma transação chega aos nós (caso o cronômetro ainda não esteja ativo).\n\nEste intervalo de tempo limite pode ser configurado via URI usando o parâmetro `block_interval`.\n\nO valor é interpretado como milissegundos.\n\n```\n\"file:test.db?blockchain=on\u0026block_interval=1000\"\n```\n\nSe o intervalo de bloco não for especificado, a biblioteca usará um valor padrão de 3 segundos.\n\n\n## Limitações\n\nEsta primeira versão usa uma rede totalmente conectada para comunicação entre os nós. Ele funciona com até 200 nós nos testes automatizados. Em breve, também conterá um protocolo blockchain com suporte a milhões de nós.\n\nApenas 1 conexão para cada arquivo de banco de dados. Se houver muitos aplicativos que precisam acessar o arquivo db, cada aplicativo deve ter sua própria cópia do banco de dados, configurada como um nó separado.\n\nA numeração de linhas em tabelas rowid (aquelas que usam um número inteiro como chave primária) é diferente do SQLite. Os primeiros 32 bits são o id do nó e os 32 bits restantes são sequenciais por nó. Isso também significa que cada nó pode criar até 2^32 linhas em cada tabela rowid.\n\nComo em qualquer sistema de replicação multimestre, podem ocorrer conflitos. A transação inteira pode ser abortada em alguns casos, então leve isso em consideração. Veja acima como o aplicativo pode verificar o estado da transação.\n\n\n## Licenciamento\n\nO AergoLite é lançado em uma das duas opções abaixo:\n\n1. AGPLv3\n\nIsso significa que seu aplicativo deve estar em conformidade com esta licença, incluindo o lançamento de seu código-fonte e a publicação sob uma GPL compatível.\n\n2. LICENÇA COMERCIAL\n\nSe as condições acima não atendem às suas necessidades, ou se você deseja um melhor suporte e serviços, entre em contato conosco para adquirir uma licença comercial.\n\n\n## Sobre nós\n\nAergoLite foi desenvolvido por Bernardo Ramos em:\n\n[![aergo logo](https://user-images.githubusercontent.com/7624275/100549737-8e89c500-3253-11eb-96b3-585916ed0883.png)](https://aergo.io/)\n\nAergo tem um [blockchain público](https://aergoscan.io/) com suporte para [contratos inteligentes](https://ide.aergo.io/) em Lua.\n\nEm breve, ele suportará armazenamento de dados relacionais e SQL em contratos inteligentes, atualmente disponíveis em nossa testnet e em redes blockchain privadas.\n\n\n## Suporte\n\nO suporte de baixa prioridade está disponível em nosso [Fórum](https://aergolite-forum.aergo.io/)\n\nSuporte empresarial também está disponível. Contate-nos por e-mail: aergolite *AT* aergo *DOT* io\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faergoio%2Faergolite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faergoio%2Faergolite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faergoio%2Faergolite/lists"}