Meetup #16 - Fully Homomorphic Encryption & Private Voting - Thiago Rocha

ERC55 Meetups · 6 Apr 2025 · 1:59:58

A hands-on workshop on fully homomorphic encryption in smart contracts, built with Zama's tooling on a testnet. It starts with a contract that doubles a number, moving from encrypting inside the contract to decrypting through a gateway and key management service, then to encrypting the input off chain with a zero-knowledge proof of knowledge and an access control list. The same pieces then drive a private voting contract that sums votes as encrypted values and reveals only the winner after voting closes. The speaker presents it as a high-level overview of a young technology and a live demo is cut short by a gateway outage.

Speakers

Topics

From ERC55 Meetups, hosted by ERC55.

Transcript

Perfeito. Ah, não. Foi. Foi. Bom. Acho que agora tá tranquilo para começar. Boa tarde, pessoal. Meu nome é Thago e não vou perder muito meu tempo explicando, tipo, falando quem eu sou, falando coisas assim, porque vai ser muito maçante, tá? Eu espero terminar em menos de 1 hora:45 mais ou menos, mas é muito conteúdo. É um conteúdo assim bem denso. Eu não vou falar muito matematique aqui, vou entrar por parte de planos como é que funciona em criptação. Eh, eu vou me trazer bem no high level, mas ainda passando tudo que tudo que é necessário para entender as entidades que que existem em cima de

um tá? [Música] Eh, aqui geralmente a gente manda os links depois, né? No final eu já vou mandar logo aqui. Não precisa tirar foto que não dá para ler muito, mas eu depois disponibilizo o o PDF da apresentação, tá? Eh, muitos links bons, muitos link bons mesmo. Os primeiros aqui são palestras que já da Tailândia fez esses ano passado, não lembro. Acho que três da5. Vou falar, acho que ser importante falar que é outros aleatórios, desde realmente homofío e coisas mais práticas que a gente é o que a gente vai fazer coisas,

tá? Ah, e esse aqui, esse esse link é muito legal que é um um livro de programa CTR e ele é bem matemático, tá? É esse daqui. Eh, ele tem um PDF aberto lá no no GitHub, pode baixar. E eles estão sempre atualizando. Isso é muito bom, tá? Dá um passo aqui para trás. R105. Um minutinho. Nós estamos uma comunidade assim de criados por brasileiros criados por dev. É de dev para dev mesmo. Uma comunidade open source sem fins lucrativos. E o nosso objetivo é trazer conhecimento técnico de língua portuguesa de conteúdo com conteúdo avançado, tá? a gente percebeu que de conteúdo iniciante eh de

tag para mesmo, já existem vários muito bons no Brasil. Eh, acho que o maior referência de quem da team, só que o nível mais intermediário para avançado, a gente sentiu que tem um um gap, sabe? Tem muitos dev, tem muitos dev bom devs bons no Brasil, só que essa galera tá muito espalhada. Então, a gente tá tentando juntar eh e compartilhar conhecimento, basicamente, de forma gratuita, aberta para o nosso objetivo principal, né, o MVP nosso, é um bit, eh, com conteúdos super legais assim de ponto. E esses três aqui são três sobre zonology. Inclusive Barba deu

uma uma t sobre sobre isso, né? Falou da PR um pouco sobre eh vou falar bem bem bem por cima sobre zic porque não é o foco. Zque é como se fosse um primo do Fit tá? Eh, vamos, tá, antes de começar uma curiosidade aleatória que eu achei legal. Tava pesquisando sobre esse tema, eh, sobre, eu tô há um mês basicamente respirando isso. E esse é um curiosidade aleatória que tem propósito mais para pro para pro workshop de hoje, mas esse é o maior número prêm encontrado até hoje. É muito é muito e imagina que uma carteira de Bitcoin tem 2 elevado 256 a

possibilidade, né? Então é muito grande. Eh, enfim, vamos pro que tem alguns disclaimers aqui antes de fato eh começar a um pipad. Calma, ficou? Ficou? Eu não sou especialista nesse assunto. Não sou especialista em criptografia. Eu não tenho PhD, não sou, não trabalho com criptografia. Eu tenho background de matemática, mas isso não é suficiente para falar que eu, pô, sou muito bom em terografia. Eu sou sou entusiasta, eu gosto bastante e eu tô perdendo um tempinho legal, estudando sobre eh enfim, eu falei, eu passei muitos tempos aí estudando. Eu ainda

tenho muitas dúvidas, ainda tenho muitas dúvidas sobre esse tema, mas eu acho legal compartilhar mesmo assim, porque pode ser que você também tenha dúvidas e as suas dúvidas sejam complementares as minhas. Pode ser que eu seja tenha resposta para alguma coisa que você não saiba e você tem a resposta para alguma coisa que eu também não saiba. Então assim, é muito boa essa troca. Eh, não vou conseguir responder todas as perguntas porque é um conteúdo muito assim, é muit são muitos detalhes, sabe? No uma coisa que no overview assim a gente consegue entender, que é o que eu quero passar para vocês, mas nos detalhes tem muita nuanciazinha que às vezes fica um pouquinho complicado.

Então é ler documentação, ler paper, basicamente. E é isso, vamos aprender juntos. Oi. Pretendo passar por estudo, por isso que eu tô falando um pouquinho rápido demais. Inclusive, se alguém tiver dúvida, a qualquer momento pode me parar. Eu não tô enxergando bem com essa luz, mas faz assim que eu vejo, tá? Eh, por que que esse tema é importante e o objetivo final do do Ritap? Vamos passar um pouquinho sobre o programa Criptógraf, o que que é as primitivas.

Então, os três principais pontos de de programo e como cada um deles temado, pô. Eh, depois a gente vai entrar de fato em efetivo, falar o que, falar bem por baixo que que é homorfismo, né, que é tá por trás do fato disso, né? Eh, a diferença entre os zompers, porque fly é uma delas, a existem algumas, e o que que é a tecnologia de o que que é o que existem várias palavrinhas que quando vocês começam a estudar sobre você vem desde nossa, tem vários, tem vários,

tem a mas a a principal assim que eu acho que você vai encontrar mais é o LW, que é errors. E é um princípio matemático, basicamente. Isso não faz sentido passar por aqui porque é muita matemática, mas basicamente o LWE você vai é é uma das é uma das coisas que torna possível barra que você tem você cria, desperta interesse em estudar sobre, mas não vou não vou falar sobre isso. Bootstrap é uma coisa que eu preciso falar, porque se quando você começar a pessou preventivo, você vai falar: "Ué, mas

como é que isso tá acontecendo? Como é que isso funciona?" Aí você precisa entender sobre trap. Eh, o que que a gente vai usar? Que que a gente vai usar hoje? eh, e tecnologias que estão usando efetivo no mercado eh hoje em dia. E, finalmente, a parte prática, que aí é a mão na massa. Eh, a gente vai fazer três dos três princípios que a gente precisa entender para fazer uma coisa mais avançada usando efetivo. E a gente vai fazer isso no exemplo seguid, ou seja, uma um contrato que você ele recebe um número, dobra esse número e retorna para mim.

Vamos passar para esses três passos, que é basicamente entrar um número normal, lá em 10 e criptar dentro do contrato e retornar ele decriptado para vocês verem que para vocês verem que tá decando. Então vai retornar uma coisa muito doida para mim. Segundo passo, a gente vai decriptar ali dentro do contrato para de fato quando entrar em cripta e volta a decriptado pra gente saber que tá funcionando. Eh, e entrar o o input já vai entrar. Terceiro passo, input já é criptitado pelo usuário offchain, eh, a gente dentro do contrato duplica ele, dobra eleitado e

decí, é tudo passo a passa que precisamos fazer uma coisa mais complexa. E vamos entender por trás de formas o que tá acontecendo, né, essas três com um pouquinho da arquitetura. Eh, o o que que tá acontecendo com as chaves públicas privadas nessa no F. E finalmente vamos entrar nisso de votação privada. Não vou codar do zero, eu vou mandar os códigos para vocês assim, copia e cola. Eh, mas vou passar por cada função importante. Depois arquitetura e a lógica da votação em si. E o nosso objetivo final é basicamente, tá? Eu vou falar do

objetivo final no objetivo final do metade. Legal. Eh, tá, vamos lá. Que que isso é importante? Eu eu ah uma coisinha, eu só coloquei texto, eu não fiz muito design do dos dos slides, tá? Então vai ser muito textão mesmo, tá? Não muito texto, desculpa, mas não vai ter nada de elemento visual. Eh, interfitação usada há muito tempo, isso é fato, eh, para várias coisas, né? Desde Ritação, signes né?

E beleza, isso é muito legal, a gente tá acostumado com isso. Só que as a maioria das aplicações ainda não são 100% a ponta, né? Eh, um dado que eu peguei no site do da Zama, que eu vou falar bastante hoje aí, eh, 95% das páginas de 24 envolveram entrado est mais ou menos na nuvem, ou seja, que não estávamos sem muito bem seguros. basicamente. E o Flit, né, essa coisa que eu tô falando há muito tempo que eu ainda não expliquei para vocês, mas vai ficar mais claro. Eh, o FT permite processar, permite a gente processar e interagir com os dados

infritados, ou seja, a gente não precisa decriptar os os dados para mexer com eles, para interagir com eles. Isso é muito bom. Eh, ó, tem alguns trofs, é muito caro, mais, mas é muito bom. E hoje em dia já tem caso é um avanço e dois fatos de viagem para que não é só somar e multiplicar número. Primeiro é análise doméstica. Então eu posso pedir para uma, não é professor, é sei o nome, uma uma casa de análise de de exames de médico para retirar alguma informação sobre a

minha saúde sem eu enviar os dados da minha saúde. Eu envio os dados criptografados, eles realizam a função deles para ver se eu tô roubou o programa ou não e me retorno de encriptado. Então, perfeito, ele não usam saldados, tudo muito bom. Um outro estado que usa é de reconhecimento facial. Na empresa que quer realizar reconhecimento racial para entrar em algum fazer qualquer coisa, não precisa saber a os meus dados biométricos para isso. Eu consigo validar em cima dos dados biométricos afectados de usuário.

E onde é que a blockchain faz isso tudo? Porque até então é uma entidade que não necessita de got. Bom, a gente sabe que botcha é simpl transparente, é muito legal, eh, mas tem alguns probleministas, curar todos os dados que nós vivem. Eh, então o FT traz pra gente privacidade na blockchain. É muito forte falar isso, mas com algumas nuanças é possível trazer privacidade para eh são três pontinhos para reforçar blockchain versus transferência privilizadas ofensivas é feito para essa

