Primeira ligação para o Exonum: por que escolhemos o Java

O núcleo de nossa estrutura para o desenvolvimento de blockchains Exonum particulares está escrito em Rust, pois esse PL está focado na segurança de trabalhar com memória. No entanto, juntamente com muitas vantagens, o Rust possui vários recursos que complicam a "interação": sua sintaxe é incomum para muitos desenvolvedores e o limite de entrada é bastante alto.

Para simplificar o trabalho com a plataforma Exonum e torná-lo mais acessível ao público, decidimos escrever uma biblioteca de ligação. A linguagem para ligação se tornou Java.

Por que escolhemos Java, dizemos sob um gato.


/ Exonum

Algumas palavras sobre Exonum


O Exonum é nossa estrutura de código aberto para o desenvolvimento de blockchains particulares. A blockchain no Exonum é muito mais rápida que as blockchains públicas e é capaz de processar até 5 mil transações por segundo. Para comparação, no Ethereum esse número é de várias dezenas , enquanto o Bitcoin o tem ainda menos .

Exonum usa um algoritmo de consenso bizantino para proteger os dados. Não requer mineração e garante a execução correta das transações, mesmo que um terço dos nós da rede esteja comprometido.

A plataforma Exonum pode ser usada em qualquer área: financeira, tecnológica, jurídica. Em particular, a estrutura é adequada para criar sistemas de gerenciamento de direitos digitais (uma demonstração pode ser encontrada no site oficial ) e organizar a votação ( demonstração ). Nos dois casos, todos os processos que ocorrem são o mais transparente possível e são protegidos por mecanismos criptográficos.

No ano passado, usando a plataforma Exonum, foi implementado o Cadastro Estadual de Terras da Ucrânia. Antes disso, um projeto de gerenciamento de terras na Geórgia foi lançado na Exonum. Também estamos negociando com dezenas de empresas da Fortune 500 e a União Europeia para implementar nosso sistema em seus processos de negócios.

O núcleo de Exonum está escrito em Rust. A escolha é justificada pelo fato de esse PL focar em segurança e velocidade - ele funciona mais rapidamente em algumas tarefas que Java, Go, C e C ++. Ao mesmo tempo, o Rust garante a segurança da memória e evita corridas quando dois threads tentam acessar os mesmos dados.

O compilador Rust foi projetado para minimizar o número de bugs causados ​​pela influência do fator humano. Por exemplo, elimina várias classes de erros à custa do conceito de vida e posse.

Todos os valores no Rust têm um "domínio de propriedade". Quando um nome ultrapassa esse escopo, o recurso associado é liberado. Aqui está um exemplo de código que é fornecido na documentação oficial do Rust:

