Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion week-01/dev/src/Counter.sol
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
pragma solidity 0.8.34;

/// @title Counter - Week 1 과제
/// @notice 간단한 카운터 컨트랙트입니다. TODO 부분을 구현하세요.
Expand Down Expand Up @@ -32,6 +32,7 @@ contract Counter {
function increment() public {
// TODO: count를 1 증가시키세요
// 힌트: count += 1; 또는 count = count + 1; 또는 count++;
count += 1;
}

/// @notice 카운트를 1 감소시킵니다
Expand All @@ -40,12 +41,15 @@ contract Counter {
// TODO: count를 1 감소시키세요. 단, count가 0이면 revert해야 합니다.
// 힌트: require(조건, "에러 메시지"); 를 사용하세요
// 힌트: require(count > 0, "Count cannot go below zero");
require(count > 0, "Count cannot go below zero");
count -= 1;
}

/// @notice 카운트를 0으로 초기화합니다
/// @dev count 값을 0으로 설정하는 로직을 구현하세요
function reset() public {
// TODO: count를 0으로 초기화하세요
// 힌트: count = 0;
count = 0;
}
}
2 changes: 1 addition & 1 deletion week-01/dev/test/Counter.t.sol
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
pragma solidity 0.8.34;

import "forge-std/Test.sol";
import "../src/Counter.sol";
Expand Down
55 changes: 39 additions & 16 deletions week-01/quiz/quiz-01.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ D) 트랜잭션이 절반만 실행되어 0.5 ETH만 전송된다
정답 알파벳을 적고, 왜 이 답을 선택했는지 설명하세요.
"원자적"이라는 것이 실제로 어떤 의미인지 설명해 주세요.
-->

B, 트랜잭션 실행 도중 가스비가 부족하면 그로 인한 상태 변화는 전부 롤백된다.
원자적이라는 것은 상태가 변화하다 말 수 있는게 아니라 완전히 변화하거나 아니거나 둘중 하나의 상태만 가질 수 있음과,
어떤 상태가 두가지 이상의 트랜잭션에 의해 동시에 점유될 수 없다는 mutex의 의미를 포함한다.

---

Expand All @@ -53,7 +55,9 @@ D) 트랜잭션이 항상 1초 안에 처리되어야 해서
정답과 함께, "결정론적이지 않으면" 어떤 문제가 발생하는지 설명하세요.
예: 노드 A와 노드 B가 다른 결과를 얻으면 어떻게 될까요?
-->

B, EVM은 난수 생성과 같은 노드 환경에 따라 변화될 수 있는 값들이 배제되어 있고,
같은 입력이 주어졌을때 모든 노드는 동일 한 결과를 도출해야 한다.
만약 노드들이 각기 다른 결과를 얻으면 이더리움의 consensus는 도출될 수 없다.

---

Expand All @@ -72,7 +76,8 @@ D) EOA와 CA는 동일한 기능을 가지며 이름만 다르다
정답과 함께, "왜 CA는 트랜잭션을 시작할 수 없나요?"에 대해 설명하세요.
힌트: 트랜잭션을 시작하려면 무엇이 필요한가요?
-->

B, Tx를 시작하기 위해서는 개인키가 필요하다. 하지만 CA에는 개인키가 없고, 스마트컨트랙트를 위한 코드만 있다.
따라서 CA는 트랜잭션을 시작할 수 없고, EOA가 발생시킨 트랜잭션에 의해 호출될때만 실행된다.

---

Expand All @@ -99,7 +104,9 @@ D) 네트워크가 자동으로 TX-B의 nonce를 6으로 변경한다
<!--
정답과 함께, nonce가 "트랜잭션 재사용 공격"을 어떻게 방지하는지 설명하세요.
-->

B, 하나의 EOA에서 발생한 모든 트랜잭션은 그 eoa가 발생시킨 트랜잭션의 수에
따른 nonce를 포함한다. 따라서 동일한 eoa로부터 동일한 nonce를 가진 tx가 있다면 둘중 하나만 처리하고,
이미 사용된 nonce나, 이후의 nonce값을 갖고있다면 무시함으로써 eoa가 악의적인 중복 트랜잭션 공격을 하는걸 방지한다

