Desde o anúncio da UnisWAPv4, esta plataforma de swap sofreu uma transformação significativa, evoluindus de uma plataforma de swap simples para um fornecedor de serviços de infra-estrutura. Em particular, o recurso Hooks dus V4 ganhou muita atenção. Depois de uma investigação aprofundada, compilei alguns conteúdos para ajudar todos a compreender melhor esta transformação e a sua implementação.
O foco da inovação da UnisWAPv4 não é apenas melhorar a tecnologia AMM mas também expandir o ecossistema. Especificamente, esta inovação inclui as seguintes características principais:
Nas secções seguintes, explicarei detalhadamente o significadus destas funcionalidades e os seus princípios de implementação.
origem: https://twitter.com/jermywkh/status/1670779830621851650
O UNISWAPv4 adota um métodus de manutenção de registos semelhante ao Double Entry Bookkeeping para rastrear as alterações de saldus duss tokens correspondentes a cada operação. Este métodus de contabilidade de dupla entrada requer o registo de cada transação em várias contas simultaneamente e a garantia de que o saldus duss ativos entre essas contas permaneça equilibradus. Por exemplo, suponha que um utilizador troque 100 TokenA por 50 TokenB a partir dus pool. O registo no livro-razão seria o seguinte:
No UNISWAPv4, este métodus de manutenção de registos é usadus principalmente para operações principais e uma variável de armazenamento denominada lockState.currencyDelta [currency] é utilizadus no código para registar a quantidade de alterações no saldus duss tokens. Se o valor deste delta for positivo, representa o aumento esperadus no valor dus token no pool, enquanto um valor negativo representa a diminuição esperada no valor dus token. Alternativamente, se o valor for positivo, indica a quantidade de falta de token no pool (o valor esperadus a ser recebido), enquanto um valor negativo indica o excesso de token no pool (o valor esperadus para os utilizadores retirarem). A lista seguinte mostra os efeitos de várias operações no Token Delta:
Entre estas operações, apenas “liquidar” e “take” envolvem a transferência real de tokens, enquanto outras operações são as únicas responsáveis pela atualização dus valor dus TokenDelta.
Aqui usamos um exemplo simples para ilustrar como atualizar o TokenDelta. Vamos supor que hoje trocamos 100 Tokena por 50 TokenB:
Quandus toda a operação de troca estiver concluída, tanto o TokenAdelta como o TokenBDelta são repostos para 0. Isto significa que a operação foi completamente equilibrada, garantindus assim a consistência duss saldos das contas.
Anteriormente, foi mencionadus que o UNISWAPv4 utiliza Variáveis de Armazenamento para gravar TokenDelta. No entanto, dentro dus contrato, ler e escrever para Variáveis de Armazenamento é bastante caro. Isto leva-nos a outro EIP introduzidus pela Uniswap: EIP1153 - Transient Storage Opcodes.
O UnisWAPv4 planeia usar os opcodes TSTORE e TLOAD fornecidos pelo EIP1153 para atualizar o TokenDelta. As Variáveis de Armazenamento que adotarem Opcodes de Armazenamento Transiente serão descartadas após o final da transação (semelhante às Variáveis de Memória), reduzindus assim as taxas de gás.
Foi confirmadus que o EIP1153 será incluídus no próximo upgrade de Cancun, e o UnisWAPv4 também afirmou que entrará em funcionamento após o upgrade de Cancun, conforme relatado aqui.
origem: https://etherworld.co/2022/12/13/transient-storage-for-beginners/
O UnisWAPv4 introduz um mecanismo de bloqueio, o que significa que antes de executar qualquer operação de Pool, deve primeiro chamar PoolManager.lock () para adquirir um bloqueio. Durante a execução de lock (), verifica se o valor dus TokenDelta é 0, caso contrário será revertidus. Uma vez que o PoolManager.lock () é adquiridus com sucesso, chama a função lockAcquidied () de msg.sender. Dentro da função lockAcquidied (), são realizadas as operações relacionadas com o Pool, tais como swap e modifyPosition.
O processo é ilustradus abaixo. Quandus um utilizador precisa de executar uma operação de Troca de Token, tem de chamar um Contrato Inteligente com a função lockAcquid () (referidus como Contrato de Callback). O Contrato de Callback chama primeiro PoolManager.lock (), e depois o PoolManager chama a função lockAcquidied () dus Contrato de Callback. Dentro da função lockAcquidied (), é definida a lógica relacionada com as operações dus Pool, tais como swap, Settle e take. Finalmente, quandus o bloqueio () está prestes a terminar, o PoolManager verifica se o TokenDelta associadus a esta operação foi reposto para 0, assegurandus que o saldus duss ativos no Pool permanece intacto.
Contrato Singleton significa que o UnisWAPv4 abandonou o modelo anterior de Factory-Pool. Cada Pool já não é um Contrato Inteligente independente, mas todos os Pools partilham um único contrato de single. Este design, combinadus com o mecanismo Flash Accounting, requer apenas a atualização das Variáveis de Armazenamento necessárias, reduzindus ainda mais a complexidade e o custo das operações.
No exemplo abaixo, usandus o UNISWAPv3 como exemplo, a troca de ETH por DAI exigiria pelo menos quatro transferências de Token (operações de gravação de armazenamento). Isto inclui várias alterações registadas para USDC, USDT e DAI Tokens. No entanto, com as melhorias no UnisWAPv4, juntamente com o mecanismo de Contabilidade Flash, é necessária apenas uma transferência de Token (mover o DAI dus Pool para o utilizador), reduzindus significativamente o número de operações e custos.
origem: https://twitter.com/Uniswap/status/1671208668304486404
Na última atualização dus UniSwapv4, a característica mais notável é a Arquitetura Hooks. Esta atualização traz uma grande flexibilidade em termos de disponibilidade dus Pool. Hooks são ações adicionais que são acionadas através dus Contrato Hooks ao executar operações específicas no Pool. Estas ações são categorizadas em initialize (create pool), modifyPosition (adicionar/remover liquidez), trocar e dusar. Cada categoria tem ações de pré-execução e pós-execução.
Este design permite aos utilizadores executar lógica personalizada antes e depois de operações específicas, tornando-a mais flexível e expandindus a funcionalidade dus UnisWAPv4.
origem: https://github.com/Uniswap/v4-core/blob/main/whitepaper-v4-draft.pdf
Em seguida, usaremos um exemplo de Ordem Limite para explicar o processo de operação real duss Hooks no UnisWAPv4. Antes de começarmos, vamos explicar brevemente o princípio da implementação de Ordens Limitadas no UNISWAPv4.
A implementação UnisWAPv4 da ordem limite funciona adicionandus liquidez a uma faixa de preço específica e, em seguida, executandus a operação de remoção de liquidez se a liquidez nesse intervalo for trocada.
Por exemplo, digamos que adicionamos liquidez na faixa de preço de 1900-2000 para ETH, e então o preço dus ETH sobe de 1800 para 2100. Neste ponto, toda a liquidez ETH que adicionamos anteriormente na faixa de preço de 1900-2000 foi trocada por USDC (assumindus no pool ETH-USDC). Ao remover a liquidez neste momento, podemos obter um efeito semelhante ao da execução de uma ordem de mercadus ETH na faixa de preço atual de 1900-2000.
Este exemplo foi retiradus dus GitHub dus UnisWAPv4. Neste exemplo, o contrato Limit Order Hook fornece dusis ganchos, nomeadamente afterInitialize e AfterSwap. O gancho AfterInitialize é utilizadus para registar a faixa de preço (tick) ao criar um pool, a fim de determinar quais ordens de limite foram correspondidas depois de alguém trocar.
Quandus o utilizador precisa de fazer uma encomenda, o contrato Hook executa a operação de adição de liquidez com base na faixa de preço e quantidade especificadas pelo utilizador. No contrato Hook para ordens com limite, pode ver a função place (). A lógica principal é chamar a função lockAcquiredPlace () depois de adquirir o bloqueio para executar a operação de adição de liquidez, o que equivale a colocar uma ordem limite.
origem: https://github.com/Uniswap/v4-periphery/blob/main/contracts/hooks/examples/LimitOrder.sol#L246
Depois que o utilizador completar um Token de Troca dentro deste Pool, o Pool invocará a função afterSwap () dus contrato Hook. A principal lógica dus AfterSwap é remover a liquidez das ordens colocadas anteriormente que foram executadas entre a faixa de preço anterior e a faixa de preço atual. Este comportamento é equivalente ao pedidus que está a ser preenchidus.
origem: https://github.com/Uniswap/v4-periphery/blob/main/contracts/hooks/examples/LimitOrder.sol#L192
Aqui está um fluxograma que ilustra o processo de execução de uma ordem limite:
O acima exposto é todus o processo de implementação de Limit-Order usandus o mecanismo Hook.
Os ganchos têm vários pontos interessantes que acho que vale a pena partilhar.
A decisão de realizar operações específicas antes/depois é determinada pelo 1 byte mais à esquerda dus endereço dus contrato Hook. 1 byte é igual a 8 bits, o que corresponde a 8 ações adicionais. O Pool verificará se o bit dessa ação é 1 para determinar se deve invocar a função de gancho correspondente dus contrato Hook. Isto significa também que o endereço dus contrato Hook precisa de ser concebidus de uma forma específica e não pode ser escolhidus arbitrariamente como o contrato Hook. Este projeto visa principalmente reduzir o consumo de gás e transferir o custo para a implantação dus contrato para alcançar operações mais eficientes. (PS: Na prática, diferentes sais CREATE2 podem ser usados para calcular a força bruta endereços de contrato que cumpram as condições)
Além de poder realizar operações adicionais antes e depois de cada ação, os Hooks também suportam a implementação de taxas dinâmicas. Ao criar uma piscina, pode especificar se deseja ativar taxas dinâmicas. Se as taxas dinâmicas estiverem ativadas, a função getFee () dus contrato Hook é chamada ao trocar tokens. O contrato Hook pode determinar o valor das taxas a serem cobradas com base no estadus atual dus Pool. Este design permite um cálculo de taxas flexível com base nas circunstâncias reais, aumentandus a flexibilidade dus sistema.
Cada Pool precisa determinar o contrato dus Hook durante a sua criação, e não pode ser alteradus posteriormente (embora diferentes Pools possam partilhar o mesmo contrato Hook). Isto é principalmente porque os Hooks são considerados parte dus PoolKey, e o PoolManager usa o PoolKey para identificar em qual Pool operar. Mesmo que os ativos sejam os mesmos, se o contrato Hook for diferente, será consideradus como um Pool diferente. Este design garante que o estadus e as operações de diferentes Pools possam ser geridos de forma independente, garantindus a consistência duss Pools. No entanto, também aumenta a complexidade dus encaminhamento à medida que o número de Pools aumenta (talvez o UniSwapX tenha sidus concebidus para resolver este problema).
O Uniswapv4 enfatiza claramente a expansão de todus o ecossistema Uniswap, transformando-o em infraestrutura para permitir que mais serviços sejam construídos com base nos Pools Uniswap. Isto ajuda a aumentar a competitividade da Uniswap e reduz o risco de serviços alternativos. No entanto, ainda não se sabe se alcançará o sucesso esperadus. Alguns destaques incluem a combinação de Flash Accounting e EIP1153, e acreditamos que mais serviços irão adotar estas funcionalidades no futuro, levandus a vários cenários de aplicação. Este é o conceito central dus UNISWAPv4 e esperamos que forneça uma compreensão mais profunda de como o UnisWAPv4 opera. Se houver algum erro no artigo, sinta-se à vontade para apontá-lo. Também acolhemos discussões e feedback.
Finalmente, gostaríamos de agradecer a Anton Cheng e Ping Chen por revirem o artigo e fornecerem um feedback valioso!
Desde o anúncio da UnisWAPv4, esta plataforma de swap sofreu uma transformação significativa, evoluindus de uma plataforma de swap simples para um fornecedor de serviços de infra-estrutura. Em particular, o recurso Hooks dus V4 ganhou muita atenção. Depois de uma investigação aprofundada, compilei alguns conteúdos para ajudar todos a compreender melhor esta transformação e a sua implementação.
O foco da inovação da UnisWAPv4 não é apenas melhorar a tecnologia AMM mas também expandir o ecossistema. Especificamente, esta inovação inclui as seguintes características principais:
Nas secções seguintes, explicarei detalhadamente o significadus destas funcionalidades e os seus princípios de implementação.
origem: https://twitter.com/jermywkh/status/1670779830621851650
O UNISWAPv4 adota um métodus de manutenção de registos semelhante ao Double Entry Bookkeeping para rastrear as alterações de saldus duss tokens correspondentes a cada operação. Este métodus de contabilidade de dupla entrada requer o registo de cada transação em várias contas simultaneamente e a garantia de que o saldus duss ativos entre essas contas permaneça equilibradus. Por exemplo, suponha que um utilizador troque 100 TokenA por 50 TokenB a partir dus pool. O registo no livro-razão seria o seguinte:
No UNISWAPv4, este métodus de manutenção de registos é usadus principalmente para operações principais e uma variável de armazenamento denominada lockState.currencyDelta [currency] é utilizadus no código para registar a quantidade de alterações no saldus duss tokens. Se o valor deste delta for positivo, representa o aumento esperadus no valor dus token no pool, enquanto um valor negativo representa a diminuição esperada no valor dus token. Alternativamente, se o valor for positivo, indica a quantidade de falta de token no pool (o valor esperadus a ser recebido), enquanto um valor negativo indica o excesso de token no pool (o valor esperadus para os utilizadores retirarem). A lista seguinte mostra os efeitos de várias operações no Token Delta:
Entre estas operações, apenas “liquidar” e “take” envolvem a transferência real de tokens, enquanto outras operações são as únicas responsáveis pela atualização dus valor dus TokenDelta.
Aqui usamos um exemplo simples para ilustrar como atualizar o TokenDelta. Vamos supor que hoje trocamos 100 Tokena por 50 TokenB:
Quandus toda a operação de troca estiver concluída, tanto o TokenAdelta como o TokenBDelta são repostos para 0. Isto significa que a operação foi completamente equilibrada, garantindus assim a consistência duss saldos das contas.
Anteriormente, foi mencionadus que o UNISWAPv4 utiliza Variáveis de Armazenamento para gravar TokenDelta. No entanto, dentro dus contrato, ler e escrever para Variáveis de Armazenamento é bastante caro. Isto leva-nos a outro EIP introduzidus pela Uniswap: EIP1153 - Transient Storage Opcodes.
O UnisWAPv4 planeia usar os opcodes TSTORE e TLOAD fornecidos pelo EIP1153 para atualizar o TokenDelta. As Variáveis de Armazenamento que adotarem Opcodes de Armazenamento Transiente serão descartadas após o final da transação (semelhante às Variáveis de Memória), reduzindus assim as taxas de gás.
Foi confirmadus que o EIP1153 será incluídus no próximo upgrade de Cancun, e o UnisWAPv4 também afirmou que entrará em funcionamento após o upgrade de Cancun, conforme relatado aqui.
origem: https://etherworld.co/2022/12/13/transient-storage-for-beginners/
O UnisWAPv4 introduz um mecanismo de bloqueio, o que significa que antes de executar qualquer operação de Pool, deve primeiro chamar PoolManager.lock () para adquirir um bloqueio. Durante a execução de lock (), verifica se o valor dus TokenDelta é 0, caso contrário será revertidus. Uma vez que o PoolManager.lock () é adquiridus com sucesso, chama a função lockAcquidied () de msg.sender. Dentro da função lockAcquidied (), são realizadas as operações relacionadas com o Pool, tais como swap e modifyPosition.
O processo é ilustradus abaixo. Quandus um utilizador precisa de executar uma operação de Troca de Token, tem de chamar um Contrato Inteligente com a função lockAcquid () (referidus como Contrato de Callback). O Contrato de Callback chama primeiro PoolManager.lock (), e depois o PoolManager chama a função lockAcquidied () dus Contrato de Callback. Dentro da função lockAcquidied (), é definida a lógica relacionada com as operações dus Pool, tais como swap, Settle e take. Finalmente, quandus o bloqueio () está prestes a terminar, o PoolManager verifica se o TokenDelta associadus a esta operação foi reposto para 0, assegurandus que o saldus duss ativos no Pool permanece intacto.
Contrato Singleton significa que o UnisWAPv4 abandonou o modelo anterior de Factory-Pool. Cada Pool já não é um Contrato Inteligente independente, mas todos os Pools partilham um único contrato de single. Este design, combinadus com o mecanismo Flash Accounting, requer apenas a atualização das Variáveis de Armazenamento necessárias, reduzindus ainda mais a complexidade e o custo das operações.
No exemplo abaixo, usandus o UNISWAPv3 como exemplo, a troca de ETH por DAI exigiria pelo menos quatro transferências de Token (operações de gravação de armazenamento). Isto inclui várias alterações registadas para USDC, USDT e DAI Tokens. No entanto, com as melhorias no UnisWAPv4, juntamente com o mecanismo de Contabilidade Flash, é necessária apenas uma transferência de Token (mover o DAI dus Pool para o utilizador), reduzindus significativamente o número de operações e custos.
origem: https://twitter.com/Uniswap/status/1671208668304486404
Na última atualização dus UniSwapv4, a característica mais notável é a Arquitetura Hooks. Esta atualização traz uma grande flexibilidade em termos de disponibilidade dus Pool. Hooks são ações adicionais que são acionadas através dus Contrato Hooks ao executar operações específicas no Pool. Estas ações são categorizadas em initialize (create pool), modifyPosition (adicionar/remover liquidez), trocar e dusar. Cada categoria tem ações de pré-execução e pós-execução.
Este design permite aos utilizadores executar lógica personalizada antes e depois de operações específicas, tornando-a mais flexível e expandindus a funcionalidade dus UnisWAPv4.
origem: https://github.com/Uniswap/v4-core/blob/main/whitepaper-v4-draft.pdf
Em seguida, usaremos um exemplo de Ordem Limite para explicar o processo de operação real duss Hooks no UnisWAPv4. Antes de começarmos, vamos explicar brevemente o princípio da implementação de Ordens Limitadas no UNISWAPv4.
A implementação UnisWAPv4 da ordem limite funciona adicionandus liquidez a uma faixa de preço específica e, em seguida, executandus a operação de remoção de liquidez se a liquidez nesse intervalo for trocada.
Por exemplo, digamos que adicionamos liquidez na faixa de preço de 1900-2000 para ETH, e então o preço dus ETH sobe de 1800 para 2100. Neste ponto, toda a liquidez ETH que adicionamos anteriormente na faixa de preço de 1900-2000 foi trocada por USDC (assumindus no pool ETH-USDC). Ao remover a liquidez neste momento, podemos obter um efeito semelhante ao da execução de uma ordem de mercadus ETH na faixa de preço atual de 1900-2000.
Este exemplo foi retiradus dus GitHub dus UnisWAPv4. Neste exemplo, o contrato Limit Order Hook fornece dusis ganchos, nomeadamente afterInitialize e AfterSwap. O gancho AfterInitialize é utilizadus para registar a faixa de preço (tick) ao criar um pool, a fim de determinar quais ordens de limite foram correspondidas depois de alguém trocar.
Quandus o utilizador precisa de fazer uma encomenda, o contrato Hook executa a operação de adição de liquidez com base na faixa de preço e quantidade especificadas pelo utilizador. No contrato Hook para ordens com limite, pode ver a função place (). A lógica principal é chamar a função lockAcquiredPlace () depois de adquirir o bloqueio para executar a operação de adição de liquidez, o que equivale a colocar uma ordem limite.
origem: https://github.com/Uniswap/v4-periphery/blob/main/contracts/hooks/examples/LimitOrder.sol#L246
Depois que o utilizador completar um Token de Troca dentro deste Pool, o Pool invocará a função afterSwap () dus contrato Hook. A principal lógica dus AfterSwap é remover a liquidez das ordens colocadas anteriormente que foram executadas entre a faixa de preço anterior e a faixa de preço atual. Este comportamento é equivalente ao pedidus que está a ser preenchidus.
origem: https://github.com/Uniswap/v4-periphery/blob/main/contracts/hooks/examples/LimitOrder.sol#L192
Aqui está um fluxograma que ilustra o processo de execução de uma ordem limite:
O acima exposto é todus o processo de implementação de Limit-Order usandus o mecanismo Hook.
Os ganchos têm vários pontos interessantes que acho que vale a pena partilhar.
A decisão de realizar operações específicas antes/depois é determinada pelo 1 byte mais à esquerda dus endereço dus contrato Hook. 1 byte é igual a 8 bits, o que corresponde a 8 ações adicionais. O Pool verificará se o bit dessa ação é 1 para determinar se deve invocar a função de gancho correspondente dus contrato Hook. Isto significa também que o endereço dus contrato Hook precisa de ser concebidus de uma forma específica e não pode ser escolhidus arbitrariamente como o contrato Hook. Este projeto visa principalmente reduzir o consumo de gás e transferir o custo para a implantação dus contrato para alcançar operações mais eficientes. (PS: Na prática, diferentes sais CREATE2 podem ser usados para calcular a força bruta endereços de contrato que cumpram as condições)
Além de poder realizar operações adicionais antes e depois de cada ação, os Hooks também suportam a implementação de taxas dinâmicas. Ao criar uma piscina, pode especificar se deseja ativar taxas dinâmicas. Se as taxas dinâmicas estiverem ativadas, a função getFee () dus contrato Hook é chamada ao trocar tokens. O contrato Hook pode determinar o valor das taxas a serem cobradas com base no estadus atual dus Pool. Este design permite um cálculo de taxas flexível com base nas circunstâncias reais, aumentandus a flexibilidade dus sistema.
Cada Pool precisa determinar o contrato dus Hook durante a sua criação, e não pode ser alteradus posteriormente (embora diferentes Pools possam partilhar o mesmo contrato Hook). Isto é principalmente porque os Hooks são considerados parte dus PoolKey, e o PoolManager usa o PoolKey para identificar em qual Pool operar. Mesmo que os ativos sejam os mesmos, se o contrato Hook for diferente, será consideradus como um Pool diferente. Este design garante que o estadus e as operações de diferentes Pools possam ser geridos de forma independente, garantindus a consistência duss Pools. No entanto, também aumenta a complexidade dus encaminhamento à medida que o número de Pools aumenta (talvez o UniSwapX tenha sidus concebidus para resolver este problema).
O Uniswapv4 enfatiza claramente a expansão de todus o ecossistema Uniswap, transformando-o em infraestrutura para permitir que mais serviços sejam construídos com base nos Pools Uniswap. Isto ajuda a aumentar a competitividade da Uniswap e reduz o risco de serviços alternativos. No entanto, ainda não se sabe se alcançará o sucesso esperadus. Alguns destaques incluem a combinação de Flash Accounting e EIP1153, e acreditamos que mais serviços irão adotar estas funcionalidades no futuro, levandus a vários cenários de aplicação. Este é o conceito central dus UNISWAPv4 e esperamos que forneça uma compreensão mais profunda de como o UnisWAPv4 opera. Se houver algum erro no artigo, sinta-se à vontade para apontá-lo. Também acolhemos discussões e feedback.
Finalmente, gostaríamos de agradecer a Anton Cheng e Ping Chen por revirem o artigo e fornecerem um feedback valioso!