Roteiro do MultiChain 1.0 beta 2 e 2.0

Nó Fonte: 1742567

Onde estamos hoje e para onde vamos amanhã

Hoje temos o prazer de lançar a segunda versão beta do MultiChain 1.0 para Linux, Windows e Mac (por enquanto, a versão para Mac requer compilação). Isso conclui o desenvolvimento planejado do MultiChain 1.0 - com exceção de quaisquer correções de bugs, a versão final do MultiChain 1.0 durante o verão não será alterada.

Este mês também marca dois anos desde o primeiro lançamento alfa do MultiChain em junho de 2015. Como acontece com qualquer novo produto, não tínhamos certeza de como o mercado reagiria e sabíamos que havia apenas uma maneira de descobrir - lançar um produto com minima viabilidade, significando uma versão inicial que fornece um valor significativo, mas é preliminar por design. Felizmente, ao contrário do nosso primeiro produto CoinSpark, MultiChain recebeu uma resposta positiva forte e imediata. Isso foi acompanhado por um tsunami de solicitações de recursos sensatas, muitas das quais já implementamos. Paralelamente ao desenvolvimento do produto, o uso também cresceu notavelmente em todas as medidas. Por exemplo, o site da MultiChain recebeu menos de 3,000 visitantes em julho de 2015 e agora traz dez vezes esse número mensalmente.

Desempenho MultiChain

Nos últimos dois anos, investimos muito esforço na otimização do MultiChain, que foi bifurcado de Bitcoin Core, a implementação de referência para a rede pública de bitcoins. Abaixo está uma comparação do rendimento da transação para uma configuração de nó único usando cinco versões do produto:

.throughput td,.throughput th {text-align:right;}
Total de transações 1.0 alfa 3 1.0 alfa 21 1.0 alfa 22 1.0 1 beta 1.0 2 beta
100 6.5 tps 7.8 541.7 830.6 1465.7
1,000 7.0 7.6 583.9 889.4 1199.6
10,000 4.1 6.4 566.9 746.6 1071.2
100,000 - 6.6 558.0 771.9 1034.2
1,000,000 - - 548.6 773.6 1055.4

Média de transações por segundo, incluindo sobrecarga de API e construção, assinatura, mineração e verificação de transações e blocos.
Testes realizados usando o ab Ferramenta de benchmarking do servidor HTTP enviando duas solicitações simultâneas para o sendtoaddress API.
Especificações do servidor: Intel Core i7-4770, 4 núcleos @ 3.4 MHz, 32 GB de RAM, Seagate 2 TB 7200 RPM SATA, CentOS 6.4.

Naturalmente, o maior salto veio no alfa 22 quando nós transicionado para uma carteira controlada por banco de dados. Mas desde aquele lançamento, quase dobramos a velocidade do MultiChain novamente. Esperamos ter demonstrado que o limite do bitcoin de 4 transações por segundo se deve a seus parâmetros de rede particulares e não tem relação com os blockchains em geral.

Claro, a otimização de desempenho é uma tarefa sem fim, e não há razão para que MultiChain não possa atingir 10,000 tx / s em um Processador de 16 núcleos com as mudanças arquitetônicas apropriadas. No entanto, com base em conversas com nossos usuários e parceiros, parece que poucos esperam precisar de mais de 1,000 tx / s nos próximos anos. Portanto, estamos redirecionando nossos esforços de desenvolvimento para novos recursos, o que nos traz muito bem ao assunto do MultiChain 2.0.

Visão geral do MultiChain 2.0

A versão 2.0 do MultiChain será a primeira a vir em duas edições - Community (open source) e Enterprise (comercial). Vou me concentrar aqui na edição da Comunidade gratuita, já que estamos apenas discutindo os detalhes do MultiChain Enterprise com nossos parceiros. Em qualquer caso, as edições Community e Enterprise serão altamente compatíveis, em que: (a) os aplicativos desenvolvidos na edição Community serão executados sem modificação no MultiChain Enterprise, e (b) ambas as edições serão capazes de se conectar e negociar entre si na mesma cadeia.

