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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
17 changes: 17 additions & 0 deletions week-01/dev/script/Deploy.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

import {Script, console} from "forge-std/Script.sol";
import {Counter} from "../src/Counter.sol";

contract DeployCounter is Script {
function run() external {
uint256 deployerPrivateKey = vm.envOr("PRIVATE_KEY", uint256(0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80));
vm.startBroadcast(deployerPrivateKey);

Counter counter = new Counter();
console.log("Counter deployed at:", address(counter));

vm.stopBroadcast();
}
}
4 changes: 4 additions & 0 deletions week-01/dev/src/Counter.sol
Original file line number Diff line number Diff line change
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;
}
}
282 changes: 282 additions & 0 deletions week-01/quiz/quiz-01-solution.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,282 @@
# Week 1 퀴즈: State/Account + Solidity 기초

**제출 방법:**
1. 이 파일을 복사하여 `quiz-01-solution.md`로 저장
2. 각 문제에 답변 작성 (왜 그런지 설명 포함)
3. Pull Request 생성 (`quiz_submission` 템플릿 사용)

**평가 기준:**
- 정답 여부보다 **개념 이해도**를 중점 평가합니다
- "왜"에 대한 설명이 충분한지 확인합니다
- 문법 오류는 크게 감점하지 않습니다

---

## 문제 1: [이론] 상태 머신 (객관식)

이더리움에서 "상태 전이가 원자적(atomic)이다"라는 말의 의미를 가장 잘 설명한 것은?

다음 상황을 고려하세요:

```
Alice가 Bob에게 1 ETH를 보내는 트랜잭션을 실행합니다.
중간에 가스가 부족해져서 트랜잭션이 실패했습니다.
```

**보기:**
A) Alice의 잔액만 감소하고 Bob의 잔액은 변하지 않는다
B) Alice의 잔액과 Bob의 잔액 모두 변하지 않고, 가스비만 소모된다
C) 네트워크가 자동으로 부족한 가스를 보충해서 트랜잭션을 완료한다
D) 트랜잭션이 절반만 실행되어 0.5 ETH만 전송된다

**답변:**
<!--
정답 알파벳을 적고, 왜 이 답을 선택했는지 설명하세요.
"원자적"이라는 것이 실제로 어떤 의미인지 설명해 주세요.
-->
B) 원자적이란 것은 트랜젝션이 전부 성공하거나 전부 실패한다는 것으로 이 과정에서 가스비는 소모된다.

---

## 문제 2: [이론] 결정론적 실행 (객관식)

이더리움 EVM이 "결정론적(deterministic)"으로 실행된다는 것의 핵심 이유는 무엇인가요?

**보기:**
A) 모든 노드가 같은 하드웨어를 사용해야 해서
B) 같은 입력(트랜잭션)이 주어지면 모든 노드가 같은 결과(상태)를 도출해야 하므로
C) 중앙 서버가 모든 계산을 수행하고 결과를 배포해서
D) 트랜잭션이 항상 1초 안에 처리되어야 해서

**답변:**
<!--
정답과 함께, "결정론적이지 않으면" 어떤 문제가 발생하는지 설명하세요.
예: 노드 A와 노드 B가 다른 결과를 얻으면 어떻게 될까요?
-->
B) 서로 다른 노드의 결과가 다르다면, 노드들끼리 합의를 이룰 수 없게되고, 블록체인의 과거 기록도 검증할 수 없게 된다.

---

## 문제 3: [이론] EOA vs CA (객관식)

다음 중 EOA(Externally Owned Account)와 CA(Contract Account)의 차이를 올바르게 설명한 것은?

**보기:**
A) EOA는 코드를 실행할 수 있고, CA는 코드를 실행할 수 없다
B) EOA만 트랜잭션을 시작할 수 있고, CA는 EOA에 의해 호출될 때만 실행된다
C) CA만 ETH를 보유할 수 있고, EOA는 ETH를 보유할 수 없다
D) EOA와 CA는 동일한 기능을 가지며 이름만 다르다

**답변:**
<!--
정답과 함께, "왜 CA는 트랜잭션을 시작할 수 없나요?"에 대해 설명하세요.
힌트: 트랜잭션을 시작하려면 무엇이 필요한가요?
-->
B) 트랜잭션에는 서명이 필요하고, 서명에는 개인키를 필요로 한다. CA는 코드를 실행할 수는 있지만 스스로 트랜잭션을 시작할 순 없다.

---

## 문제 4: [이론] 계정 상태 필드 (객관식)

이더리움 계정 상태의 4가지 필드 중 `nonce`의 역할을 올바르게 설명한 것은?

다음 상황을 고려하세요:

