올바른 데이터 위치를 사용합니다.

계약을 생성하는 동안 올바른 데이터 위치를 사용하면 트랜잭션에서 가스를 절약할 수 있습니다.
견고한 데이터 위치:

  • 저장소 - 변경을 도입하기 위해 상태 변수를 참조하는 동안 사용됨

  • 메모리 - 변수가 메모리에 복사되고 이를 변경해도 블록체인의 상태가 변경되지 않습니다.(데이터를 얻기 위한 참조 상태 변수뿐만 아니라 함수 입력에도 사용할 수 있음)

  • Calldata - 메모리와 동일하지만 함수 입력에서만 사용할 수 있습니다.

  • 데이터 위치를 결정하는 방법은 무엇입니까?



    (다음 계약을 고려하십시오)

    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.0;
    
    contract dataLocation{
    
        struct Order{
            string productName;
            address reciever;
            bool status;
        }
    
        mapping(address => Order) public orderDetails;
    
        function makeOrder1(string memory _productName) external { // using memory location
            Order storage _order = orderDetails[msg.sender];
            _order.productName = _productName;
            _order.reciever = msg.sender;
        }
    
        function makeOrder2(string calldata _productName) external { // using calldata location
            Order storage _order = orderDetails[msg.sender];
            _order.productName = _productName;
            _order.reciever = msg.sender;
        }
    }
    


  • 이 코드 예제에서는 블록체인에 변경 사항을 도입하는 동안 스토리지를 사용했습니다. 즉, 상태 변수(orderDetails)를 업데이트합니다.
    참고:- 메모리 데이터 위치를 사용한 경우 _order는 함수 범위 밖에서는 의미가 없습니다. (상태 변수 orderDetails에 변경 사항 없음)
  • makeOrder1 및 makeOrder2 함수는 각각 메모리 및 호출 데이터 위치를 사용하여 함수 입력을 받습니다.
    참고:- 두 기능 모두 동일한 작업을 수행하며 입력 저장을 위한 데이터 위치만 다릅니다.

  • 두 기능의 실행 비용:
    makeOrder1



    makeOrder2



    calldata를 사용하는 동안 실행 비용이 절반 이하로 줄었습니다.
    이유-> 메모리를 사용할 때는 입력 데이터를 복사하고, calldata를 사용할 때는 데이터를 그대로 가져간다. 따라서 가스가 감소합니다.
    이로 인해 calldata 위치에 저장된 입력을 변경할 수 없습니다. 따라서 입력을 변경해야 하는 경우 메모리를 사용해야 합니다.

    좋은 웹페이지 즐겨찾기