experiência e manter dados verificabilidade é possível confirmar validade de dados ainda assim estados e composabilidade que é muito legal também que a gente faz com que dois contratos possam interagir entre eles com os dados dados estão limitados. Isso é muito legal. Eh, tá. Ah, a imagem não foi, tá? Imagina, eh o nosso objetivo final desse etapa é desenvolver um sistema de votação privada em que o a pessoa que vai votar tá enviando isso daqui pro contrato.

Isso é o voto deleitado. E o resultado da votação final vai aparecer assim. O v o agir da votação, a pessoa que ganhou o o candidato ganhou e os votos ele fez. Tá? Eh, escrito feito. Não sei porque não tá aparecendo aqui, mas enfim. O usuário entra com estrado e a gente eh faz as operações, né, computações e retorna isso aqui pra gente pela gente conseguindo ler, verificar que a pessoa ganhou ou não. Eh, por enquanto tá tranquilo, pace tá muito rápido, muito devagar.

As coisas ainda estão muito obscuras, eu sei. Eu vou o o princípio de eu vou mastigando aos pouquinhos. Eh, mas enfim, tá tudo tranquilo por enquanto. Pessoal no chat, o PowerPoint vai ser disponibilizado, cara. Eu eu depois eu mando os links, mas a gente vê Discord ou WhatsApp, o grupo da Zap Discord. Ou eu eu posso mandar também um blast lá no no Luma, que nem eu mandei pro Zoom mais tarde, daqui a pouco, tá? Se preocupa não. Eh, show.

Perfeito. Agora vamos para metal. Programa de criptó, né? A gente fala um pouco de criptografia, legal, mas esse termo, programa criptógrafo, criptógrafo, ele é mais novo, ele foi criado por uma organização chamada Zero de Park. Eh, e o que que é, né? Bom, a o que a gente considera na primeira geração criptografia, que é hashing, que a gente tá matado, né? Basicamente é uma amção.

Você transforma um dado do paraa sa senha, né? A mais uma senha sal, mas encrypt que gera pra gente confidencialidade, né? Então, a gente consegue encriptar ele, encriptar eh dados, ptografia simétrica, assimétrica e f garante que basicamente também a gente ouviu falar. Eh, só que essas três, esses três filografia eles sãoados por, então de ele tem um específ um objetivo muito claro, né? ele realiza uma operação, ele tem um objetivo e e

compra. Eh, aí veio a segunda geração, que é o que a gente chama de programa comprut, eh, ele tira essa especificidade pra gente e deixa mais enga, só que por outro lado ele acaba sendo mais eh pesado, né? porque ele envolve algumas coisas que a gente tem que talvez aceitar mais para que não tá muito por dentro assim da matemática da coisa. Eh, mas é isso. Acho que nos últimos dois a 5 anos, talvez a gente falava sobre program, né? E os três principais ZC e F.

Ziquei o Barba comentou hoje mais cedo. NPC eu também não vou entrar muito. É o que você é o que eu menos que tem familiaridade, né? Eu não não estudei muito sobre isso ainda, mas é muito usado ainda. Ainda hoje em dia é muito usado, né? Eh, inclusive no Zão, que é o que a gente vai é o é o é o que a gente vai usar para implementar o ele usa por trás zeronology e muito par. Isso é muito legal. e o próprio Five, que é o objetivo da hoje. Inclusive, eh, eu não tinha chegado a tempo, mas falaram que o menino que falou da Arel, fez o meetap online da, ele comentou sobre a feitiça, music case de

silence. E eu vou querer dar uma olhadinha nisso. Assim que eu acabar aqui, eu vou sentar para dar uma lida para entender como é que funciona. Eh, aí eu vou ser mentor do Racatão também. ou qualquer coisa pode me chamar, eu vou estar aí para ajudar todo mundo. Eh, inclusive para entender mais para ajudar vocês. Então, é um tema que vocês talvez possam usar no racatom, talvez seja legal. Eh, e o próprio cara da árbitro falou como us case. Então, tá, essas que tão estão circular, né, onde tá inito, são as famosas program que vieram de, né, foram erradas, não, mas vieram foram as

gerações de futuras de coisas que a gente já tinha conhecimento praticamente. Eh, elas vem que generalizam as primitivas da da primeira geração, né? Tornando mais geral geral, né? Eh, e onde é que a gente tá atualmente, assim, mercado barra estudos, papers e tudo mais? A infra para programas criptógrafos, esses a gente conseguear, a gente deve não criptógrafo, consegue interagirar, isso é muito legal. Eh, bom, esse aqui é um um texto que eu tirei do blog do Zero X

Park, eh, Zé Spark que fez o livro também. Eu eu acho que tá no livro essa frase, não tenho certeza, mas no blog com certeza tá. O blog fala o que é programa, é programa as primitivas, né? as três e como elas interagem entre si. Eh, falando muito rápido, viquei, né, o B depois mais cedo, a gente consegue verificar uma coisa sem sem ter informação, sem ter o dado. Então, é uma professea zero, a gente tem zero informação sobre o dado e mesmo assim consegue validar validar certas coisas, né? Então, ofation, o MPC mu

computation, ele dá pra gente essa private competência. Então a gente não precisa trenuma nenhuma uma né, uma entidad dados e o FT a gente consegue a gente ganha o encrypted computation, então a a computação, né, as as operações feitas em cima de valores e eles, né, interagindo entre as as primitivas interagindo entre si, que é um dos conceitos que o programa eh não vai entrar muito detalhe, mas com PPC drive MC, ZP com F, a gente consegue verificar e e comparar,

né? A gente consegue verificar os dados e e fazer operações com eles, né? Porque esses computam traduzir muito bem do livro. Eh, e ciclo efeitivo, tributo de efeiti, tem se fala, eh, se fala muito também, é uma coisa que eu não que eu não ainda preciso dar uma olhadinha também. Fala, eh, F, Multibar F. É, é meio doido assim. Teve uma toque de de uma hora como ano passado falando só sobre isso. Bem legal.

É um segundinho. Barbara, você quer que te devol agora, finalmente entrando em fx de fato. Vamos entender o que que é isso. Primeira coisa é f encryption. Vou voltar aqui. Encrypt a gente já sabe.

Enctação. O fly é é uma palavra vou explicar as diferenças, mas fly é é o é o maior que táém. E homorf, o que que é homorf né? Homm na matemática, não vou ser muito matemático aqui, até porque eu não sou matemático, mas aí como um orquímo é basicamente essa função, é o que essa função prente e essa função vocês vão ver daqui há muitos slides eh da prática. Eh, então basicamente dois inputs de imagina que com fizado. Imagina que o initado de A mais o interado de B seja igual ao impritado de A + B. E é isso e o efeito trá pra

gente. Eh, não tá muito, não tá dando muito para ler, mas aqui é um 10, aqui é um 20. A gente intra o implicitar de 10, implicitar de 20. Quando a gente soma, a gente recebe muito dado porque quando a gente decidita ele vira trio. É isso. E falando mais técnico, o cliente inscrito dado X2, ele tá aqui. Ele envia o servidor muito print do X. Então o servidor só vai ter uma acessão implicitar do X. E o servidor ele vai realizar a função F.

F uma função e ele retorna pro cliente e desculpa, ele vai eh executar em cima de X e ele retorna o cliente de data de FX, ou seja, em nenhum momento ele saca, ele recebe o X, enfim. Eh, show. Agora a diferença sobre os impressions, como é que de tempo? Quatro. eh, tá a diferença com criples.

Pois é. Hum. Tá. Um segundinho, pessoal. É, eu tô com fone aqui, pronto, conectei de novo aqui. Vamos ver se vai. Eh, vamos lá. O home é um né?

É, eles há funções em cima de números habitados. É já o brin com o homic computador é só uma multiplicação, né? Né? Tudo pode ser escrito em somas e multiplicações em números, né? Porque tudo é um número de control. Eh, perfeito. Primeira que vem mais fraca, não mais fraca, né? Cada um tem seu propósito, mas a que dá menos coisa pra gente é a parte de rate que suporta apenas operação. Então tomação. E o exemplo é esse, não sei

como falar é o gamar talvez eh seista enganação. Quer dizer, ele é um que é um sobrenome de um cara muito bom americano barano, coisas assim. americano Europa. Eh, e é muito antigo. Então pô interessante tá? Eh, se eu não me engano, eu posso estar falando muita besteira, mas se eu não me engano, esse da é o que funciona no, né? Talvez quem acompanha DR aí já deve ter ouvir falar do se eu não me engano é esse canal que funciona com tá? Segundo é o samar ei, que a gente consegue fazer todas as

operações, mas com número limitado. Limitado, não definido, limitado somente, eh, antes de que o nós se atrapalhe, mais uma palavra que a gente não conhece ainda, nós. Em dois slides a gente vai entender muito o que que é o nós e o que que o good faz. O level page, eu acho que lembro, estudando sobre isso, você ouvi falar sobre o anime que eu falei antes, que ele permite um número limitado, só que definido de operações até o noise da programa. E depois novo permite execução ilimitada com

as operações sobre os cálculos, os dados criptografados. Então, né, para que qualquer problema pode ser representado como circuito de adições e multiplicações. Eh, e o que que é nós, né? Falei quatro vezes slide, mas que que é nós? O áudio tá de boa bom. Eh, a imagem não tá indo. Que doideira.

Tá? Eh, eu vou falar isso é uma descrição. Eh, todos os resultados infectados pela gente possuem um certo nível de nós para garantir a segurança na ou seja, o cerex, o texto entre ele é o resultado do dado entre mais esse nós. Imagina, tá? Tem cinco casinhas. Quando a gente pinta três casinhas são o tem uma casinha vaziante, três casinhas no meio de do valor infiltado, uma vazia, seis, seis casinha e a última é

um poise, ou seja, é o uma coisa que se cria quando você inita algum mundo. Eh, só que quando você começa a evitar em cima dos números, eh, quando você começa a fazer o prazer em cima desses números inventados, eles o o nós começa a metade, porque o nós vai entrando nessa parada do nessa sombra, dessa comunicação nessa operação. Eh, e o driving e existe para abaixar o nós. Então você tá fazendo uma operação em cima do valor que tá dois a chega uma hora que o noise vai ser tão grande que vai dar problema na no valor, tá?

E o serve para você abaixar esse noise e manter sempre o a a as operações funcionando. Então de novo, não dá para despo, mas aqui é o X, a gente cripta o X e ele tem um certo nível de noise. Quando a gente realiza a função em cima do valor invertise, calma aí, chega um ponto que o nós é muito grande e a gente não consegue, a gente não pode fazer uma outra função, eh, porque vai dar erro, vai vir um resultado errado. Para isso, a gente faz o trap, ele diminui o nós a um nível que a

gente consegue vai continuar as propriedades matemáticas. E com isso a gente consegue fazer uma outra função em cima dessa desse valor aqui, tá? Eh, basicamente é isso. Isso acontece em algumas aplicações acontecem por outras a gente faz na mão. Eh, show. Aqui na na parte prática a gente vai usar o Zama.

