1. 버전명시
- pragma 키워드를 이용해서 smart contract가 지원하는 solidity 버전을 명시한다.
pragma solidity ^0.8.7;
2. 계약(contract)
일반적인 언어에서의 class와 같은 개념이다. 이더리움과 비트코인의 가장 큰 차이중 하나이다. 모든 코드의 실행은 contract 안에서 이루어진다.
contract SimpleStorage {
uint storedData;
function set(uint x) public {
storedData = x;
}
function get() public view returns (uint) {
return storedData;
}
}
- unit : 256비트의 양의정수 타입, unit 타입의 storedData 가 변수로 선언
- set, get : 변수의 값을 변경하거나 조회하기 위한 함수
** 상태 변수에 접근할때 다른 언어에서 일반적으로 사용되는 this. 키워드는 사용하지 않는다.
3. Contract의 키워드
1. visibility (접근 제어자)
public | - 변수를 외부에 노출 가능 = 다른 contract에서 호출가능 - public을 사용 할 경우 자동으로 해당 변수를 반환하는 getter 함수 생성 (getter함수는 변호명이랑 동일한 이름) - contract 내부 함수들끼리 참조하여 사용가능 |
private | - 컨트랙트 내부만 호출가능 |
external | - external을 붙인 함수(변수)는 컨트랙트의 외부에서만 호출 될 수 있다. - 외부 컨트랙트에서만 호출 가능 - public으로 변경 가능 |
internal | - private과 유사하나, 상속을 받은 컨트랙트(자식 컨트랙트)에서는 함수(변수)를 사용 할 수 있게함 |
2. 자료형 타입
reference | memory | - 함수 내에서 유효안 영역에 저장 - storage 이외에는 모두 memory이다.(휘발성) |
reference | storage | - state variables와 같이 영속적으로 저장되는 영역에 저장 - blockchain에 기록되는 값들 |
reference | calldata | - external 함수 인자에 사용되는 공간 |
3. 접근유형(함수에 사용)
public pure 같은 형식으로 제어자를 여러개 나열
view | storage 레벨에 있는 자료를 읽을수 있음, 수정은 불가 |
pure | - storage 레벨에 있는 자료를 읽을 수 없음 - 함수 안의 인자 값만 활용해서 반환 값 정함 |
payable | 함수에서 사용 시 : ethereum을 송/수신할때 사용 |
4. Contract의 구성요소
- constructor()
- state variable
- struct type
- enum
- function
- modifier
- event
1. constructor()
contract를 생성시 실행
contract A{
string public name;
uint256 public age;
constructor(string memory _name, uint256 _age){
name = _name;
age = _age;
}
}
contract B{
A instance = new A("Alice", 52);
}
2. state variable
- 함수 밖에서 선언한 변수를 상태변수(state variable) 이라고 한다.
- state variable 이라 불리는 이유는 블록체인에 영구히 기록되기 때문
- 함수안에서 선언한 변수는 블록체인에 기록 되지 않지 때문에 state variable이 아님
boolean | true, false | |
int ~ int256 | - int256 = int - 8비트 단위로 존재 |
|
uint ~ uint256 | 부호가 없는 양의정수(0포함) | - (uint256 = uint) - 8비트 단위로 존재 |
fixed/unfixed | - 고정 소수점 | |
address | - 20바이트(이더리움 address의 크기)를 담을 수 있습니다. - 솔리디티의 함수 호출은 항상 외부 호출자가 시작한다. 따라서 함수를 호출한 사람은 무조건 존재하고 그 사람의 주소를 address 자료형으로 받을 수 있다. - balance, transfer, send, call, callcode, delegatecall의 멤버를 가지고 있습니다. |
|
bytes ~ bytes32 | byte2 test = 'no' test[0] // n test[1] // o test[1] = 'cc' // error |
- 고정 크기 바이트배열 - byte[]로도 사용 가능하지만, 배열 아이템간 31byte 패딩이 추가되어 공간낭비 발생 - delete test[1]// test == ['n'] - test.pop() ; // test ==['n'] |
bytes | - 동적 크기 바이트배열 - 임의의 길이의 원시 바이트를 처리할때 사용 |
|
string | "test" | - 동적 크기 바이트배열 - 임의이 길이의 문자열(UTF-8)데이터를 처리 할 때 사용 |
function | - 함수타입의 변수는 함수에서 할당될 수 있다 - 함수타입의 함수매개변수는 함수가 호출될때, 함수를 전달하거나 반환하는데 사용 - 내부함수 / 외부함수로 두가지 타입이 있다. |
|
mapping | - storage로만 쓸 수 있다.(state variable로만 선언가능) - 파이썬의 딕셔너리(해시태이블 자료구조) - JS와 다르게 key와 value의 타입을 미리 선언해야 한다. // key: uint 형, value: address 형 mapping(uint => address) public zombieToOwner; |
|
array | T[k] x; // 1차원 배열 T[][k] x; // 2차원 배열 |
- storage로 선언된 array만 size가 가변적으로 늘어날 수 있다. - memory로 선언시 크기를 고정 해야 한다. - 차원 배열시 특이점 T[][k] // k개의 T를 담을 수 있는 가변배열 x 선언, 일반 언어에서는 T[k][] -push로 아이템 추가 |
선언방식 : 자료형 키워드 이름 = data;
contract Count {
unit public count = 0;
adress public lastParticipant;
}
3. struct type
- solidityd에서 제공하지 않는 새로운 자료형을 만들때 사용
- c나 c++ 의 struct와 동일 (타입 인터페이스)
- struct를 구성 할 때 자기 자신을 넣을 수 없다는것 외엔 제약 없음
contract Ballot{
struct Voter {
uint weight;
bool voted;
address delegate;
uint vote;
}
}
4. enum
- 변경되지 않는 상수를 정의 할 때 사용
contract Ballot{
enum Status {
Open,
Closed
}
}
5. function
function 함수명 visibility 접근유형 modifier return (반환자료형)
6. modifier
- 함수의 실행 전, 후의 성격을 정의
- 대부분의 경우 함수의 실행 조건을 정희하는데 사용됨
- require 함수로 실행 조건을 명시
contract Ballot {
constructor() public { chairperson = msg.sender; }
address chaireperson;
modifier onlyChair {
require(msg.sender == chairperson, "only ther chaireperson can call");
// require에서 앞에 조건이 true이면 문제 없음.
// 조건이 false이면 , 뒤에 메시지를 보여주면서 종료가됨
_;
}
function giveRightToVote(addreess to) public onlyChair {
// 'onlyChair' modifier ensures that this function is called by ther chaireperson
}
}
7. event
- EVM(Ethereum Virtual Machine) 로깅을 활용한 시스템
- event가 실행 될 때마다 transaction log에 저장
- 저장된 logs는 contract 주소와 연동되어 client가 RPC로 조회 가능하게
- transaction을 보내고 transactions block에 기록 될 때마다 transactions은 자기 로그를 남길 수 있다.
- client가 event를 listening 하는데 사용, block이 나올때 마다 어떤 event를 발생 했는지 확인 가능
- client는 listening 하고있는 contract의 event가 발생하면 무언가 하게끔 만들 수 있다.
1) contract 예제 코드
- Voted라는 event를 만들고 vote가 실행되면 emit을 사용하여 Voted event를 발생 시킵니다.
contract Ballot{
event Voted(address voter, uint proposal);
function vote(uint proposal) public {
...
emit Voted(msg.sender, proposal);
}
}
2) client 예제 코드
- caver를 사용해서 contract를 생성하고 해당 contract의 event를 listenning 하는 코드 입니다.
const BallotContract = new caver.klay.Contract(abi, address);
BallotContract.event.Voted(
{ fromBlock: 0 },
function(error,event) {
console.log(event);
}
).on('error', console.error)
'[Web3.0] > 블록체인' 카테고리의 다른 글
비트코인의 UTXO (0) | 2023.02.14 |
---|---|
비트코인의 컨센서스 (Consensus) (0) | 2023.02.13 |
Bitcoin 거래 서명 (0) | 2023.02.13 |
Bitcoin Address 생성 (0) | 2023.02.13 |
ECDSA (타원곡선 암호) (0) | 2023.02.13 |