As três principais áreas de funcionalidade aprimorada em ambas as edições do MultiChain 2.0 serão:

  • Modelo de dados mais rico para fluxos, incluindo documentos JSON.
  • Filtros de transação programáveis ​​personalizados para validação on-chain.
  • Atualização contínua do protocolo e dos parâmetros de um blockchain.

Vamos discutir cada um deles em detalhes.

Modelo de dados mais rico para streams

Os streams MultiChain foram introduzidos em setembro de 2016 e provaram ser extremamente populares. Conforme descrito em esta postagem, streams fornecem uma abstração simples e natural para armazenamento, indexação e recuperação de dados de propósito geral em um blockchain. Um blockchain MultiChain pode conter qualquer número de fluxos nomeados, cada um dos quais pode ser aberto a todos para escrita ou gravável apenas em determinados endereços.

No MultiChain 1.0, cada item de fluxo tem um ou mais editores (que o assinam), uma chave opcional, uma carga de dados binários de até 64 MB de tamanho e um carimbo de data / hora (derivado do bloco no qual está embutido). Cada nó pode decidir livremente em quais streams se inscrever ou pode se inscrever em todos os streams automaticamente. Se um nó estiver inscrito em um fluxo, ele indexa o conteúdo desse fluxo em tempo real, permitindo a recuperação eficiente por editor, chave, bloco, carimbo de data / hora ou posição.

O MultiChain 2.0 irá enriquecer essa funcionalidade de streams de várias maneiras:

  • Itens JSON. Bem como dados binários, os itens de fluxo suportarão objetos JSON estruturados, armazenados no blockchain em um formato de serialização eficiente, como UBJSON. Como a API MultiChain já usa JSON, esses objetos JSON serão graváveis ​​e legíveis de uma maneira natural e óbvia.
  • Chaves múltiplas. Os itens de fluxo suportarão várias chaves, permitindo que um único pedaço de dados seja indexado de várias maneiras para recuperação usando liststreamkeyitems. Estamos constantemente avaliando quanta funcionalidade de banco de dados incluir no MultiChain, e não esperamos oferecer suporte à indexação dos subelementos nos itens de fluxo JSON na versão 2.0. Permitir várias chaves por item de fluxo fornece uma solução alternativa razoável.
  • Gravações atômicas de vários itens. O MultiChain 1.0 permite que uma única transação grave em vários fluxos, mas não grava vários itens no mesmo fluxo. MultiChain 2.0 irá remover esta restrição.
  • Mesclagem JSON. Qualquer lista ordenada de objetos JSON pode ser naturalmente nivelada ou resumida para criar um objeto "mesclado". O objeto mesclado contém todas as chaves que aparecem nos objetos individuais, onde o valor correspondente a cada chave é obtido do último objeto em que essa chave aparece. Se desejar, o objeto mesclado é o estado final de uma linha do banco de dados, cujas colunas são definidas pelo primeiro objeto e estendidas ou atualizadas por objetos posteriores. MultiChain 2.0 adicionará APIs para recuperar fácil e rapidamente o objeto mesclado para os itens JSON em um fluxo com uma chave ou editor específico.

Esses recursos são derivados de maneiras comuns pelas quais os desenvolvedores estão usando fluxos. Em outras palavras, estamos observando o que muitas pessoas estão construindo em cima do MultiChain no nível do aplicativo e trazendo essa funcionalidade para o próprio MultiChain - um padrão que pretendemos continuar aplicando. Agora que os itens de fluxo incluirão informações de tipo, eles podem ser facilmente estendidos no futuro para suportar outros formatos de dados, como XML, HDF5 e MIME- conteúdo identificado. Sem falar nas possibilidades de compressão e criptografia transparentes em cadeia.

MultiChain 2.0 também suportará objetos JSON para metadados de transação brutos (ou seja, não itens de fluxo), bem como os metadados para emissão de ativos e eventos de criação de fluxo, em vez dos pares de chave / valor somente texto implementados no MultiChain 1.0. O listassets A API oferecerá mesclagem de JSON em todos os eventos de emissão de um ativo, para que os metadados de cada emissão possam efetivamente atualizar a descrição final do ativo.

Filtros de transação personalizados

