Solidity의 데이터 위치

동적 데이터 유형을 선언할 때 저장할 위치를 지정해야 합니다. Solidity의 동적 데이터 유형은 arrays , strings , struct 등입니다. 일반적으로 storage , memorycalldata 세 위치 중 하나가 지정됩니다.
storage를 위치로 사용한다는 것은 데이터가 블록체인에 저장된다는 것을 의미하고 메모리는 데이터가 memory에 저장된다는 것을 의미하며 선언된 함수의 실행이 완료되면 지워집니다. calldata의 다른 위치는 함수에 입력 매개변수로 전달되는 저장된 변수에 사용됩니다.

 //SPDX-License-Identifier: Unlicense
pragma solidity >=0.7.0 <0.9.0;

contract StorageLocation {
    Person[] public persons;

    struct Person {
        string name;
        uint age;
        address personAddress;
    }

    constructor() {
       Person memory newperson = Person({
           name: "Jamie",
           age: 33,
           personAddress: msg.sender
       });

       Person memory personTwo = Person({
           name: "Bones Man",
           age: 33,
           personAddress: msg.sender
       });
       persons.push(newperson);
       persons.push(personTwo);
    }

    function loadPerson() public view returns ( Person[] memory ){
        return persons;
    }

    function changeDataone() public view {
        Person memory person = persons[0];
        person.age = 56;
    }

    function changeDataTwo() public {
        Person storage person = persons[0];
        person.age = 76;
    }

    function receiveAsCallData(uint256[] calldata a) public {
        //you can not modify a
    }
}


위의 스마트 계약은 간단한 스마트 계약입니다. 스마트 계약 맨 위에서 사용자 정의 구조체인 Person의 배열을 정의했습니다. Person의 배열은 persons라는 변수에 저장됩니다. persons 변수는 상태 변수이므로 블록체인에 저장되므로 위치는 storage 입니다.

생성자 함수를 보면 두 가지Person 유형이 생성되어 Person[]라는 persons 배열에 푸시된 것을 볼 수 있습니다. 생성자 내부의 newperson 변수는 메모리에 저장되며 생성자 함수 실행이 완료되면 소멸됩니다. newperson 구조체를 생성한 후 영구 저장을 위해 persons 배열로 푸시되었습니다. 메모리의 임시newperson 변수는 생성자 함수 실행이 완료된 후 삭제됩니다.
changeDataone 함수와 changeDataTwo 함수를 자세히 살펴보십시오. changeDataone 함수가 person이라는 변수를 만들고 메모리에 저장한 것을 알 수 있습니다.
Person memory person = persons[0];
Doing it this way reads the data of the
people array at index of 0 and stores it in a person variable in memory. Attempting to change person.age to 56 will not be successful because we are not referencing the storage location of people . At the termination of the function the people의 저장 변수는 메모리의 데이터가 지워졌기 때문에 그대로 유지됩니다.

동적 데이터 유형에서 변경 사항을 유지하려면 해당 변수의 저장 위치를 ​​참조해야 합니다. 함수changeDataTwo가 그렇게 합니다. 사용해 보세요Remix

계약이 배포되면 Person를 실행하여 볼 수 있는 생성자를 통해 두 개의 persons 구조체가 loadPerson 배열에 추가됩니다. 함수changeDataone를 실행하고 첫 번째Person 구조체가 설명된 대로 변경되었는지 관찰합니다. 그런 다음 함수changeDataTwo를 실행하면 persons 변수가 업데이트되었음을 ​​알 수 있습니다.

세 번째 위치calldata는 입력 매개변수를 함수에 전달하는 데 사용됩니다. calldata에 변수를 저장하면 변수를 수정할 수 없습니다. calldata를 사용하면 위치로 EVM를 사용할 때처럼 memory가 저장된 데이터를 복사하지 않으므로 약간의 가스를 절약할 수 있습니다.

요약



상태에 저장된 동적 데이터를 수정하지 않고 읽으려는 경우 또는 동적 데이터 유형에 대한 임시 저장소가 필요한 경우 위치memory를 사용합니다.

수정을 위해 상태에 저장된 동적 데이터에 대한 참조를 원할 때 storage를 사용합니다.

함수에 대한 입력으로 전달된 동적 데이터 유형의 값을 변경하지 않을 경우 calldata 를 사용할 수 있습니다. calldata를 사용하면 EVM가 데이터를 복사하지 않기 때문에 가스를 절약하는 데 도움이 됩니다.

좋은 웹페이지 즐겨찾기