Solidity의 데이터 위치
7373 단어 dynamicdatasoliditycalldataweb3
arrays
, strings
, struct
등입니다. 일반적으로 storage
, memory
및 calldata
세 위치 중 하나가 지정됩니다.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
가 데이터를 복사하지 않기 때문에 가스를 절약하는 데 도움이 됩니다.
Reference
이 문제에 관하여(Solidity의 데이터 위치), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jamiescript/data-location-in-solidity-12di텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)