티스토리 뷰
Programming Language/Solidity
[Solidity] Contract, Visibility와 Getter
SdardewValley 2021. 5. 31. 11:09반응형
Contract
- 객체 지향 언어의 클래스와 유사
Creating Contracts
- contract가 생성되면 생성자(
constructor
키워드와 선언된 함수)가 한 번 실행됨 - constructor은 선택 사항 -> default constructor
- constructor은 하나만 가능(오버로드가 지원되지 않음)
- constructor가 실행된 후, contract의 최종 코드가 블록체인에 저장됨
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.22 <0.9.0;
contract OwnedToken {
TokenCreator creator;
address owner;
bytes32 name;
// 생성자
constructor(bytes32 _name) {
owner = msg.sender;
creator = TokenCreator(msg.sender);
name = _name;
}
function changeName(bytes32 newName) public {
if (msg.sender == address(creator))
name = newName;
}
function transfer(address newOwner) public {
if (msg.sender != owner) return;
if (creator.isTokenTransferOK(owner, newOwner))
owner = newOwner;
}
}
// constructor가 있지 않음
// default constructor
contract TokenCreator {
function createToken(bytes32 name)
public
returns (OwnedToken tokenAddress)
{새
return new OwnedToken(name);
}
function changeName(OwnedToken tokenAddress, bytes32 name) public {
tokenAddress.changeName(name);
}
function isTokenTransferOK(address currentOwner, address newOwner)
public
pure
returns (bool ok)
{
return keccak256(abi.encodePacked(currentOwner, newOwner))[0] == 0x7f;
}
}
Visibility and Getters
Solidity의 함수 호출 종류
- 내부 호출: 실제 EVM 호출을 생성하지 않음
- 외부 호출: 내부 호출을 실행
Visibility 종류
Fuction | State Variable | note | |
---|---|---|---|
external | O | X | external function : 다른 contract나 transaction을 통해 호출 가능external function f 는 this.f() 를 통해 호출(f() 는 동작하지 않음 |
public | O | O | public function : 내부적으로 호출하거나 메시지를 통해서 호출 가능public state variable : 자동적으로 getter 함수가 생성됨 |
internal | O | O | State Variable의 기본 가시성 수준. 현재 contract나 파생된 contract에서 접근 가능. |
private | O | O | 정의된 contract에서만 가시적. 파생 클래스에서는 비가시적. |
visibility 지정자 위치
- 상태 변수의 타입 뒤
- 매개변수 리스트와 리턴 매개변수 리스트 사이
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;
contract C {
function f(uint a) private pure returns (uint b) { return a + 1; } // 매개변수 리스트와 리턴 매개변수 리스트 사이
function setData(uint a) internal { data = a; } // 매개변수 리스트와 리턴 매개변수 리스트 사이
uint public data; // 상태 변수 타입 뒤
}
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.8.0;
contract C {
uint private data;
function f(uint a) private pure returns(uint b) { return a + 1; }
function setData(uint a) public { data = a; }
function getData() public view returns(uint) { return data; }
function compute(uint a, uint b) internal pure returns (uint) { return a + b; }
}
// This will not compile
contract D {
function readData() public {
C c = new C();
uint local = c.f(7); // error: member `f` is not visible -> f는 private
c.setData(3);
local = c.getData();
local = c.compute(3, 5); // error: member `compute` is not visible -> compute는 internal이기 때문에 contract C나 혹은 contract C에서 파생된 contract에서만 접근 가능
}
}
contract E is C {
function g() public {
C c = new C();
uint val = compute(3, 5); // access to internal member (from derived to parent contract) -> E는 derived contract이기 때문에 접근 가능
}
}
Getter Functions
- public state variable에 대해 컴파일러가 자동으로 생성하는 함수
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.16 <0.8.0;
contract C {
uint public data = 42;
}
contract Caller {
C c = new C();
function f() public view returns (uint) {
return c.data(); // data(): return state variable "data"
}
}
- getter function은 external 수준으로 가시성을 가짐
- this.data(): 외부 접근
- data(): 내부 접근
``` solidity
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;
contract C {
uint public data;
function x() public returns (uint) {
data = 3; // internal access
return this.data(); // external access
}
}
public
state variable인 array 타입은 getter function으로 배열의 요소에 접근 가능- 전체 array를 리턴할 때 높은 gas 비용을 방지
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.16 <0.8.0;
- 전체 array를 리턴할 때 높은 gas 비용을 방지
contract arrayExample {
// public state variable
uint[] public myArray;
// 컴파일러에 의해 자동으로 생성되는 getter
/*
function myArray(uint i) public view returns (uint) {
return myArray[i];
}
*/
// 전체 array를 리턴하는 function
function getArray() public view returns (uint[] memory) {
return myArray;
}
}
```solidity
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.8.0;
contract Complex {
struct Data {
uint a;
bytes3 b;
mapping (uint => uint) map;
}
mapping (uint => mapping(bool => Data[])) public data; // ??
}
위의 코드는 아래와 같은 funtion을 생성한다.
function data(uint arg1, bool arg2, uint arg3) public returns (uint a, bytes3 b) {
a = data[arg1][arg2][arg3].a;
b = data[arg1][arg2][arg3].b;
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 코틀린
- graphql
- pm.test
- git
- java
- 코딩테스트
- go 특징
- postman tests
- DGS Framework
- mysql
- Basic Type
- python3
- pm.expect
- Python
- 1차 인터뷰
- downTo
- 네이버 2022 공채
- string
- squash merge
- Squash and merge
- 주생성자
- Kotlin
- 2차 인터뷰
- Kotlin In Action
- postman
- hashcode
- github
- postman collection
- solidity
- 확장 함수
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함