2
2024 인천 블록체인칼리지 전문가 과정
강사 소개
• 서강대학교 미래교육원 – 블록체인 입문 / 실습 , 소프트웨어 공학 ,
오픈소스 개발 , 메타버스 개괄 , 디지털 자산 최고전문가 과정 강의
• 블록체인 프로젝트 개발 - AiGO Network, Stargaze NFT Marketplace,
Brokkr, Strudy Exchange
• 해커톤 수상 – ETH Global Tokyo ApeCoin Track, ETH SEOUL
Celo/BuidlGuild.eth Track
• IT 분야 강연 , 멘토링 , 심사 등 – 서울 Web3.0 페스티벌 멘토 / 심사 ,
소프트웨어 중심대학 해커톤 멘토 , 다수 개발자 대회 심사 등
• 공개 SW 유공자 표창 (2023), 마이크로소프트 MVP 수상 (2021,22,23)
• You Don’t Know JavaScript Yet 역자 , 모던 JavaScript 튜토리얼 한국어
프로젝트 (https://ko.javascript.info/) 운영 등 다수 매체 집필 및 기고
이보라
서강대학교
미래교육원
3.
2024 인천 블록체인칼리지
강의 목표
3
“ 일반 애플리케이션 개발과
블록체인 기반 애플리케이션 개발의 차이점을 알아보고 ,
블록체인 중 가장 큰 생태계를 가진 이더리움 네트워크에서
쓰이는 스마트 컨트랙트 언어인 솔리디티를 학습하여
DApp 구축을 위한 기초를 다집니다 .”
전문가 과정
4.
01 블록체인 기반애플리케이션 개발의 특징
03 솔리디티 문법
04 프로젝트 기반 솔리디티 문법 실습
02 블록체인과 이더리움
강의 목차
4
2024 인천 블록체인 칼리지 전문가 과정
5.
01
블록체인 기반
애플리케이션
개발의 특징
클라이언트- 서버 구축을 통해 만드는
일반 애플리케이션과 블록체인 기반
애플리케이션 구축의 차이를
알아봅니다 .
일반 애플리케이션 개발 특징
블록체인 애플리케이션 개발 특징
5
2024 인천 블록체인 칼리지 전문가 과정
일반 애플리케이션의 특징을 알아봅니다 .
블록체인 기반 애플리케이션의 특징을 알아봅니다 .
실습
DApp 을 사용해 블록체인에 트랜잭션 남기기와 이더스캔을 통해
블록체인에 트랜잭션 남기기를 실습합니다 .
6.
6
웹 개발
클라이언트 -서버간 통신으로 대표되는 웹 애플리케이션 개발에 필요한 기술과 웹 개발의 특징
01 전문가과정 - 개발총론
• 웹 애플리케이션 개발을 위한 기술
- 프론트엔드 : HTML, CSS, JavaScript
- 백엔드 : 서버측 프로그래밍 언어 , 데이터베이스 및 API 개발 / 관리
• 웹 개발의 특징
- 중앙 집중식 아키텍처
- 단일 권한 관리 주체
- 상대적으로 빠른 트랜잭션 처리
- 데이터 수정 및 삭제 용이
7.
7
DApp 개발
클라이언트 -블록체인간 통신으로 대표되는 DApp(Decentralized Application) 의 특징
01 전문가과정 - 개발총론
• 블록체인 애플리케이션 개발의 특징 1
- 분산화된 데이터 관리
- P2P 네트워크 구조
- 합의 알고리즘을 통한 데이터 검증
- 데이터의 불변성과 추적 가능성
8.
8
DApp 개발
클라이언트 -블록체인간 통신으로 대표되는 DApp(Decentralized Application) 의 특징
01 전문가과정 - 개발총론
• 블록체인 애플리케이션 개발의 특징 2
- 스마트 컨트랙트
- 자동화된 비즈니스 로직 실행
- 중개자 없는 트랜잭션 처리
- 프로그래밍 가능한 화폐와 자산
9.
9
DApp 개발
클라이언트 -블록체인간 통신으로 대표되는 DApp(Decentralized Application) 의 특징
01 전문가과정 - 개발총론
• 블록체인 애플리케이션 개발의 특징 3
- 보안과 투명성
- 암호화 기술 기반의 높은 보안성
- 공개 원장을 통한 트랜잭션 투명성
- 개인정보 보호와 데이터 주권 강화
10.
10
DApp 개발에 필요한도구와 환경
DApp(Decentralized Application) 개발에 필요한 도구와 환경
01 전문가과정 - 개발총론
- 웹 개발
- 다양한 프레임워크와 라이브러리 (React,
Angular
, Vue.js 등 )
- 클라우드 서비스 (AWS, Google Cloud, Azure
등 )
- 지속적 통합 / 배포 (CI/CD)
를 위한 파이프라인
- 블록체인 앱 개발
- 블록체인 특화 프레임워크 (Hardhat, Foundry)
- 테스트넷과 메인넷 환경
- 가스 비용 최적화 및 관리
11.
11
DApp 개발에 필요한개발자 역량
DApp(Decentralized Application) 개발에 필요한 개발자 역량
01 전문가과정 - 개발총론
- 웹 개발
- 프론트엔드 및 백엔드 기술 숙련도
- UX/UI 에 대한 이해
- API 설계 및 통합 능력
- 블록체인 개발
- 암호학 및 분산 시스템 이해
- 스마트 컨트랙트 프로그래밍 능력
- 토큰 이코노미 설계 / 이해 능력
12.
12
실습 1: DApp사용해보기
직접 DApp 을 사용해보며 블록체인 개발을 통해 만들 수 있는 애플리케이션 맛보기
01 전문가과정 - 개발총론
• 지갑설치
- 메타마스크
• 테스트넷용 토큰 충전
- Faucet 을 통한 테스트넷 ETH 충전
1. Alchemy: https://www.alchemy.com/faucets/ethereum-sepolia
2. Infura: https://www.infura.io/faucet/sepolia
• 유니스왑 사용해보기
- https://app.uniswap.org/swap?chain=sepolia
13.
13
실습 2: 이더스캔을통해 트랜잭션 남기기
01 전문가과정 - 개발총론
• 이더스캔을 통해 스마트 컨트랙트와 직접 인터랙션 해서 블록체인에
트랜잭션 남기기
- ERC-20 토큰 생성 및 전송
- 테스트넷 이더스캔 사용 : https://sepolia.etherscan.io/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
constructor() ERC20("InhaCoin", "Inha") {
_mint(msg.sender, 100 * 10 ** ERC20.decimals()); // InhaCoin 100 개 생성
}
}
02
블록체인과
이더리움
다양한 블록체인 네트워크중
이더리움이 지닌 특징을 알아봅니다 .
블록체인이란
이더리움이란
스마트 컨트랙트
15
2024 인천 블록체인 칼리지 전문가 과정
블록체인의 정의와 동작 원리를 알아봅니다 .
이더리움 네트워크의 정의와 이더리움이 다른 블록체인과 어떤 점에서
다른지 알아봅니다 .
스마트 컨트랙트의 작동 원리와 실제 구현에 대해 깊이 있게 배웁니다 .
16.
16
블록체인
암호화 기술을 이용한분산형 디지털 장부 시스템
01 전문가과정 - 개발총론
- 정의 : 암호화 기술을 이용한 분산형 디지털 장부
- 쉬운 정의 : 블록들이 이어진 체인
21
- 블록체인 작동방식
- 트랜잭션 발생
- 네트워크 전체에 전파
- 노드들의 검증
- 블록에 포함 및 체인에 추가
- 특징
- 탈중앙화 : 중앙 기관의 통제 없이 운영
- 복제 : 모든 참여자가 전체 데이터의 사본을 보유
- 합의 메커니즘 : 네트워크 참여자들의 동의로 데이터 검증
분산의 의미
01 전문가과정 - 개발총론
데이터와 처리 능력이 단일 중앙 시스템이 아닌 네트워크 전체에 분산되어 있는 상태
22.
22
- 이더리움
- 대표적인블록체인 네트워크
- 스마트 컨트랙트 지원
- 비탈릭 부테린이 창시
- 특징
- 과거 작업증명 방식에서 지분증명 방식으로
합의 메커니즘을 변화시킴
이더리움
01 전문가과정 - 개발총론
03
솔리디티
문법
EVM 에서 구동되도록설계된 스마트
컨트랙트용 언어인 솔리디티를
다룹니다 .
솔리디티 소개
솔리디티 문법
24
2024 인천 블록체인 칼리지 전문가 과정
솔리디티 언어의 정의와 특징 , 다른 프로그래밍 언어와의 관계를
알아봅니다 .
스마트 컨트랙트를 작성하며 솔리디티 문법을 학습합니다 .
25.
01 전문가과정 -개발총론
25
- 목적 : 이더리움 블록체인 상에서 실행되는 스마트 컨트랙트를 작성하기
위한 언어
- 타입 : 정적 타입 언어 ( 변수의 타입이 컴파일 타임에 결정됨 )
- 패러다임 : 객체 지향 ( 상속 , 인터페이스 등 지원 )
- 실행 환경 : Ethereum Virtual Machine( 이더리움 가상 머신 , EVM)
솔리디티 (Solidity)
스마트 컨트랙트를 개발하기 위해 설계된 정적 타입의 객체 지향 프로그래밍 언어
26.
26
- EVM 은솔리디티를 실행하는 가상 머신으로
플랫폼 독립적인 실행 환경을 제공함
- 솔리디티는 ‘언어’ , EVM 은 ‘솔리디티어
통역사’로 비유할 수 있음
- EVM( 통역사 ) 을 통하면 솔리디티로 작성한
코드 ( 발화자의 의도 ) 를 블록체인이 이해할
수 있는 기계어로 변환 가능함
솔리디티 (Solidity)
스마트 컨트랙트를 개발하기 위해 설계된 정적 타입의 객체 지향 프로그래밍 언어
01 전문가과정 - 개발총론
27.
27
솔리디티 (Solidity)
스마트 컨트랙트를개발하기 위해 설계된 정적 타입의 객체 지향 프로그래밍 언어
참고 : 다양한 EVM 기반 체인
링크 : https://defillama.com/chain/inEVM
01 전문가과정 - 개발총론
28.
28
솔리디티 (Solidity)
스마트 컨트랙트를개발하기 위해 설계된 정적 타입의 객체 지향 프로그래밍 언어
참고 : 다양한 EVM 기반 체인
링크 : https://www.polymerlabs.org/
01 전문가과정 - 개발총론
29.
29
특징
1. JavaScript, C++,Python 의 최신 문법에 영향을 받음
2. 스마트 컨트랙트 특화 기능 제공
3. 고수준의 추상화와 낮은 수준의 바이트코드 접근 모두 가능
4. 보안과 안정성에 중심을 둔 설계
솔리디티 (Solidity)
스마트 컨트랙트를 개발하기 위해 설계된 정적 타입의 객체 지향 프로그래밍 언어
01 전문가과정 - 개발총론
30.
30
솔리디티 (Solidity)
스마트 컨트랙트를개발하기 위해 설계된 정적 타입의 객체 지향 프로그래밍 언어
예시 : named import
출처 : https://www.rareskills.io/post/solidity-style-guide
특징 1: JavaScript, C++, Python 의 최신 문법에 영향을 받음
01 전문가과정 - 개발총론
31.
31
솔리디티 (Solidity)
스마트 컨트랙트를개발하기 위해 설계된 정적 타입의 객체 지향 프로그래밍 언어
특징 2: 스마트 컨트랙트 특화 기능 제공
1. Events: 블록체인에 로그 기록 , 외부 알림
2. Modifiers: 함수 실행 전 조건 검사
3. Gas Optimization: view, pure 함수 , 비용
최적화 도구
4. Fallback Function: 기본 이더 수신 처리
5. Inheritance & Interfaces: 컨트랙트 상속 ,
표준 구현 (ERC20, ERC721)
6. Libraries: 재사용 가능한 코드 모듈
7. ABI (Application Binary Interface):
컨트랙트 외부 통신 규격
8. Payable Functions: 이더를 직접 수신하는
함수
9. Selfdestruct: 컨트랙트 파괴 및 잔액 전송
10. Global Variables & Functions: block, msg,
tx, keccak256(), ecrecover()
01 전문가과정 - 개발총론
32.
솔리디티 (Solidity)
스마트 컨트랙트를개발하기 위해 설계된 정적 타입의 객체 지향 프로그래밍 언어
특징 3: 고수준의 추상화와 낮은 수준의 바이트코드 접근 모두 가능
01 전문가과정 - 개발총론
32
33.
33
솔리디티 (Solidity)
스마트 컨트랙트를개발하기 위해 설계된 정적 타입의 객체 지향 프로그래밍 언어
특징 4: 보안과 안정성에 중심을 둔 설계
1. 정적 타입 시스템 : 변수의 타입을 명확히
지정해야 하며 , 이는 많은 버그를 사전에
방지함
2. 제한된 기능 : 잠재적으로 위험할 수 있는
기능들 ( 예 : 무한 루프 ) 을 제한하여
안정성을 높임
3. 가시성 지정자 : 함수와 변수의 접근
범위를 명확히 제어할 수 있어 , 의도치
않은 접근을 방지함
4. 예외 처리 : 'require', 'assert', 'revert'
등의 기능으로 오류 상황을 명확히 처리할
수 있음
5. 재진입 (reentrancy) 공격 방지 :
'transfer' 함수 사용 등으로 흔한 보안
취약점을 방지
6. 오버플로우 / 언더플로우 방지 : SafeMath
라이브러리 등을 통해 수학적 연산의
안전성을 보장함
01 전문가과정 - 개발총론
34.
34
- 라이센스 (저작권 )
- 컴파일러 버전
- 다른 파일 import
- contract 키워드로 컨트랙트 생성
//SPDX-License-Identifier:MIT
pragmasolidity^0.8.20;
import"@openzeppelin/contracts/token/ERC20/ERC20.sol";
contractMyTokenisERC20{
constructor()ERC20("MangoCoin","Mango"){
_mint(msg.sender
,100*10**ERC20.decimals());
}
}
스마트 컨트랙트 기본 구조
01 전문가과정 - 개발총론
35.
35
- 변수 종류: 상태 , 로컬 , 전역
- 상태 변수 (state variable): 컨트랙트 스토리지에 영구적으로 저장되는 변수
- 특징
- 컨트랙트 수준에서 선언
- 블록체인에 저장되어 가스 비용 발생
- 모든 함수에서 접근 가능
contractExample{
uintpublicstateVar=123;// 상태 변수
}
변수 타입과 선언
01 전문가과정 - 개발총론
36.
36
- 변수 종류: 상태 , 로컬 , 전역
- 로컬 변수 (local variable): 함수 내에서 선언되고 함수 실행 동안만 존재하는 변수
- 특징
- 함수 내에서만 사용 가능
- 스택에 저장되어 가스 비용 최소화
- 함수 종료시 소멸
contractExample{
uintpublicstateVar=123;// 상태 변수
functionexampleFunction()public{
uintlocalVar=456;// 로컬 변수
}
}
변수 타입과 선언
01 전문가과정 - 개발총론
37.
37
- 변수 종류: 상태 , 로컬 , 전역
- 전역 변수 (global variable): 솔리디티에 의해 미리 정의된 특수 변수
- 특징
- 블록체인의 특정 속성이나 트랜잭선 정보 제공
- 어디서든 접근 가능
- 읽기 전용
- 주요 전역 변수 :
- msg.sender: 현재 함수를 호출한 주소
- msg.value: 함수와 함께 전송된 이더의 양
- block.timestamp: 현재 블록의 유닉스 타임스탬프
- block.number: 현재 블록 번호
변수 타입과 선언
01 전문가과정 - 개발총론
38.
38
- 변수 종류별비고
변수 타입과 선언
01 전문가과정 - 개발총론
특성 상태 변수 로컬 변수 전역 변수
저장 위치 블록체인 메모리 -
수명 컨트랙트 전체 함수 실행 동안 항상 사용 가능
가스 비용 높음 낮음 -
접근 범위 전체 컨트랙트 함수 내부 전체 컨트랙트
수정 가능 여부 가능 가능 불가능
39.
39
- 주요 데이터타입 :
- uint: 부호 없는 정수 (uint8, uint256 등 )
- int: 부호 있는 정수
- address: 이더리움 주소
- bool: 불리언
uint8publicu8=10;
addresspublicaddr=0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;
boolpublicdefaultBoo1=false;
주요 데이터 타입
01 전문가과정 - 개발총론
41
배열과 문자열
01 전문가과정- 개발총론
- 배열 선언
uint[]publicdynamicArray;
uint[10]publicfixedArray;
- 배열 조작
-push(): 요소 추가
-pop(): 마지막 요소 제거
-length: 배열 길이
- 문자열
stringpublicgreeting="HelloWorld!";
42.
42
contractMapping{
// 주소 (키 ) 와 uint( 값 ) 쌍을 매핑함
mapping(address=>uint)publicmyMap;
functionget(address_addr)publicviewreturns(uint){
// 매핑은 항상 값을 반환하는데 ,
// 키에 해당하는 값이 없는 경우 기본 값이 반환된다 .
//uint 의 기본 값은 0 이다 .
returnmyMap[_addr];
}
functionset(address_addr
,uint_i)public{
//address 에 해당하는 값을 업데이트한다 .
myMap[_addr]=_i;
}
functionremove(address_addr)public{
// 값을 기본 값으로 리셋한다 .
deletemyMap[_addr];
}
}
매핑
01 전문가과정 - 개발총론
해시맵 , 객채 , 딕셔너리처럼 키 - 값 쌍이 있는 데이터를 저장할 때 사용
43.
43
contractNestedMappings{
// 주소와 uint(키 )-bool( 값 ) 을 쌍으로 가진 매핑을 매핑함
mapping(address=>mapping(uint=>bool))publicnestedMap;
functionget(address_addr1,uint_i)publicviewreturns(bool){
// 중첩 매핑에선 초기화 하지 않은 값도 가져올 수 있다 .
//bool 타입 값의 기본 값은 false 이다 .
returnnestedMap[_addr1][_i];
}
functionset(address_addr1,uint_i,bool_boo)public{
nestedMap[_addr1][_i]=_boo;
}
functionremove(address_addr1,uint_i)public{
deletenestedMap[_addr1][_i];
}
}
중첩 매핑
01 전문가과정 - 개발총론
매핑에서 값이 또 다른 매핑인 경우
44.
44
//enum 은미리정의된몇가지값중하나만사용하도록제한할때주로사용한다 .
contractEnum{
//예시에서사용한 enum 은여러배송상태를나타낸다 .
enumStatus{
Pending,
Shipped,
Accepted,
Rejected,
Canceled
}
//enum 변수 (status) 의기본값은 enum(Status) 의제일처음요소 (Pending) 이다 .
Statuspublicstatus;
//enum 은내부적으로 uint 로표현되기때문에아래함수 get 은항상 uint 를반환한다 .
//Pending=0,Shipped=1,Accepted=2,Rejected=3,Canceled=4
//4 보다큰값은반환할수없다 .
functionget()publicviewreturns(Status){
returnstatus;
}
Enum
01 전문가과정 - 개발총론
Enum 은 Enumerable( 열거 가능 ) 의 약자로 , 사용자 정의 타입의 한 종류임 . 사람이 읽을 수 있는 형태의 이름을 모아 놓은 상수 집합
//enumStatus 에 uint 타입의값을입력해요소를추가한다 .
functionset(Status_status)public{
status=_status;
}
// 특정 enum 요소를다음과같은방식으로업데이트할수있
다 .
// 예시에선 Canceledenum 값으로업데이트했다 .
functioncancel()public{
status=Status.Canceled;//status 는 4 가됨
}
}
45.
45
contractTodoList{
structTodoItem{
stringtext;
boolcompleted;
}
//TodoItem 구조체요소로구성된배열선언
TodoItem[]publictodos;
functioncreateTodo(stringmemory_text)public{
// 구조체를초기화하는방법은총3 가지가있다 .
// 방법 1- 함수처럼호출
todos.push(TodoItem(_text,false));
// 방법 2-key-value 매핑
todos.push(TodoItem({text:_text,completed:false}));
//Method3- 빈구조체초기화후개별프로퍼티할당
TodoItemmemorytodo;
todo.text=_text;
todo.completed=false;
todos.push(todo);
}
구조체
01 전문가과정 - 개발총론
솔리디티에서 지원하는 기본 타입을 사용해 사용자가 새롭게 지정하는 ‘사용자 정의 타입’으로 연관된 데이터를 묶을 때 유용함
// 구조체를업데이트하는방법
functionupdate(uint_index,stringmemory_text)public{
todos[_index].text=_text;
}
//completed 토글함수
functiontoggleCompleted(uint_index)public{
todos[_index].completed=!todos[_index].completed;
}
}
46.
46
View, Pure 함수
01전문가과정 - 개발총론
- View 함수 :
- 정의 : state 값을 변경하지 않는 함수
- 특징 :
- 블록체인의 상태를 변경하거나 수정하지 않음
- 블록체인의 현재 상태를 읽을 수 있음
- Pure 함수 :
- 정의 : state 값을 변경하지 않고 읽지도 않는 함수
- 특징 :
- 블록체인의 상태를 읽거나 변경할 수 없음
- 입력 값만을 기반으로 결과를 반환
47.
47
View, Pure 함수
01전문가과정 - 개발총론
- View, Pure 키워드 사용 이유
1. 가스 최적화
- 외부 호출 시 가스 소비 없음
- 단 , 다른 스마트 컨트랙트 내에서 호출 시 일정량의 가스 소비
2. 코드의 명확성 : 함수의 동작과 영향을 쉽게 이해 가능
3. 보안 : 예기치 않은 상태 변경이나 부작용 방지
- 주의사항
- 외부 호출 ( 예 : 웹 3 라이브러리 , DApp) 에서만 가스 무료
- 다른 스마트 컨트랙트 내에서 호출 시 가스 소비 발생
48.
48
contractViewAndPure{
//state 변수선언
uintpublicx=1;
//view 키워드를붙여이함수는state 값을변경하지않는다는점을약속함
//( 단 ,state 값을읽을순있음 )
functionaddToX(uinty)publicviewreturns(uint){
returnx+y;
}
//pure 키워드를붙여이함수는 state 값을변경하지도 , 읽지도않는다는점을약속함
functionadd(uinti,uintj)publicpurereturns(uint){
returni+j;
}
}
View, Pure 함수
01 전문가과정 - 개발총론
49.
49
modifier
01 전문가과정 -개발총론
- modifier
- 영 - 한 사전 정의 : ( 의미를 한정하는 ) 한정어
- 함수 호출 전후에 실행할 수 있는 코드에 붙임
- 예시 :
- 특정 함수에 대한 액세스를 제한
- 입력 매개변수의 유효성 검사
- 특정 유형의 공격으로부터 보호하는 용도
51
event
01 전문가과정 -개발총론
- 이벤트
- 블록체인에 로그를 남길 때 사용하는 문법 ( 객체 ) 으로 프론트엔드 등에서 특정 컨트랙트에 대한 로그를 파싱하여
응용하려 할 때 유용함
블록체인에 로그를 남길 때 사용하는 문법
contractEvents{
//sender 주소와메시지에해당하는문자열을기록할용도의이벤트선언
eventTestCalled(addresssender
,stringmessage);
functiontest()public{
// 이벤트로깅
emitTestCalled(msg.sender
,"Someonecalledtest()!");
}
}
52.
52
payable
01 전문가과정 -개발총론
payable( 지불가능 ) 을 사용해 함수와 주소를 선언하면 컨트랙트로 ETH 를 받을 수 있음
contractPayable{
//Payable 주소는 transfer 또는 send 함수를통해 ETH 를보낼수있다 .
addresspayablepublicowner;
//Payable 생성자는 ETH 를받을수있다 .
constructor()payable{
owner=payable(msg.sender);
}
// 이컨트랙트에 ETH 를입금할때호출할함수 .
// 입금할 ETH 가얼마인지를적어서이함수를호출하면
// 본컨트랙트의잔액이자동으로업데이트된다 .
functiondeposit()publicpayable{}
// 입금할 ETH 가얼마인지를적어서이함수를호출하면
// 이함수는 payable 이아니기때문에에러가발생한다 .
functionnotPayable()public{}
// 이컨트랙트에서모든 ETH 를인출할때호출할함수
functionwithdraw()public{
// 이컨트랙트에묶인 ETH 가얼마인지가져옴
uintamount=address(this).balance;
// 모든 ETH 를컨트랙트소유자에게보냄
(boolsuccess,)=owner
.call{value:amount}("");
require(success,"FailedtosendEther");
}
// 이컨트랙트에묶인 ETH 중일부를특정주소로보낼때호출할함수
//_to 가 payable 로선언됨
functiontransfer(addresspayable_to,uint_amount)public{
(boolsuccess,)=_to.call{value:_amount}("");
require(success,"FailedtosendEther");
}
}
53.
53
이더리움 보내기 -send
01 전문가과정 - 개발총론
- 이더리움 스마트 컨트랙트에서 특정 주소로 이더리움을 보내는 방법은 총 3 가지가
있음
- send 함수
- call 함수
- transfer 함수
- send 함수 : 지정된 양의 ETH 를 특정 주소로 전송하는 함수
- 특징
- 저수준 (low-level) 함수
- 실행 시 2300 개의 가스만 소비
- 매우 기본적인 작업만 수행 가능
54.
54
이더리움 보내기 -send
01 전문가과정 - 개발총론
- 가스 제한
- 2300 가스로는 이벤트 발생 (emit) 정도만 가능
- 거의 아무런 연산을 수행하지 못함
- 2300 가스 이상이 필요한 경우 트랜잭션 실패
- 실패 처리
- 실패 시 예외를 발생시키지 않음
- 대신 false 를 반환
- 사용 시 주의사항
- 항상 결과를 확인해야 함
- 실패는 수동으로 처리해야 함
56
이더리움 보내기 -call
01 전문가과정 - 개발총론
- call 함수 : ETH 를 전송하고 남은 가스도 전송하는 로우 레벨 함수
- ETH 전송 후 2300 이상의 가스가 필요한 복잡한 작업 수행 가능
- 가스 사용 : 남은 가스를 모두 전달
- 실패 처리
- 전송 실패 시 트랜잭션이 자동으로 취소되지 않음
- 대신 false 를 반환
- 보안 주의사항 : 재진입 (reentrancy) 공격 가능성 있음
58
이더리움 보내기 -transfer
01 전문가과정 - 개발총론
- transfer 함수 : 지정된 양의 ETH 를 특정 주소로 전송하는 함수
- 가스 제한 : 실행 시 2300 가스까지 허용됨
- 실패 처리
- 전송 실패 시 자동으로 예외 발생
- 트랜잭션이 자동으로 되돌아감 (revert)
- 안전성
- 수동으로 전송 결과를 확인하거나 실패 사례를 처리할 필요 없음
- 장점
- 사용 편의성 : 별도의 오류 처리 로직이 필요 없음
- 안전성 : 실패 시 자동으로 트랜잭션 롤백
- 제한사항
- 가스 제한 : 2300 가스로 제한되어 복잡한 로직 실행 불가
- 유연성 부족 : 가스 제한으로 인해 일부 컨트랙트와의 상호작용 제한될 수 있음
59.
59
이더리움 보내기 -transfer
01 전문가과정 - 개발총론
contractSendEther{
functionsendEth(addresspayable_to)publicpayable{
// 이 payable 함수에서원하는주소로 ETH 를보낼수있다 .
uintamountToSend=msg.value;
//transfer 메서드를사용해 ETH 를보낸다 .
_to.transfer(msg.value);
}
}
60.
60
이더리움 보내기
01 전문가과정- 개발총론
- 현재 업계 표준
- call 메서드 사용 권장
- 이유
- 높은 유연성
- 가스 제한 변경에 대한 미래 대비
- 보안 고려 사항
- 재진입 공격 방지 필수
- call 사용 시 추가 보안 조치 필요
- Check-Effects-Interaction 패턴 적용
- 재진입 가드 사용
62
이더리움 받기
01 전문가과정- 개발총론
- 개인 키로 통제 가능한 외부 소유 계정 (Externally Owned Account, EOA) 은 이더리움 전송을
자동으로 수락할 수 있기 때문에 이더리움을 받을 때 특별한 조치를 할 필요가 없음
- 하지만 이더리움을 직접 받을 수 있는 컨트랙트를 작성하는 경우 , 아래 함수 중 하나 이상을
포함해 놓아야 함
- receive() external payable
- fallback() external payable
- 여기서 receive() 는 msg.data 가 빈 값이면 호출되고 ,fallback() 은 msg.data 가 빈 값이 아닐 때 호출됨
64
이더리움 받기
01 전문가과정- 개발총론
contractReceiveEther{
//ETH 를받기위해필요한함수 .msg.data 가빈값이어야함
receive()externalpayable{}
//msg.data 가빈값이아닌경우호출되는함수
fallback()externalpayable{}
functiongetBalance()publicviewreturns(uint){
returnaddress(this).balance;
}
}
- receive() 함수
- 순수한 이더 전송을 받음
- msg.data 가 비어 있을 때 호출
- fallback() 함수
- 함수 호출과 함께 이더가 전송될 때 사용
- msg.data 가 비어 있지 않을 때 호출
- getBalance() 함수
- 현재 컨트랙트의 이더 잔액을 반환
- address(this).balance 를 사용하여 잔액 조회
- receive() 와 fallback() 함수를 적절히 구현하면 다양한 상황에서
이더 수신의 유연성과 안정성을 확보할 수 있음
66
라이브러리
01 전문가과정 -개발총론
- 라이브러리의 특징
- 상태 변수를 포함할 수 없음
- 이더를 전송할 수 없음
- 네트워크에 한 번만 배포됨
- 라이브러리 배포의 장점
- 다른 사람이 배포한 라이브러리를 사용하는 경우 , 이더리움은 해당 라이브러리가 과거에 이미 다른
사람이 배포한지 알기 때문에 내 코드를 배포할 때 가스를 지불할 필요가 없음
04
솔리디티
프로젝트
실습
로컬 환경에 DApp프로젝트 개발
환경을 구축하고 , 최신 솔리디티 실습
예시를 실행해본다 .
개발 환경 세팅
실습 예시 구동
보일러플레이트 이해하기
68
2024 인천 블록체인 칼리지 전문가 과정
VisualStudioCode,Node.js,TypeScript,Hardhat,Foundry 를
설치해보며 웹 3 프로젝트 구축 시 필요한 개발 환경을 이해한다 .
Scaffold-ETH 프로젝트를 사용해 모던 DApp 스택을 알아본다 .
보일러플레이트를 이해하고 체인별로 제공하는 보일러플레이트
오픈소스를 스스로 찾아 구동해본다 .
69.
69
- Visual StudioCode 설치
- Solidity 플러그인 설치
- Node.js 설치
- yarn 설치
- TypeScript 설치
개발 환경 세팅
01 전문가과정 - 개발총론
70.
70
- Scaffold-ETH 클론및 구동
- 링크 : https://github.com/scaffold-eth/scaffold-eth-2
- 프로젝트 소개 : https://scaffoldeth.io/
- Scaffold-ETH 기술 스택
- Next.js
- RainbowKit
- Hardhat
- Wagmi
- Viem
- TypeScript
오픈소스로 알아보는 모던 DApp 기술 스택
01 전문가과정 - 개발총론
71.
71
- 보일러플레이트
- 프로젝트의기본 구조와 설정을 제공하는 템플릿
- 여러 곳에서 재사용되는 코드를 모아 놓았기 때문에 최소한의 변경으로 프로젝트 구축 가능
- DApp 보일러플레이트의 구성 요소
- 스마트 컨트랙트 템플릿
- 프론트엔드 프레임워크 설정 ( 예 : React, Vue)
- Web3 라이브러리 통합
- 테스트 환경 설정
- 배포 스크립트
보일러플레이트
01 전문가과정 - 개발총론
72.
72
- 보일러플레이트 사용시장점
- 개발 시간 단축
- 일관된 프로젝트 구조
- 베스트 프랙티스 적용 용이
- 초보자의 진입 장벽 낮춤
- 주의사항
- 불필요한 코드 포함 가능성
- 커스터마이징 필요성
- 최신 트렌드 반영 지연 가능성
보일러플레이트
01 전문가과정 - 개발총론
#21 JVM은 자바를, EVM은 솔리디티를 실행하는 가상 머신
둘 다 플랫폼 독립적인 실행 환경을 제공함
JVM과 EVM을 각각 '자바어 통역사'와 ‘솔리디티어 통역사'로 비유할 수 있음
자바와 솔리디티는 각각의 '언어'로, 통역사(가상 머신)를 통해 컴퓨터나 블록체인이 이해할 수 있는 '말'로 변환됨
JVM은 다양한 운영 체제에서 자바 프로그램을 실행하기 위한 것이고
EVM은 이더리움 네트워크에서 스마트 컨트랙트를 실행하기 위한 목적으로 만들어짐
자바는 범용 프로그래밍 언어인 반면, 솔리디티는 스마트 컨트랙트 개발에 특화된 언어임.
#22 JVM은 자바를, EVM은 솔리디티를 실행하는 가상 머신
둘 다 플랫폼 독립적인 실행 환경을 제공함
JVM과 EVM을 각각 '자바어 통역사'와 ‘솔리디티어 통역사'로 비유할 수 있음
자바와 솔리디티는 각각의 '언어'로, 통역사(가상 머신)를 통해 컴퓨터나 블록체인이 이해할 수 있는 '말'로 변환됨
JVM은 다양한 운영 체제에서 자바 프로그램을 실행하기 위한 것이고
EVM은 이더리움 네트워크에서 스마트 컨트랙트를 실행하기 위한 목적으로 만들어짐
자바는 범용 프로그래밍 언어인 반면, 솔리디티는 스마트 컨트랙트 개발에 특화된 언어임.
#23 JVM은 자바를, EVM은 솔리디티를 실행하는 가상 머신
둘 다 플랫폼 독립적인 실행 환경을 제공함
JVM과 EVM을 각각 '자바어 통역사'와 ‘솔리디티어 통역사'로 비유할 수 있음
자바와 솔리디티는 각각의 '언어'로, 통역사(가상 머신)를 통해 컴퓨터나 블록체인이 이해할 수 있는 '말'로 변환됨
JVM은 다양한 운영 체제에서 자바 프로그램을 실행하기 위한 것이고
EVM은 이더리움 네트워크에서 스마트 컨트랙트를 실행하기 위한 목적으로 만들어짐
자바는 범용 프로그래밍 언어인 반면, 솔리디티는 스마트 컨트랙트 개발에 특화된 언어임.
#26 JVM은 자바를, EVM은 솔리디티를 실행하는 가상 머신
둘 다 플랫폼 독립적인 실행 환경을 제공함
JVM과 EVM을 각각 '자바어 통역사'와 ‘솔리디티어 통역사'로 비유할 수 있음
자바와 솔리디티는 각각의 '언어'로, 통역사(가상 머신)를 통해 컴퓨터나 블록체인이 이해할 수 있는 '말'로 변환됨
JVM은 다양한 운영 체제에서 자바 프로그램을 실행하기 위한 것이고
EVM은 이더리움 네트워크에서 스마트 컨트랙트를 실행하기 위한 목적으로 만들어짐
자바는 범용 프로그래밍 언어인 반면, 솔리디티는 스마트 컨트랙트 개발에 특화된 언어임.