É uma empresa de de nãoic é uma é uma empresa geografia open sof que tá criando o como é que o como é que se isso, né? O o que tá de ponta no mercado, que a gente tá estudando mais de ponta, né? Sobre as soluções de para long. Muitos protocolos a gente usa a TR F como o Fix e o I dois muito famosos assim quando a gente fala de privacidade de eles estão usando trágic do arregal na hora que eu comecei a estudar sobre

na hora que eu comecei a botar a na mão da massa entender o que tá acontecendo por trás de fato. Então a gente usa o usando efeit que é é é o que é a tática para usar para mexer com efetiva putstrap level level automático. Então ele vai ele faz para mim esse boots automático. Eu não preciso me preocupar com isso. Não desse nível mais básico.

Eh base no é uma língua que a gente fala daqui a pouco. É, e o T permite usar o stret e cálculos arbitrales exatos, ou seja, o sistema ele tá realizando automaticamente esse projeto pra gente para reduzir o nós. Então é menos uma preocupação que a gente precisa ter agora. Vamos paraa prática. Agora, só relembrando, a gente vai primeiro fazer um contrato que pega um valor, dobra e retorna, coisa básica. E a gente vai colocando os níveis de incriptação nesse nesse passo a

passo até a gente ter tudo que a gente precisa fazer uma coisa mais avançada tá? E depois vamos para mais avançar, obviamente. Eh, o, enfim, eh, essa ol de com if na cepolia, eu tô falando de três, mas quiser pode fazer só com uma só, não tem problema. Eu vou mostrar o exemplo de três aqui para para ter um uma mínima um mínimo caso, né, de de votação, que são dois eleit Ah, obrigado.

Obrigado. Show. Perfeito. É, foi. Obrigado. Para tão ouvindo de boa? Tá de boa. Foi perfeito. Boa. Eh, para uma a votação, né, com dois eleitores e três, não, desculpa, com dois candidatos e três eleitores, né, que é o mínimo legal assim para ver que tá aconar e o AP da Etercamp para verificar os contratos. E vamos lá. Hã, rapedinho se eu chegar um pouquinho para trás aqui. Tá melhor.

Ã, bom, bom demais. Eh, a tela aqui. Então, o objetivo final dessa primeira parte é fazer um contrato que dobra um valor que entra encriptado e devolve o valor decriptado. O espaço, como eu já falei, entra o valor eh em PL tax, encripta dentro do contrato, que não é muito legal, já vou falar sobre isso. Dobra e retorna encriptado. Segundo passo é deccriptar o resultado de fato, né, pra gente ver que tá funcionando a multiplicação.

Eh, e o terceiro passo é entrar o valor encriptado, dobrar encriptado dentro do contrato e decriptar o resultado. Um parênteses aqui, eh, eu fui refazer esse passo a passo ontem para ver se tava tudo certo e e eu tive um problema no em uma das entidades que a gente precisa pro FIT. E eu achei isso muito doido, porque eu nunca tive esse erro. Aí eu mandei mensagem pro Discord do pessoal lá e eu marquei o pessoal todo porque se eu tinha percebido que esse esse erro não era meu, sabe? Era um erro de de infra mesmo. E eles falaram que provavelmente o sistema tava fora do A e eles iam resolver em uma hora depois tava tudo certo. Espero que não esteja algum problema e vamos lá. Eh, tá. Primeiro passo é entrar no

Eu vou eu vou tirar aqui para conseguir entrar aqui. Reforcar esse repositório aqui, tá? Lá no meu GitHub. Hum. Então, entra lá no GitHub e vocês vão dar um forque nele para ter com vocês. Esse esse repositório é um fork do template feito com hard hat que o Zama dá pra gente, só que eu mudei algumas coisas para facilitar onde você achar melhor, o que que você prefere?

Obrigado. Bota aí, bota aqui. Só botar um pouquinho mais embaixo aqui, mas tá de boa. aqui. Ah, agora sim. Oi. Oi. Alô. Alô.

Pronto. Alô. Tá. Eh, show. Eh, esse repositório ele é um fork do template hard que o Zama tem. Eu só mudei algumas coisas para adiantar, ser um pouquinho mais, dar um pouquinho mais coisas de mastigada para vocês e a gente conseguir fazer melhor, tá? Eh, eu acabei de ver que são 4:20 e eu acho que eu fui bem rápido demais. Eu tava eu tava imaginando que na teoria eu tava planejando fazer em duas horas e eu acho que vai dar de boa. Então, se alguém quiser fazer alguma pergunta, pode fazer.

Eh, em uma horinha dá para terminar. Vamos lá. Eh, depois que forca, faz um clone na sua máquina e vou fazer com vocês aqui. Essa parte eu consigo. Então, basicamente fazer um clone aqui, tá? Clone na sua máquina. Então, escolhe uma pasta. Aí vou entrar em 65 etap. Tá meio rindé. Vou dar um vou aumentar aqui. Pronto.

Clonando pasta e abre. Se você quiser usar, vou usar o cursor que eu tem usando cursor. Vamos ver se se vai dar se vai ajudar mais que atrapalhar, se vai atrapalhar mais. Eh, aqui efeito. Tá, primeiro passo, eh, vamos voltar para o primeiro comit que que tem nesse repositório, tá? Dá um hit log e pega o primeiro commit. Então, vamos lá. Aqui embaixo vai ter o first commit. Aí a gente pega aqui, tá muito ruim de ver. Pronto. Sim, acho que vai ficar melhor. Eh, pega esse primeiro commit, dá aqui para sair e git checkout. Esse commit. Pronto. Agora voltamos pro início, pro pra base, tá?

Eh, primeiro passo é ver as variáveis do ambiente. Então, aqui no no dot, dá um passar rapidinho que vai ser minimonic a sua a sua wallet, né, que você vai usar para depolar os contratos e tal. o RPC da Colle, a gente vai usar a CPOL aqui. Então, o RPC URL e o RPC, ah, o RPC da Cepolia é só dar um Google em Cepolia RPC URL, vai vir no um chainlist aí, escolhão que tá de boa aqui.

Eh, talvez esse aqui e o API aqui da Etheriscam, que a gente vai usar para verificar os contratos para conseguir interagir com eles via Etherescan. No caso aqui eu já tenho um ENV. Pronto, vai vazar um pouquinho, mas não tem problema não. Eh, aqui eu já vou explicar agora, mas daqui a pouco a gente se preocupa com isso. Basicamente, eh, essa, essas duas variáveis são as que vão votar no contrato que a gente vai fazer lá daqui a pouco. Eh, vai poder votar a a wallet que deploiou o contrato, que vai ser o,

né? E essas duas que a gente vai fazer para testar. Se não quiser, não precisa fazer. pode testar só com um voto mesmo. Essas informações são do gateway, que é eu vou explicar daqui a pouco é o que que é essa entidade. Eh, e aqui são as informações offchain pra gente encriptar antes de enviar pra blockchain né o valor. Então, acho que tá bom. Eh, agora dá um NP. Putz, eu esqueci de pedir para instalar antes dependências. Vamos, que a internet vai est vai ajudar. Vamos ver.

DNPMI aqui para instalar as dependências, torcer para não demorar horrores aqui. É, enquanto instala eu vou explicar eh o que que esse esse repositório tá fazendo. Dá para ver? Dá. Eh, basicamente aqui em contratos, em um contrato só, né? É simples para duplicar o o número, né? Então, que que tá fazendo aqui? Ele tem uma variável do número, uma variável do double, né? A gente seta esse número entrando um Oi. Ah, desculpa,

desculpa. Como é que tá? Tá tranquilo. Qual coisa falo, hein? Eh, então, basicamente, eh, a função para acetar o número não se preocupa muito com boas práticas de solite aqui. Eh, e no contrato principal do da votação também não tá tudo 100% muito bom, tá? Eh, principalmente o nome das variáveis, eh, eu fui fazendo assim no flow e algumas variáveis ficavam com ficaram com o nome meio tipo um pouquinho parecido, mas dá para entender, tá? É uma coisa de outro mundo também, mas é uma coisa para para melhorar no futuro. Eh, então set number, ele seta o número no contrato,

retorna esse número eh função para pegar o número dobrado e a função de dobrar o número e pega o número multiplica por dois. Então, basicamente, o fluxo é seta o número, vê se o número é o número, dobra e pega o número eh dobrar. Como é que tá aqui? Foi. Eh, show. E aqui o script de deploy, basicamente ele não tem construtor, né? Então, ele deploia, espera 30 segundos. Isso aqui é muito na mão, tá? Geralmente a gente espera por bloco, mas enfim, eu tava fazendo, eu dei uma liada na documentação do hardhead, eu tentei três vezes esperar alguma

quantidade, uma quantidade de blocos assim para validar e deu uns erros meio estranho. Eu não perdi muito tempo para para arrumar erro de setup, sabe? Eh, então eu fui no hardcode mesmo, 30 segundos é o suficiente e verifica. E com isso a gente consegue mexer com mexer com contrato viac, tá? Deixa eu já já instalou de dependências e vamos lá. Primeiro passo é encriptar o valor que entra, né? Então ele vai entrar em número normal, o INT 256 e lá dentro a gente vai

enctar. Já já vou tomar um pouquinho de atenção com isso, porque não é uma boa prática fazer isso. É legal a gente encriptar o offchain, mas eu eu achei melhor fazer desse jeito pra gente para tentar tirar da cabeça o nosso fluxo de pensamento enquanto coda, sabe? Então pra gente estar testando, vamos encriptar primeiro onchain, depois se as as operações esverem funcionando, né? Se a gente conseguir ver que tá funcionando, a gente faz, a gente vai melhorando, né? Então tira essa, essa encriptação chain, colocin tudo mais.

Eh, tá, vamos começando começar adicionando os importes do TFIT, que eu tinha comentado antes, né? e do e do Zama. No caso aqui a gente vai usar [Música] o a Cepolia, né? Então, show. Vamos lá. Aqui no caso é o contrato todo. Vou pegar esse contrato e vou mandar para vocês. Show. tá de boa.

Ah, então tá, a gente adiciona as import. Vai ficar com esses erros mesmo, tá? Não se preocupa, vai, tá funcionando. Eh, eh, define, né, o o as o que esse contrato é herda, né? Eh, aí agora a gente troca as variáveis de que tava antes como o int 256 para int, né, que é o encrypted, então o contrato agora tá sabendo que isso aqui é encryptado, né?

