#상태변수&정수
부호 없는 정수: uint, 256비트의 부호 없는 정수
부호 있는 정수: int
#수학 연산
지수연산
uint x = 5 ** 2; // 5^2 = 5*5 = 25
#구조체
복잡한 자료형
struct Person {
uint age;
string name;
}
#배열
//정적 배열
uint[2] fixedArray;
string[5] stringArray;
//동적 배열
uint[] dynamicArray;
//구조체 배열
Person[] people
//public 배열 : 다른 컨트랙트들이 people 배열을 읽을 수 있게 됨.
Person[] public people
#함수선언
function eatHamburgers(string memory _name, uint _amount){
}
// 인자를 선언할 때 자료형까지 같이 선언
// string의 경우 메모리 타입까지 지정. string은 참조형 타입일 뿐, 실제 메모리는 타입에 따라 저장
// 전역 변수는 언더스코어(_)로 시작
#private, public 함수
// 솔리디티에서는 함수를 기본적으로 public 으로 선언.
// private로 함수를 선언할 때는 언더스코어(_)로 시작한다.
function _addToArray(uint _number) private {
numbers.push(_number);
}
#Qualifier(view, pure, payable)
qualifier는 함수의 동작을 명령함
view function은 실행할 때 데이터를 저장하거나 변조하지 않음
pure function은 데이터를 저장하지 않을 뿐만 아니라, 블록체인으로부터 데이터를 불러오지도 않음.
ex) 전역변수를 갖고오지 않음.
두 function은 모두 외부에서 불러올 때 가스 cost가 들지않음.
payable은 결제 처리를 가능하게 함. Payable로 선언되지 않은 function에 이더를 보내면 거부.
// 함수에서 반환값을 받으려면 아래와 같이 작성
function sayHello() public view returns (string memory) {
return greeting;
}
// view는 함수 제어자
// 상태를 변화시키지 않는 함수 제어자 view를 사용
// 입력된 인자값을 조작하여 반환시키는 함수는 함수 제어자 pure를 사용
#modifier
function에 특별한 조건 추가 시 사용
_;를 기준으로 함수 실행 전 동작과, 실행 후 동작을 구분
int public num = 0;
//다음의 changeNum 변경자는 함수를 실행하기 전, num 상태 변수의 값을 1 올리고, 함수의 실행이 완료되면 num 상태 변수의 값을 1 내립니다.
modifier changeNum {
num++; // 함수 실행 전 실행됨
_; // 함수 실행
num--; // 함수 실행 후 실행됨
}
function func() public changeNum {
if (num == 1) {
// do something
}
}
#메모리 타입 선언
solidity에서는 함수 내에서 변수, 파라미터로 인자값을 받을 때 메모리 타입도 같이 선언해줘야 함.
(1) storage
- 대부분의 변수, 함수들이 저장되며 영속적으로 저장이 되어 가스 비용이 비쌈
(2) memory
- 함수의 파라미터, 리턴값, 레퍼런스 타입이 주로 저장. 영속적이지 않고 함수 내에서만 유효하기 때문에 가스 비용이 상대적으로 쌈.
(3) colldata
- external function의 파라미터에 사용
(4) stack
- evm에서 stack data를 관리할 때 쓰는 영역으로 1024Mb로 제한적.
#Keccak256 and Typecasting
해시 함수는 기본적으로 입력을 임의의 256비트 16진수로 매핑함.
keccak256은 임의의 256비트 해시값으로 매핑시켜주는 내장함수.
Ethereum에서 많은 목적에 유용하며, 난수 생성할 때도 사용.
keccak256은 바이트 유형의 단일 매개변수로 받기 때문에 매개변수를 바이트로 typecasting 해야 함.
keccak256(abi.encodePacked("aaaab"));
//6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5
#event
//event 선언
event IntegersAdded(uint x, uint y, string result);
function add(uint _x, uint _y) public returns (string memory) {
uint result = string(_x + _y);
emit IntegersAdded(_x, _y, result); // 선언된 event로 방출
return result;
}
#event error handling
revert: 가능한 시나리오로부터 프로그램을 보호할 때 사용.
require: 가능한 시나리오로부터 프로그램을 보호할 때 사용.
assert: require와 동일하지만 gas를 반환하지 않음. 불변성을 검사하고 내부 문제를 테스트하는 데 사용. ex) bug
pragma solidity ^0.8.14;
contract VendingMachine {
address owner;
function buy(uint amount) public payable {
if (amount > msg.value / 2 ether)
revert("Not enough Ether provided."); //에러를 리턴하면서 에러메시지를 지정할 수 있습니다
// 송금 진행
}
}
-------------------------------------
pragma solidity ^0.8.14;
contract VendingMachine {
address owner;
function buy(uint amount) public payable {
require(
amount <= msg.value / 2 ether, // 주어진 조건이 참이면 넘어가고, 거짓이면 에러 리턴
"Not enough Ether provided." // 에러 메시지를 지정할 수 있습니다
);
// 송금 진행
}
}
'TIL' 카테고리의 다른 글
TIL) 블록체인과 튜링완전성 (0) | 2022.07.07 |
---|---|
TIL) 방법론 : MVC 패턴 (0) | 2022.07.05 |
TIL) IPFS(InterPlanetary FileSystem) 이해 (2) (0) | 2022.07.03 |
TIL) 이더리움 엔진 Geth 활용하여 private network 구축 (0) | 2022.07.01 |
TIL) IPFS(InterPlanetary FileSystem) 이해 (1) (0) | 2022.06.29 |