개요
본 post는 적어도 하나의 언어를 안다는 가정에 하에 작성 되었습니다.
그리고 모든 code의 test는 https://ide.klaytn.com/ 에서 테스트 되었습니다.
Solidity의 관점에서 컨트랙트란
무수한 코드들(함수)과 데이터(상태)가 Ethereum 블록체인의 특정 주소에 존재하는 것입니다.
기본 구조
1. Licsense 명시
- SPDX-License-Identifier: GPL-3.0
2. 버전 명시
- pragma 라는 keyword를 사용해서 smart contract가 지원하는 solidity 버전 을 명시 합니다.
1) 특정 지원 버전 명시
- pragma solidity ^0.8.4;
2) 지원 범위 명시
- pragma solidity >=0.4.0 <0.6.0;
3. 계약 정의
- contract "계약명" {
}
- 계약 정의는 일반 적인 programming과 동일 하게 작성이 됩니다.
4. contract 기본 구조
// 1. 라이센스 명시
// SPDX-License-Identifier: GPL-3.0
// 2. 버전 명시
pragma solidity ^0.8.4;
// 3. contract 정의
contract basic{
// 여기에 코드를 작성
}
contract를 구성하는 항목
- contract는 다음 7가지를 사용하면 만듭니다.
1. 중요 키워드
2. constructor()
3. state variable
4. struct type
5. enum
6. function
7. modifier
8. event
1 중요 키워드
- 다음 키워드드들은 변수 또는 함수에서 사용되는 중요 키워드들을 나열한 것입니다.
1. visibility (접근 제어자)
항목 | 설명 |
public | - 변수를 외부에 노출이 가능 하게 만듭니다. 외부에 노출 가능하다는 의미는 다른 contract에서 호출 가능 하다는 의미 입니다. - public을 사용 할 경우 자동으로 해당 변수 값을 돌려주는 Getter 함수가 생성이 됩니다. Getter함수는 변수명이랑 동일한 이름으로 생성됩니다. - contract 내부 함수들끼리 참조하여 사용 가능 |
private | - 컨트랙 내부만 호출가능 |
external | - 상태 변수에서 사용 못함. - 외부 컨트랙트만 호출 가능 - 상태변수는 external 사용 불가 - contract 내부 함수들 끼리 서로 참조해서 사용 못함 - public으로 변경 가능 |
internal | - 컨트랙 내부 호출 가능. - 상속받은 컨트랙도 호출 가능. - 상태변수는 디폴트로 internal 선언 |
2. 자료형의 type
type | keyword | 설명 |
reference | memory | - 함수 내에서 유요한 여역에 저장 - storage 이외는 모두 memory이다. - 휘발성 data |
reference | storage | - state variables와 같이 영속적으로 저장되는 영역에 저장 - block chain에 기록 되는 값들 입니다. |
reference | calldata | - external 함수 인자에 사용되는 공간 |
1) 유의 사항
- 서로 다른 영역을 참조하는 변수 간 대입이 발생시 데이터 복사
Ex) storage => memory / calldata
anything => storage
3. 유형
유형 | 설명 |
view | 데이터 read-only |
pure | - 데이터 읽지 않음 - 인자 값만 활용해서 반환 값 정함 |
payable | 함수에서 사용 시 : ethereum을 송/수신 할때 사용 합니다. |
2 constructor()
- contract를 생성 할 때 단 한번 실행 되는 code
3 state variable
1. 정의
- solidity에서는 함수 밖에서 선언한 변수를 상태변수(state variable)이라고 부른다.
- state variable이라고 불리는 이유는 블록체인에 영구히 기록 되기 때문 입니다.
- 단, 함수에서 안에서 선언한 변수는 블록체인에 기록 되지 않기 때문에 state variable이 아닙니다.
2 선언에 사용되는 자료형
종류 | 값 | 비고 |
boolean | true, false | |
int ~ int256 | - int256 = int - 8비트 단위로 존재 |
|
uint ~ uint256 | - (uint256 =uint) - 8비트 단위로 존재 |
|
fixed/ufixed | - 고정 소수점 | |
address |
- 20바이트(이더리움 address의 크기)를 담을 수 있습니다. -Address 관련 - balance, transfer, send, call, callcode, delegatecall 의 멤버를 가지고 있습니다. |
|
bytes ~ bytes32 |
bytes2 test = 'ab';
test[1] //a
test[2] //b
test[1] = 'cc' //error
|
- 고정 크기 바이트 배열 - byte[]로도 사용 가능 하지만, 배열 아이템간 31byte 패딩이 추가되어 공간 낭비가 발생한다. |
bytes |
- 동적 크기 바이트 배열 - 임의의 길이의 원시 바이트를 처리 할 때 사용 |
|
string |
"test" | - 동적 크기 바이트 배열 - 임의이 길이의 문자열(UTF-8)데이터를 처리 할 때 사용 |
function | https://solidity-kr.readthedocs.io/ko/latest/types.html#function-types | 함수 타입의 변수는 함수에서 할당 될 수 있으며 함수 타입의 함수매개변수는 함수가 호출될 때, 함수를 전달하거나 반환하는데 사용될 수 있습니다. 함수 타입에는 두 종류가 있습니다 - 내부 및 외부 함수 입니다: |
mapping | - 제약 사항 - storage로만 쓸 수 있다. (state variable로만 선언가능) - 함수안에서 사용 불가능 하다 - hashtable과 유사 - 배열 처럼 사용 |
|
array | T[k] x; // 1차원 배열 T[][k] x; // 2차원 배열 |
c++언어에서의 개념과 같음 그러나 사용법이 상이 - storage로 선언된 array만 size가 가변적으로 늘어날수 있습니다. - memory로 선언시 크기를 고정 해야 합니다. - 차원 배열시 특시정 T[][k] x; // k개의 T를 담을 수 있는 가변 배열 x선언 // 일반 적인 언어에서는 T[k][] 한다. - push로 아이템 추가 가능 - delete 하면 array가 초기화 됩니다. |
3. 선언 방식
자료형 visibility 이름 = data;
contract Count {
uint public count = 0;
address public lastParticipant;
}
4 struct type
1. 정의
- solidity에서 제공하지 않는 새로운 자료형을 만들때 사용 합니다.
- c나 c++ 에 존재하는 strcut 와 동일 합니다.
- struct를 구성 할 때의 자기 자신을 넣을 수 없다는 것외에는 어떤 것을 넣든지 제약은 없습니다.
2. 예제
contract Ballot{
struct Voter {
uint weight;
bool voted;
address delegate;
uint vote;
}
}
5 enum
1. 정의
- 변경되지 않는 상수를 정의 할때 사용 합니다.
- c나 c++의 enum과 동일 합니다.
2. 예제
contract Ballot{
enum Status {
Open,
Closed
}
}
6 Function
1. 함수의 역활
- 솔리디티 함수는 코드 안에 변수로 선언된 변수를 변경하거나 불러옴.
2. 함수 문법
3. 문법 항목 설명
1) visibility (접근 제어자)
- contract 외부에서 해당 함수를 볼수 있을지 없을지를 설정 합니다.
- 상속에도 영향을 준다.
항목 | 설명 |
public | - 변수를 외부에 노출이 가능 하게 만듭니다. 외부에 노출 가능하다는 의미는 다른 contract에서 호출 가능 하다는 의미 입니다. - public을 사용 할 경우 자동으로 해당 변수 값을 돌려주는 Getter 함수가 생성이 됩니다. Getter함수는 변수명이랑 동일한 이름으로 생성됩니다. |
private | - 컨트랙 내부만 호출가능 |
external | - 상태 변수에서 사용 못함. - 외부 컨트랙트만 호출 가능 - 상태변수는 external 사용 불가 - contract 내부 함수끼리 서로 참조 못함. |
internal | - 컨트랙 내부 호출 가능. - 상속받은 컨트랙도 호출 가능. - 상태변수는 디폴트로 internal 선언 |
2) 유형
유형 | 설명 |
view | 데이터 read-only |
pure | - 데이터 읽지 않음 - 인자 값만 활용해서 반환 값 정함 |
payable | 함수에서 사용시 : ethereum을 송/수신 할 때 사용 합니다. |
3) modifier
- modifer 함수를 명시 합니다 (아래에서 modifier가 뭔지 설명 합니다)
7 Function modifier
1. 정의
- 함수의 실행 전, 후 성격을 정의
- 대부분의 경우 함수의 실행 조건을 정의하는데 사용됨.
2. 정의 방법
- require() 함수로 실행 조건을 명시
Ex) require(msg.sender == chairperson, "only ther chaireperson can call");
// require에서 앞에 조건이 true이면 문제 없음.
// 조건이 false이면 , 뒤에 메시지를 보여주면서 종료가됨
3. 예제 코드
- msg.sender (함수를 실행한 사람의 주소)
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
}
}
8 Event
1. 정의
- EVM(Ethereum Virtual Machine)로깅을 활용한 시스템 입니다.
2. 기능
- event가 실행 될 때 마다 transaction Log에 저장 합니다.
- 저당된 Log는 contract 주소와 연동되어 client가 RPC로 조회 가능하게 해줍니다.
3. 언제 사용된는가
- transaction을 보내고 transaction이 block에 기록될 때 마다 transaction은 자기 로그를 남길 수 있습니다.
그래서 event를 생성하면 transacntion Log라는 공간에 기록을 남기게 됩니다.
그리고 나중에 contract 주소로 조회가 가능 합니다.
- client가 event를 listenning 하는데 사용 됩니다. block이 나올 떄 마다 어떤 event를 발생 했는지 확인이 가능 합니다.
client는 listening하고있는 contract의 event가 발생하면 무언가 하게끔 만들 수 있습니다.
4. 예제 코드
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)
contract는 간결 해야한다.
1. proxy contract로
참조사이트
https://www.youtube.com/playlist?list=PLKqrwxupttYEcJhWAw0E_5RVpDD9LD6Q-
https://solidity-kr.readthedocs.io/ko/latest/
'내맘대로 Study > 블록체인' 카테고리의 다른 글
[클레이튼] ERC-721 개발 (0) | 2022.04.25 |
---|---|
[블록체인] token 과 coin 비교 (0) | 2022.04.20 |
[클레이튼] smart contract 배포 과정 이해하기 (0) | 2022.04.05 |
[클레이튼] 테스트 klaytn wallet 만들기 (0) | 2022.04.04 |
[클레이튼] 클래이튼 이해하기 (0) | 2022.04.03 |