É uma, é um tipo do TF T, é TFT. Eh, ele é por default privado, mas de qualquer forma botei aqui eh o number e o douber, o number e o duplicado dele, porque os dois vão estar encriptados, né? No final ele só entra eh ele só entra PL text. Quando eu falo PL text é o valor normal, tá? está encriptado e dentro que ele vira encriptado. Aí dentro do set number. Vou vou tirar isso aqui para para melhorar um pouquinho a didática dentro do set number. Eh, o fluxo é o seguinte, a gente vai setar o número, né? Então é um valor que entra

como número normal, então ele entra como o 256 e dentro a gente vai encriptar, encriptar, tá? Porque essa não é a melhor forma de fazer. Então, ao invés da gente só setar aqui como number normal, né? Number recebe number, a gente pega dentro da lib. Então é tipo, eh, esse valor aqui que tá entrando, que é o int 256, como o encrypted, o in 256 e esse number, e esse number aqui, ele é o meu 256, né? Então, tá batendo. Eh, beleza, o set number foi. E quando a gente for duplicar, o número

vai tá encriptado, então não é mais fazer as operações que a gente fazia normalmente em solite, né? Eh, para isso a gente vai usar essa função chamada MU, né? Multiply, que multiplica os dois parâmetros. O primeiro é o número que a gente quer multiplicar, o segundo é dois porque a gente quer dobrar. e o double recebe esse número. Então a lógica tá fazendo sentido, certo? Eh, e as funções retornam eu in, né? O get number, get double, porque agora eles são eu int.

E ah, isso aqui é legal falar, flei um pouquinho, mas quando a gente faz isso aqui, eh, a gente tá multiplicando o número que já tá encriptado por um que não tá, né? Esse dois aqui é normal. E se isso tá certo, será? Tipo, por que que eu em vez de eu fazer isso, por que que eu não faço [Música] um sefeiti? É é por somas dor? Por que que eu não faço isso, né? Porque agora aqui eu tô multiplicando dois números encriptados.

Eh, na documentação do Zama fala que as os dois casos são possíveis, só que pra gente economizar mais gás, eh, mais gás, né, para gastar menos gas, o melhor jeito é só fazer isso se realmente precisar. E a gente não precisa, né, porque a função até diz que é para double, então não precisa disso. Então pode deixar só o dois, mas aqui, ó, usa os operadores em número normal sempre que possível para eh para economizar a gas. Pronto, agora a nossa lógica tá funcionando. Mas se eu deploiar, que que vocês acham que vai acontecer, velho?

Imagina eh compilou perfeito. Primeira interação que a gente faz é o set number. né? Vamos setar um número por contrato. Ã, a gente coloca o número que tá em 2256, um valor, sei lá, sete. Eh, beleza? Ele passa o valor pro encriptado de sete e coloca dentro de não. Até aí funciona, né? Vamos lá. Pensando que nem computador. Agora o usuário aperta em double number. O que que o computador vai fazer?

ele vai chamar essa multiply, né, que recebe esses dois parâmetros. Só que quando ele chega no number, ele lê e fala: "Pô, eu não conheço esse number." Por quê? Eh, uma dos umas das partes mais de segurança mesmo do Zama, eh a eh o lance do é ACL, né? Access control list. Então eu tenho que falar o que que o contrato tem acesso. Isso é muito interessante. Então aqui no set number, eh além de eu só passar o number para cá, eu tenho que falar pro contrato que ele pode ter acesso a isso.

Então eh existem duas formas de fazer, existem mais, na verdade, tá? Só que as duas mais básicas é o allow e o allow dis. Basicamente o allow dis é um é um é igual allow address. Em vez de escrever isso aqui, a gente pode simplesmente escrever escrever allow dis. Então vai deixar que o contrato que esse contrato, né, esse aqui tem acesso a esse número. E a mesma coisa pro double, que a gente precisa ter acesso ao valor duplicado, né?

Enfim. Eh, pronto. O aqui foi o que eu falei, né, do allow cerex, né, que é o valor encriptado e o address ou allow dis, que é a mesma coisa. Eh, e agora a lógica tá funcionando, tá tranquilo pra gente rodar e testar. E vamos deployar. Vamos, vamos ver se tá funcionando de fato, né? Então aqui tem um um scrive de deployer. Ele demora um pouquinho porque colocou aquele lance dos 30 segundos, né? Então, ó, compilou

e depois vai verificar só pra gente conseguir interagir via Etheriscan, tá? Pronto. Agora vamos Vamos lá testar essa brincadeira. Primeiro, os dois estão zerados, né? Temos nada. Agora vamos escrever o número, colocar, sei lá, sete. Então vamos colocar o número sete. Com isso, o contrato vai receber, né, dentro do set number e vai esse negócio aqui na frente, como é que tem esse negócio

aqui? Eh, e vai encriptar pra gente. Aí depois a gente vai chamar a função de double. Então ele vai duplicar esse valor que tá entreptado e depois a gente chama o double e a gente vai ver que tá um número gigante que não é 14. Então ele tá retornando pra gente alguma coisa estranha, mas que tá encada, porque a gente sabe que tá encriptada. Eh, deixa eu. Oi. Eu vou chamar esse double.

tá comendo. Acho que vai dar. Agora vamos ver. Eh, o number vai retornar pra gente, não o set, né, mas uma coisa muito estranha. Dar um zoom aqui também, perdão. Eh, tá vendo? Muita coisa estranha aqui. E o o double também vai retornar pra gente uma coisa estranha, mas que a gente sabe que tá encriptado, mas não sabe o que que é.

E com isso a gente termina a primeira parte do pensamento, né? E vamos pra segunda que uma vez que a gente tem o valor, os valores encriptados dentro do contrato, a gente vai decar, né, para ver se tá funcionando esse essa multiplicação ou se você tá tirando do além esses números, né? E de primeira não é trivial pensar como é que ele vai fazer, não é só uma função, ah, decrypt para mim, sabe? e vai entrar uma nova entidade nesse processo que é o Gateway, que eu já vou entrar mais, né, de fato, como é que o Gateway funciona.

Eh, mas é uma entidade que não tá no nosso contrato, mas que ele chama o nosso contrato, ele chama uma função do nosso contrato para decar. Aí o Gate manda para outro cara chamado KMS, né, que é o Key Management Management Service. E ele tem a chave privada. Então ele vai falar: "Beleza, eu posso, esse contrato tá disponível para para eu para eu receber uma request dele e decada. [Música] Então o gateway ele faz meio que a coordenação, eu depois eu vou botar um

gráfico que vai ficar mais visual e vai ficar mais fácil de entender. Eh, mas ele faz a coordenação entre o smart contract, né, a blockchain, o KMS e um outro cara chamado Coprocessor, que eu também vou falar daqui a pouco, mas que é basicamente a entidade que faz as encriptações, faz as operações, tá? E que também tem outra chave para esse cara. Eh, mas enfim, depois a gente entra em mais detalhes quando acabar essa parte do dessa dessa desse contrato que dobra. Segunda parte, vamos adicionar o gator agora, né, para decar. Eh, para isso a gente vai precisar fazer mais alguns importes que slide 8, slide tá, tá no nove.

Deixa eu ver se é só isso que tem aqui. Pegar tudo logo aqui e copiar para vocês verem. Então, o que que a gente tem de novo aqui? É o seguinte, eh, o gateway color e o gateway. Eh, isso aqui é para pra gente falar que nosso contrato pode chamar o o gateway, né, basicamente. E o a configuração do gateway que tá deploada na Cepolia, tá? Do Zama, tá deploado na Cepolia. Eh, a gente vou vou seguir aqui que tá um pouquinho mais legível. Já volto pro código. Tirar isso aqui. Tá aqui no meio. Hum. De novo aqui, né? né? São

nesses dois aqui e que a gente começa criando a a variável que vai receber o número degradado, tá? Que que vai que o gate aquele gator lá que eu falei vai retornar pra gente. Ele volta a ser o int, né? ele já não é mais encriptado, então ele volta a ser só o in normal, sem na frente. Eh, e a gente precisa adicionar as duas funções que vão fazer essa máscara acontecer, que é que são as duas funções, a que a gente chama, que que o Gatway chama. Então vamos por parte.

Essa função request decrypt number é a função que a gente usuário vai chamar, tá, para decar o número que a gente decriptar o que a gente quiser. Eh, aqui são alguns parâmetros que eu posso falar mais para frente, mas não é muito importante usar agora, até porque a gente não tá usando a maioria deles, tá? Eh, por exemplo, esse requested aqui que a gente vai usar na na no contrato de votação, a gente não tá sendo não tá usando aqui. Eh, mas basicamente vai, a gente pede pro gateway passar o double que tá em Win 256 para o int 256 e faz o recent da description. Nesse momento o o Gator que tá lá vai eh receber esse request e dando tudo certo,

ele vai passar [Música] pro pro KMS, validar se tá tudo indo bem ou não, se pode ou não, se esse contrato pode fazer essa requisição ou não. E dando tudo certo, a callback que o INT 256 vai ser chamado. Isso aqui é o nome que eu dou, mas que tá dentro do do contrato e que só pode ser chamada pelo gatwaying, tá? A gente, o usuário não pode chamar e basicamente ele vai retornar pra gente o valor decado e adicionar na nossa variável que a gente que a gente criou aqui no contrato lá em cima, né? A 1256.

E com isso volta pro request do crypt number, emite, deu tudo certo e deu e decripta, né, de fato. Eh, agora a gente vai deployar para ver se tá funcionando, né? Vamos ver se essa essa doideira funciona mesmo. [Música] Salvar e deployar. Eh, ser sincero que essa parte aqui do gateway eu não consegui fazer de primeira quando há, sei lá, um mês atrás que eu tava brincando com isso, eh, numa aplicação um pouquinho mais estruturada, não saiu de primeira. Eh, e, e tem muito mais coisa envolvida aqui, tá? Não é isso aí, pode ter lógica aqui dentro

também né? Mas depois que você entende de fato o que que acontece por trás, fica mais intuitivo, sabe? Perfeito. Foi. Show. Eh, de novo aqui tudo zerado, né? Perfecto. Então, a gente vai setar o número oito, por exemplo, e dentro do contrato ele vai

encriptar pra gente. Depois a gente vai dobrar esse valor. Tá.

OK. Show. Eh, agora a gente vai duplicar esse valor, né? Então, na teoria para ser 16. Eh, de novo, 16 em criptolen, né? Então, contrato já não sabe, já não conhece esse 16, né? Conhece o encrypt do double de oito, né? o encrypt do 8 x 2. E agora, finalmente vamos ver se essa mágica, se essa doideira acontece, né?

funciona de fato. Vamos request para decar esse valor double que a gente pediu lá no contrato. Essa função aqui que eu tinha falado, ela não é chamada pela gente, ela é chamada pelo pelo gatway, tá? Ela de fato vai retornar pra gente o valor decriptado pelo KMS, pelo é pelo KMS. E de novo, eh, esses três passos, esses três passos dessa, desse contrato que duplica, talvez ainda esteja um pouquinho obscuro o que que é gate, o