Nós pensamos muito sobre como adicionar regras programáveis ​​personalizadas ao MultiChain. Embora o paradigma de “contrato inteligente” do Ethereum seja popular, ele possui uma série de deficiências importantes para blockchains de permissão de alto rendimento. Primeiro, os contratos inteligentes introduzem uma dependência global em todo o estado do blockchain, o que prejudica drasticamente a simultaneidade e o desempenho. Em segundo lugar, os contratos inteligentes não podem impedir que transações incorretas sejam incorporadas em um blockchain, mas apenas evitar que essas transações atualizem o estado do banco de dados do blockchain. Embora, a longo prazo, esperemos que uma máquina virtual compatível com Ethereum seja oferecida como uma abstração de alto nível no MultiChain, não achamos que seja a solução certa para validação de baixo nível.

MultiChain 2.0 apresentará um paradigma diferente chamado filtros de transação, que validam transações individuais sem referência a qualquer estado global. Esperamos que os filtros sejam escritos em Javascript e executados em um mecanismo de tempo de execução integrado, como v8, que é usado no Google Chrome navegador e o Node.js plataforma. Claro, precisaremos garantir que o código do filtro seja executado de forma idêntica em cada nó em um blockchain, bloqueando qualquer fontes de não determinismo como ler a hora, usar números aleatórios, acessar rede ou disco ou realizar operações matemáticas que dependem da arquitetura do servidor host. Criar um ambiente de tempo de execução Javascript determinístico é um desafio, mas (sem revelar muito) acreditamos que será útil para vários outros recursos do MultiChain no futuro.

Os filtros receberão um objeto JSON que descreve uma transação individual, estruturada como a saída de decoderawtransaction mas com campos extras. Por exemplo, cada entrada de transação no JSON incluirá uma estrutura que descreve a saída de transação anterior que gasta e cada endereço será acompanhado por uma lista de permissões atualmente detidas por esse endereço. A função de um filtro é retornar um valor booleano indicando se a transação é aceitável e, caso não seja, fornecer um erro textual explicando o porquê. A API do MultiChain incluirá comandos para criar filtros, testá-los em transações anteriores ou novas e ativá-los de acordo com o consenso do administrador.

Ao contrário dos contratos inteligentes, se um bug for descoberto no código de um filtro, ele pode ser facilmente substituído por uma nova versão. No entanto, como todo código Turing-complete, os filtros ainda correm o risco de entrar em um loop infinito. Este problema será mitigado de duas maneiras:

  • Os filtros só podem ser instalados e ativados pelos administradores da rede, mediante consenso. Isso dá a cada administrador a oportunidade de examinar o código de um filtro em profundidade antes de votar para que ele seja ativado.
  • Todos os nós bem comportados validarão novas transações usando os filtros ativos antes de encaminhá-los para seus nós pares. Como resultado, se uma transação envia um filtro para um loop infinito, a transação não deve se propagar além do nó que a criou.

Esperamos que um aplicativo popular para filtros valide itens de fluxo. Por exemplo, um filtro pode garantir que certos campos em itens JSON de um fluxo contenham números em um intervalo específico. No MultiChain 1.0, esse tipo de validação deve ser feito no nível do aplicativo, seja ao gravar itens de fluxo (se a fonte for confiável) ou ao lê-los. Por outro lado, o MultiChain 2.0 permitirá que essas regras sejam incorporadas na própria blockchain, como verificar restrições em um banco de dados relacional.

O MultiChain 2.0 incluirá dois recursos adicionais para tornar os filtros ainda mais poderosos. Primeiro, ele introduzirá permissões definidas pelo usuário, que existem junto com as oito permissões definidas pelo MultiChain. Tal como acontece com as permissões regulares, elas serão concedidas a endereços específicos por administradores (e, em alguns casos, por usuários com activate privilégios) e incluídos ao lado de endereços no objeto JSON passado para um filtro. Por exemplo, um filtro pode garantir que apenas endereços com uma determinada permissão definida pelo usuário possam gravar certos tipos de dados em um fluxo ou realizar transações em um determinado ativo acima de um certo limite.

