O desenvolvedor Christophe Verdot fala sobre o curso on-line ' Mastering Web 3.0 with Waves ', que ele aprovou recentemente.
Conte um pouco sobre você. O que lhe interessou neste curso?Estou envolvido no desenvolvimento web há cerca de 15 anos, principalmente como freelancer.
Desenvolvendo um aplicativo da web de registro de longo prazo para países em desenvolvimento encomendado por um grupo bancário, tive a tarefa de integrar a certificação blockchain a ele. Naquela época, eu não sabia muito sobre a certificação blockchain, embora já estivesse interessado em tecnologias de criptografia - principalmente como investidor.
Como resultado, essa função não foi implementada, mas, pensando que as organizações e os bancos estavam interessados em uma solução para suas aplicações, comecei a estudar o problema e logo iniciei o projeto
Signature Chain .
Eu desenvolvi sua versão beta, que já está disponível na rede principal. Não havia [linguagem de programação Waves] Ride na época, e eu fiz tudo da maneira mais simples usando transações de tradução com JSON incorporado. Mas o objetivo principal era adicionar funcionalidades mais avançadas após o lançamento do Ride. E esse é o principal motivo de ingresso no curso: a próxima etapa no desenvolvimento do projeto envolveu a criação de um aplicativo descentralizado (dApp).
Quais aspectos do curso lhe pareceram mais simples e quais foram os mais difíceis?A coisa mais simples era que tínhamos tempo suficiente para todas as tarefas. O significado do curso é aprender algo e não competir entre si. As explicações eram muito acessíveis e as ilustrações eram simples, mas abrangentes. Ajudou a visualizar e entender diferentes tópicos.
Ao concluir as tarefas, fomos levados a pensar de forma independente e, às vezes, a estudar algo por conta própria. Essa é a melhor maneira de aprender algo e entender as idéias discutidas na sala de aula.
Várias vezes eu não entendi completamente a parte teórica até começar a escrever o código ao concluir a tarefa. Não tínhamos permissão para copiar / colar, todo o código precisava ser escrito por nós mesmos, e isso também ajudou a entender melhor tudo.
A parte mais difícil foi que as perguntas no trabalho com várias respostas nem sempre eram claras. Meu inglês não é perfeito e as perguntas foram escritas por uma pessoa que não é um falante nativo; portanto, às vezes havia um mal-entendido.
Talvez a parte do oráculo e da NFT do curso possa ser mais detalhada. Mas, em qualquer caso, o principal objetivo do curso é interessar aos desenvolvedores. Então, para entender completamente todos os seus aspectos, será necessário, é claro, passar algum tempo experimentando e praticando.
Conte-nos mais sobre a solução em que você trabalhou ao longo do curso - 'Coupon Bazaar'? Também posso ver exemplos de código?Sim, trabalhamos no 'Coupon Bazaar', este é um mercado onde as pessoas vendem e compram cupons, dando-lhes o direito de comprar bens e serviços a um preço mais baixo. Cada cupom é representado por um ativo digital, que oferece um desconto especial ao fornecedor.

Foi necessário desenvolver vários componentes de aplicativos. Primeiramente, foi necessário criar um sistema para registrar fornecedores e gerenciar cupons. Precisávamos de uma função de verificação e da capacidade de procurar cupons pelos usuários.

