 Ok, thank you. Boa noite, pessoal. Um prazer ter todos vocês aqui mais uma vez. Hoje é o dia 28 de abril de 2022, isso mesmo. O capítulo Hyperledia Brasil agradece a presença e, antes de mais nada, importante se alientar a sessão que está sendo transmitida online ao vivo no YouTube. Então qualquer tipo de informação, conteúdo ou citação que vocês venham a fazer aqui são de acesso livre por parte de todos. Além disso, é sempre bom lembrar que aqui é um ambiente onde todos são muito bem-vindos e a gente tem o trabalho e o papel fazer com que todos se sintam confortáveis e seguros. Então eu destaco aqui o nosso código de conduta e eu gostaria de se alientar que esses eventos estão catalogados na nossa página de eventos do capítulo, assim como as nossas sessões estão registradas na nossa página de gravações. Então dentro da nossa página de eventos do capítulo, mitapes já ocorridos, tá? A gente tem um conteúdo bem completo aqui de informações, de todas as sessões ocorridas no ano passado e agora a gente vai começar a alimentar com as sessões desse ano. A gente já tem um conjunto de sessões planejadas, assim como todas as gravações das reuniões do capítulo também são gravadas e estão disponibilizadas para que vocês possam ter acesso a partir da nossa página wiki. Qualquer dúvida, por favor, pergunte aí no chat. O link da live já está também disponível no chat, assim como perguntas a respeito do conteúdo que vocês podem colocar também diretamente no chat. Nesse momento eu passo a palavra para o meu amigo Marco Sarres, que vai fazer a introdução a respeito da sessão de hoje, assim como maiores detalhes, a respeito de uma empresa, acho que aqui ninguém conhece direito, mas que tem uma ferramenta sensacional de uso aberto, de código aberto chamada Golédia. Marco, como sempre, é uma satisfação tá aqui com vocês e com nossos convidados que estão mais para nossos colegas de trabalho, seu colega de trabalho e meu que como parte da referência. Marco, obrigado mais uma vez. Obrigado Renato, mais uma vez obrigado por todo esse apoio que tem dado aí ao capítulo. Obrigado a todos que compareceram a mais esse Meetup, antes de apresentar o nosso palestrante de hoje, algumas informações. Após a apresentação, essa apresentação deve durar em torno aí de uma hora, mas a gente vai reservar em torno de uns 15 minutos para perguntas. Aqueles que tiverem alguma pergunta, por favor, escrevam aqui no chat que nós vamos repassar para o Samuel após a após a apresentação. E o palestrante de hoje, ele é bacharel em Jardim Catrônica, pela Universidade de Brasília, possui a certificação do Blockchain Training Alliance como Certified Blockchain Hyperledger Developer, possui a certificação pela Linux Foundation como Certified Hyperledger Hyperledger Fabric Administrator, é CTO na Golédia e é meu sócio. Eu tenho aqui o prazer de apresentar. Samuel, vence a contigo. Obrigado, Marcos. Primeiramente, obrigado pelo convite. É sempre um prazer estar aqui com vocês, falando um pouco de Hyperledger Fabric, o que a gente tem feito na Golédia. E hoje a gente vai falar de... Acho que perdeu o áudio, Samuel. Alô? Voltou o seu áudio. Pessoa, perdão aí. Então vamos começar. Hoje, como eu estava falando, nós vamos falar de TinCodes em Hyperledger Fabric e o esforço que a Golédger tem feito para trazer uma ferramenta para a comunidade, para desenvolvimento de TinCodes de uma maneira facilitada. Então eu vou compartilhar aqui a minha tela. Vamos ver aqui. Certo. Pessoal, vocês podem confirmar se estão conseguindo visualizar a minha tela? Sim. Estamos assim. Maravilha, maravilha. Então... O título da nossa apresentação aqui hoje é Secetus, biblioteca para TinCodes. Antes de falar de Secetus e de TinCodes, a gente está falando aqui de Hyperledger Fabric. Acho que a maioria aqui tem ciência do que é o Hyperledger Fabric. Mas, basicamente, é um framework que permite a gente criar redes de leds distribuídos entre os participantes interessados. São redes permissionadas. E uma das características do Hyperledger Fabric, da blockchain do Hyperledger Fabric, é que ela tem suporte a contratos inteligentes, ou como a gente chama, geralmente, dentro da estrutura do Hyperledger TinCodes. É uma ferramenta open source. Então a gente fala muito de open source dentro de Hyperledger Fabric, e aí esse vai ser um tema que a gente vai puxar um pouco mais para frente ali também na nossa apresentação. Os conceitos chaves de Hyperledger Fabric, acho que a maioria aqui pode imaginar, são as organizações, SAs, PAs, Orders, Canais e os TinCodes. Os TinCodes são a parte central dentro do que o Hyperledger Fabric consegue prover para a gente. Então ele vai ser o assunto que a gente vai tratar hoje. Então o que é o TinCode no final das contas? O TinCode, contrato inteligente, ele é um pedaço de código. A analogia que é mais utilizada é como se fosse uma máquina de refrigerante, que ela vai ter um conjunto de regras para fazer alguma coisa com determinadas entradas e o estado do mundo. Então uma máquina de refrigerante, se você deseja comprar, por exemplo, um refrigerante de cola, você coloca dois reais na máquina e aí você seleciona um dos refrigerantes das opções disponíveis. E aí se você tiver entrado com uma quantia adequada e se o estado da máquina, no caso, ela tiver em estoque esse refrigerante, ela vai te retornar essa saída, que é um refrigerante de cola. Então para as mesmas entradas em estado do mundo, ela sempre te retorna a mesma saída. A ideia do TinCode, a ideia do contrato inteligente, no final das contas é essa. Então para transformando isso para código, é basicamente realizar, codificar códigos que permitem que a gente come com entradas e o estado do mundo produz uma determinada saída e essa saída vai ser utilizada na nossa estrutura distribuída para validar que aquela execução, aquela execução distribuída, é valida em todos os nós. Então eu vou ter a comparação do Fabric e a comparação de resultados dessas transações para que o registro do meu ledger seja confiável, parte da confiabilidade dentro do Hyperledger Fabric bem disso, da execução da transação chegar num resultado, no mesmo resultado entre nós diferentes. Mas bom, o que que guarda um ledger no Hyperledger Fabric? Um ledger no Hyperledger Fabric ele guarda chave e valor. Simples assim, tal qual um banco não relacional, você guarda uma chave e um valor e isso pode ter vários, entre aspas, sabores. Eu posso ter uma chave que é uma string qualquer, como o meu registro 1, e o valor do meu registro, que é uma outra string, eu posso fazer isso um pouco mais sofisticado. Eu posso ter um registro que eu contabilizo com uma identidade que tem algum sentido para mim. Então, por exemplo, e tem 23, sei lá, do meu estoque de carros, quando eu estou dando um exemplo. E aí ele vai ser um carro sedã, a descrição, e os status dele, tudo numa string. E eu posso fazer isso ficar mais sofisticado ainda, gerando uma chave de maneira determinística para identificar isso dentro do meu ledger e associar isso a um valor que é um JSON com campos de tipos diferentes, campos string, campo número, campo data e assim por diante. E essa estrutura de chave e valor dentro do Hyperledger Fabric é o que permite a gente rastrear o histórico do valor registrado. Então, eu posso visualizar para aquela determinada chave o que aconteceu com aquele meu registro conforme as transações novas forem chegando e alterando aquele registro. Então, no fundo, o ledger no Hyperledger Fabric ele guarda isso. Legal. E aí, quando a gente fala de Team Code para Hyperledger Fabric, quais são as etapas que a gente tem que seguir para poder produzir um Team Code para uma determinada aplicação? As etapas que a gente utiliza, geralmente, dentro da Google ledger, é realizar um mapeamento dos dados, o que significa realizar um mapeamento dos dados. É ver, efetivamente, o que eu quero registrar dentro do meu ledger, qual é a aplicação dele, qual é o escopo da minha rede blockchain, o que eu vou registrar de fato. Então, vou determinar ali que eu tenho que registrar, por exemplo, um documento, uma reação de um documento, coisas desse tipo. Então, é efetivamente o mapeamento daqueles dados. E aí, após isso, eu tenho que definir qual é o fluxo desses dados, qual é o caminho desses dados que a gente consegue definir as transações. E aí, a gente realizou o desenvolvimento das transações baseado no fluxo que esses dados têm que seguir. Então, numa rastreabilidade da vida, você teria um mapeamento de dados daqueles que você quer rastrear e as transações que vão atuar em cima desse dado para poder, sei lá, transferir ele de um dono para o outro e assim por diante, alterando esses dados que a gente mapeou. E aí, finalmente, a gente decide a arquitetura da rede, a arquitetura de organizações em produção, para a gente poder efetivamente subir isso daí e isso fazer sentido dentro do que a gente desenvolveu e das organizações que a gente quer que estejam compartilhando esse led. E aí, para requisitos, para desenvolvimento efetivamente, ter binários do tebro que golende aqui, especificamente no nosso caso, do que eu vou mostrar. Mas, tinha que dizer, eles podem ser desenvolvidos em JavaScript, imagino que isso daí seja um de conhecimento da maioria aqui. E Docker, né? Docker é uma parte central, todos os nozes ficam dentro de processos dentro de containers Docker. Então, esses são os pré-requisitos para o que a gente vai mostrar aqui. Mas beleza, se eu quiser fazer um tipo de como é que eu começo, você pode começar olhando a documentação do fabric e vai te dar alguns caminhos ali, né? Então, olhando a documentação do fabric, você encontra alguns recursos, um deles é chamado fabric samples. Dentro do fabric samples, tem alguns exemplos de team code que ele te entrega, né? Então, um desses exemplos é um exemplo famoso, né? Chama Fabcar. O Fabcar é um exemplo que ele realiza o registro de carros, basicamente, né? Com o nome de quem... Nome da fabricante, nome do modelo, a cor e quem é o dono desse carro, né? Então, como é que o Fabcar define isso na... Como que ele define isso na sua estrutura, né? Ele basicamente utiliza os recursos do próprio Golang para definir essa estrutura de um carro que ele quer registrar. Então, aqui a gente vê que ele define uma struct para esse carro, onde ele tem as propriedades que ele quer registrar e o tipo dessas propriedades, né? Isso é uma struct de padrão do Gol. Para quem não conhece Gol, isso daí é um exemplo de sintásse do Gol, como você declara uma struct em Golang, né? E os campos são definidos com tipos do Golang também, né? Os tipos nativos do Golang. Então, eu tenho aí strings, né? Poderia ter um int64, flow int64, coisas desse tipo, mas são tipos padrão do Golang. Legal. E aí eu vou... Como eu falei, né? A gente primeiro define o nosso mapeamento de dados, o nosso asset, e aí a gente define a nossa transação que a gente vai utilizar para trabalhar em cima daquele dado, né? E aí a nossa transação, a gente tem... Na definição do Fabcar, a gente tem, por exemplo, uma transação de create car, né? Então, vou criar um novo carro. E aí a gente vê ali a assinatura da função, né? A gente vê que ela recebe alguns parâmetros. Então, ela vai receber o car number, o maker, o model, o color, o owner, e todos eles vão ser um tipo string, certo? E aí o que a minha transação faz, né? É uma transação simples, mas o que ela vai fazer? Ela vai preencher esses dados dentro da minha struct de carro, jogar isso numa variável, e aí ele vai codificar essa struct para um JSON, né? Pegar os bytes desse JSON e fazer um famoso putestate no meu ledger, né? O que é o putestate? O putestate é quando eu estou registrando um estado no meu ledger. Então eu passo como parâmetros para ele. Uma chave e um valor, que é justamente o que o nosso ledger guarda, né? Então ele está recebendo um car number que vai ser usado como chave e esse car as bytes vai ser usado como valor e o putestate vai e registra isso dentro do ledger para mim, né? Beleza. Se eu quiser fazer coisas a mais aqui, né? Eu faço manualmente, né? Então se eu quiser, por exemplo, garantir que as minhas strings de cor, modelo, não estão vazias. Eu adiciono uma verificação aí dizendo que eu faço, basicamente, um if, né? Comparando com uma string de vazia. Caso for vazia, eu retorno erro e a transação não passa. Então as validações, elas são feitas manualmente dentro da transação. Legal. E aí, eu tenho agora, eu tenho meu dado, que é o carro, eu tenho a minha transação, que é o trade car. E aí eu quero rodar isso, né? Como é que eu passo desse código para o que eu consigo rodar e testar, né? Dentro do hyper ledger fabric, você... A gente está falando muito de desenvolvimento, então você está em muita documentação, né? Na documentação, existe um tutorial mais famoso, digamos assim, para quem quer começar na prática, que é o tutorial de test network, né? Então, se você está usando o fabric samples, com o fabricar, é mais natural você dar uma olhada no tutorial do test network, que está lá no fabric samples também, né? E subir essa rede instantial, o template do fabricar para você poder utilizar, né? E aí, depois que você passa pelo todo aquele passo a passo, a gente sabe que subir redes do hyper ledger fabric do zero, né? E o hyper ledger puro pode ser um pouco complicado, né? Em termos de passo e tal. Mas, depois disso, você consegue ter a estrutura inteira lá com o seu template distanciado para você poder transacionar. E aí, como é que você transaciona? Você transaciona executando um comando muito parecido com esse que eu estou mostrando aqui, né? E aí, você passa uma série de parâmetros, né? Eu estou fazendo um canal que vai ser executado com o nome do Team Code, quais são os argumentos da transação que você quer, né? Então, ali, eu estou passando uma função que é o great car. E eu estou passando alguns argumentos, né? Esses argumentos, eu estou recebendo são os argumentos que o great car recebe, né? E eles estão exatamente naquela ordem que ele recebe. Então, primeiro car number, depois o maker, model, color e owner, certo? Então, e aí ainda tem que passar certificados e tal para eu ter autorização para me comunicar com esse PI e poder efetivamente transacionar dentro da rede. Legal. E aí, é execução, então, via CLI os argumentos posicionais e aí eu preciso ser acesso aos certificados digitais com autorização. Legal. Mas aí, bom, a gente esse é o processo, digamos assim, natural de começar um Team Code, né? A gente tem um Team Code simples e ele está inclusive todo num arquivo único, né? Você consegue ver todo um arquivo único e entender o que está acontecendo ali. Mas no momento que você tem que fazer alguma coisa um pouco mais complexa, começa a ficar um pouco, pode ficar um pouco difícil de trabalhar dentro da da estrutura, digamos assim, livre que o fabric entrega, né? A estrutura que o Team Code que o Team Code tem que ter, na verdade é definida por quem o programa, né? Desde que ele receba algumas interfaces lá, que o fabric é definido por quem está programando. Então, isso pode ser pode ser mais demorado você ter um Team Code mais complexo com essa estrutura simplificada, né? Foi exatamente essa motivação que fez com que a Goladier criasse uma biblioteca de desenvolvimento de Team Codes, que a gente apenedou de CC2s, né? Ela criou justamente dessa necessidade numa época que a gente demorava 3, 4 meses para desenvolver um Team Code e aí a gente reparava que de um Team Code para o próximo, algumas coisas se repetiam. Então, a gente começou a identificar quais coisas se repetiam e aí a gente começou a tirar elas de dentro dos Team Codes de fato e movê-las para um pacote separado. E em determinado momento, aí a gente pensou, ah, porque a gente não é só um pacote separado, mas um repositório separado que você importa no seu código e aí você consegue utilizar as coisas que são comuns na maioria dos Team Codes para a nossa necessidade, né? E aí foi assim que o CC2s nasceu, né? Nasceu internamente dessa necessidade na Goladier e aí a gente expôs ele por mundo, né? A gente tornou ele open source para que a comunidade pudesse usar, né? A gente faz parte da comunidade Hyper-Leader, a gente tem contato com os desenvolvedores que estão no projeto do fabric, né? Resolvendo problema e tal. Então, foi uma maneira que a gente achou, a gente achou justo, né? Devolver para a comunidade também uma ferramenta que facilitou tanto a nossa vida e que pode facilitar a vida dos outros desenvolvedores também, né? Então, o que o CC2s ele vai fazer para a gente? O CC2s ele vai ter a padronização dos ativos, de chaves, referências de ativos, né? Então, você colocar um ativo dentro do outro. A gente tem tipo de dados padrão customizáveis, né? Então, tipo de dado padrão, por exemplo, string, número, coisas desse tipo e customizáveis. Então, a gente pode ficar os nossos. A gente também tem um gerenciamento de organizações, né? Então, ter ele dentro quais organizações tem permissão de escrita, então quais vão estar dentro do private data e a padronização de transações também, né? E não só isso, né? O CC2s ele ainda entrega uma série de de uma série de recursos, né? De qualidade de vida, digamos assim, que são algumas transações embutidas, né? Então, ele tem transações prontas para você utilizar, você só precisa definir qual o dado, né? Então, por exemplo, eu só precisaria definir carro e aí eu tenho uma transação que cria esse carro automaticamente pra mim, né? Então, não preciso me preocupar e fazer uma transação de create new car, por exemplo. E essas transações elas são o crud e o caso, né? Que a gente ouve muito falar quando a gente faz com API REST, né, e banco de dados, então create, read, update, delete e a gente ainda tem a busca com paginação, né? O search e o read asset history, né? Que é pra poder justamente ver o histórico da chave em questão, né? E isso a gente consegue integrar diretamente com um API que se comunica com o nosso PI via fabric com o usuário, consegue desenvolver o search encode usando a estrutura de CC Tools subir ele de uma maneira bem facilitada já vai ter um API que você consegue se comunicar automaticamente para realizar transações, né? Então, vamos ver na prática como que isso muda o nosso desenvolvimento, né? Antes de isso, né? A gente tem um template de um template que a gente chama de CC Tools Demo, né? Que ele é basicamente uma estrutura de um projeto clássico como a gente utiliza dentro da Golédia, em um repositório público e é como todos os nossos projetos eles iniciam a partir desse repositório, né? Que é o CC Tools Demo Então, lá a gente vai ter uma série de scripts para auxiliar com a criação de rede de teste local, a gente vai ter scripts para fazer atualização dos nossos team codes a gente vai ter uma recha API para fazer uma autenticação fazer uma série de coisas e geração de pacotes para a implantação em qualquer rede Então você pode codificar o seu código com CC Tools e isso vai funcionar em qualquer rede e além disso um suporte até achar automatizado para que você possa executar suas transações sem precisar subir uma rede do zero, né? Subir uma rede com contênias e tal com teste automatizado, inclusive colocar isso em pipeline de CI-CD de GitHub, enfim, toda uma série de coisas que facilita e ajuda o nosso processo de fazer team codes complexos Bom, então na prática, como é que isso se traduz em termos de código, né? Então, aqui eu tenho um exemplo de team code que seria uma reimplementação do Fabcard, digamos assim utilizando o CC Tools é um repostório que está disponível no GitHub então podem visualizar, é um repostório aberto mas aí eu tenho um exemplo aqui de uma definição de um ativo carro, né? Vocês veem aqui que eu tenho uma estrutura bem maior do que aquela struct simples do Hyper-Lager Fabric que o Fabric sempre os entrega mas aqui eu tenho muito mais informações que eu consigo dizer para o meu team code, né? Então aqui eu tenho um asset type, né? que eu estou chamando de car, ele vai ter uma tag, uma label, uma descrição e aqui eu tenho as propriedades dele, né? Então aqui eu tenho um bait que é um tipo string, eu tenho model que é o tipo string, color que é o tipo string e aqui é uma coisa interessante, né? que eu falei sobre referência de assets, né? um asset dentro do outro e aqui eu tenho uma tag owner onde lá no Fabcar aqui eu tenho uma referência para um outro asset person, né? Então eu posso ter um asset person que eu crio e eu referi o ele como um dono desse asset de carro, né? Então e além disso eu tenho aqui algumas propriedades interessantes, né? Que são as propriedades de requerido, né? Então posso dizer se um parâmetro ele é obrigatório ou não para o meu propósito, né? Então ele pode ser um parâmetro opcional de registrar, mas eu posso colocar isso como validação, né? E eu também posso colocar como chave, né? Então eu tenho aqui no caso eu tenho duas chaves, né? Uma chave é o maker e outra chave é o model e o que isso no final das contas faz, né? Isso vai pegar esses dois campos e vai gerar uma chave composta a partir desses dois campos, né? Então isso permite com que eu acesse sabendo quais são os campos que são chave ou diretamente pela chave que a BOTIN registra, de fato, né? Então legal, a gente tem o nosso carro, né? O próximo passo é realizar fazer a nossa transação. Na nossa transação a gente tem da mesma forma uma estrutura parecida, né? A gente tem um objeto que é o TX Transaction que vai definir quais são os argumentos dessa transação e aqui para os argumentos eu tenho uma estrutura muito parecida com o que eu tinha lá dentro do asset, né? Então aqui eu tenho os campos que a minha transação precisa receber se eles são requeridos ou não e eu posso colocar os tipos de dados bem como nos assets eu posso. Então String Person, né? Então referência para um outro asset, posso fazer tudo isso e aqui embaixo, né? Aqui ficou pequeno porque eu abrevi a e tive que abreviar, mas aqui eu tenho a minha rotina, né? Que vai ser o que a minha transação vai fazer de fato. Quando a gente for a transação eu vou mostrar exatamente como que isso se mostra em código, né? Mas aí o que é interessante? Que interessante é que tanto no caso da transação quanto no caso do meu asset, esses campos eles são validados automaticamente antes mesmo da minha transação rodar. Então se eu coloquei que o meu model é requerido e eu não enviei ele na minha requisição ele vai antes mesmo de bater na minha rotina que vai executar a transação, ele vai dizer assim opa! Você não mandou um campo que é requerido erro na transação. Então cc2 ele tem todo um ferramental por baixo que faz esse tipo de validação automaticamente para a gente, né? Inclusive de referência de pessoa, né? Então tudo isso fica transparente para quem programa, mas fica validado dentro do cc2 e além disso a gente também tem algumas funções de alto nível, né? Por exemplo, put new update eu mostrei para vocês o put state que é a função que de fato registra o meu objeto dentro da blockchain mas o cc2 ele pega a funcionalidade desse put state e ele constrói em cima dela para poder fazer para poder trazer mais funcionalidade para ela, né? Então por exemplo um put new como eu já digo no nome da função, ele está botando um novo asset, né? E aí se esse asset não for novo, ele faz uma verificação antes para ver se aquela chave já existe. E caso ela exista, ele retorna um erro de conflito, né? Então você consegue ter uma segurança ali de que quando você está registrando continue você não está sobre escrevendo nada na sua rede, né? No seu led. Então o cc2 ele tem mais uma série de funções que constrói em cima dessas funcionalidades básicas que o sdk do fabric entrega para a gente, né? Em termos de tempo hoje. Bom e além disso a gente também agora tem uma maneira muito mais simples de executar uma transação, né? Como eu mencionei para vocês utilizando a estrutura do projeto como o cc2 temo, a gente já tem uma API disponível. Isso permite que a gente, ao invés de executar aquele comando pert encode encode que eu tenho que passar uma série de parâmetros eu executi uma uma requisição HTTP, né? Então eu posso executar ela como está mostrando aqui, um curl por exemplo, eu estou chamando o endpoint da minha API falando que eu quero create new car e passando o meu corpo, né? O meu corpo reparem que ele é um JSON, né? Então é bem mais trabalhado que argumentos posicionais e isso me permite também não só executar isso com curl, né? O que é um comando bem mais simples mas também jogar isso num somnia ou num postmen e criar uma biblioteca de requisições que eu vou usar para testar o meu template. E aí essa API também já te permite colocar um front-end ali para fazer requisição, enfim, te permite fazer coisas, né? E é exatamente isso uma outra ferramenta que a gente provê que é a opção de executar essa transação via uma interface web, né? Eu estou mostrando uma imagensinha dela ali. A gente tem uma interface web que ela vem automaticamente disponível onde você se adapta ao timecode que você está programando para que você consiga executar efetivamente aquela transação preenchendo o formulário no seu browser. Então isso fica muito mais simples é uma ferramenta muito boa quando a gente quer realizar um teste rápido e tal, não quer ficar mexendo com código de insomnia, montando request e corpo e essas coisas, né? Bom, então vamos ver um pouco disso na prática, né? Eu vou passar aqui para a estrutura do meu projeto, né? Na verdade, antes disso, eu quero só mostrar para vocês os nossos repositorios, né? Então aqui eu tenho um repositório, é um repositório do CEC Tools, né? Esse aqui é um repositório que a gente importa nos projetos, ele abre biblioteca de fato, né? Esse repositório é aberto, podem visualizar ele à vontade, contribuir inclusive, né? Se encontrar qualquer tipo de coisa, isso são muito bem lindas e aqui a gente tem o nosso repositório de templates, né? Aqui a gente vê que ele é um template público e aí você pode vir aqui e usar esse template, né? E criar um repositório seu a partir desse template aqui, né? Então ele já vai ter aqui uma estrutura toda bem definida de um team code já funcional para você utilizar. Então é exatamente esse repositório que eu quero mostrar para vocês. Eu tenho ele aqui na minha máquina, né? Então eu tenho aqui na minha barra lateral algumas muitas coisas, né? Alguns arquivos e eu vou passar ali a gente utiliza, né? Quando a gente está desenvolvendo o que é importante, o que cada coisa faz. Então o primeiro de tudo, né? É interessante notar que o nosso team code de fato ele está na pasta team code. Então aqui dentro eu vou ter toda a minha definição que eu expliquei para vocês, né? Então aqui eu tenho uma pasta de assets, eu tenho uma pasta de tipo de dados, uma pasta de transações e aqui é onde vai estar a definição do que meu team code vai fazer de fato, né? Então aqui, por exemplo, eu tenho as assets aqui e a gente tem, por exemplo, asset person, né? Você vê que ele está seguindo aquele exatamente aquele mesmo modelo que eu mostrei para vocês, onde eu tenho um asset vou registrar uma pessoa, né? E aí aqui eu tenho um ID que vai ser, por exemplo, CPF, eu tenho uma propriedade de nome que vai ser uma string, tem uma propriedade de data de nascimento que vai ser um date time e uma propriedade de altura que vai ser um número, né? Então eu tenho aqui o meu primeiro asset. Aí aqui eu tenho um segundo asset, por exemplo, de biblioteca, onde eu tenho o nome da minha biblioteca, eu tenho uma referência para uma lista de livros, né? Então aqui eu posso não só fazer uma referência para um livro só, mas para uma lista deles, né? Então aqui, e aí aqui no meu livro eu tenho efetivamente aqui o qual é o meu livro, né? O autor, essas coisas e quem tem quem tá alugando esse livro aqui, né? No cajum do biblioteca. É uma referência para uma pessoa. Então isso daqui é um team code já funcional de exemplo mesmo, que você pode usar como template, trazer isso para a tua aplicação e criar novos assets aqui, apagar os assets que já existem e utilizar toda essa estrutura. Bom, e aí que a gente tem as nossas transações, né? Então aqui eu, por exemplo, tenho uma transação que é uma transação de criar nova biblioteca. E aí que é uma transação simples mesmo onde eu recebo o nome do meu biblioteca. E aqui efetivamente eu vou pegar o que eu recebo, vou construir uma estrutura com as informações que eu recebi e aqui eu vou começar a usar as funções que o CC2 entrega para mim, como a função de new asset que vai gerar a partir desse mapa um objeto de asset que eu consigo efetivamente fazer o put, né? Fazer esse put new que é o que eu expliquei para vocês anteriormente para registrar esse asset de fato na minha blockchain. Então toda essa estrutura aqui ela permite que a gente faça o desenvolvimento de uma maneira muito mais efetiva, muito mais rápida, né? Porque as validações são feitas de forma automática. Então eu lembro que quando a gente começou a utilizar o CC2 nosso desenvolvimento diminuiu dramaticamente, né? Então quando a gente colocou isso numa biblioteca externa que a gente podia importar três meses para três semanas e não tinha encode. Então isso foi uma facilidade muito boa e é por isso que a gente fala com tanto entusiasmo, assim, sobre esse... sobre essa ferramenta. E aqui tem uma outra coisa que eu acho muito muito interessante mostrar muito legal que é os data types, né? Então aqui eu vou mostrar para vocês que a pessoa, ela é um... ela tem um ID que é um cpf e aqui eu tenho data types cpf que é um cpf, né? Onde que isso está definido? Isso daqui é um tipo de dado customizado e eu defino ele aqui. Então eu tenho aqui um cpf que tem um parâmetro, um parâmetro que é uma função de par-se então ele vai efetivamente fazer a validação desse campo para mim de acordo com essa função de par-se. Então aqui eu tenho toda a regra de formação do cpf e ele vai validar o meu cpf de acordo com essa regra de formação do cpf. Legal? Então agora falando um pouquinho de como eu tenho esse código aqui e como eu faço ele funcionar, né? Aqui eu tenho alguns scripts que vão fazer essa mágica para mim, digamos assim. Então o script principal aqui é o StartDev, né? Ele é um script que chama outros scripts internos em outras passas que ele sobe uma rede de testes local na sua máquina, né? Então ele vai subir três organizações com PIR com tudo que você tem direito em uma rede fabric para que você possa testar esse team code de acordo com uma rede que você consegue tornar complexa com várias organizações e tal e conseguir testar esses casos de campo. Então o StartDev ele é o script que faz isso para a gente e a gente tem alguns scripts auxiliares aqui, por exemplo, upgrade team code o upgrade team code ele vai efetivamente fazer o upgrade, né? Então eu posso subir a minha rede a primeira vez, aí eu testei e tem uma coisa que não está do jeito que eu queria eu vou lá no meu código altero rodo o script de upgrade ele vai pegar o meu código mais atualizado e vai fazer o upgrade na minha rede já em pé então eu não perco os registros que eu já fiz e eu não preciso subir todos os noges de novo, né? Eu só faço realmente a atualização dele que é muito importante, que é o RunCC Web o RunCC Web ele sobe a interface para a gente aquela interface que eu mostrei para que a gente consiga transarcionar sem precisar escrever nem mais um código de curl usar um postme então ele vai subir uma imagem dessa interface para a gente poder utilizar eu tenho uma rede aqui eu vou abrir aqui, eu estou agora no terminal vou dar um docker ps a gente vai ver que eu tenho um monte de container em pé aqui, né? esses containers aqui são os containers da minha rede então você vê aqui que eu tenho ccapi, né? o nosso team code api para as três organizações eu tenho pi, eu tenho caute eu tenho order eu tenho celi, eu tenho um monte de coisa aqui e eu tenho esse gol initos, né? que é a nossa interface então rodando aquele comando eu consigo acessar essa interface então é isso que eu estou fazendo aqui eu estou no localhost 8080 acessando diretamente aquele container que se comunica com minha api para poder buscar as informações do team code que eu estou executando aqui na interface a gente vê na minha barra lateral que eu tenho os assets já prontos aqui, né? essa interface o legal dela é que ela se adapta a qualquer definição de team code que você faça então aqui eu tenho personbook library e aqui eu tenho em baixo as minhas transações então aqui eu posso acessar o meu personbook eu tenho já um registro feito, por exemplo aqui eu estou no ambiente da org-1, né? apontando para api da org-1 mas eu posso apontar aqui para o ambiente da org-2, né? então posso subir aqui e apontar para o meu localhost porta 980 que é o ambiente da minha... oh, perdão... que é o ambiente da minha org-2 então agora ele está carregando aqui 980 e aí ele vai puxar toda a definição para poder mostrar então aqui agora você vê que eu estou na minha org-2 e aqui eu tenho os mesmos registros, né? aí você vê que aqui mudou um pouco a cara disso então agora eu tenho alguns assets que estão aqui em cima e outros assets que estão aqui como read-only o que que significa esse read-only? aqui eu tenho o meu person, vou ver aqui que eu tenho aquele mesmo registro que eu vou mostrar para vocês mas aqui dentro do Cessetus eu tenho a possibilidade de definir permissão de leitura e de escrita para os meus assets, né? então aqui dentro do meu asset person eu digo que os meus writers são a org-1 então quer dizer que só a org-1 vai poder criar isso dentro do meu... do meu team code, né? dentro do meu Ledger então se eu vier aqui como org-2 eu não consigo nem chamar, né? eu não criei aqui nem que funciona então eu não consigo escrever se eu tentar alterar isso daqui, por exemplo vamos dizer que eu vou alterar o nome do fulano para a ciclano vou dar um submit aqui ele vai me dizer que... opa ah não, o ciclano presta atenção que aqui é uma pegadinha, né? eu posso escrever aqui a org-1 ela pode escrever nesse... somente nesse parâmetro de id e no resto eu não tenho essa limitação então vamos fazer o exemplo que eu queria mesmo, né? e vamos adicionar aqui um writers vou colocar aqui meu org-1 pode ser o writers dessa... desse asset tipo person, né? então aqui eu vou pegar fazendo ao vivo aqui para vocês, né? aqui na Navo Ledger a gente gosta de fazer as coisas com emoção então eu vou pegar vou executar aqui fazer um upgrade 0.2 e aí ele vai fazer um upgrade nas minhas organizações então com isso como eu estou atualizando agora se eu tentar realizar um registro, realizar uma alteração nesse campo de name como eu fiz com org-2 e ele permitiu agora não é para permitir mais porque agora ele vai validar isso para mim dizendo que só org-2 pode fazer isso pode efetivamente fazer a atualização então vamos aguardar aqui um pouquinho eu não estou conseguindo entender ah, ok tem algumas coisas do zoom aqui na minha frente não está dando para ver o terminal inteiro vamos aguardar e fazer aqui o upgrade lembrando pessoal que isso daqui ele está fazendo isso literalmente ao vivo, ele vai lá nos meus peers ele instalou steam code nos meus peers ele manda a requisição de instantiate e isso é um processo que pode demorar ainda mais compartilhando aqui a tela é um processo que pode demorar um pouquinho nessa situação ok meu upgrade foi feito aqui com sucesso então agora eu vou voltar aqui para a minha minha aplicação e eu vou tentar realizar a edição desse desse asset aqui então vamos aguardar o processo de upgrade para quem não tem o conhecimento ele inclui a compilação desse código então quando você manda uma transação para um peer se ele tiver o código mas não tiver esse código compilado ele vai tirar um tempo para compilar esse código então isso pode demorar um pouco na primeira transação depois que você faz um upgrade com o instantiate tradicional do fabric deixa eu recarregar essa aplicação a sua rede está com quantos nós a minha rede ela está com três peers, três ordens compartilhar a metade e geralmente não me ajuda nessas situações mas vamos aguardar aqui mais um pouquinho beleza vou vir aqui no meu personal e vou tentar editar agora o meu campo de ciclando para a ciclone então ele vai realizar um invoke e a partir desse invoke ele vai lá com o código e agora a gente vai ficar de olho aqui na nossa direita para ver o que ele retorna para a gente se ele registra isso ou não, o tipo dele retorna essa etapa que eu mencionei dele e ele vai lá com o código toda vez que você faz um invoke pela primeira vez ele faz isso é um procedimento comum dentro do fabric pronto vamos voltar aqui vamos voltar aqui a gente ainda tem 10 minutos já pode preparar o fechamento beleza vamos voltar aqui pronto, está aqui org2 não pode editar a propriedade name isso é validado pelo sessetudo legal demorei um pouquinho aqui realmente, porque conta dessa questão do upgrade mas aí depois disso tudo a gente desenvolveu e tal o nosso tempo de tal legal como a gente faz isso para um ambiente de produção como eu falei a estrutura ela é toda funciona em qualquer rede fabric dentro da goled a gente tem o nosso próprio orquestrador que a gente utiliza para subir as nossas aplicações ele vai subir tudo isso em máquinas e motas ele tem várias sinalidades para você pode fazer o upload desse timecode e assim por diante ele tem a implantação de rede cyberled, administração de redes gerencia de timecodes bom, e aqui a gente também tem um pouco aqui são alguns dos nossos clientes que utilizam ou vão utilizar estão em desenvolvimento timecodes utilizando essa estrutura do sessetudo então todos esses aí ou já fecharam, já estão com redes em produção utilizando sessetudos ou estão em desenvolvimento agora conosco para utilizar essa estrutura toda do sessetudo para timecodes em high-perdade e ferro bom pessoal, peço desculpas pela demora é isso, muito obrigado e estou disponível aí para responder as perguntas maravilha, eu sou suspeito para falar porque eu também trabalho com isso praticamente todo dia vou iniciar com uma pergunta minha qual foi dentro dos timecodes qual foi o mais complexo que você já já implementou o mais complexo tem um tem um bastante complexo que a gente está a gente está desenvolvendo agora boa parte dele está bem legal, que é o timecode do nosso cliente da Tomb Traders para quem não conhece o projeto da Tomb Traders, um projeto de é uma mistura de vaquinha online para artistas e compra de direitos autorais para recebimento de royalties então é uma mistura desses projetos então toda a estrutura lá, toda a lógica está dentro de um timecode onde você tem artistas criando projetos fãs investindo em projetos isso é emitindo tokens para os fãs os fãs com esses tokens podendo trocar isso no mercado secundário enfim, uma série de questões a gente tem eu não consegui nem contar aqui quantas transações a gente tem então acho que seria um dos timecodes mais complexos que a gente já fez saras, pessoal, Samuel, tudo bem? tudo bom? é o Magnum falando, não sei se meu mico está parecendo para vocês aí eu queria que você definisse que eu tenho um timecode complexo porque o que pode ser complexo para você, pode ser simples para mim pode ser simples, o que pode ser complexo para mim, pode ser simples para você então isso é o que? é um timecode com vários métodos para poder receber transações ou é um timecode que cada método que recebe transação tem muitas variáveis de entrada são alguns timecodes que você trabalha é só uma primeira questão de definir o que é complexo caracterizar ele por favor beleza, vamos lá um timecode um timecode complexo de onde você precisa precisa de muitas validações você trabalha com muitos dados você tem muitas transações e você tem uma relação entre esses dados que não é não é óbvio, não é trivial então, por exemplo, um timecode um timecode no HyperLED Febre você não tem a estrutura você não existe essa estrutura de referência de um ácido para o outro então o CC2, ele consegue abstrair isso, pegar o que o HyperLED tem por baixo e jogar uma camada de validação de referências onde eu consigo fazer relacionamento entre ácidos, consigo acessar retornar a cadeia desses ácidos que estão relacionados entre si consigo fazer a validação o biométrico o biométrico é do Golbi isso, é, exato eu consigo vários exemplos disso, exemplos de rastabilidade, onde você precisa definir, por exemplo, um dono de um determinado loja de produto coisas nesse sentido o CC2 facilita muito esse trabalho porque eu não preciso essa camada de referência que nem existe no HyperLED Febre está pronta para mim então eu consigo fazer encodes muito mais complexos como se eu tivesse, quase que digamos um SQL, entre aspas uma camada relacional para trabalhar dentro de um Ledger agora que é uma coisa que não existe no chave valor tradicional então o CC2, ele adiciona essa camada para a gente e aí a última pergunta por acaso você tiver a necessidade de verificar onde há possibilidade de um chain code de acessar um Web Service ou um serviço externo à rede blockchain por exemplo, você está lá executando um chain code, mas esse chain code ele precisa carregar dentro dele uma variável de sessão e essa variável de sessão na verdade ela vem, por exemplo, o valor do dólar no dia ou o valor do dólar no fechamento do dia anterior e isso é um exemplo pode ter outros ou seja, existem várias formas de pegar isso, mas qual possibilidade seria ver o Web Service, alguma coisa externa a analogia aí seria os oráculos dentro do e-film por exemplo o que você já teve nesse cenário a gente já isso é uma funcionalidade que a gente tem muito interesse em desenvolver uma solução para isso no geral isso posa um certo problema que a gente ainda não explorou como resolver que é o problema de como a execução é distribuída você tem algum problema de resultados diferentes em noges diferentes por exemplo, se eles buscarem uma variável alguma API e ele retornar o valor do dólar em valores diferentes o resultado da transição vai ser diferente e o febre irá automaticamente invadir essa transação então isso é um problema que a gente gostaria muito de explorar que a gente ainda não explorou a fundo então a nossa solução para isso é jogar os dados que a gente precisa como entrada sempre essa é a solução que a gente utiliza atualmente mas sim, isso é uma coisa aí eu gostaria muito de encontrar uma solução e desenvolver em cima do CCTUS em relação à evolução do CCTUS quanto um pouquinho das melhorias que tivemos e o que vem pela frente certo bom a gente o CCTUS é um esforço aí que já vai fazer uns dois anos e a gente sempre vai encontrando alguma necessidade interna é melhorar alguma coisa melhorar algum tratamento algum comportamento ele começou com referência simples depois a gente pensou, vamos fazer uma lista de referências então eu mostrei aquela que ele colchei e disse de referências eu preciso receber um objeto que é arbitrário, não é uma referência para assistir um objeto qualquer ou uma rouba object que é um objeto arbitrário que você consegue acessar para fazer o que você quiser sem validações específicas então tudo isso aí a gente a gente veio melhorando nesses últimos tempos e assim, o futuro do CCTUS em termos de tem dois futuros que eu gostaria de falar um futuro que é o futuro para a comunidade a gente quer como uma solução realmente que faz sentido para quem vai desenvolver CCTUS então a gente tem um esforço de comunidade no Discord já está com 80 e tantos participantes que estão por interesse de desenvolver um CCTUS e a gente também tem alguns planos de expandir a ideia do CCTUS para outras para outras situações eu imagino fazer um CCTUS para mesmo para um CCTUS para a Solidity por exemplo então essas são coisas que a gente está explorando para o futuro dessa ideia legal, última pergunta para quem deve ter muito desenvolvedor aqui no nosso Meetup além da claro dos canais do Discord para aprender desenvolvimento de Tencold Hyper Radio Fabric que documentação que pesquisa que se sugere para os novos desenvolvedores eu sabia bom o desenvolvimento de Tencold para quem está iniciando eu acho que é importante iniciar pelos materiais que a Hyper Radio Fabric provei para a gente dentro da documentação do Fabric tem alguns links alguns tutoriais lá de como começar Tencold para a aplicação explorar esses Fabric sempre ver como ele funciona por baixo dos pontos é importante documentação eu sou desenvolvedor eu gosto muito de ler documentação essa é a grande recomendação para o início e para quem quer se aventurar dentro do CCTUS a gente tem nosso canal do Discord onde a gente dá o apoio conversa com o pessoal que está querendo utilizar e a gente também tem mais duas ferramentas mais dois recursos um deles é uma documentação Read the Docs do CCTUS que eu vou tentar fazer ela ficar disponível de uma maneira fácil no repositório de passar o link agora para vocês e também a documentação de código do CCTUS que ela fica no Package de Boa lá na página oficial de pacotes do Boa tem o CCTUS lá dentro e todas as funções estão comentadas tem tudo lá que cada função faz, que cada função recebe então na parte de CCTUS a utilização de CCTUS seriam esses os dois recursos excelente tudo bom, mas uma vez como sempre eu me empolgo bastante é um esforço muito, muito importante para a comunidade inclusive a ideia de colocar isso lá no laboratório para mim foi super válida na minha parte eu desejo que continuei trabalhando que a gente tenha três, quatro vezes por ano algum tipo de apresentação nesse sentido porque acho que a gente não conseguiu atingir as pessoas que devem ser atendidas por essa ferramenta sem dúvida ela transforma a maneira como a gente constrói hoje as aplicações é muito bom, eu agradeço aqui só um pouco um spoiler a gente já está trabalhando, a REST API já está aportada para Solidity a gente já está pensando em uma biblioteca em Solidity no futuro talvez em breve sensacional, sensacional tudo bem só mais uma vez obrigado pela presença obrigado pessoal Goliad, Samuel, o próprio Marcos Marcos, como sempre de sua presença muito bem-vinda obrigado a todos que tiveram junto com a gente contamos com a presença de vocês nos próximos eventos o Marcelo erguiu a mão o Marcelo quer fazer alguma pergunta? acho que apareceu uma pergunta no chat aqui existe algum esforço no sentido de fazer interações entre blockchains por exemplo, Hyperled é privado e a blockchain do Enfield é um projeto da própria Hyperleder que faz ministro, Cactus é um deles que explora esse tipo de coisa Hyperled e Cactus e da parte da Goliad isso é uma coisa que a gente realmente é uma coisa interessante que a gente gostaria de explorar muito bem pessoal obrigado mais uma quer deixar um recado aí quem estiver assistindo o vídeo depois pelo Youtube pode consultar o histórico aqui gravados pelo Hyperled tem várias outras apresentações demonstrando a particularidades e dicas de sugestões step by step da plataforma Hyperled a gente recomenda não é só por aqui, pode pegar o histórico e assistir tem muita coisa boa e acumulada como legado da comunidade obrigado pelo comentário Magno pertenente pessoal, muito obrigado mais uma vez e a gente se vê no próximo evento um abraço bom final de semana até mais pessoal, obrigado