Cross-dapp: novo recurso da Ride combina elementos do DeFi

No próximo lançamento do Waves Node 1.3, adicionaremos a interação dapp-to-dapp na linguagem Ride.

Conforme o Blockchain da Waves amadurece, estamos adicionando mais recursos programáveis à Ride. Um desses recursos é o cross-dapp, que está no lançamento do Waves Node versão 1.3. Isso irá beneficiar os criadores de mercado automatizados (automated market maker – AMMs), o hedge automático e os oracles que desejam taxar seus serviços. Além disso, como fazer um colega desenvolvedor ficar rico rápido, sem flashloans (empréstimos instantâneos no DeFi)?

Por que esse recurso é importante?

Um ecossistema de sucesso contém muitos componentes sinergéticos. Se olharmos para os dias atuais, os pilares de um ecossistema são os componentes #defi: provedores de liquidez, criadores de mercado automatizados e oracles. Esses componentes precisam estar combinados. A interação cross-dapp é a ferramenta que fornece a combinação de componentes do DeFi, controlando a complexidade do sistema.

Como irá funcionar?

Digamos que você esteja implementando um criador de mercado automatizado, que aceita USDN como liquidez. Você deseja que o USDN fique automaticamente em stake e que seja retirado do stake mediante solicitação. Acompanhe o código abaixo:

@Callable(inv)
func provideLiquidity() = {
if(inv.payments[0].assetId != NEUTRINOID)
then throw("bad token")
else
let amt = inv.payments[0].amount
strict stakingResult = invoke(
NEUTRINODAPP, # dapp address
'lockNeutrino', # dapp function
[], # passed arguments
inv.payments # attached payments
)
...
([
# updating dapp state
],
0 # returning something meaningful to the invoker
)

Parece algo intuitivo. Preste atenção na nova palavra-chave adicionada newstrict.Mais detalhes abaixo estão descritos a seguir.

Mudanças na API

A principal alteração da API é a assinatura da função @Callable. Iniciando STDLIB_VERSION 5, o dapp pode não apenas atualizar o estado / fazer pagamentos, mas também retornar um valor significativo para o solicitante: o tipo de retorno muda de [Action] para:

([Action], Object)

Na qual a última parte da tupla (banco de dados) é o valor de retorno. A assinatura da função invoke é a seguinte:

invoke: (Address, String,[Object],[AttachedPayment]) => Object

Quando o dApp chama outro dApp, o resultado deve corresponder:

strict invokeResult = invoke(...)
match invokeResult {
case i:Int => ...
case _ => throw("unexpected invokeResult")
}

Mas esta versão da API ainda não é a final: sinta-se à vontade para participar da discussão em forum.waves.tech.

Palavra-chave ‘strict’

Este é um grande tópico de discussão durante o processo de design. A necessidade de introduzir uma nova palavra-chave vem da “preguiça” da linguagem ride, e, por sua vez, a sequência das “partes” do “script” é calculada. Até então, isso nunca foi um problema, uma vez que os cálculos não possuem “efeito colateral” (nenhum efeito de programação aconteceu durante a execução de um script).

Problema: imagine que temos um script que consegue o equilíbrio, chama um dapp e, em seguida, alcança o equilíbrio novamente:
...
let balanceBefore = wavesBalance(this)
let autotrade = invoke('swopfi-waves-usdn', 'swap', [10 waves])
let balanceAfter = wavesBalance(this)
if(balanceAfter < balanceBefore) then ... else ...

Como let é devagar, os cálculos acontecem não no momento da definição, mas no momento do primeiro acesso à variável. Por exemplo: primeiro, balanceAfter, depois balanceBefore, e nenhum autotrade será processado!

Solução: Nós “trapaceamos” ao fazer strict uma macro que garanta que a variável do bloco seja materializada antes da expressão do bloco:
strict a = ... # 'strict' macro
a + b

é apenas

let a = ...
if(a!=a) then throw("fatal") else # inserted by macro
a + b

no bytecode.

...
strict balanceBefore = wavesBalance(this)
strict autotrade = invoke('swopfi-waves-usdn', 'swap', 10 waves)
strict balanceAfter = wavesBalance(this)
if(balanceAfter < balanceBefore) then ... else ...

Agora, todos os cálculos acontecem na sequência exata das definições.

Por favor, compartilhe seus comentários em forum.waves.tech!


Faça parte da comunidade Waves Brasil!

Telegram
Twitter
Facebook
Instagram

 

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.