Todo :
0. vyper 환경 설정
1. compile 확인
2. MyToken 기본 기능 구현
/blockchain_programming_2025/hardhat-test master
❯ mkdir archived-Sol
우분투 환경이라 hardhat-test 아래에 mkdir로 archived-Sol 이라는 파일 새로 만들어주고, 기존 contracts 파일 전부 옮김.
근데 일단.. 다른 /artifacts/contracts 같은 파일이 교수님은 다 옮겨져있던데 방식이 다른건지.... 난 직접 옮겼다 일단..(이거 아닌 것 같은데)
--> test 파일은 동일하게 두고 사용한다!
+25/11/25 추가
아니 git mv 라는 기능이 있었대요!!!!!!!!!!!!!!!!!!!!
참고 : [git] 파일 또는 폴더 이동하기(git mv)
git mv contracts archived-Sol/contracts
하면 알아서 옮겨지고 git도 연동된다..
(안하고 그냥 복붙하면 삭제되었다.. 뭐다 난리남 수습하느라 머리아픔)/artifacts/contracts 같은 건 하다보니까..? (컴파일 해서 그런가) 알아서.. 생기는 것 같아요
링크 :
https://v2.hardhat.org/hardhat-runner/docs/getting-started
위의 링크로 들어가면 vyper 설치 안내가 있다.
(첫 코드만 터미널에 입력) *오류 시 npm install 해보기

import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import "@nomiclabs/hardhat-vyper"; //추가
const config: HardhatUserConfig = {
solidity: "0.8.28",
vyper: { //추가
version: "0.3.0",
}, //여기까지 추가
};
export default config;

# @version ^0.3.0
# @license MIT
name: public(String[64])
symbol: public(String[32])
decimals: public(uint256)
totalSupply: public(uint256)
# @version ^0.3.0
버전 작성은 solidity와 달리 미작성해도 컴파일이 가능하다.
다만, 다른 사람이 코드를 가져왔을 때 버전이 다른 기본 컴파일러로 컴파일이 되면 문제가 생길 수 있어 협업 시 적어두는게 일반적이라고 한다.
contract 구분
또한 파이썬과 유사하여 contract 키워드가 없이
그냥 파일 하나가 contract이라 state랑 function을 바로 작성한다.
decimals: public(uint256)
var: type 형식은 파이썬도 가능하지만,
vyper는 파이썬과 달리 미작성이 컴파일이 되지 않는다.
또한 파이썬과 동일하게 uint256만 존재하고, uint8같은 게 없다
(파이썬처럼 자원 최적화... 그런 것보다 편의성을 고려한듯)
# @version ^0.3.0
# @license MIT
name: public(String[64])
symbol: public(String[32])
decimals: public(uint256)
totalSupply: public(uint256)
#바이퍼만 스네이크 대신 낙타(카멜식) 사용..
balanceOf: public(HashMap[address, uint256])
allowances: public(HashMap[address, HashMap[address, uint256]])
@external
def __init__(_name: String[64], _symbol: String[32], _decimals: uint256, _initialSupply: uint256):
self.name = _name
self.symbol = _symbol
self.decimals = _decimals
self.totalSupply = _initialSupply * 10 ** 18
self.balanceOf[msg.sender] += _initialSupply * 10 ** 18
@external
def transfer(_amount:uint256, _to:address):
assert self.balanceOf[msg.sender] >= _amount, "insufficient balance" #require 역할
self.balanceOf[msg.sender] -= _amount
self.balanceOf[_to] += _amount
@external
def approve( _spender:address, _amount:uint256):
# assert self.balanceOf[_owner] >= _amount, "insuffient balance"
self.allowances[msg.sender][_spender] += _amount
@external
def transferFrom(_owner:address, _to:address, _amount:uint256):
assert self.allowances[_owner][msg.sender] >= _amount, "insufficient allowance"
assert self.balanceOf[_owner] >= _amount, "insufficient balance"
self.balanceOf[_owner] -= _amount
self.balanceOf[_to] += _amount
self.allowances[_owner][msg.sender] -= _amount
- vyper와 solidity의 네이밍 규칙
원래 파이썬에서는 스네이크 방식으로 변수나 함수를 작명하고 바이퍼 역시 동일한 것 같지만? (ex.
total\_supply), 우리는 solidity 에서 카멜 방식을 이용하였고, 현재 사용할 테스트파일 역시 카멜식이니 그냥 카멜식으로 적는다. (ex.totalSupply)참고 :
- 네이밍 규칙 총정리(camel case, kebab case, pascal case, snake case)
- 여러 가지 이야기/파이썬 및 그 밖의 라이브러리의 팁 - 카멜 표기법과 스네이크 표기법
- self..에 대해 순간 의문이 들어서 정리해두는 글
this.name = \_name은 이해가 가는데
self.balanceOf\[~~] = @@은 왜 굳이 self를 쓰는지 이해가 순간 안됐다.결론은 둘 다 지역변수(함수 내의 변수)가 아니라는 걸 명시하는 목적..!
solidity는 암묵적으로 알아서 해줬지만
vyper는 오해할만한 코드 작성은 지양하기 때문에 명시하는 것이 필수인 것 같다. (미작성 시 컴파일 오류가 생김)vyper 특성 참고 : Vyper, 또 다른 블록체인 개발 언어
이렇게 코드를 여기까지 짜서 돌리면 기존의 테스트가 7개 통과한다.

MyToken에서 이벤트, 접근 제어 추가
TinyBank 구현