que que é kms, mas assim que acabar eu vou mostrar, assim que acabar esse essa essa mão na massa, né, para ver que tá que funciona, eu vou mostrar um gráfico, então vai ficar bem mais tranquilo de entender, um pouquinho mais tranquilo de entender, não é tão fácil assim também, Mas vai ficar mais visual. Eu acho que isso é muito importante, ficar mais tranquilo de entender quando a gente vê, né? Enfim, esse daqui é o nosso número oito, né? Esse daqui é o número oito duplicado, né? E aqui tem que ser o famoso 16, ó. 16.

Então beleza funciona. Aí tem, existe coisa aqui. Eh, voltar pro slide. Deu para ver que essa máscara funciona. Só que a gente, é o que eu comentei antes, né? Encar dentro do contrato não é bom, né? Porque a gente envia o valor em play text, isso não é muito legal. Eh, então é uma boa prática a gente encriptar ele off chain, tá? vai encriptar o valor que o usuário vai colocar no fronte, que seja, eh, encrypt off chain, envia pro contrato já offchain também não é tão trivial de entender assim de primeira, mas faz muito sentido e é muito legal o jeito

que que funciona, tá? Eh, enfim, o que que acontece agora é que ainda no fim a gente vai encriptar o o valor, o número que a gente quer duplicar. Eh, e a gente vai passar na set number em vez do em vez de um 256 normal, a gente vai passar dois parâmetros e esses dois parâmetros são o valor encriptado que o usuário tá colocando, tá? E lá no início do MAP eu falei que o o Zama ele usa por trás não só efetiv obviamente que é o forte, né, mas que é o que ele dá pra gente, mas ele usa por trás MPC e ZCK. E aqui que ele usa, aqui é um dos vários pontos que ele usa

porque ele dá pra gente quando a gente crirypto ofchain, mas dar para ver daqui a alguns minutos, mas quando a gente crypto of ele ele gera pra gente, né, o valor encriptado e uma prova desse valor. E isso é muito legal. ele chama de Z, eh, ZKP Okss, zero knowledge proof of knowledge. Eh, tá. Para isso a gente vai não ainda, ainda não vamos teórica eh lá no offchain, lá no sei lá, no front que seja, o ele gera uma esse valor, né, encriptado a partir

do contrato e da wallet, né, que que requisitou. E isso é um dos pontos que eu falei daquele access control list também. Pro kms só dá acesso ao que ele precisar dar, né? Eh, e esse valor que tá offin, ele ele retorna pra gente um input encriptado, esse input aqui. E a gente pode nesse input adicionar vários valores que a gente quer encriptar. Isso inclusive é uma boa prática chamada input.

E ele fala para, se você for fazer um monte de de incrementações, faz tudo no mesmo no mesmo coisa para ter só uma para gerar para gerar só uma prova, né? E enfim, no offchain a gente vai, a gente pode fazer desse jeito. Então, o input é debull para adicionar o o bolano que ele quer encriptar, é de oito para adicionar o número quatro. Eh, e quando a gente encripta, esse input handles, ele retorna tudo que a gente encriptou. Então, tipo, o zero seria esse false, o um seria esse quatro e por aí vai. E a prova que ele gera pra gente também tá em inputs. Input proof, que a gente vai ver no código daqui a pouquinho. Show.

Agora aqui no contrato no código, a gente vai criar uma pasta chamada offchain pra gente não precisar fazer nada fora daqui. Perfeito. E aqui dentro a gente vai criar duas pastinhas, a o SRC. OB nem precisaria criar, dá para puxar aqui dentro do próprio contrato aqui, aqui de dentro do repositório, né, em artifacts, eh, contracts e tá aqui o, só [Música] que imaginando uma aplicação que as coisas estão separadas, né? Não teria como.

Eh então show, vou mandar o código para vocês já já. Mas basicamente é isso, ó. dentro do offchain cria uma página RC e src e uma página EBI. E dentro do src a gente vai criar o server.ts, que é o que a gente vai executar para simular o offchain da parada. Então vamos lá. Hum. Vou pegar o qu aqui para vocês. Slide 12. Tirar isso daqui. 12.

É tudo, é tudo. Show. E dentro desse contrato, eu vou passar por ele agora para ficar mais tranquilo de entender. Eh, import, a gente vai usar o Eter para interagir, né? Eh, pega as variáveis do DOTV que eu que eu falei lá no início. Eh, aqui a gente vai passar o endereço do contrato que vai que a gente vai deploiar, tá? Para interagir. Tá bem hardcoded, mas é mais questão de para entender mesmo. Aqui são

as private keys que a gente vai, né, chamar ou interagir com o contrato. O número que o é o número que a gente vai pedir para duplicar. Então esse number, lembra que ele tá entrando no antes, ele tá entrando no set number, agora esse number ele vai entrar naquele, no caso 256, que lá no contrato é um 256 e depois a gente encripta, nem tava no slide que eu falei agora h pouquinho, né? E esse daqui e esse valor encriptado do number, ele entra pra gente no input, né? No no handles do índice zero. No caso a gente coisou só um, né? F dois, três assim, aí ia ser o dois ou um e tudo mais. Show.

Ã, tá, um pouquinho mais de de coisas técnicas aqui. Aqui a gente cria instância. Então aqui a gente nessa parte aqui a gente tá pegando a public do dessa brincadeira toda pra gente conseguir de fato encrepitar as p e a private kit tá com kms lá. com KMS, ele que vai fazer a, né? Não sai de lá. Ah, e o uma curiosidade, o KMS usa MPC, tá? Para não [Música] precisar, não é curiosidade, né? Mas enfim, ele usa MPC para não trust só uma entidade, uma paren, né? Ã, enfim, acho que aqui não tem mais nada de outro

mundo. Eles Ah, tá. Eh, lembra que eu falei que ele gera o além do valor encriptado, ele gera uma proof? E é isso que a gente vai passar no set number agora. a gente ainda não mudou, a gente vai mudar o set number lá no contrato, mas agora o set o set number, em vez de receber só o número, que no caso seria nove aqui nesse caso, a gente vai receber, ele vai receber dois parâmetros e dentro do set number ele vai pegar esse valor encriptado, então ele vai entrar encriptado, tá? Hum. Perfeito. Aqui a gente vai falando que precisa pegar o ABI, só que não vamos pegar agora porque ainda tá com contrato

antigo, né? Ainda não, a gente ainda não mudou o set number. E o que a gente vai fazer agora é slide 13. Pegar aqui a colinha para vocês, ó. Essa vai ser a nova função do set number que a gente vai mudar no [Música] contrato. Que que essa set não vai estar tá fazendo agora? Eh, ela tá recebendo o o valor encriptado e a prova dele, né? Eh, e ao invés do de passar o esse 256 aqui number, né, que é o que tava antes, ele a gente tá passando dois parâmetros agora, né, que é o que é o de fato o

encriptado e a prova. Isso aqui os chama de, se eu não me engano, é é trival encryption, se eu não me engano, eh que o a encptação trivial seria enviar o play text aqui. E essa aqui é a é o outro caso que é o mais boa prática, né? Eh, enviar o encriptado e a prova. Então aqui tá entrando encriptado e o contrato tá recebendo encriptado. Então eh ele já entra na blockchain encriptado. Isso é muito bom. Eh a gente coloca o valor encriptado dentro da nossa da nossa variável number e permite que o contrato tenha acesso ao number.

Ah, perfeito. Aqui eu tô comentando que o suporte proof é usado no ZKP, ó, eh, ZKP KS que é o zero knowledge proof of knowledge, para garantir a validade do dado que o a pessoa tá entrando. Então, basicamente, cadê para cá? Eh, aqui a gente tá falando que ele é um 256, né? Só que olhando isso aqui não tem como saber que então a gente essa prova, né, serve para isso. Eh, e tá esse input e esse bite caldeira, né, que é o tipo do que tá entrando. O input se refere ao índice do parâmetro encriptado, no caso, né, a

gente só encriptou uma, mas ele se refere ao índice lá. E o bytes é o cyfer em si e o a prova, né, encriptada para validar, né, pelo que é validado pelo T efetivo. Eh, e agora a gente vai testar. Vamos lá. Eh, deploiar o contrato novo. Então, salvou comand S aqui, tá? Enquanto ele aploia aqui pra gente, eu vou falar os próximos passos que a gente vai criar um script para rodar o arquivo server, né? Então, dá um

instala o TSX. Então a eh independência de desenvolvimento desse X pra gente só porque eu fiz com Typcript, na verdade, mas deve fazer com JavaScript também. Eh, e dentro do package Jason, depois que instalar, instalou, a gente vai criar um scriptinho para rodar esse offchain e a gente vai chamar ele de, sei lá, execute of chain, pode ser.

Então aqui na parte de scripts, no último aqui, depois do deployer, a gente vai dar um vírgula passa e vai dar um execute of cha aqui. TSX vê se a tomar cuidado para pro caminho, né, pro PF tá direitinho. Então, off change escrito certo, src server test, tudo certinho, né? Salva. Dou, eu já deve ter ido, né? Pelo amor de Deus. Foi. Eh, foi. Tá. Agora vamos pro que interessa.

Eh, perfeito. Aí a gente pega ali no terminal o endereço do contrato, adiciona dentro do server, pega a BI e copia na pasta offchain. De novo. Poderia ter pego direto aqui de dentro do repositório, mas aqui no double. Pode pegar aqui, tá vendo? aqui aqui passar o endereço do contrato aqui dentro de artifacts contracts double copia aqui e bota dentro de abi e pronto. Com isso a gente tem tudo que a gente precisa para tá certo, né? Eh, vamos lá

testar o como é que a gente vai fazer para testar, né? Aqui antes a gente tava chamando dentro do aqui a gente tava chamando pelo atan o white contract que que recebia o valor eh normal, né, em plx, só que agora tá recebendo encrypt suporte, support proof. Isso é mais tranquilo a gente fazer offchain, então quer dizer, mais tranquilo fazer via código mesmo. Então dar um npm run execute of chain que a gente chamou, né? Spe of chain. E vamos lá de novo. O que que ele tá fazendo aqui, né? Ele pega o endereço do contrato, gera a instância, vai pegar a public, pega o contrato, né?

Encrypt number, gera o encrypt e o import proof e envia pro e chama a função set number dentro do contrato. Eh, não sei como é que tá a internet, mas pode ser quiser que demore um pouquinho. Para ser rápido. Eh, ah, um detalhe, eh, que já dá para adiantar, ó, foi. Não, vamos adiantar logo. Eh, na, na, no esquema de votação que a gente vai fazer daqui a pouco, eh, essa prova de que 0 1 e 2 é