fn use_vec() { let vec = make_vec(); //   print_vec(vec); //   print_vec for i in vec.iter() { //   vec println!("{}", i * 2) } } 

Se você o "alimentar" ao compilador, ele gerará um erro:

 error: use of moved value: `vec` for i in vec.iter() { ^~~ 

Isso sugere que o vec não está disponível porque seu domínio de propriedade foi alterado. Assim, "dar um tiro na perna" no processo de desenvolvimento se torna muito mais difícil.

Por que decidimos criar uma ligação


Sintaxe ruidosa

O Rust oferece uma variedade conveniente e ampla de tipos de dados que podem ser combinados entre si. Isso torna possível otimizar conjuntos de valores no código e restringir o acesso aos dados, protegendo-os contra acesso não autorizado.

Esses recursos são muito importantes ao trabalhar com contratos inteligentes no Exonum. Graças a eles, os contratos “inteligentes” de nossa estrutura têm mais desempenho e segurança no acesso à memória do que, por exemplo, soluções Ethereum.

Em geral, o Rust é semelhante a outras linguagens imperativas (em particular, a sintaxe do Rust se assemelha ao C / C ++), mas representa um grande número de conceitos inovadores. Possui ciclos, condições, funções, mas ao mesmo tempo são exibidas áreas de propriedade e tipos. Portanto, pode ser difícil para quem nunca trabalhou com este PL ler programas sobre ele.

A princípio, eles parecem "estrangeiros". "Pain" adiciona um gerenciamento de memória incomum (comparado a outros idiomas) que torna o Rust tão seguro. No outono passado, os criadores do Rust publicaram uma pesquisa entre 5 mil membros da comunidade. Quase um quarto dos entrevistados disse que Rust era difícil de trabalhar.

Compilador muito exigente

Como já observamos, a tarefa do compilador Rust é reduzir o número de bugs no código. O compilador é restrito ao texto do programa, mas exibe opções para solução de problemas. Nesse caso, o compilador até mostra avisos sobre o estilo de programação.

Essa abordagem permite que você escreva códigos confiáveis ​​(o que é importante ao trabalhar com blockchains em geral), mas também tem um lado oposto da moeda. Às vezes, você precisa escrever programas no Rust para que o compilador "entenda" que você não está executando operações de memória proibidas. E como o idioma ainda é jovem e continua a evoluir, pode não haver práticas estabelecidas. Portanto, como diz o desenvolvedor do Exonum Ilya Bogdanov, muitos padrões precisam ser encontrados pelo método da cutucada científica.

Pequena comunidade

A terceira razão para a criação de ligantes foi a pequena comunidade Rust. Embora a comunidade desse idioma seja bastante amigável e seus membros estejam sempre prontos para responder a perguntas, o idioma “sofre” com uma pequena quantidade de literatura e bibliotecas. No entanto, será justo observar aqui que esse problema está sendo resolvido gradualmente.

Nos últimos anos, a Rust vem promovendo ativamente a Mozilla e a Samsung , o que afeta positivamente o número de bibliotecas em desenvolvimento e novos “wrappers” para soluções existentes no mundo C / C ++. Os “livros didáticos” de idiomas também começam a aparecer gradualmente. Entre os que já existem, vale destacar os “ Fundamentos de Rust ” de Ivo Balbaert, um guia on - line no site oficial e o livro recente de um dos desenvolvedores do projeto Rust, Steve Klabnik, “ The Rust Programming Language ”.

Por que escolher Java


Um dos principais motivos que determinaram a escolha foi a enorme comunidade desse PL. De acordo com um estudo realizado no site Stack Overflow no ano passado, Java está em terceiro lugar em popularidade (somente JavaScript e SQL o passaram). Dos 64 mil desenvolvedores pesquisados, quase 40% escrevem em Java.

Devido ao tamanho da comunidade, este PL adquiriu um extenso conjunto de ferramentas. Isso inclui IDEs, soluções analíticas, estruturas de referência, etc. Existem tantas que algumas empresas obrigam os desenvolvedores a usar apenas IDEs e estruturas específicas para evitar a divisão do ambiente de trabalho.

Ao mesmo tempo, Java possui uma sintaxe simples e uma JNI (Java Native Interface) que pode funcionar com a ABI (C Application Binary Interface). Além disso, o Java possibilita o uso de outras linguagens na pilha da JVM: Scala, Kotlin, Clojure.

E, finalmente, a máquina Java é multiplataforma: o código Java é executado no código de bytes, que é interpretado e executado nas plataformas Windows, MacOS, Linux. Ao mesmo tempo, a linguagem Java está mais ligada ao código aberto (comparado, por exemplo, com C #). As ferramentas de desenvolvedor Java são gratuitas: são o JDK e os ambientes de desenvolvimento integrados baseados nele - JDeveloper, NetBeans, Eclipse etc. Ao mesmo tempo, você pode encontrar um grande número de projetos de código aberto em recursos especializados (por exemplo, no GitHub ). Existem também muitos manuais sobre como trabalhar com tecnologias de código aberto.

Principais desafios no desenvolvimento de Java Binding


O desenvolvimento do Java Binding foi longo e complexo (e ainda está em andamento). Tivemos que considerar todos os recursos que tornam Rust e Java tão diferentes.

Por exemplo, um dos desafios foi organizar o gerenciamento de recursos. O ponto é que existe um Garbage Collector em Java, mas não no Rust. Foi removido em uma das versões anteriores, pois os desenvolvedores chegaram à conclusão de que podiam fornecer o mesmo nível de confiabilidade usando um sistema de tipos.

O Java GC, embora tenha aumentado o consumo de recursos (força todas as funções a retornar objetos não utilizados para evitar possíveis vazamentos de memória), é bastante conveniente. Portanto, precisávamos implementar um mecanismo de limpeza de recursos que os desenvolvedores Java gostariam.

Outra dificuldade acabou por estar relacionada às estruturas específicas de dados apresentadas nas árvores Exonum - Merkle. O Exonum os usa para combinar estados de blockchain em um único hash. Isso possibilita provar a autenticidade das transações sem precisar se comunicar com vários nós de rede completos. Essa funcionalidade é importante para o trabalho de nossos clientes light, portanto, também teve que ser interpretada em Java.

A API Java repete quase completamente a API Rust. Isso é feito para facilitar a adaptação da documentação e simplificar o trabalho para os usuários. Preparamos um guia separado para configurar e executar o nó Exonum com o Java Binding App.

Para criar serviços em Java, você pode usar o gerador de modelos de projetos. Você precisa instalar o Maven 3 e executar o comando:

 $ mvn archetype:generate \ -DinteractiveMode=false \ -DarchetypeGroupId=com.exonum.binding \ -DarchetypeArtifactId=exonum-java-binding-service-archetype \ -DgroupId=com.example.myservice \ -DartifactId=my-service \ -Dversion=1.0 

Você pode usar o modo interativo:

 $ mvn archetype:generate \ -DarchetypeGroupId=com.exonum.binding \ -DarchetypeArtifactId=exonum-java-binding-service-archetype 

Você encontrará um guia completo com exemplos de configuração de um serviço Java na documentação no site oficial do projeto Exonum. Existem recomendações para iniciar o nó Exonum no repositório no GitHub .


/ Exonum

Planos futuros


Enquanto Java Binding estiver em alfa. Planejamos lançá-lo como um recurso completo e pronto para o futuro. Agora, estamos coletando comentários dos usuários para rastrear possíveis problemas na biblioteca e fazer correções.

Também está em andamento a documentação, escrevendo projetos de exemplo e SDKs para simplificar a integração com o aplicativo na blockchain e melhorar o UX em geral. Você pode encontrar o roteiro completo do projeto no repositório no GitHub .

Lá você pode pegar todas as fontes para experimentar o Java Binding e escrever seu serviço Java para o Exonum. Se você tiver alguma dúvida, entre em contato com nossa equipe de desenvolvimento na Gitter . Eles contarão e ajudarão na medida do possível.

Source: https://habr.com/ru/post/pt423441/


All Articles