2024
인천 블록체인
칼리지
전문가 과정 강의 노트
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/) 운영 등 다수 매체 집필 및 기고
이보라
서강대학교
미래교육원
2024 인천 블록체인 칼리지
강의 목표
3
“ 일반 애플리케이션 개발과
블록체인 기반 애플리케이션 개발의 차이점을 알아보고 ,
블록체인 중 가장 큰 생태계를 가진 이더리움 네트워크에서
쓰이는 스마트 컨트랙트 언어인 솔리디티를 학습하여
DApp 구축을 위한 기초를 다집니다 .”
전문가 과정
01 블록체인 기반 애플리케이션 개발의 특징
03 솔리디티 문법
04 프로젝트 기반 솔리디티 문법 실습
02 블록체인과 이더리움
강의 목차
4
2024 인천 블록체인 칼리지 전문가 과정
01
블록체인 기반
애플리케이션
개발의 특징
클라이언트 - 서버 구축을 통해 만드는
일반 애플리케이션과 블록체인 기반
애플리케이션 구축의 차이를
알아봅니다 .
일반 애플리케이션 개발 특징
블록체인 애플리케이션 개발 특징
5
2024 인천 블록체인 칼리지 전문가 과정
일반 애플리케이션의 특징을 알아봅니다 .
블록체인 기반 애플리케이션의 특징을 알아봅니다 .
실습
DApp 을 사용해 블록체인에 트랜잭션 남기기와 이더스캔을 통해
블록체인에 트랜잭션 남기기를 실습합니다 .
6
웹 개발
클라이언트 - 서버간 통신으로 대표되는 웹 애플리케이션 개발에 필요한 기술과 웹 개발의 특징
01 전문가과정 - 개발총론
• 웹 애플리케이션 개발을 위한 기술
- 프론트엔드 : HTML, CSS, JavaScript
- 백엔드 : 서버측 프로그래밍 언어 , 데이터베이스 및 API 개발 / 관리
• 웹 개발의 특징
- 중앙 집중식 아키텍처
- 단일 권한 관리 주체
- 상대적으로 빠른 트랜잭션 처리
- 데이터 수정 및 삭제 용이
7
DApp 개발
클라이언트 - 블록체인간 통신으로 대표되는 DApp(Decentralized Application) 의 특징
01 전문가과정 - 개발총론
• 블록체인 애플리케이션 개발의 특징 1
- 분산화된 데이터 관리
- P2P 네트워크 구조
- 합의 알고리즘을 통한 데이터 검증
- 데이터의 불변성과 추적 가능성
8
DApp 개발
클라이언트 - 블록체인간 통신으로 대표되는 DApp(Decentralized Application) 의 특징
01 전문가과정 - 개발총론
• 블록체인 애플리케이션 개발의 특징 2
- 스마트 컨트랙트
- 자동화된 비즈니스 로직 실행
- 중개자 없는 트랜잭션 처리
- 프로그래밍 가능한 화폐와 자산
9
DApp 개발
클라이언트 - 블록체인간 통신으로 대표되는 DApp(Decentralized Application) 의 특징
01 전문가과정 - 개발총론
• 블록체인 애플리케이션 개발의 특징 3
- 보안과 투명성
- 암호화 기술 기반의 높은 보안성
- 공개 원장을 통한 트랜잭션 투명성
- 개인정보 보호와 데이터 주권 강화
10
DApp 개발에 필요한 도구와 환경
DApp(Decentralized Application) 개발에 필요한 도구와 환경
01 전문가과정 - 개발총론
- 웹 개발
- 다양한 프레임워크와 라이브러리 (React,
Angular
, Vue.js 등 )
- 클라우드 서비스 (AWS, Google Cloud, Azure
등 )
- 지속적 통합 / 배포 (CI/CD)
를 위한 파이프라인
- 블록체인 앱 개발
- 블록체인 특화 프레임워크 (Hardhat, Foundry)
- 테스트넷과 메인넷 환경
- 가스 비용 최적화 및 관리
11
DApp 개발에 필요한 개발자 역량
DApp(Decentralized Application) 개발에 필요한 개발자 역량
01 전문가과정 - 개발총론
- 웹 개발
- 프론트엔드 및 백엔드 기술 숙련도
- UX/UI 에 대한 이해
- API 설계 및 통합 능력
- 블록체인 개발
- 암호학 및 분산 시스템 이해
- 스마트 컨트랙트 프로그래밍 능력
- 토큰 이코노미 설계 / 이해 능력
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
실습 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 개 생성
}
}
14
실습 2: 이더스캔을 통해 트랜잭션 남기기
01 전문가과정 - 개발총론
02
블록체인과
이더리움
다양한 블록체인 네트워크 중
이더리움이 지닌 특징을 알아봅니다 .
블록체인이란
이더리움이란
스마트 컨트랙트
15
2024 인천 블록체인 칼리지 전문가 과정
블록체인의 정의와 동작 원리를 알아봅니다 .
이더리움 네트워크의 정의와 이더리움이 다른 블록체인과 어떤 점에서
다른지 알아봅니다 .
스마트 컨트랙트의 작동 원리와 실제 구현에 대해 깊이 있게 배웁니다 .
16
블록체인
암호화 기술을 이용한 분산형 디지털 장부 시스템
01 전문가과정 - 개발총론
- 정의 : 암호화 기술을 이용한 분산형 디지털 장부
- 쉬운 정의 : 블록들이 이어진 체인
01 전문가과정 - 개발총론
17
- 공개키와 비밀키
- 참고자료 : https://andersbrownworth.com/blockchain/public-private-keys/keys
블록체인 내부 살펴보기
01 전문가과정 - 개발총론
18
- 사인
- 참고자료 : https://andersbrownworth.com
/blockchain/public-private-keys/signatures
블록체인 내부 살펴보기
01 전문가과정 - 개발총론
19
- 트랜잭션
- 참고자료 : https://andersbrownworth.com
/blockchain/public-private-keys/transaction
블록체인 내부 살펴보기
01 전문가과정 - 개발총론
20
- 블록체인
- 참고자료 : https://andersbrownworth.com
/blockchain/public-private-keys/blockchain
블록체인 내부 살펴보기
21
- 블록체인 작동 방식
- 트랜잭션 발생
- 네트워크 전체에 전파
- 노드들의 검증
- 블록에 포함 및 체인에 추가
- 특징
- 탈중앙화 : 중앙 기관의 통제 없이 운영
- 복제 : 모든 참여자가 전체 데이터의 사본을 보유
- 합의 메커니즘 : 네트워크 참여자들의 동의로 데이터 검증
분산의 의미
01 전문가과정 - 개발총론
데이터와 처리 능력이 단일 중앙 시스템이 아닌 네트워크 전체에 분산되어 있는 상태
22
- 이더리움
- 대표적인 블록체인 네트워크
- 스마트 컨트랙트 지원
- 비탈릭 부테린이 창시
- 특징
- 과거 작업증명 방식에서 지분증명 방식으로
합의 메커니즘을 변화시킴
이더리움
01 전문가과정 - 개발총론
23
- 지분 증명이란 ?
- 참고자료 : https://violetboralee.medium.com
/%EC%A7%80%EB%B6%84-%EC%A6%9D%EB%AA%85%EC%9D
%B4-%EB%9E%80-31632f6bae72
이더리움과 지분증명
01 전문가과정 - 개발총론
03
솔리디티
문법
EVM 에서 구동되도록 설계된 스마트
컨트랙트용 언어인 솔리디티를
다룹니다 .
솔리디티 소개
솔리디티 문법
24
2024 인천 블록체인 칼리지 전문가 과정
솔리디티 언어의 정의와 특징 , 다른 프로그래밍 언어와의 관계를
알아봅니다 .
스마트 컨트랙트를 작성하며 솔리디티 문법을 학습합니다 .
01 전문가과정 - 개발총론
25
- 목적 : 이더리움 블록체인 상에서 실행되는 스마트 컨트랙트를 작성하기
위한 언어
- 타입 : 정적 타입 언어 ( 변수의 타입이 컴파일 타임에 결정됨 )
- 패러다임 : 객체 지향 ( 상속 , 인터페이스 등 지원 )
- 실행 환경 : Ethereum Virtual Machine( 이더리움 가상 머신 , EVM)
솔리디티 (Solidity)
스마트 컨트랙트를 개발하기 위해 설계된 정적 타입의 객체 지향 프로그래밍 언어
26
- EVM 은 솔리디티를 실행하는 가상 머신으로
플랫폼 독립적인 실행 환경을 제공함
- 솔리디티는 ‘언어’ , EVM 은 ‘솔리디티어
통역사’로 비유할 수 있음
- EVM( 통역사 ) 을 통하면 솔리디티로 작성한
코드 ( 발화자의 의도 ) 를 블록체인이 이해할
수 있는 기계어로 변환 가능함
솔리디티 (Solidity)
스마트 컨트랙트를 개발하기 위해 설계된 정적 타입의 객체 지향 프로그래밍 언어
01 전문가과정 - 개발총론
27
솔리디티 (Solidity)
스마트 컨트랙트를 개발하기 위해 설계된 정적 타입의 객체 지향 프로그래밍 언어
참고 : 다양한 EVM 기반 체인
링크 : https://defillama.com/chain/inEVM
01 전문가과정 - 개발총론
28
솔리디티 (Solidity)
스마트 컨트랙트를 개발하기 위해 설계된 정적 타입의 객체 지향 프로그래밍 언어
참고 : 다양한 EVM 기반 체인
링크 : https://www.polymerlabs.org/
01 전문가과정 - 개발총론
29
특징
1. JavaScript, C++, Python 의 최신 문법에 영향을 받음
2. 스마트 컨트랙트 특화 기능 제공
3. 고수준의 추상화와 낮은 수준의 바이트코드 접근 모두 가능
4. 보안과 안정성에 중심을 둔 설계
솔리디티 (Solidity)
스마트 컨트랙트를 개발하기 위해 설계된 정적 타입의 객체 지향 프로그래밍 언어
01 전문가과정 - 개발총론
30
솔리디티 (Solidity)
스마트 컨트랙트를 개발하기 위해 설계된 정적 타입의 객체 지향 프로그래밍 언어
예시 : named import
출처 : https://www.rareskills.io/post/solidity-style-guide
특징 1: JavaScript, C++, Python 의 최신 문법에 영향을 받음
01 전문가과정 - 개발총론
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 전문가과정 - 개발총론
솔리디티 (Solidity)
스마트 컨트랙트를 개발하기 위해 설계된 정적 타입의 객체 지향 프로그래밍 언어
특징 3: 고수준의 추상화와 낮은 수준의 바이트코드 접근 모두 가능
01 전문가과정 - 개발총론
32
33
솔리디티 (Solidity)
스마트 컨트랙트를 개발하기 위해 설계된 정적 타입의 객체 지향 프로그래밍 언어
특징 4: 보안과 안정성에 중심을 둔 설계
1. 정적 타입 시스템 : 변수의 타입을 명확히
지정해야 하며 , 이는 많은 버그를 사전에
방지함
2. 제한된 기능 : 잠재적으로 위험할 수 있는
기능들 ( 예 : 무한 루프 ) 을 제한하여
안정성을 높임
3. 가시성 지정자 : 함수와 변수의 접근
범위를 명확히 제어할 수 있어 , 의도치
않은 접근을 방지함
4. 예외 처리 : 'require', 'assert', 'revert'
등의 기능으로 오류 상황을 명확히 처리할
수 있음
5. 재진입 (reentrancy) 공격 방지 :
'transfer' 함수 사용 등으로 흔한 보안
취약점을 방지
6. 오버플로우 / 언더플로우 방지 : SafeMath
라이브러리 등을 통해 수학적 연산의
안전성을 보장함
01 전문가과정 - 개발총론
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
- 변수 종류 : 상태 , 로컬 , 전역
- 상태 변수 (state variable): 컨트랙트 스토리지에 영구적으로 저장되는 변수
- 특징
- 컨트랙트 수준에서 선언
- 블록체인에 저장되어 가스 비용 발생
- 모든 함수에서 접근 가능
contractExample{
uintpublicstateVar=123;// 상태 변수
}
변수 타입과 선언
01 전문가과정 - 개발총론
36
- 변수 종류 : 상태 , 로컬 , 전역
- 로컬 변수 (local variable): 함수 내에서 선언되고 함수 실행 동안만 존재하는 변수
- 특징
- 함수 내에서만 사용 가능
- 스택에 저장되어 가스 비용 최소화
- 함수 종료시 소멸
contractExample{
uintpublicstateVar=123;// 상태 변수
functionexampleFunction()public{
uintlocalVar=456;// 로컬 변수
}
}
변수 타입과 선언
01 전문가과정 - 개발총론
37
- 변수 종류 : 상태 , 로컬 , 전역
- 전역 변수 (global variable): 솔리디티에 의해 미리 정의된 특수 변수
- 특징
- 블록체인의 특정 속성이나 트랜잭선 정보 제공
- 어디서든 접근 가능
- 읽기 전용
- 주요 전역 변수 :
- msg.sender: 현재 함수를 호출한 주소
- msg.value: 함수와 함께 전송된 이더의 양
- block.timestamp: 현재 블록의 유닉스 타임스탬프
- block.number: 현재 블록 번호
변수 타입과 선언
01 전문가과정 - 개발총론
38
- 변수 종류별 비고
변수 타입과 선언
01 전문가과정 - 개발총론
특성 상태 변수 로컬 변수 전역 변수
저장 위치 블록체인 메모리 -
수명 컨트랙트 전체 함수 실행 동안 항상 사용 가능
가스 비용 높음 낮음 -
접근 범위 전체 컨트랙트 함수 내부 전체 컨트랙트
수정 가능 여부 가능 가능 불가능
39
- 주요 데이터 타입 :
- uint: 부호 없는 정수 (uint8, uint256 등 )
- int: 부호 있는 정수
- address: 이더리움 주소
- bool: 불리언
uint8publicu8=10;
addresspublicaddr=0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;
boolpublicdefaultBoo1=false;
주요 데이터 타입
01 전문가과정 - 개발총론
40
- 함수 선언
functionfunctionName(parameter_typeparameter_name)publicreturns(return_type){
// 함수 내용
함수
01 전문가과정 - 개발총론
- 조건문
- if-else
- for 루프
41
배열과 문자열
01 전문가과정 - 개발총론
- 배열 선언
uint[]publicdynamicArray;
uint[10]publicfixedArray;
- 배열 조작
-push(): 요소 추가
-pop(): 마지막 요소 제거
-length: 배열 길이
- 문자열
stringpublicgreeting="HelloWorld!";
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
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
//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
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
View, Pure 함수
01 전문가과정 - 개발총론
- View 함수 :
- 정의 : state 값을 변경하지 않는 함수
- 특징 :
- 블록체인의 상태를 변경하거나 수정하지 않음
- 블록체인의 현재 상태를 읽을 수 있음
- Pure 함수 :
- 정의 : state 값을 변경하지 않고 읽지도 않는 함수
- 특징 :
- 블록체인의 상태를 읽거나 변경할 수 없음
- 입력 값만을 기반으로 결과를 반환
47
View, Pure 함수
01 전문가과정 - 개발총론
- View, Pure 키워드 사용 이유
1. 가스 최적화
- 외부 호출 시 가스 소비 없음
- 단 , 다른 스마트 컨트랙트 내에서 호출 시 일정량의 가스 소비
2. 코드의 명확성 : 함수의 동작과 영향을 쉽게 이해 가능
3. 보안 : 예기치 않은 상태 변경이나 부작용 방지
- 주의사항
- 외부 호출 ( 예 : 웹 3 라이브러리 , DApp) 에서만 가스 무료
- 다른 스마트 컨트랙트 내에서 호출 시 가스 소비 발생
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
modifier
01 전문가과정 - 개발총론
- modifier
- 영 - 한 사전 정의 : ( 의미를 한정하는 ) 한정어
- 함수 호출 전후에 실행할 수 있는 코드에 붙임
- 예시 :
- 특정 함수에 대한 액세스를 제한
- 입력 매개변수의 유효성 검사
- 특정 유형의 공격으로부터 보호하는 용도
50
modifier
01 전문가과정 - 개발총론
contractModifiers{
addresspublicowner;
constructor(){
// 컨트랙트배포자를컨트랙트의소유자로설정함
owner=msg.sender;
}
// 컨트랙트소유자만함수를호출할수있는 modifier 만들기
modifieronlyOwner(){
require(msg.sender==owner
,"Youarenottheowner");
// 언더스코어는 modifier 안에서사용되는특수문자로
//modifier 를적용한함수를이시점에서실행하도록지시하는역할을한다 .
// 따라서 onlyOwnermodifier 가적용된함수는예외처리 (require) 를먼저진행한후에
// 나머지코드를실행한다 .
_;
}
// 위에서선언한 modifier
,onlyOwner 를적용한함수
changeOwner 생성
functionchangeOwner(address_newOwner)publiconlyOwner{
//onlyOwner 첫줄에적용한예외처리를통과해야이지점에
도달할수있다 .
// 따라서컨트랙트의현소유자만컨트랙트소유자를바꿀수
있다 .
owner=_newOwner;
}
}
51
event
01 전문가과정 - 개발총론
- 이벤트
- 블록체인에 로그를 남길 때 사용하는 문법 ( 객체 ) 으로 프론트엔드 등에서 특정 컨트랙트에 대한 로그를 파싱하여
응용하려 할 때 유용함
블록체인에 로그를 남길 때 사용하는 문법
contractEvents{
//sender 주소와메시지에해당하는문자열을기록할용도의이벤트선언
eventTestCalled(addresssender
,stringmessage);
functiontest()public{
// 이벤트로깅
emitTestCalled(msg.sender
,"Someonecalledtest()!");
}
}
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
이더리움 보내기 - send
01 전문가과정 - 개발총론
- 이더리움 스마트 컨트랙트에서 특정 주소로 이더리움을 보내는 방법은 총 3 가지가
있음
- send 함수
- call 함수
- transfer 함수
- send 함수 : 지정된 양의 ETH 를 특정 주소로 전송하는 함수
- 특징
- 저수준 (low-level) 함수
- 실행 시 2300 개의 가스만 소비
- 매우 기본적인 작업만 수행 가능
54
이더리움 보내기 - send
01 전문가과정 - 개발총론
- 가스 제한
- 2300 가스로는 이벤트 발생 (emit) 정도만 가능
- 거의 아무런 연산을 수행하지 못함
- 2300 가스 이상이 필요한 경우 트랜잭션 실패
- 실패 처리
- 실패 시 예외를 발생시키지 않음
- 대신 false 를 반환
- 사용 시 주의사항
- 항상 결과를 확인해야 함
- 실패는 수동으로 처리해야 함
55
이더리움 보내기 - send
01 전문가과정 - 개발총론
contractSendEther{
functionsendEth(addresspayable_to)publicpayable{
//sendEth 라는 payable 함수를사용해자신이전송받은 ETH 를주어진주소로
포워딩한다 .
uintamountToSend=msg.value;
boolsent=_to.send(amountToSend);
require(sent==true,"FailedtosendETH");
}
}
56
이더리움 보내기 - call
01 전문가과정 - 개발총론
- call 함수 : ETH 를 전송하고 남은 가스도 전송하는 로우 레벨 함수
- ETH 전송 후 2300 이상의 가스가 필요한 복잡한 작업 수행 가능
- 가스 사용 : 남은 가스를 모두 전달
- 실패 처리
- 전송 실패 시 트랜잭션이 자동으로 취소되지 않음
- 대신 false 를 반환
- 보안 주의사항 : 재진입 (reentrancy) 공격 가능성 있음
57
이더리움 보내기 - call
01 전문가과정 - 개발총론
contractSendEther{
functionsendEth(addresspayable_to)publicpayable{
// 이 payable 함수에서원하는주소로 ETH 를보낼수있다 .
uintamountToSend=msg.value;
//call 은불린값을반환하는데반환값참 / 거짓은성공 / 실패를나타낸다 .
(boolsuccess,bytesmemorydata)=_to.call{value:msg.value}("");
require(success==true,"FailedtosendETH");
}
}
58
이더리움 보내기 - transfer
01 전문가과정 - 개발총론
- transfer 함수 : 지정된 양의 ETH 를 특정 주소로 전송하는 함수
- 가스 제한 : 실행 시 2300 가스까지 허용됨
- 실패 처리
- 전송 실패 시 자동으로 예외 발생
- 트랜잭션이 자동으로 되돌아감 (revert)
- 안전성
- 수동으로 전송 결과를 확인하거나 실패 사례를 처리할 필요 없음
- 장점
- 사용 편의성 : 별도의 오류 처리 로직이 필요 없음
- 안전성 : 실패 시 자동으로 트랜잭션 롤백
- 제한사항
- 가스 제한 : 2300 가스로 제한되어 복잡한 로직 실행 불가
- 유연성 부족 : 가스 제한으로 인해 일부 컨트랙트와의 상호작용 제한될 수 있음
59
이더리움 보내기 - transfer
01 전문가과정 - 개발총론
contractSendEther{
functionsendEth(addresspayable_to)publicpayable{
// 이 payable 함수에서원하는주소로 ETH 를보낼수있다 .
uintamountToSend=msg.value;
//transfer 메서드를사용해 ETH 를보낸다 .
_to.transfer(msg.value);
}
}
60
이더리움 보내기
01 전문가과정 - 개발총론
- 현재 업계 표준
- call 메서드 사용 권장
- 이유
- 높은 유연성
- 가스 제한 변경에 대한 미래 대비
- 보안 고려 사항
- 재진입 공격 방지 필수
- call 사용 시 추가 보안 조치 필요
- Check-Effects-Interaction 패턴 적용
- 재진입 가드 사용
61
이더리움 보내기
01 전문가과정 - 개발총론
functionsafeTransfer(addresspayable_to,uint256_amount)public{
require(_amount<=address(this).balance,"Insufficientbalance");
//Checks-Effects-Interactions 패턴
//1.Checks
//2.Effects( 상태변경 )
balance-=_amount; // 예시 : 잔액업데이트
//3.Interactions
(boolsuccess,)=_to.call{value:_amount}("");
require(success,"Transferfailed");
}
62
이더리움 받기
01 전문가과정 - 개발총론
- 개인 키로 통제 가능한 외부 소유 계정 (Externally Owned Account, EOA) 은 이더리움 전송을
자동으로 수락할 수 있기 때문에 이더리움을 받을 때 특별한 조치를 할 필요가 없음
- 하지만 이더리움을 직접 받을 수 있는 컨트랙트를 작성하는 경우 , 아래 함수 중 하나 이상을
포함해 놓아야 함
- receive() external payable
- fallback() external payable
- 여기서 receive() 는 msg.data 가 빈 값이면 호출되고 ,fallback() 은 msg.data 가 빈 값이 아닐 때 호출됨
63
이더리움 받기
01 전문가과정 - 개발총론
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() 함수를 적절히 구현하면 다양한 상황에서
이더 수신의 유연성과 안정성을 확보할 수 있음
65
다른 컨트랙트 호출하기
01 전문가과정 - 개발총론
interfaceMinimalERC20{
// 인터페이스엔실제관심있는함수만넣는다 .
functionbalanceOf(addressaccount)externalviewreturns
(uint256);
}
contractMyContract{
MinimalERC20externalContract;
constructor(address_externalContract){
//MinimalERC20 컨트랙트인스턴스초기화
externalContract=MinimalERC20(_externalContract);
}
//mustHaveSomeBalance 를호출하는사람의 ERC20 잔액이 0 이상인지
확인하는함수
functionmustHaveSomeBalance()public{
//ERC20 관련외부함수에서해당토큰의잔액정보를가져온다 .
uintbalance=externalContract.balanceOf(msg.sender);
require(balance>0,"Youdontownanytokensofexternalcontract");
}
}
66
라이브러리
01 전문가과정 - 개발총론
- 라이브러리의 특징
- 상태 변수를 포함할 수 없음
- 이더를 전송할 수 없음
- 네트워크에 한 번만 배포됨
- 라이브러리 배포의 장점
- 다른 사람이 배포한 라이브러리를 사용하는 경우 , 이더리움은 해당 라이브러리가 과거에 이미 다른
사람이 배포한지 알기 때문에 내 코드를 배포할 때 가스를 지불할 필요가 없음
67
라이브러리
01 전문가과정 - 개발총론
librarySafeMath{
functionadd(uintx,uinty)internalpurereturns(uint){
uintz=x+y;
//z 가오버플로우되었을때에러를던짐
require(z>=x,"uintoverflow");
returnz;
}
}
contractTestSafeMath{
functiontestAdd(uintx,uinty)publicpurereturns(uint){
returnSafeMath.add(x,y);
}
}
04
솔리디티
프로젝트
실습
로컬 환경에 DApp 프로젝트 개발
환경을 구축하고 , 최신 솔리디티 실습
예시를 실행해본다 .
개발 환경 세팅
실습 예시 구동
보일러플레이트 이해하기
68
2024 인천 블록체인 칼리지 전문가 과정
VisualStudioCode,Node.js,TypeScript,Hardhat,Foundry 를
설치해보며 웹 3 프로젝트 구축 시 필요한 개발 환경을 이해한다 .
Scaffold-ETH 프로젝트를 사용해 모던 DApp 스택을 알아본다 .
보일러플레이트를 이해하고 체인별로 제공하는 보일러플레이트
오픈소스를 스스로 찾아 구동해본다 .
69
- Visual Studio Code 설치
- Solidity 플러그인 설치
- Node.js 설치
- yarn 설치
- TypeScript 설치
개발 환경 세팅
01 전문가과정 - 개발총론
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
- 보일러플레이트
- 프로젝트의 기본 구조와 설정을 제공하는 템플릿
- 여러 곳에서 재사용되는 코드를 모아 놓았기 때문에 최소한의 변경으로 프로젝트 구축 가능
- DApp 보일러플레이트의 구성 요소
- 스마트 컨트랙트 템플릿
- 프론트엔드 프레임워크 설정 ( 예 : React, Vue)
- Web3 라이브러리 통합
- 테스트 환경 설정
- 배포 스크립트
보일러플레이트
01 전문가과정 - 개발총론
72
- 보일러플레이트 사용시 장점
- 개발 시간 단축
- 일관된 프로젝트 구조
- 베스트 프랙티스 적용 용이
- 초보자의 진입 장벽 낮춤
- 주의사항
- 불필요한 코드 포함 가능성
- 커스터마이징 필요성
- 최신 트렌드 반영 지연 가능성
보일러플레이트
01 전문가과정 - 개발총론
73
체인별 보일러플레이트
01 전문가과정 - 개발총론
- 공식 문서를 통해 보일러플레이트 코드 확보 후 구현 진행
2024 인천 블록체인 칼리지
감사합니다 .

2024 인천 블록체인 칼리지 전문가과정 강의자료 - EVM 이론, 솔리디티 기본 문법

  • 1.
  • 2.
    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 개 생성 } }
  • 14.
    14 실습 2: 이더스캔을통해 트랜잭션 남기기 01 전문가과정 - 개발총론
  • 15.
    02 블록체인과 이더리움 다양한 블록체인 네트워크중 이더리움이 지닌 특징을 알아봅니다 . 블록체인이란 이더리움이란 스마트 컨트랙트 15 2024 인천 블록체인 칼리지 전문가 과정 블록체인의 정의와 동작 원리를 알아봅니다 . 이더리움 네트워크의 정의와 이더리움이 다른 블록체인과 어떤 점에서 다른지 알아봅니다 . 스마트 컨트랙트의 작동 원리와 실제 구현에 대해 깊이 있게 배웁니다 .
  • 16.
    16 블록체인 암호화 기술을 이용한분산형 디지털 장부 시스템 01 전문가과정 - 개발총론 - 정의 : 암호화 기술을 이용한 분산형 디지털 장부 - 쉬운 정의 : 블록들이 이어진 체인
  • 17.
    01 전문가과정 -개발총론 17 - 공개키와 비밀키 - 참고자료 : https://andersbrownworth.com/blockchain/public-private-keys/keys 블록체인 내부 살펴보기
  • 18.
    01 전문가과정 -개발총론 18 - 사인 - 참고자료 : https://andersbrownworth.com /blockchain/public-private-keys/signatures 블록체인 내부 살펴보기
  • 19.
    01 전문가과정 -개발총론 19 - 트랜잭션 - 참고자료 : https://andersbrownworth.com /blockchain/public-private-keys/transaction 블록체인 내부 살펴보기
  • 20.
    01 전문가과정 -개발총론 20 - 블록체인 - 참고자료 : https://andersbrownworth.com /blockchain/public-private-keys/blockchain 블록체인 내부 살펴보기
  • 21.
    21 - 블록체인 작동방식 - 트랜잭션 발생 - 네트워크 전체에 전파 - 노드들의 검증 - 블록에 포함 및 체인에 추가 - 특징 - 탈중앙화 : 중앙 기관의 통제 없이 운영 - 복제 : 모든 참여자가 전체 데이터의 사본을 보유 - 합의 메커니즘 : 네트워크 참여자들의 동의로 데이터 검증 분산의 의미 01 전문가과정 - 개발총론 데이터와 처리 능력이 단일 중앙 시스템이 아닌 네트워크 전체에 분산되어 있는 상태
  • 22.
    22 - 이더리움 - 대표적인블록체인 네트워크 - 스마트 컨트랙트 지원 - 비탈릭 부테린이 창시 - 특징 - 과거 작업증명 방식에서 지분증명 방식으로 합의 메커니즘을 변화시킴 이더리움 01 전문가과정 - 개발총론
  • 23.
    23 - 지분 증명이란? - 참고자료 : https://violetboralee.medium.com /%EC%A7%80%EB%B6%84-%EC%A6%9D%EB%AA%85%EC%9D %B4-%EB%9E%80-31632f6bae72 이더리움과 지분증명 01 전문가과정 - 개발총론
  • 24.
    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 전문가과정 - 개발총론
  • 40.
    40 - 함수 선언 functionfunctionName(parameter_typeparameter_name)publicreturns(return_type){ //함수 내용 함수 01 전문가과정 - 개발총론 - 조건문 - if-else - for 루프
  • 41.
    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 - 영 - 한 사전 정의 : ( 의미를 한정하는 ) 한정어 - 함수 호출 전후에 실행할 수 있는 코드에 붙임 - 예시 : - 특정 함수에 대한 액세스를 제한 - 입력 매개변수의 유효성 검사 - 특정 유형의 공격으로부터 보호하는 용도
  • 50.
    50 modifier 01 전문가과정 -개발총론 contractModifiers{ addresspublicowner; constructor(){ // 컨트랙트배포자를컨트랙트의소유자로설정함 owner=msg.sender; } // 컨트랙트소유자만함수를호출할수있는 modifier 만들기 modifieronlyOwner(){ require(msg.sender==owner ,"Youarenottheowner"); // 언더스코어는 modifier 안에서사용되는특수문자로 //modifier 를적용한함수를이시점에서실행하도록지시하는역할을한다 . // 따라서 onlyOwnermodifier 가적용된함수는예외처리 (require) 를먼저진행한후에 // 나머지코드를실행한다 . _; } // 위에서선언한 modifier ,onlyOwner 를적용한함수 changeOwner 생성 functionchangeOwner(address_newOwner)publiconlyOwner{ //onlyOwner 첫줄에적용한예외처리를통과해야이지점에 도달할수있다 . // 따라서컨트랙트의현소유자만컨트랙트소유자를바꿀수 있다 . owner=_newOwner; } }
  • 51.
    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 를 반환 - 사용 시 주의사항 - 항상 결과를 확인해야 함 - 실패는 수동으로 처리해야 함
  • 55.
    55 이더리움 보내기 -send 01 전문가과정 - 개발총론 contractSendEther{ functionsendEth(addresspayable_to)publicpayable{ //sendEth 라는 payable 함수를사용해자신이전송받은 ETH 를주어진주소로 포워딩한다 . uintamountToSend=msg.value; boolsent=_to.send(amountToSend); require(sent==true,"FailedtosendETH"); } }
  • 56.
    56 이더리움 보내기 -call 01 전문가과정 - 개발총론 - call 함수 : ETH 를 전송하고 남은 가스도 전송하는 로우 레벨 함수 - ETH 전송 후 2300 이상의 가스가 필요한 복잡한 작업 수행 가능 - 가스 사용 : 남은 가스를 모두 전달 - 실패 처리 - 전송 실패 시 트랜잭션이 자동으로 취소되지 않음 - 대신 false 를 반환 - 보안 주의사항 : 재진입 (reentrancy) 공격 가능성 있음
  • 57.
    57 이더리움 보내기 -call 01 전문가과정 - 개발총론 contractSendEther{ functionsendEth(addresspayable_to)publicpayable{ // 이 payable 함수에서원하는주소로 ETH 를보낼수있다 . uintamountToSend=msg.value; //call 은불린값을반환하는데반환값참 / 거짓은성공 / 실패를나타낸다 . (boolsuccess,bytesmemorydata)=_to.call{value:msg.value}(""); require(success==true,"FailedtosendETH"); } }
  • 58.
    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 패턴 적용 - 재진입 가드 사용
  • 61.
    61 이더리움 보내기 01 전문가과정- 개발총론 functionsafeTransfer(addresspayable_to,uint256_amount)public{ require(_amount<=address(this).balance,"Insufficientbalance"); //Checks-Effects-Interactions 패턴 //1.Checks //2.Effects( 상태변경 ) balance-=_amount; // 예시 : 잔액업데이트 //3.Interactions (boolsuccess,)=_to.call{value:_amount}(""); require(success,"Transferfailed"); }
  • 62.
    62 이더리움 받기 01 전문가과정- 개발총론 - 개인 키로 통제 가능한 외부 소유 계정 (Externally Owned Account, EOA) 은 이더리움 전송을 자동으로 수락할 수 있기 때문에 이더리움을 받을 때 특별한 조치를 할 필요가 없음 - 하지만 이더리움을 직접 받을 수 있는 컨트랙트를 작성하는 경우 , 아래 함수 중 하나 이상을 포함해 놓아야 함 - receive() external payable - fallback() external payable - 여기서 receive() 는 msg.data 가 빈 값이면 호출되고 ,fallback() 은 msg.data 가 빈 값이 아닐 때 호출됨
  • 63.
  • 64.
    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() 함수를 적절히 구현하면 다양한 상황에서 이더 수신의 유연성과 안정성을 확보할 수 있음
  • 65.
    65 다른 컨트랙트 호출하기 01전문가과정 - 개발총론 interfaceMinimalERC20{ // 인터페이스엔실제관심있는함수만넣는다 . functionbalanceOf(addressaccount)externalviewreturns (uint256); } contractMyContract{ MinimalERC20externalContract; constructor(address_externalContract){ //MinimalERC20 컨트랙트인스턴스초기화 externalContract=MinimalERC20(_externalContract); } //mustHaveSomeBalance 를호출하는사람의 ERC20 잔액이 0 이상인지 확인하는함수 functionmustHaveSomeBalance()public{ //ERC20 관련외부함수에서해당토큰의잔액정보를가져온다 . uintbalance=externalContract.balanceOf(msg.sender); require(balance>0,"Youdontownanytokensofexternalcontract"); } }
  • 66.
    66 라이브러리 01 전문가과정 -개발총론 - 라이브러리의 특징 - 상태 변수를 포함할 수 없음 - 이더를 전송할 수 없음 - 네트워크에 한 번만 배포됨 - 라이브러리 배포의 장점 - 다른 사람이 배포한 라이브러리를 사용하는 경우 , 이더리움은 해당 라이브러리가 과거에 이미 다른 사람이 배포한지 알기 때문에 내 코드를 배포할 때 가스를 지불할 필요가 없음
  • 67.
    67 라이브러리 01 전문가과정 -개발총론 librarySafeMath{ functionadd(uintx,uinty)internalpurereturns(uint){ uintz=x+y; //z 가오버플로우되었을때에러를던짐 require(z>=x,"uintoverflow"); returnz; } } contractTestSafeMath{ functiontestAdd(uintx,uinty)publicpurereturns(uint){ returnSafeMath.add(x,y); } }
  • 68.
    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 전문가과정 - 개발총론
  • 73.
    73 체인별 보일러플레이트 01 전문가과정- 개발총론 - 공식 문서를 통해 보일러플레이트 코드 확보 후 구현 진행
  • 74.
    2024 인천 블록체인칼리지 감사합니다 .

Editor's Notes

  • #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은 이더리움 네트워크에서 스마트 컨트랙트를 실행하기 위한 목적으로 만들어짐 자바는 범용 프로그래밍 언어인 반면, 솔리디티는 스마트 컨트랙트 개발에 특화된 언어임.