Durante o curso, também adicionamos vários novos recursos, incluindo um sistema de votação e um recurso que nos permite verificar e colocar na lista negra os fornecedores.
Primeiro, examinamos a diferença entre ativos inteligentes, contas inteligentes e contas do dApp e os princípios básicos do trabalho com as funções do verificador. Os recursos do verificador permitem alterar o comportamento padrão da conta. Por padrão, eles verificam assinaturas de transação, mas a função verificador permite definir outras "regras".
{-# STDLIB_VERSION 3 #-} {-# CONTENT_TYPE DAPP #-} {-# SCRIPT_TYPE ACCOUNT #-} letownerPublicKey = base58'H8ndsHjBha6oJBQQx33zqbP5wi8sQP7hwgjzWUv3q95M' @Verifier(tx) funcverify() = { matchtx { cases: SetScriptTransaction=>sigVerify(tx.bodyBytes, tx.proofs[0], ownerPublicKey) cased: DataTransaction=>true case_ =>false } }
Então começamos a adicionar cupons. Usamos uma das funções mais importantes do dApp, que nos permite gravar dados de qualquer tipo no blockchain na forma de pares de valores-chave - uma transação de dados. Combinamos com uma nova transação, invokeScript, usada para chamar a função chamada no dApp de fora da blockchain.
O tipo de transação de dados que usamos durante o curso foi adicionar cupons ao mercado:
letdatajson = { "title": "t-shirt with , vote 1", "coupon_price": 10000000, "old_price": 1000000000, "new_price": 100000000, "address": "Universe", "description": "I want you to make love, not war, i know you've heard it before", "image": "https://bit.ly/2EXTghg" } it('add item', asyncfunction(){ letts = invokeScript({ dApp: dappAddress, call:{ function:"addItem", args:[ { type:"string", value: datajson.title }, { type:"integer", value: datajson.coupon_price }, { type:"string", value: JSON.stringify(datajson) } ]}, payment: [] }, accountSupplierSeed) lettx = awaitbroadcast(ts) awaitwaitForTx(tx.id) })
Para processar esses dados com a função addItem e desenvolver uma função de compra e outras opções, usamos uma função chamada que o usuário pode chamar de fora da blockchain. Como resultado, ele pode executar várias tarefas, por exemplo, iniciar uma transferência de fundos, gravar ou atualizar dados em um data warehouse do dApp, etc.
Aqui está um exemplo da função chamada usada na função addItem:
@Callable(i) funcaddItem(title: String, price: Int, data: String) = { letsupplierAddress = toBase58String(i.caller.bytes) letitem = getKeyItem(supplierAddress, title) if( price <= 0) thenthrow("purchase amount cannot be less than item price") elseif( getValueItemSupplier(item) !=NONE ) thenthrow("an item is already exist") else{ WriteSet([ DataEntry(getKeyItemSupplier(item), supplierAddress), DataEntry(getKeyItemPrice(item), price), DataEntry(getKeyItemData(item), data) ]) } }
Posteriormente, desenvolvemos um sistema de votação que nos permite votar na promoção ou remoção de determinados produtos. Para evitar influências externas no processo de votação, ela usa o esquema 'Confirmar'.
A fase de confirmação é usada para coletar votos criptografados usando uma função hash e um salt.
A fase "revelar" é usada para coletar votos criptografados e comparar seus hashes.
Aqui está um exemplo da função chamada usada aqui:
@Callable(i) funcvoteCommit(item: String, hash: String) = { letuser = toBase58String(i.caller.bytes) letcommits = getValueCommitsCount(item) letstatus = getValueItemStatus(item) if( commits >=VOTERS) thenthrow("reached max num of voters") elseif(getValueCommit(item, user) !=NONE) thenthrow("user has already participated") elseif(getKeyItemSupplier(item) ==NONE) thenthrow("item does not exist") elseif(status !=NONE && status !=VOTING) thenthrow("voting is not possible") else{ WriteSet([ DataEntry(getKeyCommit(item, user), hash), DataEntry(getKeyCommitsCount(item), commits +1), DataEntry(getKeyItemStatus(item),if(commits ==VOTERS) thenREVEAL elseVOTING) ]) } } >
O que mais você aprendeu com o curso?O curso também incluiu tokenização e tokens não fungíveis (NFT) - tokens que representam algo único e, portanto, não são intercambiáveis.
A última lição foi sobre oráculos. Como o blockchain não pode receber dados do mundo exterior, precisamos de oráculos para enviar esses dados para ele.
Para o nosso mercado, eram necessários oráculos para verificar e, se necessário, colocar na lista negra um fornecedor que, por exemplo, não aceitava um cupom vendido.
Aqui está um exemplo:
funcgetExtValueItemWhiteListStatus(item:String) = { item +"_verifier_status" } letverifier = "3Mx9qgMyMhHt7WUZr6PsaXNfmydxMG7YMxv" letVERIFIED = "verified" letBLACKLISTED = "blacklist" @Callable(i) funcsetstatus(supplier: String, status: String) = { letaccount = toBase58String(i.caller.bytes) if( account !=verifier ) thenthrow("only oracle verifier are able to manage whitelist") elseif( status !=VERIFIED && status !=BLACKLISTED) thenthrow("wrong status") else{ WriteSet([ DataEntry(getExtValueItemWhiteListStatus(supplier), status) ]) } }
O que foi mais útil para você?A parte mais útil são as atribuições. Graças a eles, o material da palestra ficou mais claro e o conhecimento que acabamos de ganhar foi consolidado por tentativa e erro. O trabalho prático com
IDE ,
explorador e
oráculos foi muito útil.
Como você planeja usar o que aprendeu na prática?Desde o início, esperava que o curso ajudasse a levar meu projeto a um novo nível. A ideia era escrever
agora o código
sign-web.app no RIDE. A versão existente já possui as funções de certificação de documentos, mas, graças ao RIDE, pode ser significativamente aprimorada. A nova versão será mais flexível e compreensível, terá mais funções, incluindo certificação de e-mails, acordos entre várias partes, etc.
O curso também serviu de reflexão e eu tive muitas idéias novas. Estou certo de que os resultados serão manifestados no futuro.