WEB3DEV

Cover image for Padrão de Design do Mapa de Hash - Algorand
Panegali
Panegali

Posted on • Atualizado em

Padrão de Design do Mapa de Hash - Algorand

Tabelas de hash ou dicionários são estruturas de dados valiosas usadas para criar associações entre chaves e valores correspondentes para pesquisa e recuperação rápidas e em tempo constante. Enquanto o Solidity fornece a estrutura de dados do tipo Mapping que é semelhante às tabelas de hash, a Máquina Virtual Algorand não suporta nativamente tabelas de _hash _ou estruturas de dados do tipo de mapeamento (a lista completa dos tipos de dados suportados pode ser encontrada aqui). No entanto, uma combinação de assinatura inteligente e contrato inteligente com estado pode ser usada para construir algo semelhante à estrutura de dados do tipo de mapeamento.

Em princípio, uma vez que o contrato inteligente de estado Algorand pode armazenar até 64 pares de valores-chave em seu estado global e funciona conceitualmente como uma tabela de hash. Entretanto, 64 pares de valores-chave geralmente não são suficientes para casos de uso práticos, como um serviço de nome de domínio. O design da tabela de hash descrito neste artigo permite um mapeamento praticamente (os limites das funções de hash criptográficas SHA512_256 ainda se aplicam) ilimitado do número de pares de valor-chave.

Função de hash

Uma função de hash é usada em uma tabela de hash para gerar um índice para um local de armazenamento com base na chave de entrada onde o valor correspondente será armazenado. A função hash produz um índice determinístico de tamanho fixo para entrada de tamanho variável. E no AVM, a geração de conta de contrato pode ser usada como função de hash padronizando um programa de assinatura inteligente com entradas variáveis ​​que são compiladas para gerar uma conta de contrato. A conta do contrato pode então ser usada como um local de armazenamento em um contrato inteligente com estado para armazenar os valores correspondentes. O AVM 1.1 oferece suporte a dois modos de uso para assinaturas inteligentes: conta de contrato e aprovação delegada.

Mapeamento

Os contratos inteligentes com estado permitem que um número ilimitado de contas aceite e acesse o estado local no aplicativo. E as contas de contrato geradas a partir do programa padronizado (função de hash) podem ser usadas para aceitar o contrato inteligente e armazenar o valor correspondente no estado local do contrato inteligente. Dependendo do esquema do contrato inteligente com estado, até 16 pares de valores-chave podem ser armazenados por conta no estado local de um contrato inteligente.

Consulta

A conta de contrato de assinatura inteligente pode ser regenerada usando a mesma entrada para o programa padronizado. Como o processo de geração da conta do contrato de assinatura inteligente (por meio da compilação do programa) envolve o processo de avaliação do hash SHA512_256 do programa, podemos ter certeza de que a saída é determinística e exclusiva.

Segurança

É importante observar que qualquer pessoa com acesso ao programa Smart Signature poderá autorizar transações dessa conta. Portanto, as alterações no estado local do contrato inteligente correspondente a uma conta de assinatura inteligente devem ser totalmente protegidas. As diretrizes e melhores práticas recomendadas pela Algorand devem ser rigorosamente seguidas. Especialmente a propriedade RekeyTo deve ser validada como definida como ZeroAddress para garantir que o contrato de assinatura inteligente gerado não seja recodificado para a conta de carteira de um invasor.

Exemplo:

Considere o simples programa Smart Signature:

from pyteal import *

def ValidateRecord(name):

    program = Cond(
        [Len(Bytes(name)) >= Int(3), Return(Int(1))]
    )

    return program
Enter fullscreen mode Exit fullscreen mode

e um contrato inteligente simples:

from pyteal import *

def approval_program():

    optin_to_app = Seq([
        App.localPut(Int(0), Bytes("registered"), Int(1)),
        Return(Int(1))
    ])

    program = Cond(
        [Txn.application_id() == Int(0), Return(Int(1))],
        [Txn.on_completion() == OnComplete.OptIn, optin_to_app]
    )

    return program

def clear_state_program():
    return Int(0)
Enter fullscreen mode Exit fullscreen mode

Podemos gerar uma conta de assinatura lógica por:

from pyteal import *
from lsig import ValidateRecord

logic_sig_teal = compileTeal(ValidateRecord("ans"), Mode.Signature, version=5)

compiled_logic_sig_teal = compile_program(algod_client, str.encode(logic_sig_teal))

lsig = LogicSig(compiled_logic_sig_teal)

The address of logic sig:

print(lsig.address())
Enter fullscreen mode Exit fullscreen mode

A conta lsig pode optar por um contrato inteligente e utilizar seu armazenamento local:

# Criando um optin txn

optin_txn_unsigned = transaction.ApplicationOptInTxn(lsig.address(), algod_client.suggested_params(), APP_ID)

# Assinando o optin txn

optin_signed_txn = LogicSigTransaction(optin_txn_unsigned, lsig)

# Enviar txn para a rede

algod_client.send_transactions(optin_signed_txn)
Enter fullscreen mode Exit fullscreen mode

Serviço de Nome Algorand (do inglês Algorand Name Service ou ANS)

O padrão de design do Mapa de Hash pode ser aplicado ao caso de uso de serviço de nomes em que os nomes de entrada precisam ser mapeados para endereços de carteira. O Serviço de nome Algorand é projetado usando o padrão de design Mapa de Hash, onde o nome de entrada é usado para gerar uma conta de contrato de assinatura inteligente para armazenar os dados correspondentes de um nome de domínio .algo (sociais vinculados, endereço IP/hash CNAME/IPFS) e metadados (como vencimento, endereço do controlador) no estado local do contrato inteligente de registro.


Este artigo foi escrito por Sai Medury e publicado no Portal do desenvolvedor Algorand. Traduzido por Marcelo Panegali.

Top comments (0)