29일 - 조립

특사-VC / 30일의 견고함


스마트 계약 개발을 배우기 위한 30일간의 Solidity 단계별 가이드.




Solidity Series의 29 중 Day30입니다.
오늘 저는 솔리디티에서 어셈블리에 대해 배웠습니다.

어셈블리(어셈블러 언어라고도 함)는 어셈블러를 사용하여 기계 코드로 변환되는 모든 저수준 프로그래밍 언어를 나타냅니다. 어셈블러 언어는 명령어 세트를 구현하기 때문에 물리적 또는 가상 머신에 연결됩니다. 명령은 단순히 CPU에게 두 개의 숫자를 더하는 것과 같은 기본적인 작업을 수행하도록 지시합니다.

프로세서의 예로는 Intel x86 또는 ARM이 있습니다. Intel x86에는 약 1503개의 기계 명령어가 있습니다. 그들은 일반적으로 opcode라고합니다.

EVM(Ethereum Virtual Machine)에는 자체 명령어 세트도 있습니다.

The EVM contains 141 opcodes in its instruction set



Solidity에는 스마트 계약의 소스 코드 내에 어셈블리 언어 코드를 작성할 수 있는 옵션이 있습니다. Solidity 어셈블리의 도움으로 opcode를 사용하여 EVM과 직접 상호 작용할 수 있습니다. 어셈블리는 특정 메모리 블록을 가리키는 것과 같이 견고성만 사용해서는 불가능한 일부 논리에 대해 더 많은 제어를 제공합니다. 주요 이점 중 하나는 계약을 배포하는 데 사용되는 가스 비용을 줄이는 것입니다.

Solidity에는 어셈블리 언어를 구현하는 두 가지 방법이 있습니다.

인라인 어셈블리:



인라인 어셈블리 코드는 보다 세밀한 제어를 위해 견고성 코드 내부에 작성될 수 있으며 특히 새 라이브러리 생성을 통해 언어를 향상시키는 데 사용됩니다. EVM이 이해할 수 있는 방식으로 solidity 문 사이에 인라인 어셈블리를 삽입할 수 있습니다. 옵티마이저가 효율적인 코드를 생성할 수 없을 때도 사용할 수 있습니다. 어셈블리 로컬 변수, 함수 호출, switch 문, if 문, 루프 등과 같은 기능을 사용하면 견고성이 더 쉬워집니다.

통사론:

assembly{
     // assembly language statements
}


예시 -

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract InlineAssembly {
    function add(uint a) public view returns (uint b) {

        // Inline assembly code
        assembly {
            // Creating a new variable 'c'
            // Calculate the sum of 'a+16' with the 'add' opcode
            // assign the value to the 'c'
            let c := add(a, 16)

            // Use 'mstore' opcode to store 'c' in memory
            // at memory address 0x80
            mstore(0x80, c)
            {
                // Creating a new variable
                // Calculate the sum of 'sload(c)+12'
                // means values in variable 'c' with the 'add' opcode
                // assign the value to 'd'
                let d := add(sload(c), 12)

                // assign the value of 'd' to 'b'
                b := d

            // 'd' is deallocated now
            }

            // Calculate the sum of 'b+c' with the 'add' opcode
            // assign the value to 'b'
            b := add(b, c)

            // 'c' is deallocated here
        }
    }
}

5 함수의 인수로 add를 전달하면

0:
uint256: b 33

좋은 웹페이지 즐겨찾기