Solidity Assembly

Neste artigo, examinaremos a montagem do Solidity com exemplos, incluindo sua sintaxe, tipos de dados e estruturas de fluxo de controle.

Também abordaremos alguns casos de uso comuns para montagem, como otimização de gás, gerenciamento de memória de baixo nível e interface com contratos externos.



Montador ou Montador

Uma linguagem assembly é uma linguagem de programação de baixo nível que pode ser convertida em código de máquina usando um montador.

As linguagens Assembler são implementadas por máquinas físicas ou virtuais, e essas instruções instruem a CPU a fazer coisas como adicionar dois números.


Solidity Assembly

O Solidity oferece a opção de escrever código em linguagem assembly dentro do código-fonte do contrato inteligente .

Ao usar o assembly do Solidity, podemos interagir diretamente com o EVM por meio de seus opcodes. Usando o assembly, você pode controlar alguma lógica que não pode ser controlada usando apenas solidez, como apontar para um bloco de memória específico.

Uma de suas principais vantagens é que reduz o custo do gás utilizado para implantação.

Existem duas maneiras de implementar a linguagem assembly no Solidity , Inline Assembly e Standalone Assembly.


Montagem Em Linha

Adicionar código assembly ao código solidity fornece controle refinado e é particularmente útil para aprimorar a linguagem adicionando novas bibliotecas.

Uma instrução de solidity pode conter montagem em linha que o EVM pode entender.

Além disso, pode ser aplicado quando o otimizador não é capaz de produzir código confiável.

Variáveis ​​locais de montagem, chamadas de função, instruções switch , instruções if , loops , etc., tornam a solidez mais fácil.

Sintaxe

assembly{
// assembly language statements
}

O exemplo abaixo irá ajudá-lo a integrar a linguagem assembly com solidity. Aqui adicionamos duas variáveis ​​usando a linguagem assembly:

Example: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
pragma solidity ^0.8.0;
contract SolidityTest {
function add(uint256 a, uint256 b) public pure returns (uint256) {
assembly {
// Load the values of a and b into registers
mstore(0x0, a)
mstore(0x20, b)
let result := add(a, b)
// Return the result
mstore(0x0, result)
return(0x0, 0x20)
}
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<div class="spinner-border" role="status"><span class="sr-only">Loading...</span></div>
O programa abaixo mostra o método de impressão de um produto de dois números usando o código de bloco da linguagem assembly:

Example: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
pragma solidity ^0.8.0;
contract SolidityTest {
function multiply(uint256 a, uint256 b) public pure returns (uint256) {
uint256 mrx_result;
assembly {
// Multiply a and b
mrx_result := mul(a, b)
}
return mrx_result;
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<div class="spinner-border" role="status"><span class="sr-only">Loading...</span></div>
Da mesma forma, é possível subtrair duas variáveis ​​fornecidas pelo usuário usando o código assembly da seguinte forma:

Example: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
pragma solidity ^0.8.0;
contract SolidityTest{
function subtract_Variables(uint mrx,uint ample) public pure returns (uint) {
uint mrx_result;
assembly {
// subtract ample from mrx and store the mrx_result on the stack
let subResult := sub(mrx, ample)
// copy the result from the stack to the mrx_result variable
mrx_result := subResult
}
return mrx_result;
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<div class="spinner-border" role="status"><span class="sr-only">Loading...</span></div>

Montagem independente

A linguagem assembly autônoma é planejada para atuar como uma linguagem intermediária para o compilador Solidity.

Foi suportado para compatibilidade recente, mas não aparece mais na documentação do Solidity.

Em assemblies autônomos, o código pode ser lido mesmo que tenha sido gerado usando um compilador de solidity.

Um fluxo de controle simples é necessário para otimização e verificação formal.

O exemplo a seguir mostrará o funcionamento do Standalone Assembly com o contrato de solidez:

Example: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
pragma solidity ^0.8.0;
contract SolidityTest{
function standAlone_Assembly_add(uint mrx) public pure returns (uint ample) {
// Here we have assigned the variable ample with a value of 5
ample = 5;
// The for loop will be executed until the desired condition is met
for (uint n = 0; n < mrx; n++)
ample += mrx;
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<div class="spinner-border" role="status"><span class="sr-only">Loading...</span></div>

Benefícios do Solidity Assembly

A seguir estão alguns benefícios de usar o assembly no código do Solidity:

  • A execução do código Solidity pode ser controlada precisamente através da linguagem Assembly. É possível otimizar os custos de gás e tornar seus contratos mais eficientes escrevendo código de baixo nível em assembly.
  • O código Assembly é mais rápido que o código Solidity, pois acessa diretamente as instruções nativas do EVM. Em contraste, o Solidity requer um processo de compilação intermediário que pode ser demorado.
  • O código Assembly oferece acesso direto à Máquina Virtual Ethereum (EVM). Em comparação com as abstrações de nível superior do Solidity, isso fornece mais flexibilidade e controle sobre o comportamento do contrato.
  • O código Assembly geralmente é mais curto que o código Solidity equivalente. Como resultado, o tamanho do contrato pode ser reduzido, reduzindo assim os custos de gás e melhorando a implantação do contrato.
  • Às vezes, depurar o código do Solidity é difícil, especialmente ao lidar com detalhes de baixo nível, como custos de gás. A linguagem assembly permite depurar em um nível inferior, facilitando o isolamento e a correção de problemas de código.

Conclusão

A linguagem de montagem Solidity oferece um conjunto exclusivo de benefícios para otimizar seus contratos inteligentes. O código de montagem fornece acesso direto aos opcodes EVM para ajustar a execução do contrato e melhorar a eficiência do gás.

Além disso, a linguagem assembly pode ser inestimável para você na otimização de contratos devido ao seu tamanho de código reduzido e recursos de depuração de baixo nível.

É importante, no entanto, entender bem o EVM antes de usar o código assembly.

A linguagem assembly do Solidity deve ser escolhida com base em uma avaliação cuidadosa de sua eficiência, complexidade e capacidade de manutenção .

Pode ser altamente gratificante para os desenvolvedores que dedicam tempo e esforço para dominar a linguagem assembly em termos de desempenho do contrato e economia de custos.

Nós valorizamos o seu feedback.
+1
0
+1
0
+1
0
+1
0
+1
0
+1
0
+1
0

Assine a nossa newsletter
Digite seu e-mail para receber um resumo semanal de nossos melhores posts. Saber mais!
ícone