A maioria das despesas com gás da Ethereum concentra-se no armazenamento. Cada operação que altera o estado (armazenamento) da rede Ethereum é tipicamente dispendiosa. Como resultado, concentrar-se na forma como os dados são mantidos e acessíveis pode resultar em reduções significativas de custos. Nesta sessão, veremos algumas maneiras de otimizar o armazenamento com o Remix.
A cadeia de blocos Ethereum fornece armazenamento permanente. Tudo o que é poupado na cadeia de blocos estará disponível enquanto o blockchain sobreviver, mas esta permanência tem um custo. A otimização do armazenamento não só reduz os custos mas também garante que o estado global do Ethereum seja utilizado de forma eficiente.
Solidity armazena variáveis em slots. Cada slot é de 32 bytes. Quando as variáveis podem caber num único slot, podem ser lidas ou atualizadas com uma única operação SLOAD ou SSTORE, respectivamente.
Considere dois contratos:
Solidez
//Sem Optimização
solidez do pragma ^0.8.9;
contrato UnOptimizedStorage {
uint256 public value1;
uint256 public value2;
}
Solidez
//Com Optimização
solidez do pragma ^0.8.9;
contrato OptimizedStorage {
uint128 public value1;
uint128 public value2;
}
Implemente ambos os contratos no Remix e observe as diferenças de gás ao interagir com as suas variáveis.
Na versão otimizada, tanto o valor1 como o valor2
partilham um único
slot de 32 bytes.
Quando terminar com um slot de armazenamento, especialmente o armazenamento temporário de dados, pode eliminar ou zerar o slot para obter um reembolso de gás.
Solidez
solidez do pragma ^0.8.9;
contrato refundeExemplo {
uint256 dados temporários públicos;
função StoreTemporaryData (uint256 data) public {
temporaryData = data;
}
função clearTemporaryData () public {
delete temporaryData;
}
}
Implemente este contrato no Remix.
Armazene alguns dados temporários e depois limpe.
Verifique o custo do gás. Observe o reembolso do gás que recebe pela operação de exclusão
.
Se os dados não precisarem de ser acedidos na cadeia, considere registá-los como um evento em vez de armazená-los. Os eventos são muito mais baratos do que as operações de armazenamento.
Solidez
solidez do pragma ^0.8.9;
exemplo de evento de contrato {
dados de eventos armazenados (dados uint256);
função StoreData (dados uint256) público {
emit DataStored(data);
}
}
Implemente e interaja com o contrato no Remix.
Note os custos de gás mais baratos em comparação com o armazenamento.
É fundamental praticar agora que dominou algumas abordagens fundamentais de otimização de armazenamento. Envolva com os exemplos oferecidos e experimente criar o seu próprio. Na sessão seguinte, vamos aprofundar-nos 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 a experimentar!
A maioria das despesas com gás da Ethereum concentra-se no armazenamento. Cada operação que altera o estado (armazenamento) da rede Ethereum é tipicamente dispendiosa. Como resultado, concentrar-se na forma como os dados são mantidos e acessíveis pode resultar em reduções significativas de custos. Nesta sessão, veremos algumas maneiras de otimizar o armazenamento com o Remix.
A cadeia de blocos Ethereum fornece armazenamento permanente. Tudo o que é poupado na cadeia de blocos estará disponível enquanto o blockchain sobreviver, mas esta permanência tem um custo. A otimização do armazenamento não só reduz os custos mas também garante que o estado global do Ethereum seja utilizado de forma eficiente.
Solidity armazena variáveis em slots. Cada slot é de 32 bytes. Quando as variáveis podem caber num único slot, podem ser lidas ou atualizadas com uma única operação SLOAD ou SSTORE, respectivamente.
Considere dois contratos:
Solidez
//Sem Optimização
solidez do pragma ^0.8.9;
contrato UnOptimizedStorage {
uint256 public value1;
uint256 public value2;
}
Solidez
//Com Optimização
solidez do pragma ^0.8.9;
contrato OptimizedStorage {
uint128 public value1;
uint128 public value2;
}
Implemente ambos os contratos no Remix e observe as diferenças de gás ao interagir com as suas variáveis.
Na versão otimizada, tanto o valor1 como o valor2
partilham um único
slot de 32 bytes.
Quando terminar com um slot de armazenamento, especialmente o armazenamento temporário de dados, pode eliminar ou zerar o slot para obter um reembolso de gás.
Solidez
solidez do pragma ^0.8.9;
contrato refundeExemplo {
uint256 dados temporários públicos;
função StoreTemporaryData (uint256 data) public {
temporaryData = data;
}
função clearTemporaryData () public {
delete temporaryData;
}
}
Implemente este contrato no Remix.
Armazene alguns dados temporários e depois limpe.
Verifique o custo do gás. Observe o reembolso do gás que recebe pela operação de exclusão
.
Se os dados não precisarem de ser acedidos na cadeia, considere registá-los como um evento em vez de armazená-los. Os eventos são muito mais baratos do que as operações de armazenamento.
Solidez
solidez do pragma ^0.8.9;
exemplo de evento de contrato {
dados de eventos armazenados (dados uint256);
função StoreData (dados uint256) público {
emit DataStored(data);
}
}
Implemente e interaja com o contrato no Remix.
Note os custos de gás mais baratos em comparação com o armazenamento.
É fundamental praticar agora que dominou algumas abordagens fundamentais de otimização de armazenamento. Envolva com os exemplos oferecidos e experimente criar o seu próprio. Na sessão seguinte, vamos aprofundar-nos 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 a experimentar!