좋은 질문입니다! 테스트 실행 시 컨트랙트가 매번 새롭게 배포되는 내부 매커니즘을 자세히 설명드리겠습니다.
테스트 실행 시 컨트랙트 배포 내부 매커니즘
1. Truffle 테스트 환경 설정
테스트 실행 시 Truffle이 하는 일:
1. Truffle 테스트 환경 설정
테스트 실행 시 Truffle이 하는 일:
// truffle test 실행 시 내부적으로 일어나는 일들:
// 1. 테스트용 블록체인 네트워크 생성
const testNetwork = {
host: "127.0.0.1",
port: 7545, // Ganache 포트
network_id: "*"
};
// 2. Web3 인스턴스 생성
const web3 = new Web3(provider);
// 3. 계정 목록 가져오기
const accounts = await web3.eth.getAccounts();
// [owner, customer, ...] 형태로 계정들 할당2. 컨트랙트 배포 내부 과정
Tether.new() 호출 시 일어나는 일:
// 1. 컨트랙트 아티팩트 로드
const Tether = artifacts.require("Tether");
// → src/truffle_abis/Tether.json에서 ABI와 바이트코드 로드
// 2. 컨트랙트 인스턴스 생성
const tether = await Tether.new();
// 내부적으로:
// - 컨트랙트 생성자 호출
// - 블록체인에 트랜잭션 전송
// - 새로운 컨트랙트 주소 반환3. 실제 블록체인 트랜잭션 과정
컨트랙트 배포 트랜잭션:
// Tether.new() 내부 동작:
const deployTransaction = {
from: accounts[0], // 배포자 주소
gas: 2000000, // 가스 한도
gasPrice: 20000000000, // 가스 가격
data: "0x6080604052..." // 컴파일된 바이트코드
};
// 블록체인에 트랜잭션 전송
const receipt = await web3.eth.sendTransaction(deployTransaction);
// 새로 생성된 컨트랙트 주소
const contractAddress = receipt.contractAddress; // 예: 0x123...4. 생성자 실행 과정
Tether.sol 생성자:
constructor() public {
balanceOf[msg.sender] = totalSupply; // 1백만 토큰 할당
}실행 과정:
- 바이트코드 실행 - 생성자 함수가 실행됨
- 상태 변수 초기화 - balanceOf[msg.sender] = 1000000000000000000000000
- 스토리지 업데이트 - 블록체인 상태에 저장
5. 매번 새로운 주소가 생성되는 이유
컨트랙트 주소 생성 알고리즘:
// Ethereum 컨트랙트 주소 생성 공식:
// address = keccak256(rlp.encode([sender, nonce]))[12:]
// 예시:
// 첫 번째 배포: nonce = 0 → 주소: 0x123...
// 두 번째 배포: nonce = 1 → 주소: 0x456...
// 세 번째 배포: nonce = 2 → 주소: 0x789...6. 테스트 격리 메커니즘
각 테스트 실행 시:
contract("DecentralBank", ([owner, customer]) => {
before(async () => {
// 매번 새로운 블록체인 상태에서 시작
// 이전 테스트의 상태는 완전히 무시됨
tether = await Tether.new(); // 새로운 주소
rwd = await RWD.new(); // 새로운 주소
decentralBank = await DecentralBank.new(rwd.address, tether.address);
});
});7. 실제 실행 흐름
# truffle test 실행 시:
1. 테스트 환경 초기화
2. Ganache 연결 (또는 내장 테스트 네트워크)
3. 계정 목록 가져오기
4. 각 테스트 파일별로:
- before 블록 실행
- 컨트랙트 배포 (새로운 주소)
- 테스트 실행
- after 블록 실행 (정리)
5. 다음 테스트 파일로 이동핵심: Truffle은 각 테스트 실행 시 완전히 새로운 블록체인 상태를 생성하고, 컨트랙트 배포 시 Ethereum의 표준 주소 생성 알고리즘을 사용하여 매번 고유한 주소를 생성합니다. 이를 통해 테스트 간 완전한 격리를 보장합니다!