Em segundo lugar, o MultiChain 2.0 oferecerá suporte a metadados personalizados (binários ou JSON) em saídas de transações regulares. Isso permitirá que qualquer saída atue como uma linha geral do banco de dados, “pertencente” ao endereço interno. Os filtros verão todos os metadados nas saídas geradas e gastas de uma transação como parte de sua descrição JSON. Como resultado, o MultiChain se tornará um mecanismo de banco de dados compartilhado universal, onde a validade de uma transação é determinada por uma função personalizável das linhas que ele cria e exclui. (Se isso parece um pouco abstrato, com certeza forneceremos alguns exemplos concretos.)

Atualização do Blockchain

Como os blockchains são projetados para funcionar por muitos anos, suas características podem precisar ser alteradas com o tempo. A versão atual do MultiChain já oferece um certo grau de flexibilidade, permitindo mudanças de permissões (incluindo de administradores e mineradores por consenso), novos ativos e fluxos a serem criados e nós a serem facilmente adicionados ou removidos da rede. No entanto, no MultiChain 1.0, o básico de um blockchain parâmetros, como o tamanho máximo do bloco e o tempo de confirmação de destino, são fixados quando a cadeia é criada e não podem ser alterados posteriormente.

MultiChain 2.0 adicionará a capacidade de atualizar um blockchain, permitindo que muitos (mas não todos) de seus parâmetros sejam modificados enquanto a cadeia continua em execução. Como outras operações importantes, a atualização de um blockchain exigirá um nível personalizável de consenso do administrador, onde esse nível em si é um parâmetro que pode ser alterado. As atualizações entrarão em vigor a partir de um determinado bloco e serão aplicadas a cada bloco subsequente até a próxima atualização.

Os parâmetros do Blockchain que podem ser atualizados incluem:

  • Versão do protocolo. Isso permitirá que um blockchain criado com uma versão do MultiChain seja atualizado para oferecer suporte aos recursos em uma nova versão, como itens de fluxo JSON ou filtros de transação. Na verdade, a versão do protocolo 10008 introduzido no MultiChain 1.0 alpha 29 (e usado no beta) já foi preparado para o futuro com suporte não documentado para este tipo de atualização. Assim que um blockchain MultiChain 1.0 for atualizado para o protocolo 2.0, ele também terá acesso às outras alterações de parâmetro descritas aqui.
  • Escala de blockchain. Blockchains que se tornam populares podem superar os valores iniciais definidos para seu tempo de confirmação de destino ou transações máximas e tamanhos de bloco. O MultiChain 2.0 permitirá que esses valores sejam aumentados ou diminuídos conforme necessário.
  • Modelo de permissão. O MultiChain 2.0 permitirá a atualização de muitos parâmetros relacionados à permissão e governança, incluindo: (a) anyone-can-* parâmetros que controlam as maneiras pelas quais um blockchain é aberto ou fechado, (b) admin-consensus-* parâmetros que determinam os níveis de consenso do administrador necessários para certas operações, e (c) o mining-diversity parâmetro que controla a rigidez do algoritmo de consenso round-robin.

Depois que essa funcionalidade de atualização for implementada, não deve haver razão para que um blockchain criado no MultiChain não possa ser executado por muitas décadas ou mais.

Olhando para o futuro

Já começamos a trabalhar no MultiChain 2.0 e esperamos cumprir este roteiro. Sem dúvida, outras melhorias também serão incluídas. Assim como no MultiChain 1.0, teremos versões alfa ao longo do caminho, para que os desenvolvedores possam usar e aprender novos recursos à medida que são implementados (e, é claro, relatar quaisquer problemas ou deficiências). Naturalmente, continuaremos mantendo a versão 1.0 ao longo deste período, corrigindo todos os bugs que aparecerem.

Gostaria de terminar agradecendo à nossa equipe de desenvolvimento, liderada pelo Dr. Michael Rozantsev, por sua excelência contínua e trabalho árduo. Vemos o MultiChain como um projeto direto de engenharia de software, no qual a qualidade do código e os testes contam acima de tudo. Tenho o privilégio de trabalhar com pessoas que podem transformar uma visão de produto complexa em software de trabalho estável com eficiência e velocidade notáveis.

Por favor, poste comentários no LinkedIn.

Carimbo de hora:

Mais de Multichain