para para dizer diferentes que tiver que vão estar chamando para votar, né? Então, a gente só muda aqui. Vamos ver o que que ele vai retornar pra gente aqui. Da hora.

Ah, que beleza, hein? Eu comentei com vocês que ontem eu tive problema do Gator, né? Então, foi esse o problema. O esse eu vou mandar mensagem para os caras aqui agora no Discord para ver se se eles resolvem. Mas que droga, hein? Só vou antes de fazer uma passar aqui meu celular. Cara que bizarro. Isso aqui é porque, não sei, eles provavelmente

estão passando por alguma alguma alguma uma mudança lá. Eh, ah, uma observação importante, esse aqui é o gator da Cepolia, tá? Não é o da Mainet. Então foi mais é muito mais preocupante se esse aqui tivesse fora do ar numa mainet, né? Porque aí realmente é sacanagem. Só que aqui no Cepolia ainda é ruim, né? Mas a nível de preocupação é menor que o de uma mainet obviamente, mas é um erro de do gato e tá off mesmo.

Tá, vamos ver se agora vai. Provavelmente não vai porque não vai. Seria muita sorte se fosse vou abrir o Discord aqui já. aqui pro

pessoal, ó. Hoje às 6 da manhã, ele falou [Música] que devia tá funcionando. Olá. He. É, é, ó, ontem eu eu mandei esse mesmo print que vocês estão vendo aqui, ó.

E eu falei que eu tive esse erro, que eu nunca tinha visto isso. E ele falou que provavelmente o Git tava off mesmo. Então, eh, é, é mais azar mesmo, porque em um mês brincando com isso, eu nunca tive esse erro. Deve tá tendo alguma coisa, mas enfim. Eh, para adiantar um pouquinho aqui para ver se a gente consegue terminar antes das 5:30. Acho que vai ser muito difícil, mas enfim. Eh, se eles responderem, muito bom. senão, eh, eu, eu gravei um vídeo, não desse double, mas da votação. Eu posso mandar mandar para vocês também como é que tá funcionando, mas enfim, se der tudo certo, ótimo. Senão vamos continuar

aqui. O que que iria acontecer, né, se funcionasse esse código aqui off chain, ele ia encriptar pra gente o valor, o set number ia receber encriptado. Aí uma vez encriptado aqui pela pelo Etheriscam mesmo, a gente ia double esse valor, apertar aqui normal porque ele já teria o valor encriptado e depois a gente ia fazer o request para decar o o valor dobrado. A partir de do desse request, a gente já fez tem, né, agora a pouco. E aqui no read contract, depois tu tu tivesse feito esse number decrypt, ia aparecer 18, né, que é o a gente

passou o nove aqui server, ó, nove. Então ia ia aparecer 18 aqui. Então com isso a gente teria o end to end. Então, ia ia encryptar of chain, entrar no no e decptar via gateway. E com isso a gente teria o end to end de uma aplicação simples, rodando, funcionando. Ver se ele respondeu aqui. Não é, não sei se vai ser tão rapidinho não, mas enfim.

Eh, tá, vamos continuar aqui com conteúdo que agora a gente agora vai agora vou explicar um pouquinho melhor como é que tá funcionando por trás dos panelis, né? Esse que que é esse gateway, que que é esse kms que a gente tava falando tanto aqui. Eh, show no fluxo teórico da parada, né? Eh, de fato, o que que acontece? A, o FIT VM é uma arquitetura básica que permite aplicações, né, que permite operações e afeiti em EVMs, né? E esse tier feiti, como é que eu vou aumentar aqui para vocês? Esse ti é uma biblioteca do Zama

e os principais componentes são o contratos né do FM, o gator, isso que eu já tinha falado, o coprocessor e o KMS. De novo, o gate ele é esse intermediário entre o blockchain, Kms e Coprocessor. Esse que o processo é o que realiza operações encriptadas e o KMS é o que é é onde fica a private key, é onde faz a validação das operações, a dectação em si, eh onde faz esse management do access control list e as validações do zeronology, que nem eu falei, eh ele é descentralizado através centralizado através de MPC, tá?

E essa arquitetura ela utiliza symbol execution, que eu vou falar um segundo, mas basicamente é antes de enviar pro processor executar, ela faz essa symbolic execution e utiliza também ZPG para garantir a confidencialidade dos dados, tá? Eh, falar um pouquinho de chave, né? Porque criptação, dectação existem chaves, né? E até agora eu não falei muito sobre isso. Eh, como ele faz? A publica é conhecida, né, através daquela instância que eu comentei, tá? Até a fotinha aqui do daquela mesma parte do código que eu falei antes. Eh, ela é conhecida e a gente usa ela para encriptar de valores,

só que a private que por outro lado, ela é só conhecida pelo KMS e, ou seja, só o KMS consegue decitar pra gente eh usa o protocolo MPC e tal. E essa evaluation key também que eu não tinha comentado antes, é o que o coprocessor usa para realizar as operações em cima dos encriptados. Então uma fotinha, não sei se dá para ler, mas calma aí, vou passar aqui para baixo, ó. A public, basicamente ela encrypt, private key, ela decrypta e essa evaluation key, ela faz operação em cima de dois encriptados, retorna. Ah, ah, dá para ler, tá de boa.

Eh, um pouquinho do fluxo aqui tem o o nosso front, ele interage com, ó, o front interage com o nosso smart contracts, que vez interage com o efectiv e é nele que tem a public, é ele que a gente usa para encriptar. ainda é um eh aí o quando a gente vai chamar o gator, né, que a gente fez para decar, eh, o gatito ele, na verdade, ele é um passo antes do KMS, né, como já tava falando há um tempinho, ele é ele é o orquestrador da parada.

Eh, se for fazer operações em cima dos encriptados, chama o coprocessor que tem a evaluation key. Se for para encriptar de fato, eh, vem o gate. O gator envia o request necessário pro kms, que tem a private key, eh, e ele retorna pro gator e o gator retorna pro contrato ou seja pro para um valor final ou para um um valor que esteja sendo usado, sei lá, para outro contrato. É, e também tem reencrypt, que eu não vou conseguir abordar né nessa talk, mas é basicamente assim, não é nem muito bom chamar assim, mas é basicamente uma troca de chave pública com privada, ou seja, eh eu

tenho uma uma entidade, né, que que faz enqutação e dectação e eu quero eh encriptar, eu eu quero conseguir decriptar com a minha chave privada, um valor que tá um valor que é possível decryptar pela chave privada do kms. Então o no rencrypt, o KMS que tem a chave privada de cripta, encripta com a chave pública que eu tenho, né, que é, quer dizer, não é que eu tenho, que é minha e que é pública. E agora eu com esse valor encriptado que o que a MS me dá, eu consigo decitar com a minha chave privada. falando muito por alto é isso, mas tem muito mais coisa por

trás. Nossa, que droga. Tá, mas não tem problema não. Acho que tem uma, pô, mas todos assim, tá? Essa aqui é o que importa. Eh, aqui eu passando mais por por dentro de cada passo, né? Então, encrypt o o client, né? Offchain usa public aqui para encriptar e o dado encriptado entra na blockchain. Eh, graças ao ZP, né? Zer CR of Knowledge, eh, garante essa validade do dado encriptado sem precisar revelar. Na parte de computation, eh, ah, tá. Basicamente aqui essas essas três imagens aqui seria tipo assim e encriptação, entra dado, sai da volta,

tipo, vai dado volta d encriptado. Eh, aqui no computation e realiza as operações encriptadas usando o evaluation key no coprocessor. Eh, e o fluxo é blockchain inicia essa symbol execution, gerando uma série de operações. Então, o que que vai ser feito eh em cima desses dados? E essas operações são enviadas pro coprocesso. Ele faz o processamento dessas operações de fato usando evaluation key e o coprocesso retorna pra gente o resultado. Eh, e na descryption o KMS tem apóst privada. O gateway atua, né, sendo intermediário entre a blockchain, né, o meu contrato e o

KMS. E ele envia esse decryption requer request tá? Ele criptou usando a private que retorna o valor. Esse aqui é muito legal para entender. Acho que dá para aqui não precisa ler não, mas o que importa são esses mais negritos. Ó, tem a Alice Alice, eh, primeira coisa, ela faz request para para ter o dado decryptado, né? Aí aqui é o gateway. request decryption, que é exatamente o que a gente fez no nosso código.

Eh, deixar rodando aqui, vai aqui, né? Eh, que é aqui, ó, gate. Description. É exatamente isso. Aqui, tá? Eh, uma vez que ah, ele se chama esse request, o contrato do gateway, que tá deployado no caso na Cepolia, eh, ele envia a request, né? Ele recebe essa request e o Gate, uma vez que tem esse request, ele envia pro KMS, né? Eles ele envia o descryption request, como se

fosse, não sei se é com essas palavras, mas enfim. Eh, ele envia isso que faz a requisição para decriptar. Ah, meu Deus. Tá, resolver isso. Putz, não é possível. Vai ficar me atrapalhando mesmo tá? [Música] O, é uma vez que o KMS vê que tá tudo funcionando direitinho, né? que que graças aquele access control que eu já tinha comentado antes, o ele vai retornar pra gente o valor decriptado bonitinho. O Gator recebe esse valor e manda um fulfill, né, pro pro contrato para volta onchain

e depois que tu vai ficar mandando aqui, sério, computadorzinho, meu Deus, tá quente, hein? Tá. Eh, deixa eu olhar aqui. Aí manda pro contato do gateway. E esse gateway ele ele chama a nossa callback que tava no nosso contrato, que só é chamada pelo gateway, né? Essa only gateway aqui, ó. E com aí nisso ele dá pra gente o valor decitado. Esse gráfico é realmente muito bom para entender de fato o que tá acontecendo. Então ele envia pra gente callback e com isso a gente tem o valor decriptado. Pronto. É isso. Esse é o fluxo teórico. É o que acontece por trás

dos panos. É o que essas essas funçõezinhas aqui estão fazendo tá? Eh, são 5:20. tava planejando acabar 5:30. Eu vou dar uma pulada aqui em algumas coisas. Eh, tem alguém fazendo junto comigo? Acho que não, né? Deixa eu ver aqui no zoom. Imagino que não. Eh, o que eu ia fazer a partir de agora é é de fato entrar no fluxo teórico, eh, entrar no nesse case de votação privada que a gente vê realmente a mágica acontecendo, né? CAS real não

defendi. Eh, e eu ia, eu não ia codar, eu ia mandar o copia e cola mesmo, só que função por função. Ao invés disso, eu vou entrar no projeto que eu já tenho aqui no na minha máquina e vou indo com vocês, né, no nos contratos e nas entidades [Música] para para ganhar um pouquinho de tempo, porque já já vou passar um pouquinho. EV case eh, sistema de votação privada, né? Lá no início do MAPAP eu dei algumas alguns casos reais, né, que FT podem solucionar e votação é um deles que eu não vai falar até então. Eh, objetivo agora é a segunda parte, né, a parte final, é desenvolver um sistema de

