WEB3DEV

Jhonattan Farias
Jhonattan Farias

Posted on • Atualizado em

Metatag — Como detectar caracteres de largura zero (ZWC) em Solidity — Bug ENS

Neste blog, falaremos sobre caracteres de largura zero (ZWC) e como eles atualmente afetam o ENS, bem como detectá-los, então aperte o cinto porque seremos bem técnicos.

O que são caracteres de largura zero?
Caracteres de largura zero em um nível básico, são caracteres que não são imprimíveis. Essencialmente, isso significa que eles não podem ser vistos quando inseridos entre outros caracteres, portanto, parecem idênticos a qualquer texto normalmente digitado.

No nível binário/bytes/hex, caracteres de largura zero são fáceis de detectar. vá para Convert ASCII to Hex — Online Hex Tools e digite seu nome. Por exemplo, vamos usar o nome ‘david’ para o restante deste blog.

O nome david se traduz no hexadecimal equivalente “0x64 0x61 0x76 0x69 0x64”.
O que é Hex? Hex é usado para simplificar o código binário e formar uma relação linear com o binário. É a BASE 16 que é composta por 16 dígitos. 0-9 e A-F.

Por que isso é um problema em ENS e domínios?
Este é um bug/supervisão bem documentado com o ENS. Essencialmente, significa que caracteres não imprimíveis podem ser inseridos entre domínios e aparecer normalmente.
Por que isso é um problema? Bem, isso significa que, embora pareçam idênticos ao olho humano, na realidade são diferentes no nível de bytes. Que é o que o Solidity converte em caracteres de string.
Então, por serem diferentes aos olhos dos contratos inteligentes, isso permitirá que você registre esse domínio.
Por exemplo, “Vitalik” e “Vitalik (ZWC inserido)” parecem iguais ao olho humano e ao contrato inteligente, mas são traduzidos para endereços de carteira diferentes. Portanto, o destinatário pretendido pode ser outra pessoa.
O problema com o contrato inteligente do ENS é que ele não detecta caracteres de largura zero e, portanto, permite registrar “Vitalik(ZWC)” sem erro.

Como a ENS está lidando com isso?
Atualmente eles fazem um ótimo trabalho junto com a Etherscan e Metamask de validação de caracteres inseridos no nível de front-end. Portanto, se você tentar registrar um nome através do site deles, ele o bloqueará e, portanto, não permitirá que você registre um nome com um ZWC. Mas em um nível de contrato inteligente, você pode interagir diretamente com ele e registrar um nome e, portanto, ignorar qualquer validação de front-end que seja feita.

Imagem mostra um aviso de erro que diz "o nome david não é valido"

Como detectá-los em Solidity?

O Solidity está se tornando cada vez mais fácil e à medida que as versões do pragma aumentam, alguns dos recursos disponíveis também aumentam.

bytes(“string”) — converte strings em seu formato de bytes equivalente. bytes1(bytes(string)) converte strings em bytes1, que é uma unidade de armazenamento menor disponível.

Com um simples loop “for”, podemos converter cada caractere em uma string para seu formato em bytes1 equivalente. A partir deles, podemos construir uma blacklist/whitelist simples e retornar um booleano.
Simples assim mesmo. Abaixo está o código completo; Teremos detecção de ZWC em nossos contratos inteligentes de metatag.

bytes1 compare4 = 0xe2;
bytes1 compare5 = 0x80;
bytes1 compare6 = 0x8b;
function checkIfZeroNotPresent(string memory _name) public view returns (bool) {
    bytes memory nameinbytes = bytes(_name);
    for(uint i; i < nameinbytes.length; i++) {
        if (bytes1(nameinbytes[i]) == compare4){
            if (bytes1(nameinbytes[i+1]) == compare5) {
                if (bytes1(nameinbytes[i+2]) == compare6) {
                    return false;
                }
            }
            else {
                return false;
            }
        }
    return false
 }
Enter fullscreen mode Exit fullscreen mode

Para ver o vídeo completo com exemplo assista ao vídeo abaixo.
[https://vimeo.com/717331441?embedded=true&source=video_title&owner=172160253](https://vimeo.com/717331441?

Este artigo foi escrito por (Metatag) e traduzido por (Jhonattan Farias), você pode encontrar o artigo original aqui.

Top comments (0)