```
Alice의 현재 nonce: 5
Alice가 두 개의 트랜잭션을 동시에 전송합니다:
- TX-A: nonce=5, Bob에게 1 ETH 전송
- TX-B: nonce=5, Charlie에게 2 ETH 전송
```

**보기:**
A) 두 트랜잭션 모두 성공적으로 처리된다
B) TX-A만 처리되고 TX-B는 무시된다 (또는 그 반대)
C) 두 트랜잭션 모두 실패하고 Alice의 자산이 동결된다
D) 네트워크가 자동으로 TX-B의 nonce를 6으로 변경한다

**답변:**
<!--
정답과 함께, nonce가 "트랜잭션 재사용 공격"을 어떻게 방지하는지 설명하세요.
-->
B) 이미 사용된 논스값의 트랜잭션은 즉시 거절하여서 똑같은 트랜잭션을 통한 공격을 방지한다.

---

## 문제 5: [이론] World State (객관식)

World State에 대한 설명 중 올바른 것은?

**보기:**
A) World State는 최신 100개 블록의 트랜잭션만 저장한다
B) World State는 모든 계정의 현재 상태(주소 -> 상태 매핑)를 나타낸다
C) World State는 EOA의 정보만 저장하고 CA 정보는 별도로 관리한다
D) World State는 각 노드마다 다른 값을 가질 수 있다

**답변:**
<!--
정답과 함께, World State가 "전화번호부"에 비유되는 이유를 설명하세요.
-->
B) MPT라는 자료구조로 저장되어, 전화번호부에서 이름과 주소로 전화번호를 찾아내듯, World State에서 주소를 통해 계정 정보를 빠르게 찾알 수 있다.

---

## 문제 6: [이론] 상태 변수 vs 지역 변수 (단답형)

Solidity에서 `상태 변수(state variable)`와 `지역 변수(local variable)`의 차이는 무엇인가요?

다음 코드를 보고 설명하세요:

```solidity
contract Example {
uint256 public count; // 이것은 무엇인가요?

function calculate(uint256 input) public pure returns (uint256) {
uint256 result = input * 2; // 이것은 무엇인가요?
return result;
}
}
```

**답변:**
<!--
두 변수의 차이점을 설명하세요.
특히 다음 관점에서 비교해 주세요:
1. 저장 위치 (Storage vs Memory)
2. 지속성 (트랜잭션 종료 후에도 유지되는가?)
3. 비용 (어느 것이 더 비싼가?)
-->
count 변수는 contract에서 선언된 상태변수이고, result는 함수내에서 선언된 지역변수이다.
주요한 차이점은
1. 상태변수는 블록체인에 저장되고, 지역변수는 메모리에 저장된다.
2. 상태변수는 영구적으로 저장되지만, 지역변수는 함수 종료시 사라진다.
3. 상태변수가 훨씬 더 많은 가스를 필요로 한다.

---

## 문제 7: [이론] 원자성의 이유 (단답형)

이더리움에서 트랜잭션이 "원자적(atomic)"으로 처리되어야 하는 이유는 무엇인가요?

**왜** 부분적으로 성공하는 트랜잭션을 허용하면 문제가 될까요? 구체적인 예시와 함께 설명하세요.

**답변:**
<!--
2-3 문장으로 설명하세요.
힌트: 송금 트랜잭션이 "절반만 성공"하면 어떤 일이 벌어질까요?
누군가의 잔액이 갑자기 사라지거나 생기면 어떻게 될까요?
-->
만약 송금이 절반만 성공하여서, 출금은 되었는데, 입금이 되지 않는다면, 돈이 공중분해되는 사라지는 결과가 나온다.
블록체인은 중앙관리자가 없기 때문에, 이런 사고를 복구해줄 방법이 없다. 특히 스마트컨트랙트와 결합되면 아주 복잡한 문제가 생길 수 있다.
---

## 문제 8: [이론] 계정 구조 설명 (단답형)

EOA에는 `codeHash`와 `storageRoot`가 왜 의미가 없나요?

**답변:**
<!--
EOA와 CA의 구조적 차이를 설명하면서 답변하세요.
힌트: EOA에 코드가 있나요? 저장소가 필요한가요?
-->
코드를 실행하고, 변수들의 데이터를 저장해야하는 CA계정과 달리, EOA계정에서는 실행할 코드도 없고, 저장한 변수내용도 없다. 단순히 보유한 잔고와, 논스만을 가지고 트랜잭션을 할 수 있기에 두 가지 모두 필요가 없다.

---

## 문제 9: [코드] Counter 읽기 (코드 읽기)

다음 Counter.sol 코드를 분석하세요:

```solidity
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;

contract Counter {
uint256 public count;

function getCount() public view returns (uint256) {
return count;
}

function increment() public {
count += 1;
}

function decrement() public {
require(count > 0, "Count cannot go below zero");
count -= 1;
}
}
```

