A maioria dos gastos com gás da Ethereum concentra-se no armazenamento. Cada operação que altera o estado (armazenamento) da rede Ethereum normalmente é cara. Como resultado, concentrar-se na forma como os dados são mantidos e acessíveis pode resultar em reduções de custos significativas. Nesta sessão, veremos algumas maneiras de otimizar o armazenamento com o Remix.
A blockchain Ethereum fornece armazenamento permanente. Tudo o que for salvo no blockchain estará disponível enquanto o blockchain sobreviver, mas essa permanência tem um custo. A otimização do armazenamento não apenas reduz os custos, mas também garante que o estado global do Ethereum seja usado de forma eficiente.
O Solidity armazena variáveis em slots. Cada slot tem 32 bytes. Quando as variáveis cabem em um único slot, elas podem ser lidas ou atualizadas com uma única operação SLOAD ou SSTORE, respectivamente.
Considere dois contratos:
Solidez
// Sem Otimização
pragma solidez ^0.8.9;
contratos UnoptimizedStorage {
uint256 public value1;
uint256 public value2;
}
Solidez
// Com Otimização
pragma solidez ^0.8.9;
contratos OptimizedStorage {
uint128 public value1;
uint128 public value2;
}
Implante ambos os contratos no Remix e observe as diferenças de gás ao interagir com suas variáveis.
Na versão otimizada, value1
e value2
compartilham um único slot de 32 bytes.
Quando terminar de usar um slot de armazenamento, especialmente o armazenamento temporário de dados, você pode excluir ou zerar o slot para obter um reembolso de gás.
Solidez
pragma solidez ^0,8,9;
contratos RefundExample {
uint256 public temporárioData;
função storeTemporaryData (dados uint256) público {
temporaryData = data;
}
função clearTemporaryData() público {
delete temporaryData;
}
}
Implante este contrato no Remix.
Armazene alguns dados temporários e limpe-os.
Verifique o custo do gás. Observe o reembolso do gás que você recebe pela operação delete
.
Se os dados não precisarem ser acessados na cadeia, considere registrá-los como um evento em vez de armazená-los. Os eventos são muito mais baratos que as operações de armazenamento.
Solidez
pragma solidez ^0,8,9;
contratos EventExample {
eventos DataStored (dados uint256);
função storeData (dados uint256) público {
emit DataStored(data);
}
}
Implante e interaja com o contrato no Remix.
Observe os custos mais baratos do gás quando comparado ao armazenamento.
É fundamental praticar agora que você domina algumas abordagens fundamentais de otimização de armazenamento. Envolva-se com os exemplos oferecidos e experimente criar os seus próprios. Na sessão a seguir, nos aprofundaremos na otimização da visibilidade da função e na reutilização de código com bibliotecas. Tenha em mente que a otimização é uma arte e uma ciência. Continue experimentando!
A maioria dos gastos com gás da Ethereum concentra-se no armazenamento. Cada operação que altera o estado (armazenamento) da rede Ethereum normalmente é cara. Como resultado, concentrar-se na forma como os dados são mantidos e acessíveis pode resultar em reduções de custos significativas. Nesta sessão, veremos algumas maneiras de otimizar o armazenamento com o Remix.
A blockchain Ethereum fornece armazenamento permanente. Tudo o que for salvo no blockchain estará disponível enquanto o blockchain sobreviver, mas essa permanência tem um custo. A otimização do armazenamento não apenas reduz os custos, mas também garante que o estado global do Ethereum seja usado de forma eficiente.
O Solidity armazena variáveis em slots. Cada slot tem 32 bytes. Quando as variáveis cabem em um único slot, elas podem ser lidas ou atualizadas com uma única operação SLOAD ou SSTORE, respectivamente.
Considere dois contratos:
Solidez
// Sem Otimização
pragma solidez ^0.8.9;
contratos UnoptimizedStorage {
uint256 public value1;
uint256 public value2;
}
Solidez
// Com Otimização
pragma solidez ^0.8.9;
contratos OptimizedStorage {
uint128 public value1;
uint128 public value2;
}
Implante ambos os contratos no Remix e observe as diferenças de gás ao interagir com suas variáveis.
Na versão otimizada, value1
e value2
compartilham um único slot de 32 bytes.
Quando terminar de usar um slot de armazenamento, especialmente o armazenamento temporário de dados, você pode excluir ou zerar o slot para obter um reembolso de gás.
Solidez
pragma solidez ^0,8,9;
contratos RefundExample {
uint256 public temporárioData;
função storeTemporaryData (dados uint256) público {
temporaryData = data;
}
função clearTemporaryData() público {
delete temporaryData;
}
}
Implante este contrato no Remix.
Armazene alguns dados temporários e limpe-os.
Verifique o custo do gás. Observe o reembolso do gás que você recebe pela operação delete
.
Se os dados não precisarem ser acessados na cadeia, considere registrá-los como um evento em vez de armazená-los. Os eventos são muito mais baratos que as operações de armazenamento.
Solidez
pragma solidez ^0,8,9;
contratos EventExample {
eventos DataStored (dados uint256);
função storeData (dados uint256) público {
emit DataStored(data);
}
}
Implante e interaja com o contrato no Remix.
Observe os custos mais baratos do gás quando comparado ao armazenamento.
É fundamental praticar agora que você domina algumas abordagens fundamentais de otimização de armazenamento. Envolva-se com os exemplos oferecidos e experimente criar os seus próprios. Na sessão a seguir, nos aprofundaremos na otimização da visibilidade da função e na reutilização de código com bibliotecas. Tenha em mente que a otimização é uma arte e uma ciência. Continue experimentando!