※ 기본적인 프로그래밍 지식이 있다는 전제하에 작성함.
'★'은 처음 접할 수 있는 내용
Solidity
- 구조체 반환예제
- Private/Public
- ★ Mapping
- ★ View/Pure
- Storage / Memory
구조체 반환예제
pragma solidity ^0.8.10;
contract pay2{
uint count;
//생성자 생성
constructor() {
count = 0;
}
//(1) 사용자 Key or id, (2) 사용자 이름, (3) 사용자 나이
struct Human{
uint id;
string name;
uint age;
}
// 구조체 배열 생성
Human[] human;
// 매개변수 (이름, 나이)입력시 데이터 push
function push(string memory _name, uint _age) public{
human.push(Human(count, _name, _age));
count++;
}
// 총 배열 길이반환
function getLength() public view returns (uint) {
return human.length;
}
// id값에 따라 (이름, 나이)반환
function gethuman(uint _id) public view returns (Human memory) {
return human[_id];
}
// 전체 사람 내역 반환
function getallhuman() public view returns(uint[] memory, string[] memory, uint[] memory){
uint[] memory id = new uint[](count);
string[] memory name = new string[](count);
uint[] memory age = new uint[](count);
for(uint i=0; i<count; i++){
Human storage test = human[i];
id[i] = test.id;
name[i] = test.name;
age[i] = test.age;
}
return (id, name, age);
}
}
★ Mapping(매핑)
mapping(Key => Value)
Key, Value 쌍으로 저장하는 방식, 처음보면 헷갈릴 수 있음 파이썬에서 Dict구조라고 생각하면 될듯
예제 : 내 주소를 Key로 입력시 설정한 Value을 반환(주석에 설명 적어놓음)
pragma solidity ^0.8.10;
contract map{
// mapping(자료형 => 자료형)
// address(Key) => uint(Value) 변수명저장
mapping(address => uint) test_map;
// 생성자
constructor() public{
// test_map에 내 주소를 Key값으로 입력시 100값 반환
test_map[msg.sender] = 100;
}
// addmap 함수 실행시 value값 125씩 증가
function addmap() public{
test_map[msg.sender] += 125;
}
// 해당 값 반환
function getmap() public view returns(uint){
return test_map[msg.sender];
}
}
★View/Pure
View/Pure는 함수를 선언할 때 사용
(1)View : View함수 안에 외부의 값을 임의로 변경할 수 없음.
View를 쓰고 Mapping한 값을 변경하려고 했지만 에러가남.
View를 제거하고 Mapping 값을 변경
(2)Pure : Pure는 외부(컨트랙트 내 포함) 변수를 읽어서도 안되고, 변경도 불가능함
외부 값들을 가져와서 사용할 수 없고, 함수내의 로컬 변수로만 값을 반환할 수 있음
public / private / internal / external
(1)public : 외부에서든, 어디서든지 접근이 가능함.
(2)private : 정의된 스마트 컨트랙트 내에서 접근가능함.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract test{
// 각 변수 Public, Private 선언
uint public pub_test = 10;
uint private pri_test = 50;
// Public 선언
function get_pub() public view returns (uint256){
return pub_test;
}
function get_pub2() public view returns (uint256){
return pri_test;
}
// Private 선언
function get_pri1() private view returns (uint256){
return pub_test;
}
function get_pri2() private view returns (uint256){
return pri_test;
}
}
Private으로 선언한 함수, 변수는 배포시 직접적인 접근이 불가능
오직, Private에 정의된 컨트랙트 내에서만 접근이 가능
(3)internal : 정의된 컨트랙트 내에서만 사용가능함(Private과 비슷하지만), 상속받은 컨트랙트에서의 접근 가능 기능이 추가됨
같은 컨트랙트 내(test)에서 external 선언함수(chang_val)를 호출 시 에러안남,
외부 컨트랙트(test2)에서 external 선언함수(chang_val) 에러남
※ external과 반대
(4)external : external이 정의된 컨트랙트 내에서는 사용이 불가능하고 외부에서만 접근가능
같은 컨트랙트 내(test)에서 external 선언함수(chang_val)를 호출 시 에러가남,
외부 컨트랙트(test2)에서 external 선언함수(chang_val) 에러안남
※ internal과 반대
Storage / Memory
(1)Storage : 블록체인에 영구적으로 저장
(1)Memory : 임시적으로 저장되는 변수, 외부 호출이 일어날 때마다 초기화 진행
'보안 및 블록체인 > 블록체인' 카테고리의 다른 글
솔리디티(Solidity) 기본 언어/문법 정리 #3, 이더리움 Dapp개발을 위해 - [블록체인] (0) | 2022.01.21 |
---|---|
블록체인 채굴 / 작업 증명 알고리즘 원리 및 개념정리- [블록체인] (0) | 2022.01.18 |
솔리디티(Solidity) 기본 언어/문법 정리, 이더리움 Dapp개발을 위해 - [블록체인] (0) | 2022.01.12 |
ICO, IEO, STO 상장방식 개념정리 - [블록체인] (0) | 2021.12.30 |
NFT? ERC? NFT 개념정리 및 전망정리 - [블록체인] (0) | 2021.12.29 |