votação onde algumas pessoas podem votar. Eh, no caso, a gente chama de eleitor. Essa votação específica, né? Em cada votação, o eleitor envia o voto para blockchain encriptado. A gente sabe fazer isso já. O contrato da votação, ele ele faz as operações, as somas dos votos, né, as lógicas, né, eh, em cima dos dados encriptados e armazena os encriptados. E quando a votação acaba, a gente revela o vencedor. Ou seja, só depois que a votação acaba, a gente pode fazer um request para decriptar o o vencedor, né?

O vencedor e e ver o as informações dele, né? Eh, antes de codar um overview, eh, o que que a gente tá fazendo de fato, né? Bom, o o fluxo que seria muito legal da gente fazer, que não vai ter como fazer aqui agora, seria na parte de de validar o eleitor, daria para fazer um ZP, né? Eh, enfim, o Barba entrou em mais detalhes sobre o que que é ZP hoje mais cedo. Eh, e na RC55 a gente tem também três ou quatro MITAPS sobre ZP, mas basicamente a gente conseguiria validar o título de eleitor do do eleitor sem

saber o título em si. E é isso que Zquei faz. Então, daria para fazer uma e essa esse passo antes falando eh mostrando eh pro pro contrato da votação que aquele aquele eleitor é válido por causa do título de eleitor dele, sem saber o título de eleitor. Eh, e a única coisa que mudar no nosso contrato principal da votação é é enviar dois parâmetros a mais no na função de votar, sabe? Eh, enfim, aqui eu tô explicando que a gente não vai usar para facilitar o desenvolvimento porque o foco é feiti, tá? Eh, e aqui é a arquitetura completa, sem falar de zic,

tá? Eh, eu vou dar um zoom aqui pro pessoal presencial, mas basicamente o primeiro passo eh, não tá muito bonito, tá, pessoal? Mas enfim, o her do contrato ele deploia, né, passando, no nosso caso, a gente vai passar uma a rede de eleitores válidos para como se como se a gente fosse mocar o ZP. Então, existe um outro contato que a gente vai fazer chamado verify proof and get voted, que na eh o caso ideal, né, ele passaria os a as execuções de ZP dentro dele e retornaria pra gente voltar caso fosse válido. No nosso caso, a gente vai mocar isso.

Então, a gente vai passar uma rede de eletores válidos que são carteiras, né, que podem votar. E a lógica dentro do verify proof and get é a mesma, acaba sendo a mesma. a gente vai gerar um hash eh para cada usuário para garantir que cada usuário só pode votar uma vez na votação. E perfeito. O Honer também ele pode criar votação. Eh, ele é a única pessoa que pode, ele é o único entidade que pode criar uma votação, chama create volt. A estrutura da votação é desse jeito aqui. Ela tem um volt, que é um increment, tá? 01 2 3 o end block quando o bloco termina, quando a votação termina, desculpa, uma rei de

candidatos. [Música] Então o eleitor ele vai escolher o candidato dentro do eh escolhendo o índice do AI. Então, tipo, se a pessoa votar no um, ele vai votar no Bob. Quer dizer, se ele votar no no Bob, ele vai escolher um Charlie do, enfim. Eh, óbvio, teria como melhorar isso, mas para tornar mais melhorar a experience na UX, mas enfim. E a descrição da votação agora pro eleitor, né, qual é o fluxo dele? Ele pode votar. Então ele vota, o voto é encriptado ainda offchain, né? A blockchain tá aqui dentro, ó. Tens aqui eh ele envia o o ID da votação que ele quer

votar e o voto encriptado para para pra função de votar. a gente faz umas validações, então vê se o candidato é válido e para isso a gente chama aquela função do outro contrato. Se ele for, ele retorna o volter ID e com isso a gente sabe que o esse esse usuário já votou nessa votação. Eh, a gente vê se o candidato já votou, se não, procede, continua. Eh, a gente vê se o voto ainda tá aberto, né? Se ainda se ainda pode votar. Se sim, o voto é é feito, é cadastrado e uma vez que a votação acaba, qualquer pessoa pode request o vencedor, né? Eh, isso é aberto,

qualquer um pode fazer isso. E para isso ele ele chama essa função de request winner encryption, passando o ID da votação que ele quer saber o resultado. Ele vê se o o a votação ainda tá aberta. Se não te aberta, ele pode. Se ainda tiver aberta, ela não pode ver o resultado, obviamente. E uma vez que ele que ele pode ver o resultado, eh, ele envia esse resultado encriptado pro gateway, o gateway retorna, né, manda pro Kess, Kess retorna pra gente o valor decriptado e com isso ele tem o resultado.

Tá, dentro do contrato vai ser o seguinte, a gente tem o exro do Volt, que tem o o bloco que termina, né, a votação, a quantidade de pessoas que votaram no total, eh, a descrição e o estado da votação. O estado da votação pode ser que ainda não foi criado, que foi criado, que ele tá request para ser revelado e que ele já foi revelado. E também tem um candidato que tem o nome e a quantidade de votos e tá encriptada, tá? Essa esse V está encriptado e é isso que a gente vai validar e decriptar quando quiser ver o resultado. Eh, aqui são os mapers que que faz para para ajudar, mas não precisa entrar em detalhe, mas basicamente, né, número de, né, o number of votes para gerar o ID, é o incremento

0 1 2 3, vai somando eh o map das votações para ver se o eleitor já votou aí na votação. Volte, voltar, né? Volter ID é o resto que é gerado e o vol é o da votação, os candidatos de cada votação e o resto é é a gente só usa para parte de decrypt para fazer um for, tá? Isso é um pouquinho mais bem feito. Os eventos, né, são eh a gente tem um evento de que é o voto foi criado, o voto foi cadastrado, né? já não é palavra, mas a pessoa votou que o voto foi request para ser revelado, o voto foi revelado e o e finalmente o evento de que o winner

[Música] foi anunciado. Os erros e as funções que a gente tem, eu vou passar em cada uma delas já. Então, ó, aqui é um é um high level view, né? Tem uma votação que tem o ID1, por exemplo, bloco 1 2 3 4 56 e essa são e é o ar usuário de ID 1 2 3 não é isso obviamente né não é esse tipo de ID mas de de volta ID mas enfim usuário com ID 1 2 3 ele quer votar no Bob ou seja ele vai passar a votação o encriptado do um número um tá na votação ou seja o ID da votação

um passar o encriptado de um que é o valor que ele quer é votar no Bob. E uma vez que ele faz isso, ele emite o que ele votou na votação um, tá? Esse um aqui é, perdão, esse um é da votação e não do valor que ele votou, obviamente. Eh, quando eu passo o vols um, ele ele retorna pra gente essa estrutura da da votação para ver se o a pessoa já votou. Então passa o índice, o do da votação, o índice da pessoa, ele dá true. Então ele votou, então ele não pode votar de novo.

E aqui é para ver os candidatos da votação específica. Então o candidato de índice dois é o Thago. Se eu tirar isso aqui, ele vai aparecer em já. Então tá. Eh, agora, eita, agora a segunda parte, a parte final é de fato fazer o sistema de votação. Eh, eu vou entrar aqui no no código feito e que eu já que eu já tenho, né, e passar para passar com vocês em cada função antes que a bateria cape. E tá, nós vamos ter duas interfacees, uma para cada contrato, né? O contrato do do, né, do manager de identidade, que é o que vai ver pra gente se a pessoa

pode votar aí, se puder ele retorno o ID. Eh, e finalmente o sistema de votação, tá? eh, que eu aqui eu já volto, vou mostrar dentro do código que é melhor. Então, basicamente as duas interfaces os dois contratos e aqui a função de cada contrato, eu vou parar aqui que aqui o script deploy, eu volto para mostrar. Bora. Foi, tá, ele tinha dado aquele mesmo erro, ainda não fui pro fim. Eh, vamos sair aqui. Cara, isso é muito chato, meu

Deus. Deixa em paz aí. Eh, voltar aqui rapidinho. Caraca. Ah, gosto. Tá. É como tá tá chorando, meu Deus. Tá onde ele tá? Ah já

sei. Aqui computador tá no limite, coitado. É, tá. Agora vamos passar por cima aqui [Música] de cada parte do contrato de votação, tá? Primeiro a interface do Identity Manager, né, que é o cara que o contrato que é responsável por ver a a identidade. Então, basicamente ele só tem um erro de noroud e a função. E aqui doent manager, vamos lá. Eh, deixa aqui do lado que vem

para aqui, tá bom? Eh, hum, aquela arreocado, aquele arremmocado de pessoas que podem votar, né? Ele passa no quando eu, quando eu crio o contrato. E nesse verify proof, eu tentei deixar do jeito mais legítimo de que se tivesse funcionando com ZP seria, tá? Então aqui seria passado alguns parâmetros do ZIK, tá? Eh, no caso aqui a gente não tem o que passar porque, né, a gente não tá fazendo uma vez validado, né, ele ia gerar um rest e esse hash que a gente tá

fazendo aqui, que é c é o que ia ver a ia é o que ia gerar o o ID único do de cada usuário, né? No caso aqui a gente tá fazendo em cima da wallet que o a pessoa tá chamando do contrato tá? Eh, mas só para criar um layer a mais [Música] de tipo esse é o fluxo, sabe? Tá aqui é a lógica para ver quem que ele votou, certo? Não, desculpa, para ver se ele pode votar, dando que sim, break passa e ele retorna o voltered que a gente gerou no resto, tá?

A interface do sistema de votação, ele de novo, tem aquilo que eu já mostrei no nos slides, né? Estatus da votação, candidato. Isso aqui não precisa, esse aqui também não precisa ser result aqui. Eh, o resto de tudo eu falei, block, v count, description, os eventos que ele emite, os erros que ele pode dar e as funções não internas, né? Eh, tá. Agora de contrato, o contrato principal em si, né, que é onde a a lógica toda tá, tá bem no cantinho aqui. Hã, aqui tudo a gente já conhece, né? Is aqui tudo a gente conhece que a gente fez no no

double, oable pega do opening normal e as oent manager e o a interface que a gente criou. Eh, pega tudo isso aqui. Deixa eu Aqui são todos os maps que eu já tinha falado. Eh, aqui na hora do construtor a gente tá passando a a rei mocada da das pessoas que podem votar. Só de fato para fazer esse esse lei de segurança mais né essa simulação. Passa esse essa rede de endereços pro ident manager para ele saber quem pode votar.

