https://www.inflearn.com/course/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-blockchain
[지금 무료] 블록체인과 솔리디티 | 박민 박 - 인프런
박민 박 | Solinity 언어와 Truffle 빌드 프레임 워크를 사용하는 Ethereum 블록체인에서의 탈중앙화 애플리케이션 (Dapp) 개발, [임베딩 영상] 블록체인과 솔리디티 이 강의는 블록체인에 대한 이해를 높
www.inflearn.com
솔리디티
스마트 컨트랙트를 만들기 위한 언어
이더리움 버추얼 머신이라는 EVM을 타겟으로 디자인되어 있다.
EVM은 버츄얼 머신이라는 이름처럼 가상의 머신이다. 이더리움 네트워크의 노드들이 공유하는 하나의 거대한 가상 머신
Solidity는 정적 타입이고 여러 기능 중 상속, 라이브러리, 유저 정의 타입을 지원하며, 솔리디티를 이용하여 다양한 앱을 만들 수 있다.
Smart Contract는 블록체인 특성상 한 번 블록체인 위에 올라가면 바꿀 수 없고 누구나 확인할 수 있기 때문에 신중하게 작성되어야 한다.
수정할 수 없고 누구나 확인할 수 있기 때문에 신뢰성이 있다.
본 강의에서는 솔리디티로 스마트 컨트랙트를 작성하는 방법 중 리믹스라는 웹기반의 솔리디티 에디터를 사용
리믹스는 웹브라우저에서 사용 가능한 IDE이고 쉽게 솔리디티 프로그램을 실행, 테스트해 볼 수 있는 도구이다.
Remix - Ethereum IDE
remix.ethereum.org
솔리디티 특징
솔리디티는 튜링완전하다.
튜링완전하다하는 쉽게 반복문과 제어문을 사용할 수 있다는 이야기와 비슷하다.
솔리디티는 message.sender와 message.value라는 특수한 변수가 있다.
- messeage.sender : 메시지를 보낸 주소
- message.value : 메시지를 보낸 값
스마트 컨트랙트의 구조
컨트랙트는 클래스와 비숫하여 상태 변수, 함수, 함수 변경자, 이벤트, 구조체, 열거형, 상속과 다양성 등을 포함한다.
// 1. 컨트랙트 선언
contract Sample {
// 2. 상태 변수 선언
uint256 data;
address owner;
// 3. 이벤트 정의
event logData(uint256 dataToLog);
// 4. 함수 변경자 정의
modifier onlyOwner() {
if(msg.sender != owner) revert();
_;
}
// 5. 생성자
function Sample(uint256 initData, address initOwner) {
data = initData;
onwer = initOwner;
}
// 6. 함수(메소드) 정의
function getData() returns (uint256 returned) {
return data;
}
function setData(uint256 newData) onlyOwner {
logData(newData);
data = newData;
}
}
```
위의 코드는 나중에 스마트 컨트랙트를 작성할 때 뼈대 코드로 쓰기 좋다.
솔리디티 데이터 타입
기존의 언어들과 대부분 동일하지만 특이한 점만 살펴봄
- 스트링과 바이트
- 둘 다 문자를 표현할 때 사용
- 스트링은 UTF-8로 인코딩 되어 우리가 알아보기 쉽도록 표현된다.
contract Sample {
string public myString = "wow";
bytes public myRawString = "wowowo";
}
- 매핑
- 키와 값의 쌍
- 아래의 예제는 어드레스 값을 키로, 스트링 값을 매핑했다.
pragma solidity;
contract Sample {
mapping (address => string) myMap;
constructor(string value) public{
myMap[msg.sender] = value;
}
}
- 솔리디티는 동적 배열과 정적 배열을 모두 사용할 수 있다.
- 동적 배열을 사용하면 블록체인 상에 마치 데이터베이스처럼 값을 계속 추가하며 사용할 수 있다.
pragma solidity;
contract Sample {
uint[] myDynamicArray = [0, 0];
uint[3] myStaticArray = [1, 1, 0];
}
- 또한 인터페이스를 사용하여 추상계층을 작성할 수 있다.
interface Tocken {
function transfer(address recipient, uint amount) external;
}
- Modifier라는 한정자를 가진다.
- 한정자는 함수 선언에 같이 선언하면 함수를 실행시키는 조건으로 자리할 수 있다.
- 다른 언어의 데코레이터와 비슷한 역할을 한다.
pragma solidity 0.4.23;
contract Sample {
address owner;
modifier onlyOwner {
require(msg.sender == owner);
_;
}
function ownerCanDoIt(string something) public onlyOwner view returns (string) {
return something;
}
}
데이터 위치와 문법
- storage - 전역 변수
- memory - 로컬 변수
스토리지는 블록체인 내에 저장되고 메모리는 사용 후 휘발된다.
솔리디티 문법은 if, else, while, for, break, continue, return, 삼항연산자를 모두 지원한다.
일반적이 언어와 같다.
가시성
가시성 : 누가 접근할 수 있는지를 정의하는 것
internal, public, external, private 4가지가 존재한다.
external
- 다른 컨트랙트나 트랜접션을 통해서만 호출될 수 있다.
- functon f를 f()로 그냥 부르면 동작하지 않지만, this.f()를 통해 fuction을 호출하면 동작한다는 특징이 있다.
public
- 모든 방법으로 접근할 수 있다.
- Getter함수가 자동 생성되어 값을 가져올 수 있다.
internal
- 내부적으로만 접근할 수 있다.
- 접근을 위해 this를 사용할 수 없다.
private
- internal과 비슷하지만, 상속된 컨트랙트에서는 접근할 수 없다.
가스
EVM에서 무언가가 실행될 때 가스라는 것이 발생된다.
가스는 쉽게 수수료라고 할 수 있다.
가스 리밋
- 수수료의 한계치
- 가스 리밋을 낮게 설정하면 일을 끝마치기 전에 수수료를 다 써버리게 된다.
- 이런 경우 이더리움에서는 지금까지 한 일들을 취소시키고, 채굴자들이 일을 했기 때문에 지금까지 사용한 수수료는 돌려주지 않는다.
가스 프라이스
- 가스 당 가격
- 이 가격이 비싸지면 채굴자들은 수수료를 많이 받을 수 있기 때문에 비싼 가스 프라이스가 먼저 채굴되는 경향이 있다.
- 가스 프라이스 * 가스 사용량 = 수수료
솔리디티에서 기능을 사용할 때마다 가스를 사용하게 되므로 신중하게 스마트 컨트랙트를 짜야한다.
'PBL > 블록체인' 카테고리의 다른 글
암호화폐 직관적 이해1 (0) | 2024.07.28 |
---|---|
블록체인 만들기2 (0) | 2024.07.26 |
블록체인 만들기1 (0) | 2024.07.18 |
블록체인 직관적 이해 (0) | 2024.07.14 |
블록체인 (0) | 2024.04.01 |