아래 코드를 HelloWorld.sol에 입력합니다. 직접 타이핑하면서 각 줄의 의미를 이해하세요.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
contract HelloWorld {
// ===== 상태 변수 =====
string private greeting;
address public owner;
uint256 public greetingCount;
// ===== 이벤트 =====
event GreetingChanged(
address indexed changer,
string newGreeting,
uint256 timestamp
);
// ===== 생성자 =====
constructor(string memory _greeting) {
greeting = _greeting;
owner = msg.sender;
greetingCount = 0;
}
// ===== 함수 =====
// 인사말 조회 (view - 가스비 없음)
function getGreeting() public view returns (string memory) {
return greeting;
}
// 인사말 변경 (소유자만 가능)
function setGreeting(string memory _newGreeting) public {
require(msg.sender == owner, "Only owner can change greeting");
require(bytes(_newGreeting).length > 0, "Greeting cannot be empty");
greeting = _newGreeting;
greetingCount++;
emit GreetingChanged(msg.sender, _newGreeting, block.timestamp);
}
// 소유권 이전
function transferOwnership(address _newOwner) public {
require(msg.sender == owner, "Only owner");
require(_newOwner != address(0), "Invalid address");
owner = _newOwner;
}
}
코드 핵심 설명
pragma solidity ^0.8.19 - 컴파일러 버전 0.8.19 이상 지정
string private greeting - 외부 계약에서 직접 접근 불가한 문자열
msg.sender - 현재 함수를 호출한 지갑 주소
require() - 조건이 false이면 트랜잭션 취소
emit - 이벤트 발생, 블록체인 로그에 기록