Agora vamos lá. A função de create vote, ela só pode ser chamada pelo owner do contrato para ela criar pro para ele, né? Ela cria uma votação. Preciso passar o o bloco que termina, a rede de candidatos e a descrição. Já tinha falado dentro dessa dessa função de create volt. Eh, a gente pega o volt ID, que é aquele incremento que eu falei, em zero, né? Vai indo, ele gera, ele cria o voto em cima desse índice que ele ele pega. É, a votação, desculpe. Para cada um dos candidatos, ele ele gera, né, o candidato em si que tá aqui em candidates do voto, o índice tal, e ele permite, né, aquilo que eu outra coisa

que a gente fez lá no Numbera, no double, no exemplo anterior, ele permite acessar o contrato acessar o valor do voto que tá encado, tá? Eh, de novo, isso aqui poderia ser só um allow dis, né? Lembra? Enfim, eh, ele certo o status da votação como criado, aumenta o número do voto pro índice seguinte ser, né, um a mais e emite que o voto foi criado, voltando pra gente o volt ID. A próxima função, né, principal é a cash v que é realmente para votar. Aí nisso, eh de novo, existe o encrypted suporte e o suporte improf que a gente de a gente

também fez lá no number para no double, né, no exemplo anterior para pro usuário encriptar a a escolha dele off chain e enviar pro contrato down chain. E daqui a pouco eu mostro do o script de deployer de de deployer, não, desculpa, de do offchain que tá nesse nesse repositório, ele escolhe o ID da votação que ele quer votar, né? Aí aqui a gente chama a verify proof para que no caso a gente não tá verificando a proof, né? Mas verify user como se fosse, né? User ou wallet, sei lá.

Eh, e pega o veterja válido, ele retorna pra gente o volter ID, ele vê se o se esse esse se essa pessoa já votou. Se não votou, passa e marca como true para ele não poder votar de novo. Ele a gente pega aqui a essa votação que ele tá querendo votar, vê se ainda tá aberto. E aqui é aquela outra parte do do suporte proof que eu falei aqui. Ele valida se o o a o voto encado é válido. Então, no caso, o voto é tipo 64.

Então ele envia que nem eu já mostrei antes lá, né, o exemplo anterior desses dessa forma aqui tava exatamente aí. E dando tudo certo, ele retorna pra gente o índice, né, que é o é o que o usuário escolhe para votar, permite o contrato acessar o índice, aumenta a quantidade de pessoas que votaram nesse nesse nessa votação. E aqui é a lógica da operação em cima do valor encriptado. O que que ele tá fazendo? Ele passa pro pelo índice, ele vê que se o índice que o usuário escolheu, que é o candidate index, for igual ao índice do arrei que ele tá

passando, o índice do array, ele dá true, senão ele dá falso. Basicamente isso aqui para ver em quem ele votou, tá? Aqui a gente vai fazer o o a o peso da votação, no caso é 01, né? Zero para quem ele não votou. e um para quem o usuário votou. Esse select função da seguinte maneira. Se aqui for true, é o primeiro. Se aqui for falso é o segundo. Então, se aqui for true, ou seja, se for o eleitor que ele escolheu, eh, vão passar um. O voto, o valor do voto vai ser um. Se não for voto zero. Depois ele soma, ele faz um da quantidade de votos que aquele cara tem e soma com o valor que pediu.

Então, eh, votar vai dar zero para todo mundo, menos pro pra pessoa que ele votou, que ele quem ele votou vai subir um e permite o o contrato de novo acessar esse esse valor encriptado. Emite que o voto foi cadastrado. Aqui é uma função auxiliar só pra gente dar um get volt externa, que ela chama essa gett que é só interna, que é tipo um get user que a gente usa no backend e tal para enfim pegar o usuário e de uma forma mais fácil, mais rápida, né? Eh, ele vê se o o se a votação existe ou não. E uma funçãozinha aqui para pegar o o block number, só pra gente criar lá no no pelo scan a essa votação, passar uns

alguns blocos depois que a gente quer que a votação acabe. E a última parte principal é o decrypt, né? Vamos como é que a gente faz para decar. A primeira aqui é a que o usuário chama é a request winner decryption que vai passar o o ID da votação que ele quer ver o vencedor, né? Ele vê se o voto ainda tá aberto ou se não. Se já tiver fechado, ele passa. Eh, ele emite que o voto foi, tá tá sendo request para ser revelado. E aqui é o que eu falei antes, né? Lembra que na parte do exemplo do dobrar era bem mais simples. Aqui também ainda não é tão complexo, mas já tem uma

complexidade a mais aqui. Então ele ele decta, né, o o valor do do votação. Eh, e chama essa callback, que é o que o usuário vai, o gator vai retornar pra gente, né, o valor do do vencedor, né, o a estrutura candidato que ganha. Eh, e a gente adiciona dois parâmetros, que é o volt e o index do da rei que a gente tá analisando, do candidato que a gente tá analisando, né?

Eh, tá. Vamos paraa callback description que ela de novo é só chamada pelo gateway, tá? Eh, o que que acontece aqui? Ela pega o parâmetro, ela pega o parâmetro do voled que a gente passou aqui, certo? Em cima do do question e pega também o parâmetro do do índice do candidato que a gente tá analisando naquela hora, tá? Eh, e basicamente faz o a verificação, né? Quem ganhou e quem ganhou ele chama-se determine winner que passa o ID da votação. E aqui que é a lógica de de emitir o vencedor. Então ele vê quem tem

mais votos. Se a pessoa que ele tá analisando agora tiver mais votos que o quem a gente setou que tem mais votos, ele ele atualiza o max vols, né? E uma vez, né, que esse loop acaba, a gente emite o vencedor, passando o aditção, o nome dele, né, o name e o max volts que também poderia ser acessado, né, aqui ponto volts. Eh, enfim, são essas funções. E pro offchain, dá uma passadinha aqui no deploy rapidinho. Não tem nada demais. A única coisa aqui que que fica diferente são as

wallets que podem votar, né, no nosso contrato que a gente manda lá pro pro ID manager. Ã, e o off chain, que é a segunda parte interessante que que nós temos aqui. Eh, aqui a gente nas no variáveis, né? para não precisar mudar aqui, a gente coloca tudo em cima. A vota o índice da votação que o usuário tá votando aqui e a escolha dele, né, que é o índice da rede de candidatos.

aqui a prova de que zer 1 ou dois que são os eleitores. Eh, no caso aqui a gente rodaria esse script três vezes, uma pro zero, uma por um pro dois, rotando em pessoas diferentes. Eh, e o que temos mais aqui, ó, a aqui é a votação encriptada, certo? a votação, o voltice, que é o índice que a gente passou aqui em cima, e o e nas na função de cash v a gente passa o vol ID e aqueles dois inputs que a gente já tinha falado antes, né, que é a o encriptado e a prova do do input.

E muito basicamente é isso. Não sei se o pessoal me respondeu se tá rodando ou não. Se tiver rodando a gente não respondeu. Ele ficou em Paris lá um pouquinho mais tarde, 4 horas na frente, tá? Eh, hum, as funções auxiliar para testar aí aqui na teoria acaba. Eu vou só mostrar para vocês o vídeo que [Música] eu como é que como é que ficaria, né? Como é que funciona? Deixa eu [Música] ver. Ah, não preciso

pegar o o link tá aqui. Eu mandei para para cá. Cadê? Aqui. Pronto. Finalzinho. Eh aqui ó, isso aqui é basicamente um, como é que esse contrato tá funcionando, tá rodando, tá? Eh, é uma demozinha.

Eh, aqui, ó, a gente deploia mais ou menos nesse menu tá ó, aqui a gente tá criando a votação. Então, passa o end block, passa quando é que o bloco tá terminando, quando é que a votação termina, desculpa. o índice de o a redi de candidatos, no caso é a Alice BOP, ele vai fazer o use case de três pessoas que estão votando e dois candidatos. Eh, e a descrição, tá? Ã, pular um pouquinho aí agora aqui no offchain, tá? Eh, aqui no offchain a gente vai votar três vezes, né?

A primeira vai votar no na pessoa um que tá aqui, eh, e chama o a função de cash v roda. Ele ah, que ele tá emitindo que o voto foi criado com o índice da votação quatro. Eh, aqui tá chamando, então ele tá gerando as duas provas, né, que é o que eu mostrei lá no início do dos slides lá lá no iniciozinho, que é isso que é o voto encriptado do usuário. Eh, enfim, ele vai votar duas vezes aqui. Engraçado que nesse vídeo, a última vez que que eu fui rodar, ele deu erro porque tinha passado o o block, né?

Então legal isso. E agora aqui a gente tá fazendo request winner decryption. Nesse caso aqui foram duas pessoas que votaram, a terceira pessoa não conseguiu votar porque a votação já tinha acabado, tá? Eh, e as duas pessoas votaram no BOP, que era o arred índice um, não é? É o o arre e o o índice um do arrei de candidatos. Eh, ó, aqui tá aqui é o evento que o que o voto foi request para ser revelado, certo? E cadê? Aqui, ó. Depois de um tempinho, ele dá pra gente a emissão de dois de dois eventos, né? E o mais importante é esse winners declared, que

é o que a gente que é o que eu mostrei agora a pouco. E dentro dele, né, a gente vem aqui, ó, vem aqui, aqui em logs, ó, lá em cima em logs. E olha o que que ele dá pra gente. Tcharã. Então, o ele tá retornando pra gente o vencedor dessa votação que a gente fez, que foi no caso paraa votação de número quatro. O vencedor foi o Bob, que é o índice um, e tiveram dois votos. Eh, enfim, estamos agora acaba, né, porque 6 horas tem que ir embora.

Mas basicamente foi isso. Eh, foi um overview sobre FIT. É muito novo, tá? É, é uma tecnologia super de ponto, então tem muito erro. Pode ver que deu erro ao vivo né? Eh, mas tem muita coisa acontecendo ainda, tem muita matemática envolvida, é muito paper, é muita coisa, muita matemática de fato. Eh, e meu intuito aqui foi tentar trazer de um jeito menos matemático e mais amigável. Eh, eu entendo que é é complexo, é muito tenso, foram 2 horas aqui. Eh, e isso, acredite, foi só o básico mesmo, tá? Eh, tem muita coisa

acontece poros planos, mas o objetivo foi isso. Eh, eu perdi um tempinho aí nos últimos meses e semanas estudando sobre isso. E algumas pessoas pediram para vir aqui trazer eh compartilhar no RC55 eh sobre esse sobre meus aprendizados, né? Porque isso que a gente fez em duas horas, eu demorei uns cinco dias inteiros, assim, de quinta a domingo, talvez. para fazer funcionar umas coisas simples, sabe? Eh, então o objetivo foi esse, trazer um pouquinho mastigado e é isso. Show.