**1) `public` 키워드의 역할:**
`count` 변수에 `public`이 붙으면 어떤 일이 자동으로 일어나나요?

**답변:**
<!--
자동 생성되는 것이 무엇인지 설명하세요.
-->
해당변수를 외부에서 읽을 수 있도록 getter함수를 자동으로 생성해준다.

**2) `view` 키워드의 의미:**
`getCount()` 함수에 `view`가 붙은 이유는 무엇인가요? `view`를 제거하면 어떻게 될까요?

**답변:**
<!--
view 함수의 특성을 설명하세요.
-->
view는 해당함수를 읽기 전용 함수로 취급하게 해준다. view가 없다면, 상태변경이 가능한 함수로 취굽되어 외부에서 호출 시 가스비를 필요로 한다.

---

## 문제 10: [코드] Counter 동작 예측 (코드 읽기)

위의 Counter 컨트랙트에서 다음 시나리오를 분석하세요:

**시나리오:**
```
초기 상태: count = 0

1. increment() 호출
2. increment() 호출
3. decrement() 호출
4. decrement() 호출
5. decrement() 호출
```

**질문 1:** 5번째 `decrement()` 호출의 결과는 무엇인가요?

**답변:**
<!--
성공/실패 여부와 그 이유를 설명하세요.
-->
5번째 decrement실행 시, count변수는 0의 값을 가지고, require의 조건을 만족하지 않으므로, 실행되지 않고, 실패한다.

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

**답변:**
<!--
이 조건이 없으면 어떤 문제가 발생하는지 설명하세요.
힌트: uint256의 특성을 고려하세요.
-->
최솟값 0에서 require를 통해 확인을 하지 않고, count -= 1실행 시, 언더플로우가 발생해 uint256의 최댓값으로 바뀔 수도 있다.

---

## 자기 평가

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

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

---

## 참고 자료

- 이론: `eth-materials/week-01/theory/slides.md`
- 코드: `eth-homework/week-01/dev/src/Counter.sol`
- 용어: `eth-materials/resources/glossary.md`
64 changes: 64 additions & 0 deletions week-01/theory/quiz-01-solution.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# Week 1 이론 퀴즈

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

---

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

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

**답변:**
중앙화된 데이터베이스에서는, 관리자가 절대적인 권한을 가져, 데이터들을 관리, 수정 등이 가능하므로, 서비스가 유지되는데 신뢰를 필요로 한다.
반면 블록체인에서는 각 이용자, 다수의 노드가 데이터를 소유하고, 신뢰대신 네트워크의 규칙, 수학적 알고리즘을 통해 신뢰가 필요없는 시스템으로 구축된다.
---

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

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

**답변:**
[여기에 답변을 작성하세요]
먼저 설계된 목적에서의 차이로, 비트코인에서는 단순하고 제한적인 명령만 실행가능하다. 단순한 송금은 가능하지만 복잡한 계산, 반복문 등은 사용이 불가능하다. 이더리움은 EVM을 통해 복잡한 논리를 코딩할 수 있다. 또 UTXO방식으로 잔고를 다루어 까다로운 비트코인가 달리, 이더리움에서는 계정을 사용하여 더 직관적으로 복잡한 앱들을 만들 수 있다. 저장공간또한 있기 때문에, 상태값을 영구적으로 저장하고 사용할 수 있다.
---

## 문제 3: Solidity 기초

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

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

**답변:**
- `public`: 가시성을 나타내는 것으로 public은 외부, 내부, 상속 어디에서도 호출이 가능하다
- `view`: 상태변수를 변경없이 읽기만 하는 상태변경자이다

---

## 문제 4: 상태 변수

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

**답변:**
[여기에 답변을 작성하세요]
상태변수는 contract레벨에서 선언되는 변수로 블록체인에 영구 저장되어 가스비가 많이 발생한다.
지역변수는 함수 내부에서 선언되는 변수로 메모리에 저장되어 함수 실행 중에만 메모리에 저장되고, 가스비가 적게 발생한다.
---

## 문제 5: Gas 개념

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

**답변:**
[여기에 답변을 작성하세요]
가스는 트랜젝션의 수수료이자, 노드들의 하드웨어 사용에 대한 일종의 대가로 트랜젝션 생성, 컨트랙트 등록, 연산 수행 데이터 저장 및 변경 등에 필요로 한다. 무한루프 및 악의적인 공격을 방지하기 위해 필요한 연산의 비용이라고 볼 수 있고, 네트워크 전체의 부하를 조절하기 위해 필요하다.
---

**제출 방법:**
1. 이 파일을 복사하여 `quiz-01-solution.md`로 저장
2. 각 문제에 대한 답변 작성
3. Git으로 커밋 및 푸시
4. Pull Request 생성
Loading