---

Expand All @@ -117,7 +124,7 @@ D) World State는 각 노드마다 다른 값을 가질 수 있다
<!--
정답과 함께, World State가 "전화번호부"에 비유되는 이유를 설명하세요.
-->

B, World State는 모든 계정의 주소와 그 상태를 저장하고있다. 마치 전국민의 이름과 전화번호가 매핑된 전화번호부와 유사하다.

---

Expand Down Expand Up @@ -146,7 +153,11 @@ contract Example {
2. 지속성 (트랜잭션 종료 후에도 유지되는가?)
3. 비용 (어느 것이 더 비싼가?)
-->

함수 외부에 선언된 변수는 상태변수이고,
함수 내부에 선언된 변수는 지역변수이다.
상태변수는 블록체인(Storage)에 기록되는 값이고,
지역변수는 validator의 Memory에 저장되었다가 함수의 실행이 끝나면 사라진다.
상태변수가 지역변수보다 비싸다.

---

Expand All @@ -162,7 +173,12 @@ contract Example {
힌트: 송금 트랜잭션이 "절반만 성공"하면 어떤 일이 벌어질까요?
누군가의 잔액이 갑자기 사라지거나 생기면 어떻게 될까요?
-->
A가 B에게 돈을 보내는 트랜잭션이 다음과 같이 실행한다 가정하자.
1. A의 돈이 충분하다면 송금할 만큼 차감한다.
2. B의 주소가 정확하다면 A의 차감액에서 수수료를 뺸 만큼 B의 Balance를 증가시킨다.

근데 만일 위 상황에서 트랜잭션이 부분적으로 처리되어 1번까지만 작동하였고 롤백이 없다면
돈은 증발하게 된다. 이러한 상황을 막기 위해 트랜잭션은 원자적으로 처리된다.

---

Expand All @@ -175,7 +191,9 @@ EOA에는 `codeHash`와 `storageRoot`가 왜 의미가 없나요?
EOA와 CA의 구조적 차이를 설명하면서 답변하세요.
힌트: EOA에 코드가 있나요? 저장소가 필요한가요?
-->

codeHash와 sotrageRoot는 스마스컨트랙트의 코드와 메모리를
저장 및 검증하기 위한 도구이다.
EOa에는 트랜잭션을 발생시키는 것 외에 코드가 없기에 의미가 없다.

---

Expand Down Expand Up @@ -212,7 +230,7 @@ contract Counter {
<!--
자동 생성되는 것이 무엇인지 설명하세요.
-->

Getter 함수가 생성된다.

**2) `view` 키워드의 의미:**
`getCount()` 함수에 `view`가 붙은 이유는 무엇인가요? `view`를 제거하면 어떻게 될까요?
Expand All @@ -221,7 +239,9 @@ contract Counter {
<!--
view 함수의 특성을 설명하세요.
-->

외부 컨트랙트가 그냥 count를 참조한 경우에는 수정의 가능성이 있다.
view 함수는 외부컨트랙트 호출시 count를 조회만 하고 수정하지 않음을 명시적으로 하여
불필요한 가스비의 지출을 방지한다.

---

Expand All @@ -246,7 +266,9 @@ view 함수의 특성을 설명하세요.
<!--
성공/실패 여부와 그 이유를 설명하세요.
-->

실패,
require(count > 0, "Count cannot go below zero");
위 함수로 인해 count가 0 이하인 경우 오류를 발생시킨다.

**질문 2:** 왜 `decrement()` 함수에 `require(count > 0, ...)` 조건이 필요한가요?

Expand All @@ -255,19 +277,20 @@ view 함수의 특성을 설명하세요.
이 조건이 없으면 어떤 문제가 발생하는지 설명하세요.
힌트: uint256의 특성을 고려하세요.
-->

uint는 0 이상의 정수만 다루는 문자열이다. 따라서 0 이하로 값이 떨어지면
underflow가 발생한다. 이를 방지하기 위해 해당 require 구문이 필요하다.

---

## 자기 평가

모든 문제를 풀었다면, 아래 체크리스트로 자기 평가를 해보세요:

- [ ] 상태 머신과 원자성 개념을 이해했다
- [ ] EOA와 CA의 차이를 설명할 수 있다
- [ ] 계정 상태의 4가지 필드(nonce, balance, storageRoot, codeHash)를 이해했다
- [ ] Solidity 기본 문법(public, view, require)을 이해했다
- [ ] 상태 변수와 지역 변수의 차이를 설명할 수 있다
- [v] 상태 머신과 원자성 개념을 이해했다
- [v] EOA와 CA의 차이를 설명할 수 있다
- [v] 계정 상태의 4가지 필드(nonce, balance, storageRoot, codeHash)를 이해했다
- [v] Solidity 기본 문법(public, view, require)을 이해했다
- [v] 상태 변수와 지역 변수의 차이를 설명할 수 있다

---

Expand Down
71 changes: 71 additions & 0 deletions week-01/theory/quiz-01-solution.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# Week 1 이론 퀴즈

이 퀴즈를 복사하여 `quiz-01-solution.md`로 저장한 후 답변을 작성하세요.

---

## 문제 1: 블록체인 기초

블록체인의 핵심 목적은 무엇인가요? 중앙화된 데이터베이스와 비교하여 설명해주세요.

**답변:**
중앙서버의 개입이나 신뢰 없이 모든 참여자가 동등한 권리로 참여 및 검증에 참여할 수 있는
탈중앙화된 환경 구성

---

## 문제 2: 이더리움의 특징

이더리움이 비트코인과 다른 점은 무엇인가요? 스마트 컨트랙트의 관점에서 설명해주세요.

**답변:**
이더리움은 코드를 이용하여 Turing Completeness한 스마트컨트랙트가 구현 가능하다.
하지만 비트코인은 반복문의 사용이 불가능한 등 Turing Incomplete하고 코드 길이도 제한되어있다.

---

## 문제 3: Solidity 기초

다음 Solidity 코드에서 `public`과 `view` 키워드의 의미를 각각 설명하세요.

```solidity
function count() public view returns (uint256) {
return _count;
}
```

**답변:**
- `public`: 컨트랙트 외부에서도 해당 함수를 호출 할 수 있음
- `view`: 해당 함수 참조 시 값 변형 없이 조회만 한다는 명시

---

## 문제 4: 상태 변수

Solidity에서 상태 변수(state variable)와 지역 변수(local variable)의 차이점을 설명하세요.

**답변:**
함수 외부에 선언된 변수는 상태변수이고,
함수 내부에 선언된 변수는 지역변수이다.
상태변수는 블록체인(Storage)에 기록되는 값이고,
지역변수는 validator의 Memory에 저장되었다가 함수의 실행이 끝나면 사라진다.
상태변수가 지역변수보다 비싸다.

---

## 문제 5: Gas 개념

이더리움에서 Gas란 무엇이며, 왜 필요한가요?

**답변:**
컨트랙트를 실행할때 드는 비용이다.
노드에게 너무 많은 부하를 주는 것을 방지하거나,
컨트랙트가 무한 루프를 도는것을 방지하기 위해 사용한다.

---

**제출 방법:**
1. 이 파일을 복사하여 `quiz-01-solution.md`로 저장
2. 각 문제에 대한 답변 작성
3. Git으로 커밋 및 푸시
4. Pull Request 생성
2 changes: 1 addition & 1 deletion week-04/dev/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ npm run dev

### 3. 추가 과제 (선택)

- [ ] 이벤트 리스닝으로 실시간 업데이트 구현
- [V] 이벤트 리스닝으로 실시간 업데이트 구현
- [ ] 에러 메시지를 사용자 친화적으로 표시
- [ ] 트랜잭션 히스토리 표시

Expand Down
12 changes: 12 additions & 0 deletions week-04/dev/my-dapp/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Counter dApp</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>
Loading